RegisterWishlist.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <?php
  2. namespace Dotdigitalgroup\Email\Observer\Customer;
  3. /**
  4. * Register new wishlist automation.
  5. */
  6. class RegisterWishlist implements \Magento\Framework\Event\ObserverInterface
  7. {
  8. /**
  9. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist
  10. */
  11. private $emailWishlistResource;
  12. /**
  13. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory
  14. */
  15. private $emailWishlistCollection;
  16. /**
  17. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Automation
  18. */
  19. private $automationResource;
  20. /**
  21. * @var \Dotdigitalgroup\Email\Helper\Data
  22. */
  23. private $helper;
  24. /**
  25. * @var \Magento\Store\Model\StoreManagerInterface
  26. */
  27. private $storeManager;
  28. /**
  29. * @var \Dotdigitalgroup\Email\Model\WishlistFactory
  30. */
  31. private $wishlistFactory;
  32. /**
  33. * @var \Magento\Customer\Api\CustomerRepositoryInterface
  34. */
  35. private $customer;
  36. /**
  37. * @var \Dotdigitalgroup\Email\Model\AutomationFactory
  38. */
  39. private $automationFactory;
  40. /**
  41. * RegisterWishlist constructor.
  42. * @param \Dotdigitalgroup\Email\Model\AutomationFactory $automationFactory
  43. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Automation $automationResource
  44. * @param \Magento\Customer\Api\CustomerRepositoryInterface $customer
  45. * @param \Dotdigitalgroup\Email\Model\WishlistFactory $wishlistFactory
  46. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory $emailWishlistCollection
  47. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist $emailWishlistResource
  48. * @param \Dotdigitalgroup\Email\Helper\Data $data
  49. * @param \Magento\Store\Model\StoreManagerInterface $storeManagerInterface
  50. */
  51. public function __construct(
  52. \Dotdigitalgroup\Email\Model\AutomationFactory $automationFactory,
  53. \Dotdigitalgroup\Email\Model\ResourceModel\Automation $automationResource,
  54. \Magento\Customer\Api\CustomerRepositoryInterface $customer,
  55. \Dotdigitalgroup\Email\Model\WishlistFactory $wishlistFactory,
  56. \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory $emailWishlistCollection,
  57. \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist $emailWishlistResource,
  58. \Dotdigitalgroup\Email\Helper\Data $data,
  59. \Magento\Store\Model\StoreManagerInterface $storeManagerInterface
  60. ) {
  61. $this->emailWishlistCollection = $emailWishlistCollection;
  62. $this->automationResource = $automationResource;
  63. $this->emailWishlistResource = $emailWishlistResource;
  64. $this->automationFactory = $automationFactory;
  65. $this->customer = $customer;
  66. $this->wishlistFactory = $wishlistFactory;
  67. $this->helper = $data;
  68. $this->storeManager = $storeManagerInterface;
  69. }
  70. /**
  71. * @param \Magento\Framework\Event\Observer $observer
  72. * @return $this
  73. */
  74. public function execute(\Magento\Framework\Event\Observer $observer)
  75. {
  76. try {
  77. $wishlist = $observer->getEvent()->getWishlist();
  78. $customer = $this->customer->getById($wishlist->getCustomerId());
  79. //if api is enabled
  80. if ($this->helper->isEnabled($customer->getWebsiteId())) {
  81. $itemCount = count($wishlist->getItemCollection());
  82. $emailWishlist = $this->getEmailWishlistById($wishlist->getId());
  83. //update wishlist
  84. if ($emailWishlist) {
  85. //update the items count and reset the sync
  86. $this->updateWishlistAndReset($emailWishlist, $itemCount);
  87. } else {
  88. //new wishlist with items
  89. if ($wishlist->getCustomerId() && $wishlist->getWishlistId()) {
  90. $this->registerWishlist($wishlist, $itemCount, $customer);
  91. }
  92. }
  93. }
  94. } catch (\Exception $e) {
  95. $this->helper->error((string)$e, []);
  96. }
  97. return $this;
  98. }
  99. /**
  100. * Register new wishlist.
  101. *
  102. * @param \Dotdigitalgroup\Email\Model\Wishlist $wishlist
  103. * @param int $itemCount
  104. * @param \Magento\Customer\Api\Data\CustomerInterface $customer
  105. */
  106. private function registerWishlist($wishlist, $itemCount, $customer)
  107. {
  108. try {
  109. $emailWishlist = $this->wishlistFactory->create();
  110. //if wishlist exist not to save again
  111. if (! $emailWishlist->getWishlist($wishlist->getWishlistId())) {
  112. $storeName = $this->storeManager->getStore($customer->getStoreId())->getName();
  113. $emailWishlist->setWishlistId($wishlist->getWishlistId())
  114. ->setCustomerId($wishlist->getCustomerId())
  115. ->setStoreId($customer->getStoreId())
  116. ->setItemCount($itemCount);
  117. $this->emailWishlistResource->save($emailWishlist);
  118. $this->registerWithAutomation($wishlist, $customer, $storeName);
  119. }
  120. } catch (\Exception $e) {
  121. $this->helper->error((string)$e, []);
  122. }
  123. }
  124. /**
  125. * @param int $wishlistId
  126. * @return bool|\Dotdigitalgroup\Email\Model\Wishlist
  127. */
  128. private function getEmailWishlistById($wishlistId)
  129. {
  130. return $this->emailWishlistCollection->create()
  131. ->getWishlistById($wishlistId);
  132. }
  133. /**
  134. * @param \Dotdigitalgroup\Email\Model\Wishlist $emailWishlist
  135. * @param int $itemCount
  136. */
  137. private function updateWishlistAndReset($emailWishlist, $itemCount)
  138. {
  139. try {
  140. $originalItemCount = $emailWishlist->getItemCount();
  141. $emailWishlist->setItemCount($itemCount);
  142. //first item added to wishlist
  143. if ($itemCount == 1 && $originalItemCount == 0) {
  144. $emailWishlist->setWishlistImported(null);
  145. } elseif ($emailWishlist->getWishlistImported()) {
  146. $emailWishlist->setWishlistModified(1);
  147. }
  148. $this->emailWishlistResource->save($emailWishlist);
  149. } catch (\Exception $e) {
  150. $this->helper->error((string)$e, []);
  151. }
  152. }
  153. /**
  154. * @param \Dotdigitalgroup\Email\Model\Wishlist $wishlist
  155. * @param \Magento\Customer\Api\Data\CustomerInterface $customer
  156. * @param string $storeName
  157. */
  158. private function registerWithAutomation($wishlist, $customer, $storeName)
  159. {
  160. try {
  161. $programId = $this->helper->getWebsiteConfig(
  162. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_AUTOMATION_STUDIO_WISHLIST,
  163. $customer->getWebsiteId()
  164. );
  165. //wishlist program mapped
  166. if ($programId) {
  167. $automation = $this->automationFactory->create();
  168. //save automation type
  169. $automation->setEmail($customer->getEmail())
  170. ->setAutomationType(\Dotdigitalgroup\Email\Model\Sync\Automation::AUTOMATION_TYPE_NEW_WISHLIST)
  171. ->setEnrolmentStatus(\Dotdigitalgroup\Email\Model\Sync\Automation::AUTOMATION_STATUS_PENDING)
  172. ->setTypeId($wishlist->getWishlistId())
  173. ->setWebsiteId($customer->getWebsiteId())
  174. ->setStoreName($storeName)
  175. ->setProgramId($programId);
  176. $this->automationResource->save($automation);
  177. }
  178. } catch (\Exception $e) {
  179. $this->helper->error((string)$e, []);
  180. }
  181. }
  182. }