DotmailerCouponGenerator.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\SalesRule;
  3. use Magento\Framework\Stdlib\DateTime;
  4. use Magento\SalesRule\Model\Coupon\CodegeneratorInterface;
  5. use Magento\SalesRule\Model\ResourceModel\Rule;
  6. use Magento\SalesRule\Model\RuleFactory;
  7. use Magento\SalesRule\Model\Spi\CouponResourceInterface;
  8. class DotmailerCouponGenerator
  9. {
  10. /**
  11. * @var RuleFactory
  12. */
  13. private $ruleFactory;
  14. /**
  15. * @var Rule
  16. */
  17. private $ruleResource;
  18. /**
  19. * @var CodegeneratorInterface
  20. */
  21. private $couponCodeGenerator;
  22. /**
  23. * @var CouponResourceInterface
  24. */
  25. private $couponResourceInterface;
  26. /**
  27. * @var DateTime
  28. */
  29. private $dateTime;
  30. /**
  31. * @param RuleFactory $ruleFactory
  32. * @param Rule $ruleResource
  33. * @param CodegeneratorInterface $couponCodeGenerator
  34. * @param CouponResourceInterface $couponResourceInterface
  35. * @param DateTime $dateTime
  36. */
  37. public function __construct(
  38. RuleFactory $ruleFactory,
  39. Rule $ruleResource,
  40. CodegeneratorInterface $couponCodeGenerator,
  41. CouponResourceInterface $couponResourceInterface,
  42. DateTime $dateTime
  43. ) {
  44. $this->ruleFactory = $ruleFactory;
  45. $this->ruleResource = $ruleResource;
  46. $this->couponCodeGenerator = $couponCodeGenerator;
  47. $this->couponResourceInterface = $couponResourceInterface;
  48. $this->dateTime = $dateTime;
  49. }
  50. /**
  51. * Generate coupon.
  52. *
  53. * @param int $priceRuleId
  54. * @param \DateTime $expireDate
  55. *
  56. * @return bool
  57. * @throws \Magento\Framework\Exception\LocalizedException
  58. */
  59. public function generateCoupon($priceRuleId, $expireDate)
  60. {
  61. $rule = $this->getPriceRule($priceRuleId);
  62. $coupon = $rule->acquireCoupon();
  63. $coupon = $this->setUpCoupon($expireDate, $coupon, $rule);
  64. $this->couponResourceInterface->save($coupon);
  65. return $coupon->getCode();
  66. }
  67. /**
  68. * @param int $priceRuleId
  69. *
  70. * @return \Magento\SalesRule\Model\Rule
  71. */
  72. private function getPriceRule($priceRuleId)
  73. {
  74. $rule = $this->ruleFactory->create();
  75. $this->ruleResource->load($rule, $priceRuleId);
  76. $rule->setCouponCodeGenerator($this->couponCodeGenerator);
  77. $rule->setCouponType(
  78. \Magento\SalesRule\Model\Rule::COUPON_TYPE_AUTO
  79. );
  80. return $rule;
  81. }
  82. /**
  83. * @param \DateTime $expireDate
  84. * @param \Magento\SalesRule\Model\Coupon $coupon
  85. * @param $rule
  86. *
  87. * @return \Magento\SalesRule\Model\Coupon
  88. * @throws \Magento\Framework\Exception\LocalizedException
  89. */
  90. private function setUpCoupon($expireDate, $coupon, $rule)
  91. {
  92. $coupon->setGeneratedByDotmailer(1);
  93. $coupon->setType(
  94. \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON
  95. );
  96. $coupon = $this->setExpiryDate($coupon, $expireDate, $rule);
  97. $coupon->setCreatedAt($this->dateTime->formatDate(true));
  98. return $coupon;
  99. }
  100. /**
  101. * @param \Magento\SalesRule\Model\Coupon $couponModel
  102. * @param \DateTime $expireDate
  103. * @param \Magento\SalesRule\Model\Rule $rule
  104. *
  105. * @return \Magento\SalesRule\Model\Coupon
  106. */
  107. private function setExpiryDate($couponModel, $expireDate, $rule)
  108. {
  109. $newExpiryDate = $expireDate;
  110. if ($rule->getToDate() && ! $expireDate) {
  111. $newExpiryDate = $rule->getToDate();
  112. }
  113. $couponModel->setExpirationDate($newExpiryDate);
  114. return $couponModel;
  115. }
  116. }