From 1f66535fe31ebe6ae8eb61f42c741d626906a4ed Mon Sep 17 00:00:00 2001 From: jajajaime Date: Wed, 9 Aug 2023 12:16:01 -0700 Subject: [PATCH 1/2] APF-397 adds detection of invalid coupon code --- Model/Spc/Coupon.php | 54 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/Model/Spc/Coupon.php b/Model/Spc/Coupon.php index bc33d1d81..16ec5bd48 100644 --- a/Model/Spc/Coupon.php +++ b/Model/Spc/Coupon.php @@ -8,10 +8,15 @@ use Magento\Framework\Phrase; use Magento\Quote\Api\CartRepositoryInterface; use Amazon\Pay\Helper\Spc\Cart; +use Magento\SalesRule\Api\Data\CouponInterface as SalesRuleCouponInterface; use Magento\Store\Api\Data\StoreInterface; class Coupon implements CouponInterface { + const NOT_APPLICABLE = 'CouponNotApplicable'; + + const INVALID = 'InvalidCouponCode'; + /** * @var StoreInterface */ @@ -33,23 +38,22 @@ class Coupon implements CouponInterface */ protected $checkoutSessionHelper; - /** - * @param StoreInterface $store - * @param CartRepositoryInterface $cartRepository - * @param Cart $cartHelper - * @param CheckoutSession $checkoutSessionHelper - */ + protected $salesRuleCoupon; + + public function __construct( StoreInterface $store, CartRepositoryInterface $cartRepository, Cart $cartHelper, - CheckoutSession $checkoutSessionHelper + CheckoutSession $checkoutSessionHelper, + SalesRuleCouponInterface $salesRuleCoupon ) { $this->store = $store; $this->cartRepository = $cartRepository; $this->cartHelper = $cartHelper; $this->checkoutSessionHelper = $checkoutSessionHelper; + $this->salesRuleCoupon = $salesRuleCoupon; } /** @@ -84,7 +88,18 @@ public function applyCoupon(int $cartId, $cartDetails = null) $couponCode = $cartDetails['coupons'][0]['coupon_code']; - // Empty out the quote items' rule ids, because of Magento bug + // Check if coupon exists + if (!$this->couponExists($couponCode)) { + $this->cartHelper->logError( + 'SPC Coupon: '. self::INVALID .' - The coupon '. $couponCode .' is invalid. CartId: ' . $cartId . ' - ', $cartDetails + ); + + throw new \Magento\Framework\Webapi\Exception( + new Phrase("The coupon code '". $couponCode ."' is invalid"), self::INVALID, 400 + ); + } + + // Empty out the quote items' rule ids, because Magento does not foreach ($quote->getItems() as &$item) { $item->setAppliedRuleIds(null); } @@ -107,18 +122,18 @@ public function applyCoupon(int $cartId, $cartDetails = null) } $this->cartHelper->logError( - 'SPC Coupon: CouponNotApplicable - The coupon '. $couponCode .' could not be applied to the cart. CartId: ' . $cartId . ' - ', $cartDetails + 'SPC Coupon: '. self::NOT_APPLICABLE .' - The coupon '. $couponCode .' could not be applied to the cart. CartId: ' . $cartId . ' - ', $cartDetails ); throw new \Magento\Framework\Webapi\Exception( - new Phrase("The coupon code '". $couponCode ."' does not apply"), "CouponNotApplicable", 400 + new Phrase("The coupon code '". $couponCode ."' does not apply"), self::NOT_APPLICABLE, 400 ); } } else { if (!isset($cartDetails['coupons'][0]['coupon_code']) || $cartDetails['coupons'][0]['coupon_code'] === null) { throw new \Magento\Framework\Webapi\Exception( - new Phrase("Coupon code is missing"), "CouponNotApplicable", 400 + new Phrase("Coupon code is missing"), self::NOT_APPLICABLE, 400 ); } } @@ -132,4 +147,21 @@ public function applyCoupon(int $cartId, $cartDetails = null) return $this->cartHelper->createResponse($quote->getId(), $checkoutSessionId); } + + protected function couponExists($couponCode) + { + try { + $coupon = $this->salesRuleCoupon->loadByCode($couponCode); + + if ($coupon->getRuleId()) { + return true; + } + + } + catch (\Exception $e) { + return false; + } + + return false; + } } From 648672cb93770c42d472a9fe71c278a413e94508 Mon Sep 17 00:00:00 2001 From: jajajaime Date: Wed, 9 Aug 2023 12:17:08 -0700 Subject: [PATCH 2/2] APF-397 adds docblocks --- Model/Spc/Coupon.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Model/Spc/Coupon.php b/Model/Spc/Coupon.php index 16ec5bd48..0beb13108 100644 --- a/Model/Spc/Coupon.php +++ b/Model/Spc/Coupon.php @@ -38,9 +38,19 @@ class Coupon implements CouponInterface */ protected $checkoutSessionHelper; + /** + * @var SalesRuleCouponInterface + */ protected $salesRuleCoupon; + /** + * @param StoreInterface $store + * @param CartRepositoryInterface $cartRepository + * @param Cart $cartHelper + * @param CheckoutSession $checkoutSessionHelper + * @param SalesRuleCouponInterface $salesRuleCoupon + */ public function __construct( StoreInterface $store, CartRepositoryInterface $cartRepository, @@ -148,6 +158,10 @@ public function applyCoupon(int $cartId, $cartDetails = null) return $this->cartHelper->createResponse($quote->getId(), $checkoutSessionId); } + /** + * @param $couponCode + * @return bool + */ protected function couponExists($couponCode) { try {