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