From 2f9244bff664359e6c28c0c28549775ebf7ab9f3 Mon Sep 17 00:00:00 2001 From: Henning Leutz <leutz@pcsg.de> Date: Wed, 25 Nov 2020 08:43:35 +0100 Subject: [PATCH] fix: quiqqer/discount#6 --- src/QUI/ERP/Coupons/CouponCode.php | 65 +++++++++++++++++++++++++++++- src/QUI/ERP/Coupons/Events.php | 1 + 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/QUI/ERP/Coupons/CouponCode.php b/src/QUI/ERP/Coupons/CouponCode.php index 8d70beb..f015125 100644 --- a/src/QUI/ERP/Coupons/CouponCode.php +++ b/src/QUI/ERP/Coupons/CouponCode.php @@ -2,6 +2,7 @@ namespace QUI\ERP\Coupons; +use QUI\ERP\Order\OrderInterface; use function GuzzleHttp\Promise\queue; use QUI; use QUI\Permissions\Permission; @@ -397,13 +398,63 @@ public function checkRedemption($User) } } + /** + * Check if the given Order can redeem this CouponCode + * + * @param OrderInterface|null $Order + * @throws CouponCodeException + */ + public function checkOrderRedemption($Order) + { + if ($Order === null) { + return; + } + + $DiscountHandler = DiscountHandler::getInstance(); + $discountsValid = false; + $discountError = false; + + foreach ($this->discountIds as $discountId) { + try { + /** @var QUI\ERP\Discount\Discount $Discount */ + $Discount = $DiscountHandler->getChild($discountId); + } catch (\Exception $Exception) { + $discountError = $Exception->getMessage(); + continue; + } + + if ($Discount->canUsedInOrder($Order)) { + $discountsValid = true; + break; + } + } + + if (!$discountsValid) { + if (\count($this->discountIds) === 1) { + throw new CouponCodeException([ + 'quiqqer/coupons', + 'exception.CouponCode.discount_invalid', + [ + 'reason' => $discountError + ] + ]); + } else { + throw new CouponCodeException([ + 'quiqqer/coupons', + 'exception.CouponCode.discounts_invalid' + ]); + } + } + } + /** * Check if the given User can redeem this CouponCode * * @param QUI\Users\User $User - If omitted, use session user + * @param OrderInterface $Order * @return bool */ - public function isRedeemable($User = null) + public function isRedeemable($User = null, $Order = null) { try { $this->checkRedemption($User); @@ -411,6 +462,16 @@ public function isRedeemable($User = null) return false; } + if ($Order) { + try { + $this->checkOrderRedemption($Order); + } catch (CouponCodeException $Exception) { + $Order->addFrontendMessage($Exception->getMessage()); + + return false; + } + } + return true; } @@ -576,7 +637,7 @@ public function addToOrder(QUI\ERP\Order\OrderInProcess $Order) } // coupon check - if (!$Coupon->isRedeemable($Order->getCustomer())) { + if (!$Coupon->isRedeemable($Order->getCustomer(), $Order)) { continue; } diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php index 2907bb4..788b74e 100644 --- a/src/QUI/ERP/Coupons/Events.php +++ b/src/QUI/ERP/Coupons/Events.php @@ -364,6 +364,7 @@ protected static function addCouponToOrder($Order, $coupon) $CouponCode = Handler::getCouponCodeByCode($code); $CouponCode->checkRedemption(QUI::getUserBySession()); + $CouponCode->checkOrderRedemption($Order); $coupons = $Order->getDataEntry('quiqqer-coupons'); $coupons[] = $code; -- GitLab