ChangeContactSubscription.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace Dotdigitalgroup\Email\Observer\Newsletter;
  3. /**
  4. * Contact newsletter subscription change.
  5. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  6. */
  7. class ChangeContactSubscription implements \Magento\Framework\Event\ObserverInterface
  8. {
  9. /**
  10. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Contact
  11. */
  12. private $contactResource;
  13. /**
  14. * @var \Dotdigitalgroup\Email\Helper\Data
  15. */
  16. private $helper;
  17. /**
  18. * @var \Magento\Framework\Registry
  19. */
  20. private $registry;
  21. /**
  22. * @var \Magento\Store\Model\StoreManagerInterface
  23. */
  24. private $storeManager;
  25. /**
  26. * @var \Dotdigitalgroup\Email\Model\ContactFactory
  27. */
  28. private $contactFactory;
  29. /**
  30. * @var \Dotdigitalgroup\Email\Model\AutomationFactory
  31. */
  32. private $automationFactory;
  33. /**
  34. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Automation
  35. */
  36. private $automationResource;
  37. /**
  38. * @var \Dotdigitalgroup\Email\Model\ImporterFactory
  39. */
  40. private $importerFactory;
  41. /**
  42. * @var bool
  43. */
  44. private $isSubscriberNew;
  45. /**
  46. * ChangeContactSubscription constructor.
  47. * @param \Dotdigitalgroup\Email\Model\AutomationFactory $automationFactory
  48. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Automation $automationResource
  49. * @param \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory
  50. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource
  51. * @param \Magento\Framework\Registry $registry
  52. * @param \Dotdigitalgroup\Email\Helper\Data $data
  53. * @param \Magento\Store\Model\StoreManagerInterface $storeManagerInterface
  54. * @param \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  55. */
  56. public function __construct(
  57. \Dotdigitalgroup\Email\Model\AutomationFactory $automationFactory,
  58. \Dotdigitalgroup\Email\Model\ResourceModel\Automation $automationResource,
  59. \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory,
  60. \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource,
  61. \Magento\Framework\Registry $registry,
  62. \Dotdigitalgroup\Email\Helper\Data $data,
  63. \Magento\Store\Model\StoreManagerInterface $storeManagerInterface,
  64. \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  65. ) {
  66. $this->contactResource = $contactResource;
  67. $this->automationFactory = $automationFactory;
  68. $this->automationResource = $automationResource;
  69. $this->contactFactory = $contactFactory;
  70. $this->helper = $data;
  71. $this->storeManager = $storeManagerInterface;
  72. $this->registry = $registry;
  73. $this->importerFactory = $importerFactory->create();
  74. }
  75. /**
  76. * Change contact subscription status.
  77. *
  78. * @param \Magento\Framework\Event\Observer $observer
  79. *
  80. * @return $this
  81. */
  82. public function execute(\Magento\Framework\Event\Observer $observer)
  83. {
  84. $subscriber = $observer->getEvent()->getSubscriber();
  85. $this->isSubscriberNew = $subscriber->isObjectNew();
  86. $email = $subscriber->getEmail();
  87. $storeId = $subscriber->getStoreId();
  88. $subscriberStatus = $subscriber->getSubscriberStatus();
  89. $websiteId = $this->storeManager->getStore($subscriber->getStoreId())
  90. ->getWebsiteId();
  91. //api is enabled
  92. if (!$this->helper->isEnabled($websiteId)) {
  93. return $this;
  94. }
  95. try {
  96. $contactEmail = $this->contactFactory->create()
  97. ->loadByCustomerEmail($email, $websiteId);
  98. //update the contact
  99. $contactEmail->setStoreId($storeId)
  100. ->setSubscriberStatus($subscriberStatus);
  101. // only for subscribers
  102. if ($subscriberStatus == \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED) {
  103. //Set contact as subscribed
  104. $contactEmail->setSubscriberImported(null)
  105. ->setIsSubscriber('1');
  106. //Subscriber subscribed when it is suppressed in table then re-subscribe
  107. if ($contactEmail->getSuppressed()) {
  108. $this->importerFactory->registerQueue(
  109. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBER_RESUBSCRIBED,
  110. ['email' => $email],
  111. \Dotdigitalgroup\Email\Model\Importer::MODE_SUBSCRIBER_RESUBSCRIBED,
  112. $websiteId
  113. );
  114. //Set to subscriber imported and reset the subscriber as suppressed
  115. $contactEmail->setSubscriberImported(1)
  116. ->setSuppressed(null);
  117. }
  118. //save contact
  119. $this->contactResource->save($contactEmail);
  120. //not subscribed
  121. } else {
  122. //skip if contact is suppressed
  123. if ($contactEmail->getSuppressed()) {
  124. return $this;
  125. }
  126. $contactEmail->setSubscriberImported(1)
  127. ->setIsSubscriber(null);
  128. //save contact
  129. $this->contactResource->save($contactEmail);
  130. //need to confirm enabled, to keep before the subscription data for contentinsight.
  131. if ($subscriberStatus == \Magento\Newsletter\Model\Subscriber::STATUS_UNCONFIRMED ||
  132. $subscriberStatus == \Magento\Newsletter\Model\Subscriber::STATUS_NOT_ACTIVE) {
  133. return $this;
  134. }
  135. //Add subscriber update to importer queue
  136. $this->importerFactory->registerQueue(
  137. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBER_UPDATE,
  138. ['email' => $email, 'id' => $contactEmail->getId()],
  139. \Dotdigitalgroup\Email\Model\Importer::MODE_SUBSCRIBER_UPDATE,
  140. $websiteId
  141. );
  142. }
  143. // fix for a multiple hit of the observer. stop adding the duplicates on the automation
  144. $emailReg = $this->registry->registry($email . '_subscriber_save');
  145. if ($emailReg) {
  146. return $this;
  147. }
  148. $this->registry->unregister($email . '_subscriber_save'); // additional measure
  149. $this->registry->register($email . '_subscriber_save', $email);
  150. //add subscriber to automation
  151. $this->addSubscriberToAutomation($email, $subscriber, $websiteId);
  152. } catch (\Exception $e) {
  153. $this->helper->debug((string)$e, []);
  154. }
  155. return $this;
  156. }
  157. /**
  158. * Register subscriber to automation.
  159. *
  160. * @param string $email
  161. * @param \Magento\Newsletter\Model\Subscriber $subscriber
  162. * @param string|int|null $websiteId
  163. *
  164. * @return void
  165. */
  166. private function addSubscriberToAutomation($email, $subscriber, $websiteId)
  167. {
  168. $storeId = $subscriber->getStoreId();
  169. $store = $this->storeManager->getStore($storeId);
  170. $programId = $this->helper->getWebsiteConfig(
  171. 'connector_automation/visitor_automation/subscriber_automation',
  172. $websiteId
  173. );
  174. //not mapped or subscriber is not new then ignore
  175. if (! $programId || ! $this->isSubscriberNew) {
  176. return;
  177. }
  178. //save subscriber to the queue
  179. $automation = $this->automationFactory->create()
  180. ->setEmail($email)
  181. ->setAutomationType(
  182. \Dotdigitalgroup\Email\Model\Sync\Automation::AUTOMATION_TYPE_NEW_SUBSCRIBER
  183. )
  184. ->setEnrolmentStatus(
  185. \Dotdigitalgroup\Email\Model\Sync\Automation::AUTOMATION_STATUS_PENDING
  186. )
  187. ->setTypeId($subscriber->getId())
  188. ->setWebsiteId($websiteId)
  189. ->setStoreName($store->getName())
  190. ->setProgramId($programId);
  191. $this->automationResource->save($automation);
  192. }
  193. }