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