From 62802ab6c94c18e7267d3785f4a4d37190f39b43 Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Mon, 17 Sep 2018 17:17:33 +0200
Subject: [PATCH] feat: refactor: redeem coupon code

---
 ajax/frontend/redeem.php       | 10 ++++--
 events.xml                     |  4 +++
 src/QUI/ERP/Coupons/Events.php | 57 +++++++++++++++++++++++++++++++---
 3 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/ajax/frontend/redeem.php b/ajax/frontend/redeem.php
index 34328ec..7b5226a 100644
--- a/ajax/frontend/redeem.php
+++ b/ajax/frontend/redeem.php
@@ -16,7 +16,7 @@
     'package_quiqqer_coupons_ajax_frontend_redeem',
     function ($code, $orderHash) {
         try {
-            $CouponCode = Handler::getCouponCodeByCode($code);
+            Handler::getCouponCodeByCode($code);
         } catch (QUI\ERP\Coupons\CouponCodeException $Exception) {
             QUI\System\Log::writeDebugException($Exception);
 
@@ -36,8 +36,14 @@ function ($code, $orderHash) {
             return false;
         }
 
-        $Order = QUI\ERP\Order\Handler::getInstance()->getOrderByHash($orderHash);
+        $Order     = QUI\ERP\Order\Handler::getInstance()->getOrderByHash($orderHash);
+        $coupons   = $Order->getDataEntry('quiqqer-coupons');
+        $coupons[] = $code;
 
+        $coupons = array_unique($coupons);
+
+        $Order->setData('quiqqer-coupons', $coupons);
+        $Order->update();
 
         return true;
     },
diff --git a/events.xml b/events.xml
index bf2f088..65b98cf 100644
--- a/events.xml
+++ b/events.xml
@@ -2,4 +2,8 @@
 <events>
     <event on="onQuiqqer::order::orderProcessBasketEnd" fire="\QUI\ERP\Coupons\Events::templateOrderProcessBasketEnd"/>
     <!--<event on="onQuiqqer::order::basketSmall::end" fire="\QUI\ERP\Payments\PayPal\Events::templateOrderBasketSmallEnd"/>-->
+
+    <event on="onQuiqqerOrderBasketToOrder"
+           fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketToOrder"
+    />
 </events>
\ No newline at end of file
diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php
index 7bf60df..abe724f 100644
--- a/src/QUI/ERP/Coupons/Events.php
+++ b/src/QUI/ERP/Coupons/Events.php
@@ -6,8 +6,6 @@
 use Quiqqer\Engine\Collector;
 use QUI\ERP\Order\Basket\Basket;
 use QUI\ERP\Order\Basket\BasketGuest;
-use QUI\ERP\Order\Utils\Utils as OrderUtils;
-use QUI\ERP\Order\Controls\OrderProcess\Checkout as CheckoutStep;
 
 /**
  * Class Events
@@ -21,9 +19,6 @@ class Events
      *
      * @param Collector $Collector
      * @param BasketGuest $Basket
-     * @return void
-     *
-     * @throws QUI\Exception
      */
     public static function templateOrderProcessBasketEnd(Collector $Collector, $Basket)
     {
@@ -36,6 +31,58 @@ public static function templateOrderProcessBasketEnd(Collector $Collector, $Bask
         );
     }
 
+
+    /**
+     * event - on price factor init
+     *
+     * @param $Basket
+     * @param QUI\ERP\Order\AbstractOrder $Order
+     * @param QUI\ERP\Products\Utils\PriceFactors $PriceFactors
+     */
+    public static function onQuiqqerOrderBasketToOrder(
+        $Basket,
+        QUI\ERP\Order\AbstractOrder $Order,
+        QUI\ERP\Products\Utils\PriceFactors $PriceFactors
+    ) {
+        $coupons = $Order->getDataEntry('quiqqer-coupons');
+
+        if (!$coupons) {
+            return;
+        }
+
+        if (!is_array($coupons)) {
+            return;
+        }
+
+        foreach ($coupons as $coupon) {
+            /* @var $Coupon CouponCode */
+            try {
+                $Coupon = Handler::getCouponCodeByCode($coupon);
+            } catch (\Exception $Exception) {
+                continue;
+            }
+
+            // coupon check
+            if (!$Coupon->isRedeemable($Order->getCustomer())) {
+                continue;
+            }
+
+            /* @var $Discount QUI\ERP\Discount\Discount */
+            $discounts = $Coupon->getDiscounts();
+
+            foreach ($discounts as $Discount) {
+                // @todo discount check
+
+                $PriceFactor = $Discount->toPriceFactor();
+                $PriceFactor->setTitle(
+                    'Gutschein-Code '.$Coupon->getCode()
+                );
+
+                $PriceFactors->addToEnd($PriceFactor);
+            }
+        }
+    }
+
 //    /**
 //     * Template event quiqqer/order: onQuiqqer::order::basketSmall::end
 //     *
-- 
GitLab