Order.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Sales;
  3. /**
  4. * Transactional data for orders to sync.
  5. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  6. */
  7. class Order
  8. {
  9. /**
  10. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Campaign
  11. */
  12. private $campaignResource;
  13. /**
  14. * @var string
  15. */
  16. private $dateTime;
  17. /**
  18. * @var array
  19. */
  20. private $reviewCollection = [];
  21. /**
  22. * @var \Dotdigitalgroup\Email\Helper\Data
  23. */
  24. private $helper;
  25. /**
  26. * @var \Magento\Store\Model\StoreManagerInterface
  27. */
  28. private $storeManager;
  29. /**
  30. * @var \Dotdigitalgroup\Email\Model\CampaignFactory
  31. */
  32. private $campaignFactory;
  33. /**
  34. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Campaign\CollectionFactory
  35. */
  36. private $campaignCollection;
  37. /**
  38. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Order\CollectionFactory
  39. */
  40. private $orderCollection;
  41. /**
  42. * @var \Dotdigitalgroup\Email\Model\RulesFactory
  43. */
  44. private $rulesFactory;
  45. /**
  46. * @var \Dotdigitalgroup\Email\Model\DateIntervalFactory
  47. */
  48. private $dateIntervalFactory;
  49. /**
  50. * Order constructor.
  51. *
  52. * @param \Dotdigitalgroup\Email\Model\RulesFactory $rulesFactory
  53. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Order\CollectionFactory $orderCollection
  54. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Campaign\CollectionFactory $campaignCollection
  55. * @param \Dotdigitalgroup\Email\Model\CampaignFactory $campaignFactory
  56. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Campaign $campaignResource
  57. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  58. * @param \Magento\Framework\Stdlib\DateTime $datetime
  59. * @param \Magento\Store\Model\StoreManagerInterface $storeManagerInterface
  60. * @param \Dotdigitalgroup\Email\Model\DateIntervalFactory $dateIntervalFactory
  61. */
  62. public function __construct(
  63. \Dotdigitalgroup\Email\Model\RulesFactory $rulesFactory,
  64. \Dotdigitalgroup\Email\Model\ResourceModel\Order\CollectionFactory $orderCollection,
  65. \Dotdigitalgroup\Email\Model\ResourceModel\Campaign\CollectionFactory $campaignCollection,
  66. \Dotdigitalgroup\Email\Model\CampaignFactory $campaignFactory,
  67. \Dotdigitalgroup\Email\Model\ResourceModel\Campaign $campaignResource,
  68. \Dotdigitalgroup\Email\Helper\Data $helper,
  69. \Magento\Framework\Stdlib\DateTime $datetime,
  70. \Magento\Store\Model\StoreManagerInterface $storeManagerInterface,
  71. \Dotdigitalgroup\Email\Model\DateIntervalFactory $dateIntervalFactory
  72. ) {
  73. $this->dateIntervalFactory = $dateIntervalFactory;
  74. $this->campaignResource = $campaignResource;
  75. $this->rulesFactory = $rulesFactory;
  76. $this->orderCollection = $orderCollection;
  77. $this->campaignCollection = $campaignCollection;
  78. $this->campaignFactory = $campaignFactory;
  79. $this->helper = $helper;
  80. $this->dateTime = $datetime;
  81. $this->storeManager = $storeManagerInterface;
  82. }
  83. /**
  84. * Create review campaigns
  85. *
  86. * @return null
  87. */
  88. public function createReviewCampaigns()
  89. {
  90. $this->searchOrdersForReview();
  91. foreach ($this->reviewCollection as $websiteId => $collection) {
  92. $this->registerCampaign($collection, $websiteId);
  93. }
  94. }
  95. /**
  96. * Register review campaign.
  97. *
  98. * @param \Magento\Sales\Model\ResourceModel\Order\Collection $collection
  99. * @param int $websiteId
  100. *
  101. * @return null
  102. */
  103. public function registerCampaign($collection, $websiteId)
  104. {
  105. //review campaign id
  106. $campaignId = $this->helper->getCampaign($websiteId);
  107. if ($campaignId) {
  108. foreach ($collection as $order) {
  109. $this->helper->log(
  110. '-- Order Review: ' . $order->getIncrementId()
  111. . ' Campaign Id: ' . $campaignId
  112. );
  113. try {
  114. $emailCampaign = $this->campaignFactory->create()
  115. ->setEmail($order->getCustomerEmail())
  116. ->setStoreId($order->getStoreId())
  117. ->setCampaignId($campaignId)
  118. ->setEventName('Order Review')
  119. ->setCreatedAt($this->dateTime->formatDate(true))
  120. ->setOrderIncrementId($order->getIncrementId())
  121. ->setQuoteId($order->getQuoteId());
  122. if ($order->getCustomerId()) {
  123. $emailCampaign->setCustomerId($order->getCustomerId());
  124. }
  125. $this->campaignResource->saveItem($emailCampaign);
  126. } catch (\Exception $e) {
  127. $this->helper->debug((string)$e, []);
  128. }
  129. }
  130. }
  131. }
  132. /**
  133. * Search for orders to review per website.
  134. *
  135. * @return null
  136. */
  137. public function searchOrdersForReview()
  138. {
  139. $websites = $this->helper->getwebsites(true);
  140. foreach ($websites as $website) {
  141. $apiEnabled = $this->helper->isEnabled($website);
  142. if ($apiEnabled
  143. && $this->helper->getWebsiteConfig(
  144. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_REVIEWS_ENABLED,
  145. $website
  146. )
  147. && $this->helper->getOrderStatus($website)
  148. && $this->helper->getDelay($website)
  149. ) {
  150. $storeIds = $website->getStoreIds();
  151. if (empty($storeIds)) {
  152. continue;
  153. }
  154. $orderStatusFromConfig = $this->helper->getOrderStatus(
  155. $website
  156. );
  157. $delayInDays = $this->helper->getDelay(
  158. $website
  159. );
  160. $campaignCollection = $this->campaignCollection->create()
  161. ->getCollectionByEvent('Order Review');
  162. $campaignOrderIds = $campaignCollection->getColumnValues(
  163. 'order_increment_id'
  164. );
  165. $fromTime = new \DateTime('now', new \DateTimezone('UTC'));
  166. $interval = $this->dateIntervalFactory->create(
  167. ['interval_spec' => sprintf('P%sD', $delayInDays)]
  168. );
  169. $fromTime->sub($interval);
  170. $toTime = clone $fromTime;
  171. $fromTime->sub($this->dateIntervalFactory->create(['interval_spec' => 'PT2H']));
  172. $fromDate = $fromTime->format('Y-m-d H:i:s');
  173. $toDate = $toTime->format('Y-m-d H:i:s');
  174. $created = ['from' => $fromDate, 'to' => $toDate, 'date' => true];
  175. $collection = $this->orderCollection->create()
  176. ->getSalesCollectionForReviews(
  177. $orderStatusFromConfig,
  178. $created,
  179. $website,
  180. $campaignOrderIds
  181. );
  182. //process rules on collection
  183. $collection = $this->rulesFactory->create()
  184. ->process(
  185. $collection,
  186. \Dotdigitalgroup\Email\Model\Rules::REVIEW,
  187. $website->getId()
  188. );
  189. if ($collection->getSize()) {
  190. $this->reviewCollection[$website->getId()] = $collection;
  191. }
  192. }
  193. }
  194. }
  195. /**
  196. * Get customer last order id.
  197. *
  198. * @param \Magento\Customer\Model\Customer $customer
  199. *
  200. * @return bool|mixed
  201. */
  202. public function getCustomerLastOrderId(\Magento\Customer\Model\Customer $customer)
  203. {
  204. $storeIds = $this->storeManager->getWebsite(
  205. $customer->getWebsiteId()
  206. )->getStoreIds();
  207. return $this->orderCollection->create()
  208. ->getCustomerLastOrderId($customer, $storeIds);
  209. }
  210. /**
  211. * Get customer last quote id.
  212. *
  213. * @param \Magento\Customer\Model\Customer $customer
  214. *
  215. * @return bool|mixed
  216. */
  217. public function getCustomerLastQuoteId(\Magento\Customer\Model\Customer $customer)
  218. {
  219. $storeIds = $this->storeManager->getWebsite(
  220. $customer->getWebsiteId()
  221. )->getStoreIds();
  222. return $this->orderCollection->create()
  223. ->getCustomerLastQuoteId($customer, $storeIds);
  224. }
  225. }