SubscriberWithSalesExporter.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Newsletter;
  3. use Dotdigitalgroup\Email\Setup\Schema;
  4. class SubscriberWithSalesExporter
  5. {
  6. /**
  7. * @var \Dotdigitalgroup\Email\Model\ImporterFactory
  8. */
  9. public $importerFactory;
  10. /**
  11. * @var \Dotdigitalgroup\Email\Helper\File
  12. */
  13. public $file;
  14. /**
  15. * @var \Dotdigitalgroup\Email\Helper\Data
  16. */
  17. public $helper;
  18. /**
  19. * @var \Magento\Framework\App\ResourceConnection
  20. */
  21. public $resource;
  22. /**
  23. * @var \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory
  24. */
  25. public $subscribersCollection;
  26. /**
  27. * @var \Dotdigitalgroup\Email\Model\Apiconnector\SubscriberFactory
  28. */
  29. public $emailSubscriber;
  30. /**
  31. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Contact
  32. */
  33. public $emailContactResource;
  34. /**
  35. * @var \Dotdigitalgroup\Email\Helper\Config
  36. */
  37. public $configHelper;
  38. /**
  39. * @var \Magento\Framework\Stdlib\DateTime\DateTime
  40. */
  41. public $dateTime;
  42. /**
  43. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Consent
  44. */
  45. private $consentResource;
  46. /**
  47. * @var \Dotdigitalgroup\Email\Model\ConsentFactory
  48. */
  49. private $consentFactory;
  50. /**
  51. * @var \Dotdigitalgroup\Email\Model\Apiconnector\ContactDataFactory
  52. */
  53. private $contactDataFactory;
  54. /**
  55. * SubscriberWithSalesExporter constructor.
  56. * @param \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  57. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  58. * @param \Dotdigitalgroup\Email\Model\ConsentFactory $consentFactory
  59. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Consent $consentResource
  60. * @param \Magento\Framework\App\ResourceConnection $resource
  61. * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
  62. * @param \Dotdigitalgroup\Email\Model\Apiconnector\ContactDataFactory $contactDataFactory
  63. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource
  64. */
  65. public function __construct(
  66. \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory,
  67. \Dotdigitalgroup\Email\Helper\Data $helper,
  68. \Dotdigitalgroup\Email\Model\ConsentFactory $consentFactory,
  69. \Dotdigitalgroup\Email\Model\ResourceModel\Consent $consentResource,
  70. \Magento\Framework\App\ResourceConnection $resource,
  71. \Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
  72. \Dotdigitalgroup\Email\Model\Apiconnector\ContactDataFactory $contactDataFactory,
  73. \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource
  74. ) {
  75. $this->dateTime = $dateTime;
  76. $this->helper = $helper;
  77. $this->resource = $resource;
  78. $this->importerFactory = $importerFactory;
  79. $this->file = $this->helper->fileHelper;
  80. $this->configHelper = $this->helper->configHelperFactory->create();
  81. $this->consentFactory = $consentFactory;
  82. $this->consentResource = $consentResource;
  83. $this->contactDataFactory = $contactDataFactory;
  84. $this->emailContactResource = $contactResource;
  85. }
  86. /**
  87. * @param \Magento\Store\Model\Website $website
  88. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact\Collection $contactSubscribers
  89. *
  90. * @return int
  91. */
  92. public function exportSubscribersWithSales($website, $contactSubscribers)
  93. {
  94. $updated = 0;
  95. $websiteId = $website->getId();
  96. $stores = [];
  97. $consentModel = $this->consentFactory->create();
  98. $mappedHash = $this->helper->getWebsiteSalesDataFields($website);
  99. $isConsentSubscriberEnabled = $this->configHelper->isConsentSubscriberEnabled($websiteId);
  100. $emails = $contactSubscribers->getColumnValues('email');
  101. $emailContactIds = $contactSubscribers->getColumnValues('email_contact_id');
  102. $subscribersFile = strtolower($website->getCode() . '_subscribers_with_sales_' . date('d_m_Y_His') . '.csv');
  103. $this->helper->log('Subscriber file with sales : ' . $subscribersFile);
  104. $contactSubscriberCollection = $this->emailContactResource->getContactCollectionByEmail($emails);
  105. //no subscribers found
  106. if ($contactSubscriberCollection->getSize() == 0) {
  107. return $updated;
  108. }
  109. $headers = ['Email', 'EmailType', 'OptInType'];
  110. $headers = array_merge($headers, array_values($mappedHash));
  111. //consentdata append
  112. if ($isConsentSubscriberEnabled) {
  113. $headers = array_merge($headers, \Dotdigitalgroup\Email\Model\Consent::$bulkFields);
  114. $contactSubscriberCollection->getSelect()
  115. ->joinLeft(
  116. ['ecc' => $contactSubscriberCollection->getTable(Schema::EMAIL_CONTACT_CONSENT_TABLE)],
  117. "ecc.email_contact_id = main_table.email_contact_id",
  118. ['consent_url', 'consent_datetime', 'consent_ip', 'consent_user_agent']
  119. );
  120. }
  121. //subscribers sales data
  122. $salesDataForSubscribers = $this->emailContactResource->getSalesDataForSubscribersWithOrderStatusesAndBrand(
  123. $emails,
  124. $websiteId
  125. );
  126. //write headers to the file
  127. $this->file->outputCSV($this->file->getFilePath($subscribersFile), $headers);
  128. foreach ($contactSubscriberCollection as $subscriber) {
  129. if (isset($salesDataForSubscribers[$subscriber->getEmail()])) {
  130. $subscriber = $this->setSalesDataOnItem(
  131. $salesDataForSubscribers[$subscriber->getEmail()],
  132. $subscriber
  133. );
  134. }
  135. if (! isset($stores[$subscriber->getStoreId()])) {
  136. $stores[$subscriber->getStoreId()] = $this->helper->storeManager->getStore($subscriber->getStoreId());
  137. }
  138. $optInType = $this->configHelper->getOptInType($stores[$subscriber->getStoreId()]);
  139. $connectorSubscriber = $this->contactDataFactory->create();
  140. $connectorSubscriber->setMappingHash($mappedHash);
  141. $connectorSubscriber->setContactData($subscriber);
  142. $email = $subscriber->getEmail();
  143. $outputData = [$email, 'Html', $optInType];
  144. $outputData = array_merge($outputData, $connectorSubscriber->toCSVArray());
  145. $consentUrl = $subscriber->getConsentUrl();
  146. //check for any subscribe or customer consent enabled
  147. if ($isConsentSubscriberEnabled && $consentUrl) {
  148. $consentUrl = $subscriber->getConsentUrl();
  149. $consentText = $consentModel->getConsentTextForWebsite($consentUrl, $websiteId);
  150. $consentData = [
  151. $consentText,
  152. $consentUrl,
  153. $this->dateTime->date(\Zend_Date::ISO_8601, $subscriber->getConsentDatetime()),
  154. $subscriber->getConsentIp(),
  155. $subscriber->getConsentUserAgent()
  156. ];
  157. $outputData = array_merge($outputData, $consentData);
  158. }
  159. $this->file->outputCSV($this->file->getFilePath($subscribersFile), $outputData);
  160. //clear contactSubscriberCollection and free memory
  161. $subscriber->clearInstance();
  162. $updated++;
  163. }
  164. $this->registerWithImporter($emailContactIds, $subscribersFile, $websiteId);
  165. return $updated;
  166. }
  167. /**
  168. * @param array $salesData
  169. * @param \Dotdigitalgroup\Email\Model\Contact $item
  170. *
  171. * @return \Dotdigitalgroup\Email\Model\Contact
  172. */
  173. private function setSalesDataOnItem($salesData, $item)
  174. {
  175. foreach ($salesData as $column => $value) {
  176. $item->setData($column, $value);
  177. }
  178. return $item;
  179. }
  180. /**
  181. * Register data with importer
  182. *
  183. * @param array $emailContactIds
  184. * @param string $subscribersFile
  185. * @param $websiteId
  186. */
  187. private function registerWithImporter($emailContactIds, $subscribersFile, $websiteId)
  188. {
  189. $subscriberNum = count($emailContactIds);
  190. if (is_file($this->file->getFilePath($subscribersFile))) {
  191. if ($subscriberNum > 0) {
  192. //register in queue with importer
  193. $check = $this->importerFactory->create()
  194. ->registerQueue(
  195. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBERS,
  196. '',
  197. \Dotdigitalgroup\Email\Model\Importer::MODE_BULK,
  198. $websiteId,
  199. $subscribersFile
  200. );
  201. //mark contacts as imported
  202. if ($check) {
  203. $this->emailContactResource->updateSubscribers($emailContactIds);
  204. }
  205. }
  206. }
  207. }
  208. }