From a717b586c964afb815e1eb63f6b3fd6acefb90f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Thu, 20 Sep 2018 16:36:09 +0200
Subject: [PATCH] feat: save order prefixed id in coupon usage

---
 bin/backend/controls/Manager.Usages.html |  5 ++++-
 bin/backend/controls/Manager.css         |  6 +++++-
 bin/backend/controls/Manager.js          | 13 +++++++++----
 events.xml                               |  4 ++++
 locale.xml                               |  4 ++++
 src/QUI/ERP/Coupons/CouponCode.php       | 19 ++++++++++++++-----
 src/QUI/ERP/Coupons/Events.php           | 23 +++++++++++++++++++++++
 7 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/bin/backend/controls/Manager.Usages.html b/bin/backend/controls/Manager.Usages.html
index 5a3b5ec..8e8a8d6 100644
--- a/bin/backend/controls/Manager.Usages.html
+++ b/bin/backend/controls/Manager.Usages.html
@@ -5,9 +5,12 @@
                 <th class="quiqqer-coupons-manager-usages-tbl-date">
                     {{headerDate}}
                 </th>
-                <th>
+                <th class="quiqqer-coupons-manager-usages-tbl-user">
                     {{headerUser}}
                 </th>
+                <th>
+                    {{headerOrderPrefixedId}}
+                </th>
             </tr>
         </thead>
         <tbody></tbody>
diff --git a/bin/backend/controls/Manager.css b/bin/backend/controls/Manager.css
index 63977b1..e085853 100644
--- a/bin/backend/controls/Manager.css
+++ b/bin/backend/controls/Manager.css
@@ -82,5 +82,9 @@
 }
 
 .quiqqer-coupons-manager-usages-tbl-date {
-    width: 150px;
+    width: 100px;
+}
+
+.quiqqer-coupons-manager-usages-tbl-user {
+    width: 200px;
 }
\ No newline at end of file
diff --git a/bin/backend/controls/Manager.js b/bin/backend/controls/Manager.js
index 8bf5a0d..0ffa025 100644
--- a/bin/backend/controls/Manager.js
+++ b/bin/backend/controls/Manager.js
@@ -572,7 +572,7 @@ define('package/quiqqer/coupons/bin/backend/controls/Manager', [
         $showUsages: function (RowData) {
             new QUIConfirm({
                 maxHeight: 550,
-                maxWidth : 400,
+                maxWidth : 600,
                 autoclose: false,
 
                 title: QUILocale.get(lg, 'controls.Manager.usages.title', {code: RowData.code}),
@@ -591,8 +591,9 @@ define('package/quiqqer/coupons/bin/backend/controls/Manager', [
                         var lgPrefix = 'controls.Manager.usages.template.';
 
                         Popup.setContent(Mustache.render(templateUsages, {
-                            headerUser: QUILocale.get(lg, lgPrefix + 'headerUser'),
-                            headerDate: QUILocale.get(lg, lgPrefix + 'headerDate')
+                            headerUser           : QUILocale.get(lg, lgPrefix + 'headerUser'),
+                            headerDate           : QUILocale.get(lg, lgPrefix + 'headerDate'),
+                            headerOrderPrefixedId: QUILocale.get(lg, lgPrefix + 'headerOrderPrefixedId')
                         }));
 
                         var Content   = Popup.getContent();
@@ -601,10 +602,14 @@ define('package/quiqqer/coupons/bin/backend/controls/Manager', [
                         for (var i = 0, len = RowData.usages.length; i < len; i++) {
                             var usage = RowData.usages[i];
 
-                            new Element('tr', {
+                            var Row = new Element('tr', {
                                 html: '<td>' + usage.date + '</td>' +
                                     '<td>' + usage.userId + ' (' + usage.userName + ')</td>'
                             }).inject(TableBody);
+
+                            new Element('td', {
+                                html: usage.orderPrefixedId ? usage.orderPrefixedId : '-'
+                            }).inject(Row);
                         }
                     }
                 }
diff --git a/events.xml b/events.xml
index 65b98cf..faefcba 100644
--- a/events.xml
+++ b/events.xml
@@ -6,4 +6,8 @@
     <event on="onQuiqqerOrderBasketToOrder"
            fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketToOrder"
     />
+    <event on="onQuiqqerOrderSuccessful"
+           fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderSuccessful"
+    />
+
 </events>
\ No newline at end of file
diff --git a/locale.xml b/locale.xml
index 3113591..f55c3de 100644
--- a/locale.xml
+++ b/locale.xml
@@ -332,6 +332,10 @@
             <de><![CDATA[Datum]]></de>
             <en><![CDATA[Date]]></en>
         </locale>
+        <locale name="controls.Manager.usages.template.headerOrderPrefixedId">
+            <de><![CDATA[Bestellung]]></de>
+            <en><![CDATA[Order]]></en>
+        </locale>
         <locale name="controls.Manager.usages.btn_ok">
             <de><![CDATA[OK]]></de>
             <en><![CDATA[OK]]></en>
diff --git a/src/QUI/ERP/Coupons/CouponCode.php b/src/QUI/ERP/Coupons/CouponCode.php
index 8852f1f..9de161c 100644
--- a/src/QUI/ERP/Coupons/CouponCode.php
+++ b/src/QUI/ERP/Coupons/CouponCode.php
@@ -233,11 +233,12 @@ public function getDiscounts()
      * Hint: This may invalidate the code for future use
      *
      * @param QUI\Users\User $User - The user that redeems the CouponCode [if omitted use Session User]
+     * @param QUI\ERP\Order\Order $Order (optional) - Link redemption to a specific Order
      * @return void
      * @throws CouponCodeException
      * @throws QUI\Exception
      */
-    public function redeem($User = null)
+    public function redeem($User = null, $Order = null)
     {
         if (is_null($User)) {
             $User = QUI::getUserBySession();
@@ -245,12 +246,20 @@ public function redeem($User = null)
 
         $this->checkRedemption($User);
 
-        $Now            = new \DateTime();
-        $this->usages[] = [
-            'userId' => $User->getId(),
-            'date'   => $Now->format('Y-m-d H:i:s')
+        $Now = new \DateTime();
+
+        $usage = [
+            'userId'          => $User->getId(),
+            'date'            => $Now->format('Y-m-d H:i:s'),
+            'orderPrefixedId' => false
         ];
 
+        if (!is_null($Order) && $Order instanceof QUI\ERP\Order\Order) {
+            $usage['orderPrefixedId'] = $Order->getPrefixedId();
+        }
+
+        $this->usages[] = $usage;
+
         QUI::getDataBase()->update(
             Handler::getTable(),
             [
diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php
index e6b3207..7617e68 100644
--- a/src/QUI/ERP/Coupons/Events.php
+++ b/src/QUI/ERP/Coupons/Events.php
@@ -6,6 +6,7 @@
 use Quiqqer\Engine\Collector;
 use QUI\ERP\Order\Basket\Basket;
 use QUI\ERP\Order\Basket\BasketGuest;
+use QUI\ERP\Coupons\Handler as CouponsHandler;
 
 /**
  * Class Events
@@ -93,4 +94,26 @@ public static function onQuiqqerOrderBasketToOrder(
         } catch (QUI\Exception $Exception) {
         }
     }
+
+    /**
+     * quiqqer/order: onQuiqqerOrderSuccessful
+     *
+     * Redeem coupons used in (completed) orders
+     *
+     * @param QUI\ERP\Order\Order|QUI\ERP\Order\OrderInProcess $Order
+     * @return void
+     */
+    public static function onQuiqqerOrderSuccessful($Order)
+    {
+        $coupons = $Order->getDataEntry('quiqqer-coupons');
+
+        foreach ($coupons as $couponCode) {
+            try {
+                $CouponCode = CouponsHandler::getCouponCodeByCode($couponCode);
+                $CouponCode->redeem($Order->getCustomer(), $Order);
+            } catch (\Exception $Exception) {
+                QUI\System\Log::writeException($Exception);
+            }
+        }
+    }
 }
-- 
GitLab