Wishlist.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Sync;
  3. use Dotdigitalgroup\Email\Model\Importer;
  4. /**
  5. * Sync Wishlists.
  6. *
  7. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  8. */
  9. class Wishlist
  10. {
  11. /**
  12. * @var \Dotdigitalgroup\Email\Helper\Data
  13. */
  14. private $helper;
  15. /**
  16. * @var array
  17. */
  18. private $wishlists;
  19. /**
  20. * @var array
  21. */
  22. private $wishlistIds = [];
  23. /**
  24. * @var mixed
  25. */
  26. private $start;
  27. /**
  28. * @var int
  29. */
  30. private $countWishlists = 0;
  31. /**
  32. * @var \Magento\Customer\Model\CustomerFactory
  33. */
  34. private $customerFactory;
  35. /**
  36. * @var \Dotdigitalgroup\Email\Model\ImporterFactory
  37. */
  38. private $importerFactory;
  39. /**
  40. * @var \Dotdigitalgroup\Email\Model\ResourceModel\WishlistFactory
  41. */
  42. private $wishlist;
  43. /**
  44. * @var \Dotdigitalgroup\Email\Model\Customer\WishlistFactory
  45. */
  46. private $wishlistFactory;
  47. /**
  48. * @var \Dotdigitalgroup\Email\Model\Customer\Wishlist\ItemFactory
  49. */
  50. private $itemFactory;
  51. /**
  52. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory
  53. */
  54. private $wishlistCollection;
  55. /**
  56. * @var \Magento\Wishlist\Model\ResourceModel\Item\CollectionFactory
  57. */
  58. private $itemCollection;
  59. /**
  60. * @var \Magento\Framework\Stdlib\DateTime\DateTime
  61. */
  62. private $datetime;
  63. /**
  64. * Wishlist constructor.
  65. *
  66. * @param \Magento\Wishlist\Model\ResourceModel\Item\CollectionFactory $itemCollection
  67. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory $wishlistCollection
  68. * @param \Dotdigitalgroup\Email\Model\Customer\Wishlist\ItemFactory $itemFactory
  69. * @param \Dotdigitalgroup\Email\Model\Customer\WishlistFactory $wishlistFactory
  70. * @param \Dotdigitalgroup\Email\Model\ResourceModel\WishlistFactory $wishlist
  71. * @param \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  72. * @param \Magento\Customer\Model\CustomerFactory $customerFactory
  73. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  74. * @param \Magento\Framework\Stdlib\DateTime\DateTime $datetime
  75. */
  76. public function __construct(
  77. \Magento\Wishlist\Model\ResourceModel\Item\CollectionFactory $itemCollection,
  78. \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\CollectionFactory $wishlistCollection,
  79. \Dotdigitalgroup\Email\Model\Customer\Wishlist\ItemFactory $itemFactory,
  80. \Dotdigitalgroup\Email\Model\Customer\WishlistFactory $wishlistFactory,
  81. \Dotdigitalgroup\Email\Model\ResourceModel\WishlistFactory $wishlist,
  82. \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory,
  83. \Magento\Customer\Model\CustomerFactory $customerFactory,
  84. \Dotdigitalgroup\Email\Helper\Data $helper,
  85. \Magento\Framework\Stdlib\DateTime\DateTime $datetime
  86. ) {
  87. $this->itemCollection = $itemCollection;
  88. $this->wishlistCollection = $wishlistCollection;
  89. $this->itemFactory = $itemFactory;
  90. $this->wishlistFactory = $wishlistFactory;
  91. $this->wishlist = $wishlist;
  92. $this->importerFactory = $importerFactory;
  93. $this->customerFactory = $customerFactory;
  94. $this->helper = $helper;
  95. $this->datetime = $datetime;
  96. }
  97. /**
  98. * Sync Wishlists.
  99. *
  100. * @return array
  101. *
  102. * @throws \Magento\Framework\Exception\LocalizedException
  103. */
  104. public function sync()
  105. {
  106. $response = ['success' => true, 'message' => 'Done.'];
  107. $websites = $this->helper->getWebsites();
  108. foreach ($websites as $website) {
  109. $wishlistEnabled = $this->helper->getWebsiteConfig(
  110. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_SYNC_WISHLIST_ENABLED,
  111. $website
  112. );
  113. $apiEnabled = $this->helper->isEnabled($website);
  114. $storeIds = $website->getStoreIds();
  115. if ($wishlistEnabled && $apiEnabled && !empty($storeIds)) {
  116. //using bulk api
  117. $this->start = microtime(true);
  118. $this->exportWishlistForWebsite($website);
  119. //send wishlist as transactional data
  120. if (isset($this->wishlists[$website->getId()])) {
  121. $websiteWishlists = $this->wishlists[$website->getId()];
  122. //register in queue with importer
  123. $this->importerFactory->create()
  124. ->registerQueue(
  125. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_WISHLIST,
  126. $websiteWishlists,
  127. \Dotdigitalgroup\Email\Model\Importer::MODE_BULK,
  128. $website->getId()
  129. );
  130. //mark connector wishlist as imported
  131. $this->setImported($this->wishlistIds);
  132. }
  133. if (! empty($this->wishlists)) {
  134. $message = '----------- Wishlist bulk sync ----------- : ' .
  135. gmdate('H:i:s', microtime(true) - $this->start) .
  136. ', Total synced = ' . $this->countWishlists;
  137. $this->helper->log($message);
  138. }
  139. //using single api
  140. $this->exportWishlistForWebsiteInSingle($website);
  141. }
  142. }
  143. $response['message'] = 'wishlists updated: ' . $this->countWishlists;
  144. return $response;
  145. }
  146. /**
  147. * @param \Magento\Store\Api\Data\WebsiteInterface $website
  148. *
  149. * @return null
  150. */
  151. public function exportWishlistForWebsite(\Magento\Store\Api\Data\WebsiteInterface $website)
  152. {
  153. //reset wishlists
  154. $this->wishlists = [];
  155. $this->wishlistIds = [];
  156. //sync limit
  157. $limit = $this->helper->getWebsiteConfig(
  158. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_TRANSACTIONAL_DATA_SYNC_LIMIT,
  159. $website
  160. );
  161. //wishlist collection
  162. $emailWishlist = $this->getWishlistToImport($website, $limit);
  163. $this->wishlistIds = $emailWishlist->getColumnValues('wishlist_id');
  164. if (! empty($this->wishlistIds)) {
  165. $collection = $this->wishlist->create()
  166. ->getWishlistByIds($this->wishlistIds);
  167. foreach ($collection as $wishlist) {
  168. $connectorWishlist = $this->wishlistFactory->create();
  169. $connectorWishlist->setId($wishlist->getId())
  170. ->setUpdatedAt($wishlist->getUpdatedAt())
  171. ->setCustomerId($wishlist->getCustomerId())
  172. ->setEmail($wishlist->getEmail());
  173. $wishListItemCollection = $this->itemCollection->create()
  174. ->addWishlistFilter($wishlist);
  175. if ($wishListItemCollection->getSize()) {
  176. foreach ($wishListItemCollection as $item) {
  177. $product = $item->getProduct();
  178. $wishlistItem = $this->itemFactory->create();
  179. $wishlistItem->setProduct($product)
  180. ->setQty($item->getQty())
  181. ->setPrice($product);
  182. //store for wishlists
  183. $connectorWishlist->setItem($wishlistItem);
  184. ++$this->countWishlists;
  185. }
  186. //set wishlists for later use
  187. $this->wishlists[$website->getId()][] = $connectorWishlist->expose();
  188. }
  189. }
  190. }
  191. }
  192. /**
  193. * @param \Magento\Store\Api\Data\WebsiteInterface $website
  194. * @param int $limit
  195. *
  196. * @return \Dotdigitalgroup\Email\Model\ResourceModel\Wishlist\Collection
  197. */
  198. public function getWishlistToImport(\Magento\Store\Api\Data\WebsiteInterface $website, $limit = 100)
  199. {
  200. return $this->wishlistCollection->create()
  201. ->getWishlistToImportByWebsite($website, $limit);
  202. }
  203. /**
  204. * Export single wishilist for website.
  205. *
  206. * @param \Magento\Store\Api\Data\WebsiteInterface $website
  207. *
  208. * @return null
  209. */
  210. public function exportWishlistForWebsiteInSingle(\Magento\Store\Api\Data\WebsiteInterface $website)
  211. {
  212. //transactional data limit
  213. $limit = $this->helper->getWebsiteConfig(
  214. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_TRANSACTIONAL_DATA_SYNC_LIMIT,
  215. $website
  216. );
  217. $collection = $this->getModifiedWishlistToImport(
  218. $website,
  219. $limit
  220. );
  221. $this->wishlistIds = [];
  222. //email_wishlist wishlist ids
  223. $wishlistIds = $collection->getColumnValues('wishlist_id');
  224. $wishlistCollection = $this->wishlist->create()
  225. ->getWishlistByIds($wishlistIds);
  226. foreach ($wishlistCollection as $wishlist) {
  227. $wishlistId = $wishlist->getid();
  228. $wishlistItems = $this->itemCollection->create()
  229. ->addWishlistFilter($wishlist);
  230. $connectorWishlist = $this->wishlistFactory->create();
  231. $connectorWishlist->setId($wishlistId)
  232. ->setUpdatedAt($wishlist->getUpdatedAt())
  233. ->setCustomerId($wishlist->getCustomerId())
  234. ->setEmail($wishlist->getEmail());
  235. if ($wishlistItems->getSize()) {
  236. foreach ($wishlistItems as $item) {
  237. $product = $item->getProduct();
  238. $wishlistItem = $this->itemFactory->create()
  239. ->setProduct($product)
  240. ->setQty($item->getQty())
  241. ->setPrice($product);
  242. //store for wishlists
  243. $connectorWishlist->setItem($wishlistItem);
  244. $this->countWishlists++;
  245. }
  246. //send wishlist as transactional data
  247. $this->start = microtime(true);
  248. //register in queue with importer
  249. $check = $this->importerFactory->create()
  250. ->registerQueue(
  251. Importer::IMPORT_TYPE_WISHLIST,
  252. $connectorWishlist->expose(),
  253. Importer::MODE_SINGLE,
  254. $website->getId()
  255. );
  256. if ($check) {
  257. $this->wishlistIds[] = $wishlistId;
  258. }
  259. } else {
  260. //register in queue with importer
  261. $check = $this->importerFactory->create()
  262. ->registerQueue(
  263. Importer::IMPORT_TYPE_WISHLIST,
  264. [$wishlist->getId()],
  265. Importer::MODE_SINGLE_DELETE,
  266. $website->getId()
  267. );
  268. if ($check) {
  269. $this->wishlistIds[] = $wishlistId;
  270. }
  271. }
  272. }
  273. if (!empty($this->wishlistIds)) {
  274. $this->setImported($this->wishlistIds, true);
  275. }
  276. }
  277. /**
  278. * Get wishlists marked as modified for website.
  279. *
  280. * @param \Magento\Store\Api\Data\WebsiteInterface $website
  281. * @param int $limit
  282. * @return mixed
  283. */
  284. public function getModifiedWishlistToImport(\Magento\Store\Api\Data\WebsiteInterface $website, $limit = 100)
  285. {
  286. return $this->wishlistCollection->create()
  287. ->getModifiedWishlistToImportByWebsite($website, $limit);
  288. }
  289. /**
  290. * @param array $ids
  291. * @param bool $modified
  292. *
  293. * @return null
  294. */
  295. public function setImported($ids, $modified = false)
  296. {
  297. $now = $this->datetime->gmtDate();
  298. $this->wishlist->create()
  299. ->setImported($ids, $now, $modified);
  300. }
  301. }