From 2bfff68eed909070c03561cee88c096af386e3b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Wed, 29 Aug 2018 16:19:14 +0200
Subject: [PATCH] feat: CouponCodeInput for basket

---
 ajax/frontend/redeem.php                      | 42 +++++++++
 bin/{ => backend}/CouponCodes.js              |  6 +-
 bin/{ => backend}/classes/CouponCodes.js      |  6 +-
 .../controls/Manager.Create.html              |  0
 .../controls/Manager.Usages.html              |  0
 bin/{ => backend}/controls/Manager.css        |  0
 bin/{ => backend}/controls/Manager.html       |  0
 bin/{ => backend}/controls/Manager.js         | 22 ++---
 .../controls/settings/CodeGeneratorSelect.css |  0
 .../controls/settings/CodeGeneratorSelect.js  |  8 +-
 bin/frontend/CouponCodes.js                   | 17 ++++
 bin/frontend/classes/CouponCodes.js           | 38 ++++++++
 bin/frontend/controls/CouponCodeInput.html    |  9 ++
 bin/frontend/controls/CouponCodeInput.js      | 94 +++++++++++++++++++
 events.xml                                    |  5 +
 locale.xml                                    | 10 ++
 menu.xml                                      |  2 +-
 src/QUI/ERP/Coupons/CouponCode.php            | 35 +++++--
 src/QUI/ERP/Coupons/Events.php                | 89 ++++++++++++++++++
 19 files changed, 351 insertions(+), 32 deletions(-)
 create mode 100644 ajax/frontend/redeem.php
 rename bin/{ => backend}/CouponCodes.js (50%)
 rename bin/{ => backend}/classes/CouponCodes.js (93%)
 rename bin/{ => backend}/controls/Manager.Create.html (100%)
 rename bin/{ => backend}/controls/Manager.Usages.html (100%)
 rename bin/{ => backend}/controls/Manager.css (100%)
 rename bin/{ => backend}/controls/Manager.html (100%)
 rename bin/{ => backend}/controls/Manager.js (97%)
 rename bin/{ => backend}/controls/settings/CodeGeneratorSelect.css (100%)
 rename bin/{ => backend}/controls/settings/CodeGeneratorSelect.js (86%)
 create mode 100644 bin/frontend/CouponCodes.js
 create mode 100644 bin/frontend/classes/CouponCodes.js
 create mode 100644 bin/frontend/controls/CouponCodeInput.html
 create mode 100644 bin/frontend/controls/CouponCodeInput.js
 create mode 100644 events.xml
 create mode 100644 src/QUI/ERP/Coupons/Events.php

diff --git a/ajax/frontend/redeem.php b/ajax/frontend/redeem.php
new file mode 100644
index 0000000..3fe02a7
--- /dev/null
+++ b/ajax/frontend/redeem.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * This file contains package_quiqqer_coupons_ajax_delete
+ */
+
+use QUI\ERP\Coupons\Handler;
+
+/**
+ * Redeem a CouponCode
+ *
+ * @param int $id - CouponCode ID
+ * @return bool - success
+ */
+QUI::$Ajax->registerFunction(
+    'package_quiqqer_coupons_ajax_frontend_redeem',
+    function ($id) {
+        $id = (int)$id;
+
+        try {
+            $CouponCode = Handler::getCouponCode($id);
+
+            // @todo
+
+        } catch (\Exception $Exception) {
+            QUI\System\Log::writeException($Exception);
+
+            QUI::getMessagesHandler()->addError(
+                QUI::getLocale()->get(
+                    'quiqqer/coupons',
+                    'message.ajax.general_error'
+                )
+            );
+
+            return false;
+        }
+
+        return true;
+    },
+    ['id'],
+    'Permission::checkAdminUser'
+);
diff --git a/bin/CouponCodes.js b/bin/backend/CouponCodes.js
similarity index 50%
rename from bin/CouponCodes.js
rename to bin/backend/CouponCodes.js
index 8656be4..a302a3d 100644
--- a/bin/CouponCodes.js
+++ b/bin/backend/CouponCodes.js
@@ -1,14 +1,14 @@
 /**
  * CouponCodes Handler
  *
- * @module package/quiqqer/coupons/bin/classes/CouponCodes
+ * @module package/quiqqer/coupons/bin/backend/classes/CouponCodes
  * @author www.pcsg.de (Patrick Müller)
  *
  * @require Ajax
  */
-define('package/quiqqer/coupons/bin/CouponCodes', [
+define('package/quiqqer/coupons/bin/backend/CouponCodes', [
 
-    'package/quiqqer/coupons/bin/classes/CouponCodes'
+    'package/quiqqer/coupons/bin/backend/classes/CouponCodes'
 
 ], function (CouponCodesManager) {
     "use strict";
diff --git a/bin/classes/CouponCodes.js b/bin/backend/classes/CouponCodes.js
similarity index 93%
rename from bin/classes/CouponCodes.js
rename to bin/backend/classes/CouponCodes.js
index 88a3f6d..9107243 100644
--- a/bin/classes/CouponCodes.js
+++ b/bin/backend/classes/CouponCodes.js
@@ -1,12 +1,12 @@
 /**
  * CouponCodes Handler
  *
- * @module package/quiqqer/coupons/bin/classes/CouponCodes
+ * @module package/quiqqer/coupons/bin/backend/classes/CouponCodes
  * @author www.pcsg.de (Patrick Müller)
  *
  * @require Ajax
  */
-define('package/quiqqer/coupons/bin/classes/CouponCodes', [
+define('package/quiqqer/coupons/bin/backend/classes/CouponCodes', [
 
     'Ajax'
 
@@ -17,7 +17,7 @@ define('package/quiqqer/coupons/bin/classes/CouponCodes', [
 
     return new Class({
 
-        Type: 'package/quiqqer/coupons/bin/classes/CouponCodes',
+        Type: 'package/quiqqer/coupons/bin/backend/classes/CouponCodes',
 
         /**
          * Create new CouponCode
diff --git a/bin/controls/Manager.Create.html b/bin/backend/controls/Manager.Create.html
similarity index 100%
rename from bin/controls/Manager.Create.html
rename to bin/backend/controls/Manager.Create.html
diff --git a/bin/controls/Manager.Usages.html b/bin/backend/controls/Manager.Usages.html
similarity index 100%
rename from bin/controls/Manager.Usages.html
rename to bin/backend/controls/Manager.Usages.html
diff --git a/bin/controls/Manager.css b/bin/backend/controls/Manager.css
similarity index 100%
rename from bin/controls/Manager.css
rename to bin/backend/controls/Manager.css
diff --git a/bin/controls/Manager.html b/bin/backend/controls/Manager.html
similarity index 100%
rename from bin/controls/Manager.html
rename to bin/backend/controls/Manager.html
diff --git a/bin/controls/Manager.js b/bin/backend/controls/Manager.js
similarity index 97%
rename from bin/controls/Manager.js
rename to bin/backend/controls/Manager.js
index 1d138ea..8bf5a0d 100644
--- a/bin/controls/Manager.js
+++ b/bin/backend/controls/Manager.js
@@ -1,10 +1,10 @@
 /**
  * Manage Invite Codes
  *
- * @module package/quiqqer/coupons/bin/controls/Manager
+ * @module package/quiqqer/coupons/bin/backend/controls/Manager
  * @author www.pcsg.de (Patrick Müller)
  */
-define('package/quiqqer/coupons/bin/controls/Manager', [
+define('package/quiqqer/coupons/bin/backend/controls/Manager', [
 
     'qui/QUI',
     'qui/controls/desktop/Panel',
@@ -17,15 +17,15 @@ define('package/quiqqer/coupons/bin/controls/Manager', [
     'controls/grid/Grid',
     'qui/utils/Form',
 
-    'package/quiqqer/coupons/bin/CouponCodes',
+    'package/quiqqer/coupons/bin/backend/CouponCodes',
 
     'Locale',
     'Mustache',
 
-    'text!package/quiqqer/coupons/bin/controls/Manager.html',
-    'text!package/quiqqer/coupons/bin/controls/Manager.Create.html',
-    'text!package/quiqqer/coupons/bin/controls/Manager.Usages.html',
-    'css!package/quiqqer/coupons/bin/controls/Manager.css'
+    'text!package/quiqqer/coupons/bin/backend/controls/Manager.html',
+    'text!package/quiqqer/coupons/bin/backend/controls/Manager.Create.html',
+    'text!package/quiqqer/coupons/bin/backend/controls/Manager.Usages.html',
+    'css!package/quiqqer/coupons/bin/backend/controls/Manager.css'
 
 ], function (QUI, QUIPanel, QUILoader, QUIPopup, QUIConfirm, QUIButton, QUISeparator,
              Grid, QUIFormUtils, CouponCodes, QUILocale, Mustache, template, templateCreate,
@@ -37,7 +37,7 @@ define('package/quiqqer/coupons/bin/controls/Manager', [
     return new Class({
 
         Extends: QUIPanel,
-        Type   : 'package/quiqqer/coupons/bin/controls/Manager',
+        Type   : 'package/quiqqer/coupons/bin/backend/controls/Manager',
 
         Binds: [
             '$onCreate',
@@ -445,11 +445,7 @@ define('package/quiqqer/coupons/bin/controls/Manager', [
                         ));
 
                         if (CouponData) {
-
-                            console.log(CouponData);
-
                             CouponData.discountIds = CouponData.discountIds.join(',');
-
                             QUIFormUtils.setDataToForm(CouponData, Form);
                         }
 
@@ -602,8 +598,6 @@ define('package/quiqqer/coupons/bin/controls/Manager', [
                         var Content   = Popup.getContent();
                         var TableBody = Content.getElement('tbody');
 
-                        console.log(TableBody);
-
                         for (var i = 0, len = RowData.usages.length; i < len; i++) {
                             var usage = RowData.usages[i];
 
diff --git a/bin/controls/settings/CodeGeneratorSelect.css b/bin/backend/controls/settings/CodeGeneratorSelect.css
similarity index 100%
rename from bin/controls/settings/CodeGeneratorSelect.css
rename to bin/backend/controls/settings/CodeGeneratorSelect.css
diff --git a/bin/controls/settings/CodeGeneratorSelect.js b/bin/backend/controls/settings/CodeGeneratorSelect.js
similarity index 86%
rename from bin/controls/settings/CodeGeneratorSelect.js
rename to bin/backend/controls/settings/CodeGeneratorSelect.js
index c30b830..f51f43f 100644
--- a/bin/controls/settings/CodeGeneratorSelect.js
+++ b/bin/backend/controls/settings/CodeGeneratorSelect.js
@@ -1,10 +1,10 @@
 /**
  * Select available CodeGenerators
  *
- * @module package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect
+ * @module package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect
  * @author www.pcsg.de (Patrick Müller)
  */
-define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [
+define('package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect', [
 
     'qui/controls/buttons/Select',
     'qui/controls/loader/Loader',
@@ -12,7 +12,7 @@ define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [
     'Locale',
     'Ajax',
 
-    'css!package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect.css'
+    'css!package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect.css'
 
 ], function (QUISelect, QUILoader, QUILocale, QUIAjax) {
     "use strict";
@@ -21,7 +21,7 @@ define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [
 
     return new Class({
         Extends: QUISelect,
-        Type   : 'package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect',
+        Type   : 'package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect',
 
         Binds: [
             '$onImport'
diff --git a/bin/frontend/CouponCodes.js b/bin/frontend/CouponCodes.js
new file mode 100644
index 0000000..bd8c0c8
--- /dev/null
+++ b/bin/frontend/CouponCodes.js
@@ -0,0 +1,17 @@
+/**
+ * CouponCodes Handler (Frontend)
+ *
+ * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodes
+ * @author www.pcsg.de (Patrick Müller)
+ *
+ * @require Ajax
+ */
+define('package/quiqqer/coupons/bin/frontend/CouponCodes', [
+
+    'package/quiqqer/coupons/bin/frontend/classes/CouponCodes'
+
+], function (CouponCodesManager) {
+    "use strict";
+
+    return new CouponCodesManager();
+});
diff --git a/bin/frontend/classes/CouponCodes.js b/bin/frontend/classes/CouponCodes.js
new file mode 100644
index 0000000..643f2e5
--- /dev/null
+++ b/bin/frontend/classes/CouponCodes.js
@@ -0,0 +1,38 @@
+/**
+ * CouponCodes Handler (Frontend)
+ *
+ * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodes
+ * @author www.pcsg.de (Patrick Müller)
+ *
+ * @require Ajax
+ */
+define('package/quiqqer/coupons/bin/frontend/classes/CouponCodes', [
+
+    'Ajax'
+
+], function (QUIAjax) {
+    "use strict";
+
+    var pkg = 'quiqqer/coupons';
+
+    return new Class({
+
+        Type: 'package/quiqqer/coupons/bin/frontend/classes/CouponCodes',
+
+        /**
+         * Adds a coupon to the current session basket
+         *
+         * @param {String} code
+         * @return {Promise}
+         */
+        addCouponCodeToBasket: function (code) {
+            return new Promise(function (resolve, reject) {
+                QUIAjax.post('package_quiqqer_coupons_ajax_frontend_redeem', resolve, {
+                    'package': pkg,
+                    code     : code,
+                    onError  : reject
+                });
+            });
+        }
+    });
+});
diff --git a/bin/frontend/controls/CouponCodeInput.html b/bin/frontend/controls/CouponCodeInput.html
new file mode 100644
index 0000000..93c214b
--- /dev/null
+++ b/bin/frontend/controls/CouponCodeInput.html
@@ -0,0 +1,9 @@
+<div class="quiqqer-coupons-couponcodeinput">
+    <label>
+        <span>{{labelInput}}</span>
+        <input type="text" name="code"/>
+    </label>
+    <button class="quiqqer-coupons-couponcodeinput-btn">
+        <span>{{submitBtnText}}</span>
+    </button>
+</div>
\ No newline at end of file
diff --git a/bin/frontend/controls/CouponCodeInput.js b/bin/frontend/controls/CouponCodeInput.js
new file mode 100644
index 0000000..a5ae990
--- /dev/null
+++ b/bin/frontend/controls/CouponCodeInput.js
@@ -0,0 +1,94 @@
+/**
+ * CouponCodeInput
+ *
+ * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodeInput
+ * @author www.pcsg.de (Patrick Müller)
+ */
+define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
+
+    'qui/controls/Control',
+    'qui/controls/loader/Loader',
+
+    'package/quiqqer/coupons/bin/frontend/CouponCodes',
+
+    'Locale',
+    'Mustache',
+
+    'text!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.html',
+    //'css!package/quiqqer/coupons/bin/frontend/classes/CouponCodeInput.css'
+
+], function (QUIControl, QUILoader, CouponCodes, QUILocale, Mustache, template) {
+    "use strict";
+
+    var lg = 'quiqqer/coupons';
+
+    return new Class({
+
+        Extends: QUIControl,
+        Type   : 'package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput',
+
+        Binds: [
+            '$submit'
+        ],
+
+        initialize: function (options) {
+            this.parent(options);
+
+            this.$Input = null;
+            this.Loader = new QUILoader();
+
+            this.addEvents({
+                onInject: this.$onInject
+            });
+        },
+
+        /**
+         * Event: onInject
+         */
+        $onInject: function () {
+            var self     = this;
+            var lgPrefix = 'controls.frontend.CouponCodeInput.template.';
+
+            this.$Elm.set('html', Mustache.render(template, {
+                labelInput   : QUILocale.get(lg, lgPrefix + 'labelInput'),
+                submitBtnText: QUILocale.get(lg, lgPrefix + 'submitBtnText')
+            }));
+
+            this.Loader.inject(this.$Elm);
+
+            this.$Input = this.$Elm.getElement('input[name="code"]');
+
+            this.$Input.addEvent('keyup', function (event) {
+                if (event.code === 13) {
+                    self.$submit();
+                }
+            });
+
+            var SubmitBtn = this.$Elm.getElement('button.quiqqer-coupons-couponcodeinput-btn');
+            SubmitBtn.addEvent('click', function (event) {
+                event.stop();
+                self.$submit();
+            });
+        },
+
+        /**
+         * Submit a CouponCode
+         */
+        $submit: function () {
+            var self = this;
+            var code = this.$Input.value.trim();
+
+            if (code === '') {
+                this.$Input.focus();
+                return;
+            }
+
+            this.Loader.show();
+
+            CouponCodes.addCouponCodeToBasket(code).then(function () {
+                // @todo
+                self.Loader.hide();
+            });
+        }
+    });
+});
diff --git a/events.xml b/events.xml
new file mode 100644
index 0000000..bf2f088
--- /dev/null
+++ b/events.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-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"/>-->
+</events>
\ No newline at end of file
diff --git a/locale.xml b/locale.xml
index 92cf892..a26cae0 100644
--- a/locale.xml
+++ b/locale.xml
@@ -327,5 +327,15 @@
             <de><![CDATA[Erweiterte Einstellungen ausblenden]]></de>
             <en><![CDATA[Hide advanced settings]]></en>
         </locale>
+
+        <!-- Control: frontend/controls/CouponCodeInput -->
+        <locale name="controls.frontend.CouponCodeInput.template.labelInput">
+            <de><![CDATA[Coupon-Code]]></de>
+            <en><![CDATA[Coupon code]]></en>
+        </locale>
+        <locale name="controls.frontend.CouponCodeInput.template.submitBtnText">
+            <de><![CDATA[Einlösen]]></de>
+            <en><![CDATA[Redeem]]></en>
+        </locale>
     </groups>
 </locales>
diff --git a/menu.xml b/menu.xml
index 98da8d9..b9f8a56 100644
--- a/menu.xml
+++ b/menu.xml
@@ -8,7 +8,7 @@
     </item>
     <item parent="/extras/erp/"
           name="couponcodes"
-          require="package/quiqqer/coupons/bin/controls/Manager"
+          require="package/quiqqer/coupons/bin/backend/controls/Manager"
           icon="fa fa-credit-card-alt"
     >
         <locale group="quiqqer/coupons" var="menu.erp.couponcodes.title" />
diff --git a/src/QUI/ERP/Coupons/CouponCode.php b/src/QUI/ERP/Coupons/CouponCode.php
index 78d489d..5ee626f 100644
--- a/src/QUI/ERP/Coupons/CouponCode.php
+++ b/src/QUI/ERP/Coupons/CouponCode.php
@@ -206,6 +206,27 @@ public function getDiscountIds()
         return $this->discountIds;
     }
 
+    /**
+     * Get all discounts associated with this CouponCode
+     *
+     * @return QUI\ERP\Discount\Discount[]
+     */
+    public function getDiscounts()
+    {
+        $discounts       = [];
+        $DiscountHandler = DiscountHandler::getInstance();
+
+        foreach ($this->discountIds as $discountId) {
+            try {
+                $discounts[] = $DiscountHandler->getChild($discountId);
+            } catch (\Exception $Exception) {
+                QUI\System\Log::writeDebugException($Exception);
+            }
+        }
+
+        return $discounts;
+    }
+
     /**
      * Redeems this CouponCode
      *
@@ -260,6 +281,13 @@ public function redeem($User = null)
      */
     protected function checkRedemption($User)
     {
+        if (!$this->isValid()) {
+            throw new CouponCodeException([
+                'quiqqer/coupons',
+                'exception.CouponCode.no_longer_valid'
+            ]);
+        }
+
         $DiscountHandler = DiscountHandler::getInstance();
         $discountsValid  = false;
         $discountError   = false;
@@ -296,13 +324,6 @@ protected function checkRedemption($User)
             }
         }
 
-        if (!$this->isValid()) {
-            throw new CouponCodeException([
-                'quiqqer/coupons',
-                'exception.CouponCode.no_longer_valid'
-            ]);
-        }
-
         if (!empty($this->userIds)) {
             if (in_array($User->getId(), $this->userIds)) {
                 if (!$this->reusable && $this->hasUserRedeemed($User)) {
diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php
new file mode 100644
index 0000000..7bf60df
--- /dev/null
+++ b/src/QUI/ERP/Coupons/Events.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace QUI\ERP\Coupons;
+
+use QUI;
+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
+ *
+ * Global Event Handler for quiqqer/payment-paypal
+ */
+class Events
+{
+    /**
+     * Template event quiqqer/order: onQuiqqer::order::orderProcessBasketEnd
+     *
+     * @param Collector $Collector
+     * @param BasketGuest $Basket
+     * @return void
+     *
+     * @throws QUI\Exception
+     */
+    public static function templateOrderProcessBasketEnd(Collector $Collector, $Basket)
+    {
+        if (!($Basket instanceof Basket)) {
+            return;
+        }
+
+        $Collector->append(
+            '<div data-qui="package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput"></div>'
+        );
+    }
+
+//    /**
+//     * Template event quiqqer/order: onQuiqqer::order::basketSmall::end
+//     *
+//     * @param Collector $Collector
+//     * @param BasketGuest $Basket
+//     * @return void
+//     *
+//     * @throws QUI\Exception
+//     */
+//    public static function templateOrderBasketSmallEnd(Collector $Collector, $Basket)
+//    {
+//        $PaymentExpress = Provider::getPayPalExpressPayment();
+//
+//        if (!$PaymentExpress || !$PaymentExpress->isActive()) {
+//            return;
+//        }
+//
+//        if (!($Basket instanceof Basket)) {
+//            return;
+//        }
+//
+//        // do not display PayPal button if basket has no articles
+//        if (!$Basket->count()) {
+//            return;
+//        }
+//
+//        $Project      = QUI::getProjectManager()->getStandard();
+//        $CheckoutStep = new CheckoutStep();
+//        $checkout     = 0;
+//
+//        if ($Basket->hasOrder()) {
+//            $Order = $Basket->getOrder();
+//
+//            if ($Order->getPaymentDataEntry(Payment::ATTR_PAYPAL_PAYMENT_ID)) {
+//                $checkout = 1;
+//            }
+//        }
+//
+//        $Collector->append(
+//            '<div data-qui="package/quiqqer/payment-paypal/bin/controls/ExpressBtnLoader"
+//                  data-qui-options-context="smallbasket"
+//                  data-qui-options-basketid="' . $Basket->getId() . '"
+//                  data-qui-options-checkout="' . $checkout . '"
+//                  data-qui-options-displaysize="' . Provider::getWidgetsSetting('btn_express_size_smallbasket') . '"
+//                  data-qui-options-displaycolor="' . Provider::getWidgetsSetting('btn_express_color') . '"
+//                  data-qui-options-displayshape="' . Provider::getWidgetsSetting('btn_express_shape') . '"
+//                  data-qui-options-orderprocessurl="' . OrderUtils::getOrderProcessUrl($Project, $CheckoutStep) . '">
+//            </div>'
+//        );
+//    }
+}
-- 
GitLab