SubscriberExporter.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Newsletter;
  3. use Dotdigitalgroup\Email\Setup\Schema;
  4. class SubscriberExporter
  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\Store\Model\StoreManagerInterface
  20. */
  21. public $storeManager;
  22. /**
  23. * @var \Dotdigitalgroup\Email\Helper\Config
  24. */
  25. public $configHelper;
  26. /**
  27. * @var \Magento\Framework\Stdlib\DateTime\DateTime
  28. */
  29. public $dateTime;
  30. /**
  31. * @var \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory
  32. */
  33. public $subscriberCollectionFactory;
  34. /**
  35. *
  36. * @var array
  37. */
  38. private $contactIds;
  39. /**
  40. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Consent
  41. */
  42. private $consentResource;
  43. /**
  44. * @var \Dotdigitalgroup\Email\Model\ConsentFactory
  45. */
  46. private $consentFactory;
  47. /**
  48. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Contact
  49. */
  50. private $contactResource;
  51. /**
  52. * SubscriberExporter constructor.
  53. * @param \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  54. * @param \Dotdigitalgroup\Email\Helper\File $file
  55. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  56. * @param \Dotdigitalgroup\Email\Helper\Config $configHelper
  57. * @param \Dotdigitalgroup\Email\Model\ConsentFactory $consentFactory
  58. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Consent $consentResource
  59. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource
  60. * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
  61. * @param \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory $subscriberCollectionFactory
  62. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  63. */
  64. public function __construct(
  65. \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory,
  66. \Dotdigitalgroup\Email\Helper\File $file,
  67. \Dotdigitalgroup\Email\Helper\Data $helper,
  68. \Dotdigitalgroup\Email\Helper\Config $configHelper,
  69. \Dotdigitalgroup\Email\Model\ConsentFactory $consentFactory,
  70. \Dotdigitalgroup\Email\Model\ResourceModel\Consent $consentResource,
  71. \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource,
  72. \Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
  73. \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory $subscriberCollectionFactory,
  74. \Magento\Store\Model\StoreManagerInterface $storeManager
  75. ) {
  76. $this->file = $file;
  77. $this->helper = $helper;
  78. $this->dateTime = $dateTime;
  79. $this->configHelper = $configHelper;
  80. $this->storeManager = $storeManager;
  81. $this->consentFactory = $consentFactory;
  82. $this->consentResource = $consentResource;
  83. $this->contactResource = $contactResource;
  84. $this->importerFactory = $importerFactory;
  85. $this->subscriberCollectionFactory = $subscriberCollectionFactory;
  86. }
  87. /**
  88. * Export subscribers
  89. *
  90. * @param \Magento\Store\Model\Website $website
  91. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact\Collection $emailContactCollection
  92. *
  93. * @return int
  94. */
  95. public function exportSubscribers($website, $emailContactCollection)
  96. {
  97. $updated = 0;
  98. $websiteId = $website->getId();
  99. $subscribersFilename = strtolower($website->getCode() . '_subscribers_' . date('d_m_Y_His') . '.csv');
  100. $consentModel = $this->consentFactory->create();
  101. //get mapped storename
  102. $subscriberStorename = $this->helper->getMappedStoreName($website);
  103. //file headers
  104. $headers = ['Email', 'EmailType', $subscriberStorename, 'OptInType'];
  105. //contentinsight is enabled include additional headers
  106. $isConsentSubscriberEnabled = $this->configHelper->isConsentSubscriberEnabled($websiteId);
  107. if ($isConsentSubscriberEnabled) {
  108. $headers = array_merge($headers, \Dotdigitalgroup\Email\Model\Consent::$bulkFields);
  109. $emailContactCollection->getSelect()
  110. ->joinLeft(
  111. ['ecc' => $emailContactCollection->getTable(Schema::EMAIL_CONTACT_CONSENT_TABLE)],
  112. "ecc.email_contact_id = main_table.email_contact_id",
  113. ['consent_url', 'consent_datetime', 'consent_ip', 'consent_user_agent']
  114. );
  115. }
  116. $subscribersData = $this->subscriberCollectionFactory->create()
  117. ->addFieldToFilter(
  118. 'subscriber_email',
  119. ['in' => $emailContactCollection->getColumnValues('email')]
  120. )
  121. ->addFieldToSelect(['subscriber_email', 'store_id']);
  122. //csv file data with headers
  123. $this->file->outputCSV($this->file->getFilePath($subscribersFilename), $headers);
  124. foreach ($emailContactCollection as $contact) {
  125. $email = $contact->getEmail();
  126. $storeId = $this->getStoreIdForSubscriber(
  127. $email,
  128. $subscribersData->getItems()
  129. );
  130. $store = $this->storeManager->getStore($storeId);
  131. $storeName = $store->getName();
  132. $optInType = $this->configHelper->getOptInType($store);
  133. // save data for subscribers
  134. $outputData = [$email, 'Html', $storeName, $optInType];
  135. $consentUrl = $contact->getConsentUrl();
  136. //check for any subscribe or customer consent enabled
  137. if ($isConsentSubscriberEnabled && $consentUrl) {
  138. $consentText = $consentModel->getConsentTextForWebsite($consentUrl, $websiteId);
  139. $consentData = [
  140. $consentText,
  141. $consentUrl,
  142. $this->dateTime->date(\Zend_Date::ISO_8601, $contact->getConsentDatetime()),
  143. $contact->getConsentIp(),
  144. $contact->getConsentUserAgent()
  145. ];
  146. $outputData = array_merge($outputData, $consentData);
  147. }
  148. $this->contactIds[] = $contact->getId();
  149. //csv subscriber data
  150. $this->file->outputCSV($this->file->getFilePath($subscribersFilename), $outputData);
  151. $updated++;
  152. }
  153. //mark is subscriber imported for contacts
  154. if (! empty($this->contactIds)) {
  155. $this->contactResource->updateSubscribers($this->contactIds);
  156. }
  157. $this->helper->log('Subscriber filename: ' . $subscribersFilename);
  158. //register in queue with importer
  159. $this->importerFactory->create()
  160. ->registerQueue(
  161. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBERS,
  162. '',
  163. \Dotdigitalgroup\Email\Model\Importer::MODE_BULK,
  164. $websiteId,
  165. $subscribersFilename
  166. );
  167. return $updated;
  168. }
  169. /**
  170. * Get the store id from newsletter_subscriber, return default if not found.
  171. *
  172. * @param string $email
  173. * @param array $subscribers
  174. *
  175. * @return int
  176. */
  177. public function getStoreIdForSubscriber($email, $subscribers)
  178. {
  179. $defaultStore = 1;
  180. foreach ($subscribers as $subscriber) {
  181. if ($subscriber['subscriber_email'] == $email) {
  182. return $subscriber['store_id'];
  183. }
  184. }
  185. return $defaultStore;
  186. }
  187. }