From 01ee7dc30e74636e17af7c71580c1b3c0a564d75 Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Tue, 9 Jul 2019 15:12:28 +0200
Subject: [PATCH] refactor: CRUD shipping rules

---
 bin/backend/controls/ShippingEntry.List.js    | 83 ++++++++++++++-----
 bin/backend/controls/ShippingEntry.js         | 11 ++-
 .../controls/shippingRules/CreateRule.html    | 26 ++++++
 .../controls/shippingRules/CreateRule.js      |  3 +
 .../shippingRules/CreateRuleWindow.js         |  1 +
 bin/backend/controls/shippingRules/Rule.html  | 26 ++++++
 bin/backend/controls/shippingRules/Rule.js    |  3 +
 .../controls/shippingRules/RuleWindow.js      |  8 +-
 .../shippingRules/ShippingRuleListWindow.js   |  1 +
 database.xml                                  |  2 +
 locale.xml                                    | 12 +++
 src/QUI/ERP/Shipping/Rules/Factory.php        | 47 ++++++++++-
 src/QUI/ERP/Shipping/Rules/ShippingRule.php   | 29 ++++++-
 13 files changed, 225 insertions(+), 27 deletions(-)

diff --git a/bin/backend/controls/ShippingEntry.List.js b/bin/backend/controls/ShippingEntry.List.js
index 0955d7c..f2b09e6 100644
--- a/bin/backend/controls/ShippingEntry.List.js
+++ b/bin/backend/controls/ShippingEntry.List.js
@@ -2,6 +2,8 @@
  * @module package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List
  * @author www.pcsg.de (Henning Leutz)
  *
+ * Shipping rule list for the shipping entry
+ *
  * @event onLoad [self]
  */
 define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
@@ -77,6 +79,41 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
             this.$Input.value = value;
         },
 
+        /**
+         * refresh the list
+         *
+         * @return {Promise}
+         */
+        refresh: function () {
+            var self = this;
+
+            this.fireEvent('refreshBegin', [this]);
+
+            return new Promise(function (resolve) {
+                require([
+                    'package/quiqqer/shipping/bin/backend/Shipping',
+                    'package/quiqqer/shipping/bin/backend/ShippingRules',
+                    'package/quiqqer/shipping/bin/backend/utils/ShippingUtils'
+                ], function (Shipping, ShippingRules, Utils) {
+                    var shippingRules = self.$Grid.getData().map(function (entry) {
+                        return entry.id;
+                    });
+
+                    ShippingRules.getRules(shippingRules).then(function (rules) {
+                        self.$Grid.setData({
+                            data: Utils.parseRulesDataForGrid(rules)
+                        });
+
+                        resolve();
+                        self.fireEvent('refreshEnd', [self]);
+                    }).catch(function (e) {
+                        console.log(e);
+                        self.fireEvent('refreshEnd', [self]);
+                    });
+                });
+            });
+        },
+
         /**
          * event: on inject
          */
@@ -139,20 +176,20 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
                 onDblClick: function () {
                     require(['package/quiqqer/shipping/bin/backend/controls/shippingRules/RuleWindow'], function (RuleWindow) {
                         new RuleWindow({
-                            ruleId: self.$Grid.getSelectedData()[0].id
+                            ruleId: self.$Grid.getSelectedData()[0].id,
+                            events: {
+                                onUpdateEnd: function () {
+                                    self.refreshInput();
+                                    self.refresh();
+                                }
+                            }
                         }).open();
                     });
                 }
             });
 
-            require([
-                'package/quiqqer/shipping/bin/backend/Shipping',
-                'package/quiqqer/shipping/bin/backend/ShippingRules',
-                'package/quiqqer/shipping/bin/backend/utils/ShippingUtils'
-            ], function (Shipping, ShippingRules, Utils) {
-                Shipping.getShippingEntry(
-                    self.getAttribute('shippingId')
-                ).then(function (result) {
+            require(['package/quiqqer/shipping/bin/backend/Shipping'], function (Shipping) {
+                Shipping.getShippingEntry(self.getAttribute('shippingId')).then(function (result) {
                     var shippingRules = result.shipping_rules;
 
                     try {
@@ -161,15 +198,19 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
                         shippingRules = [];
                     }
 
-                    return ShippingRules.getRules(shippingRules);
-                }).then(function (rules) {
+                    var data = shippingRules.map(function (entry) {
+                        return {
+                            id: entry
+                        };
+                    });
+
                     self.$Grid.setData({
-                        data: Utils.parseRulesDataForGrid(rules)
+                        data: data
                     });
 
+                    return self.refresh();
+                }).then(function () {
                     self.fireEvent('load', [self]);
-                }).catch(function (e) {
-                    console.log(e);
                 });
             });
         },
@@ -183,11 +224,10 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
             var self = this;
 
             return new Promise(function (resolve) {
-                require([
-                    'package/quiqqer/shipping/bin/backend/ShippingRules'
-                ], function (ShippingRules) {
+                require(['package/quiqqer/shipping/bin/backend/ShippingRules'], function (ShippingRules) {
                     ShippingRules.getRules(shippingRules).then(function (rules) {
-                        var current = QUILocale.getCurrent();
+                        var current     = QUILocale.getCurrent(),
+                            currentData = self.$Grid.getData();
 
                         rules.forEach(function (v, k) {
                             var title = '';
@@ -199,10 +239,15 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [
                             }
 
                             rules[k].title = title;
+
+                            currentData.push(rules[k]);
                         });
 
+                        // filter duplicated
+
+
                         self.$Grid.setData({
-                            data: rules
+                            data: currentData
                         });
 
                         self.refreshInput();
diff --git a/bin/backend/controls/ShippingEntry.js b/bin/backend/controls/ShippingEntry.js
index e343ae3..f33f1b8 100644
--- a/bin/backend/controls/ShippingEntry.js
+++ b/bin/backend/controls/ShippingEntry.js
@@ -371,7 +371,16 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry', [
 
                 new ShippingRulesGrid({
                     shippingId: self.getAttribute('shippingId'),
-                    name      : 'shipping_rules'
+                    name      : 'shipping_rules',
+                    events    : {
+                        onRefreshBegin: function () {
+                            self.Loader.show();
+                        },
+
+                        onRefreshEnd: function () {
+                            self.Loader.hide();
+                        }
+                    }
                 }).inject(
                     Container.getElement('.shipping-rules tbody td')
                 );
diff --git a/bin/backend/controls/shippingRules/CreateRule.html b/bin/backend/controls/shippingRules/CreateRule.html
index cb7c080..1c5c6f2 100644
--- a/bin/backend/controls/shippingRules/CreateRule.html
+++ b/bin/backend/controls/shippingRules/CreateRule.html
@@ -38,6 +38,32 @@
                 </label>
             </td>
         </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item" title="{{discountTitle}}">
+                        {{discountTitle}}
+                    </span>
+                    <span class="field-container-field field-container-field-no-padding">
+                        <select name="discount_type" class="field-container-field"
+                                style="width: 30%"
+                        >
+                            <option value="ABS">
+                                {{discountAbsolute}}
+                            </option>
+                            <option value="PERCENTAGE">
+                                {{discountPercentage}}
+                            </option>
+                        </select>
+                        <input type="number"
+                               name="discount"
+                               class="field-container-field"
+                               style="width: 69%"
+                        />
+                    </span>
+                </label>
+            </td>
+        </tr>
         </tbody>
     </table>
 
diff --git a/bin/backend/controls/shippingRules/CreateRule.js b/bin/backend/controls/shippingRules/CreateRule.js
index 8eae4c6..b74159a 100644
--- a/bin/backend/controls/shippingRules/CreateRule.js
+++ b/bin/backend/controls/shippingRules/CreateRule.js
@@ -53,6 +53,9 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/CreateRule',
                 title              : QUILocale.get(lg, 'shipping.edit.template.title'),
                 workingTitle       : QUILocale.get('quiqqer/system', 'workingtitle'),
                 calculationPriority: QUILocale.get(lg, 'shipping.edit.template.calculationPriority'),
+                discountTitle      : QUILocale.get(lg, 'shipping.edit.template.discount'),
+                discountAbsolute   : QUILocale.get(lg, 'shipping.edit.template.discount.absolute'),
+                discountPercentage : QUILocale.get(lg, 'shipping.edit.template.discount.percentage'),
 
                 usageHeader  : QUILocale.get(lg, 'shipping.edit.template.usage'),
                 usageFrom    : QUILocale.get(lg, 'shipping.edit.template.usage.from'),
diff --git a/bin/backend/controls/shippingRules/CreateRuleWindow.js b/bin/backend/controls/shippingRules/CreateRuleWindow.js
index 7007d0e..bad6f9a 100644
--- a/bin/backend/controls/shippingRules/CreateRuleWindow.js
+++ b/bin/backend/controls/shippingRules/CreateRuleWindow.js
@@ -71,6 +71,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/CreateRuleWi
             this.Loader.hide();
             this.$Create.submit().then(function () {
                 self.Loader.hide();
+                self.close();
             });
         }
     });
diff --git a/bin/backend/controls/shippingRules/Rule.html b/bin/backend/controls/shippingRules/Rule.html
index cb7c080..b34ae72 100644
--- a/bin/backend/controls/shippingRules/Rule.html
+++ b/bin/backend/controls/shippingRules/Rule.html
@@ -38,6 +38,32 @@
                 </label>
             </td>
         </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item" title="{{discountTitle}}">
+                        {{discountTitle}}
+                    </span>
+                    <span class="field-container-field field-container-field-no-padding">
+                        <select name="discount_type" class="field-container-field"
+                                style="width: 30%"
+                        >
+                            <option value="0">
+                                {{discountAbsolute}}
+                            </option>
+                            <option value="1">
+                                {{discountPercentage}}
+                            </option>
+                        </select>
+                        <input type="number"
+                               name="discount"
+                               class="field-container-field"
+                               style="width: 69%"
+                        />
+                    </span>
+                </label>
+            </td>
+        </tr>
         </tbody>
     </table>
 
diff --git a/bin/backend/controls/shippingRules/Rule.js b/bin/backend/controls/shippingRules/Rule.js
index 33baee4..5ecd260 100644
--- a/bin/backend/controls/shippingRules/Rule.js
+++ b/bin/backend/controls/shippingRules/Rule.js
@@ -61,6 +61,9 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/Rule', [
                 title              : QUILocale.get(lg, 'shipping.edit.template.title'),
                 workingTitle       : QUILocale.get('quiqqer/system', 'workingtitle'),
                 calculationPriority: QUILocale.get(lg, 'shipping.edit.template.calculationPriority'),
+                discountTitle      : QUILocale.get(lg, 'shipping.edit.template.discount'),
+                discountAbsolute   : QUILocale.get(lg, 'shipping.edit.template.discount.absolute'),
+                discountPercentage : QUILocale.get(lg, 'shipping.edit.template.discount.percentage'),
 
                 usageHeader  : QUILocale.get(lg, 'shipping.edit.template.usage'),
                 usageFrom    : QUILocale.get(lg, 'shipping.edit.template.usage.from'),
diff --git a/bin/backend/controls/shippingRules/RuleWindow.js b/bin/backend/controls/shippingRules/RuleWindow.js
index 0a40fd2..c4a43b0 100644
--- a/bin/backend/controls/shippingRules/RuleWindow.js
+++ b/bin/backend/controls/shippingRules/RuleWindow.js
@@ -1,6 +1,9 @@
 /**
  * @module package/quiqqer/shipping/bin/backend/controls/shippingRules/CreateRuleWindow
  * @author www.pcsg.de (Henning Leutz
+ *
+ * @event updateBegin [self]
+ * @event updateEnd [self]
  */
 define('package/quiqqer/shipping/bin/backend/controls/shippingRules/RuleWindow', [
 
@@ -70,9 +73,12 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/RuleWindow',
         $onSubmit: function () {
             var self = this;
 
-            this.Loader.hide();
+            this.fireEvent('updateBegin', [this]);
+
+            this.Loader.show();
             this.$Rule.update().then(function () {
                 self.Loader.hide();
+                self.fireEvent('updateEnd', [self]);
             });
         }
     });
diff --git a/bin/backend/controls/shippingRules/ShippingRuleListWindow.js b/bin/backend/controls/shippingRules/ShippingRuleListWindow.js
index b0d16da..0b11f27 100644
--- a/bin/backend/controls/shippingRules/ShippingRuleListWindow.js
+++ b/bin/backend/controls/shippingRules/ShippingRuleListWindow.js
@@ -61,6 +61,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule
 
                     onCloseCreateRuleWindow: function () {
                         self.open();
+                        self.$List.refresh();
                     }
                 }
             }).inject(this.getContent());
diff --git a/database.xml b/database.xml
index 73ba150..260baf5 100644
--- a/database.xml
+++ b/database.xml
@@ -22,6 +22,8 @@
         <table name="shipping_rules">
             <field type="INT(11) NOT NULL">id</field>
             <field type="INT(1) NOT NULL DEFAULT 0">active</field>
+            <field type="INT(11) NOT NULL">discount</field>
+            <field type="INT(1) NOT NULL">discount_type</field>
             <field type="text NULL">date_from</field>
             <field type="text NULL">date_until</field>
             <field type="INT(10) NULL DEFAULT 0">purchase_quantity_from</field>
diff --git a/locale.xml b/locale.xml
index c6632ee..c2bc1f2 100644
--- a/locale.xml
+++ b/locale.xml
@@ -202,6 +202,18 @@
             <de><![CDATA[Legen Sie ein eigenes Bild für die Versandart fest.]]></de>
             <en><![CDATA[Define your own image for the shipping method.]]></en>
         </locale>
+        <locale name="shipping.edit.template.discount">
+            <de><![CDATA[Abschlag]]></de>
+            <en><![CDATA[Discount]]></en>
+        </locale>
+        <locale name="shipping.edit.template.discount.absolute">
+            <de><![CDATA[Auf / Abschlag (absolut)]]></de>
+            <en><![CDATA[Discount (absolute)]]></en>
+        </locale>
+        <locale name="shipping.edit.template.discount.percentage">
+            <de><![CDATA[% (prozentual)]]></de>
+            <en><![CDATA[% (percentage)]]></en>
+        </locale>
 
         <locale name="window.delete.title">
             <de><![CDATA[Versandart löschen]]></de>
diff --git a/src/QUI/ERP/Shipping/Rules/Factory.php b/src/QUI/ERP/Shipping/Rules/Factory.php
index 272b358..32c66de 100644
--- a/src/QUI/ERP/Shipping/Rules/Factory.php
+++ b/src/QUI/ERP/Shipping/Rules/Factory.php
@@ -7,6 +7,7 @@
 namespace QUI\ERP\Shipping\Rules;
 
 use QUI;
+use QUI\ERP\Shipping\Rules\Factory as RuleFactory;
 use QUI\Permissions\Permission;
 
 /**
@@ -16,6 +17,16 @@
  */
 class Factory extends QUI\CRUD\Factory
 {
+    /**
+     * absolute discount
+     */
+    const DISCOUNT_TYPE_ABS = 0;
+
+    /**
+     * percentage discount
+     */
+    const DISCOUNT_TYPE_PERCENTAGE = 1;
+
     /**
      * Handler constructor.
      */
@@ -54,7 +65,9 @@ public function createChild($data = [])
             'purchase_quantity_from',
             'purchase_quantity_until',
             'purchase_value_from',
-            'purchase_value_until'
+            'purchase_value_until',
+            'discount',
+            'discount_type'
         ]);
 
         $data = \array_filter($data, function ($k) use ($allowed) {
@@ -78,6 +91,33 @@ public function createChild($data = [])
             $data['priority'] = 0;
         }
 
+
+        // discount
+        if (\is_numeric($data['discount_type'])) {
+            $data['discount_type'] = (int)$data['discount_type'];
+        }
+
+        switch ($data['discount_type']) {
+            case 'ABS':
+                $data['discount_type'] = RuleFactory::DISCOUNT_TYPE_ABS;
+                break;
+
+            case 'PERCENTAGE':
+                $data['discount_type'] = RuleFactory::DISCOUNT_TYPE_PERCENTAGE;
+                break;
+
+            case RuleFactory::DISCOUNT_TYPE_ABS:
+            case RuleFactory::DISCOUNT_TYPE_PERCENTAGE:
+                break;
+
+            default:
+                $data['discount_type'] = RuleFactory::DISCOUNT_TYPE_ABS;
+        }
+
+        $attributes['discount'] = \floatval($data['discount']);
+
+
+        // start creating
         QUI::getEvents()->fireEvent('shippingRuleCreateBegin', [$data]);
 
         /* @var $NewChild ShippingRule */
@@ -140,7 +180,10 @@ public function getChildAttributes()
             'areas',
             'articles',
             'categories',
-            'user_groups'
+            'user_groups',
+
+            'discount',
+            'discount_type'
         ];
     }
 
diff --git a/src/QUI/ERP/Shipping/Rules/ShippingRule.php b/src/QUI/ERP/Shipping/Rules/ShippingRule.php
index bcc0a55..6f89f71 100644
--- a/src/QUI/ERP/Shipping/Rules/ShippingRule.php
+++ b/src/QUI/ERP/Shipping/Rules/ShippingRule.php
@@ -12,6 +12,7 @@
 
 use QUI\ERP\Areas\Utils as AreaUtils;
 use QUI\ERP\Shipping\Exceptions\ShippingCanNotBeUsed;
+use QUI\ERP\Shipping\Rules\Factory as RuleFactory;
 
 /**
  * Class ShippingEntry
@@ -48,24 +49,44 @@ public function __construct($id, Factory $Factory)
             $attributes = $this->getAttributes();
 
             if (\is_array($attributes['title'])) {
-                QUI\Translator::update(
+                QUI\Translator::edit(
                     'quiqqer/shipping',
-                    'shipping.'.$id.'.title',
+                    'shipping.'.$id.'.rule.title',
                     'quiqqer/shipping',
                     $attributes['title']
                 );
             };
 
             if (\is_array($attributes['workingTitle'])) {
-                QUI\Translator::update(
+                QUI\Translator::edit(
                     'quiqqer/shipping',
-                    'shipping.'.$id.'.workingTitle',
+                    'shipping.'.$id.'.rule.workingTitle',
                     'quiqqer/shipping',
                     $attributes['workingTitle']
                 );
             };
 
             QUI\Translator::publish('quiqqer/shipping');
+
+
+            // discount
+            $attributes['discount'] = \floatval($attributes['discount']);
+
+            if (\is_numeric($attributes['discount_type']) || empty($attributes['discount_type'])) {
+                $attributes['discount_type'] = (int)$attributes['discount_type'];
+            }
+
+            if ($attributes['discount_type'] === RuleFactory::DISCOUNT_TYPE_PERCENTAGE ||
+                $attributes['discount_type'] === 'PERCENTAGE'
+            ) {
+                $attributes['discount_type'] = RuleFactory::DISCOUNT_TYPE_PERCENTAGE;
+            } else {
+                $attributes['discount_type'] = RuleFactory::DISCOUNT_TYPE_ABS;
+            }
+
+
+            // update for saving
+            $this->setAttributes($attributes);
         });
     }
 
-- 
GitLab