diff --git a/ajax/backend/rules/getRules.php b/ajax/backend/rules/getRules.php new file mode 100644 index 0000000000000000000000000000000000000000..f5b353f96ff909d5afd1ebda2afd6da184798f4d --- /dev/null +++ b/ajax/backend/rules/getRules.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file contains package_quiqqer_shipping_ajax_backend_rules_getRules + */ + +/** + * Return all wanted shipping rules + * + * @return array + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_shipping_ajax_backend_rules_getRules', + function ($ruleIds) { + $ruleIds = \json_decode($ruleIds, true); + $Rules = QUI\ERP\Shipping\Rules\Factory::getInstance(); + + $result = []; + + foreach ($ruleIds as $ruleId) { + try { + $result[] = $Rules->getChild($ruleId)->toArray(); + } catch (QUI\Exception $Exception) { + \QUI\System\Log::addDebug($Exception); + } + } + + return $result; + }, + ['ruleIds'], + 'Permission::checkAdminUser' +); diff --git a/ajax/backend/update.php b/ajax/backend/update.php index 446ce4b2dd1a7b7b11d4e83976690b6d68f03334..4aa11a2f83b9f9d2bbe87fe100be00206f6de472 100644 --- a/ajax/backend/update.php +++ b/ajax/backend/update.php @@ -38,6 +38,15 @@ function ($shippingId, $data) { } $ShippingEntry->setAttributes($data); + + if (isset($data['shipping_rules'])) { + $shipping = json_decode($data['shipping_rules'], true); + + foreach ($shipping as $shippingId) { + $ShippingEntry->addShippingRuleId($shippingId); + } + } + $ShippingEntry->update(); QUI::getMessagesHandler()->addSuccess( diff --git a/bin/backend/classes/ShippingRules.js b/bin/backend/classes/ShippingRules.js index a36c64175a8d898629cde874aefdeadf7acdfd2f..39f923a305c724d578fdf82351e67d21fb239811 100644 --- a/bin/backend/classes/ShippingRules.js +++ b/bin/backend/classes/ShippingRules.js @@ -43,6 +43,22 @@ define('package/quiqqer/shipping/bin/backend/classes/ShippingRules', [ onError : reject }); }); + }, + + /** + * Return the wanted rules + * + * @param ruleIds + * @return {Promise} + */ + getRules: function (ruleIds) { + return new Promise(function (resolve, reject) { + QUIAjax.get('package_quiqqer_shipping_ajax_backend_rules_getRules', resolve, { + 'package': 'quiqqer/shipping', + ruleIds : JSON.encode(ruleIds), + onError : reject + }); + }); } }); }); diff --git a/bin/backend/controls/ShippingEntry.List.js b/bin/backend/controls/ShippingEntry.List.js index 08891e98eb24d1c0e9d9e347738f0140944aa78e..a49970e827d5e18c488a530aff8c6c1f9006097f 100644 --- a/bin/backend/controls/ShippingEntry.List.js +++ b/bin/backend/controls/ShippingEntry.List.js @@ -1,6 +1,8 @@ /** * @module package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List * @author www.pcsg.de (Henning Leutz) + * + * @event onLoad [self] */ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [ @@ -18,17 +20,21 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [ Type : 'package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', Binds: [ - '$onInject' + '$onInject', + '$openAddDialog', + '$openDeleteDialog' ], options: { - shippingId: false + shippingId: false, + name : 'shipping-rules' }, initialize: function (options) { this.parent(options); - this.$Grid = null; + this.$Grid = null; + this.$Input = null; this.addEvents({ onInject: this.$onInject @@ -44,14 +50,36 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [ this.$Elm.addClass('quiqqer-shipping-rules'); + this.$Input = new Element('input', { + type: 'hidden', + name: this.getAttribute('name') + }).inject(this.$Elm); return this.$Elm; }, + /** + * refresh the input value + */ + refreshInput: function () { + if (!this.$Grid) { + return; + } + + var value = this.$Grid.getData().map(function (entry) { + return parseInt(entry.id); + }); + + value = JSON.encode(value); + + this.$Input.value = value; + }, + /** * event: on inject */ $onInject: function () { + var self = this; var Container = new Element('div').inject(this.getElm()); var width = Container.getSize().x - 5; @@ -99,19 +127,85 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry.List', [ }); this.$Grid.setWidth(width); + + 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) { + var shippingRules = result.shipping_rules; + + try { + shippingRules = JSON.decode(shippingRules); + } catch (e) { + shippingRules = []; + } + + return ShippingRules.getRules(shippingRules); + }).then(function (rules) { + self.$Grid.setData({ + data: Utils.parseRulesDataForGrid(rules) + }); + + self.fireEvent('load', [self]); + }); + }); + }, + + /** + * Add shipping rules to the shipping entry + * + * @param {Array} shippingRules - list of ids + */ + addShippingRules: function (shippingRules) { + var self = this; + + return new Promise(function (resolve) { + require([ + 'package/quiqqer/shipping/bin/backend/ShippingRules' + ], function (ShippingRules) { + ShippingRules.getRules(shippingRules).then(function (rules) { + var current = QUILocale.getCurrent(); + + rules.forEach(function (v, k) { + var title = ''; + + if (typeof v.title[current] !== 'undefined') { + title = v.title[current]; + } else { + title = Object.values(v.title)[0]; + } + + rules[k].title = title; + }); + + self.$Grid.setData({ + data: rules + }); + + self.refreshInput(); + resolve(); + }); + }); + }); }, /** * open rule window to add a rule to the shipping rules */ $openAddDialog: function () { + var self = this; + require([ 'package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRuleListWindow' ], function (ShippingRuleListWindow) { new ShippingRuleListWindow({ events: { - onSubmit: function () { - console.log('submit'); + onSubmit: function (Win, selected) { + self.addShippingRules(selected); } } }).open(); diff --git a/bin/backend/controls/ShippingEntry.js b/bin/backend/controls/ShippingEntry.js index b9f2f266f245992643693e4f92946fa2e202f62e..10239904f3dbff2814074daf5cd2c4b1a2f409a4 100644 --- a/bin/backend/controls/ShippingEntry.js +++ b/bin/backend/controls/ShippingEntry.js @@ -370,7 +370,8 @@ define('package/quiqqer/shipping/bin/backend/controls/ShippingEntry', [ Container.getElement('.field-id').set('html', data.id); new ShippingRulesGrid({ - shippingId: self.getAttribute('shippingId') + shippingId: self.getAttribute('shippingId'), + name : 'shipping_rules' }).inject( Container.getElement('.shipping-rules tbody td') ); diff --git a/bin/backend/controls/shippingRules/ShippingRuleList.js b/bin/backend/controls/shippingRules/ShippingRuleList.js index 85b6d56bb035d97dba30c1c8fc541178999d1f6b..e382012dcfcb3dbc225bdd40e50db5ee08f3df3f 100644 --- a/bin/backend/controls/shippingRules/ShippingRuleList.js +++ b/bin/backend/controls/shippingRules/ShippingRuleList.js @@ -7,10 +7,11 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule 'qui/QUI', 'qui/controls/Control', 'package/quiqqer/shipping/bin/backend/ShippingRules', + 'package/quiqqer/shipping/bin/backend/utils/ShippingUtils', 'controls/grid/Grid', 'Locale' -], function (QUI, QUIControl, ShippingRules, Grid, QUILocale) { +], function (QUI, QUIControl, ShippingRules, ShippingUtils, Grid, QUILocale) { "use strict"; return new Class({ @@ -18,11 +19,16 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule Extends: QUIControl, Type : 'package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRuleList', + options: { + multiple: true + }, + Binds: [ '$onInject', '$openCreateDialog', '$openDeleteDialog', - 'refresh' + 'refresh', + 'getSelected' ], initialize: function (options) { @@ -73,10 +79,11 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule var height = size.y; this.$Grid = new Grid(Container, { - height : height, - width : width, - pagination : true, - buttons : [{ + height : height, + width : width, + pagination : true, + multipleSelection: this.getAttribute('multiple'), + buttons : [{ name : 'create', text : QUILocale.get('quiqqer/quiqqer', 'create'), textimage: 'fa fa-plus', @@ -92,7 +99,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule onClick: this.$openDeleteDialog } }], - columnModel: [{ + columnModel : [{ header : QUILocale.get('quiqqer/system', 'id'), dataIndex: 'id', dataType : 'number', @@ -135,17 +142,8 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule ShippingRules.getList().then(function (rules) { self.fireEvent('refresh', [self, rules]); - var current = QUILocale.getCurrent(); - - var data = rules.map(function (entry) { - entry.title = entry.title[current]; - entry.workingTitle = entry.workingTitle[current]; - - return entry; - }); - self.$Grid.setData({ - data: data + data: ShippingUtils.parseRulesDataForGrid(rules) }); return rules; @@ -169,8 +167,8 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule return []; } - return this.$Grid.getSelected().map(function (entry) { - return entry.id; + return this.$Grid.getSelectedData().map(function (entry) { + return parseInt(entry.id); }); }, @@ -187,7 +185,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule ], function (CreateRuleWindow) { new CreateRuleWindow({ events: { - onCloseCreateRuleWindow: function () { + onClose: function () { self.fireEvent('closeCreateRuleWindow', [self]); } } diff --git a/bin/backend/controls/shippingRules/ShippingRuleListWindow.js b/bin/backend/controls/shippingRules/ShippingRuleListWindow.js index 728fe8b027fbf588dbe3b07a5d0751f11e294ba9..b0d16dab58fd22b741b618ac45731ceab05dacd1 100644 --- a/bin/backend/controls/shippingRules/ShippingRuleListWindow.js +++ b/bin/backend/controls/shippingRules/ShippingRuleListWindow.js @@ -24,8 +24,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule options: { maxHeight: 600, - maxWidth : 600, - autoclose: false + maxWidth : 600 }, initialize: function (options) { @@ -71,11 +70,16 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/ShippingRule }, /** - * event: on submit + * Submit the window + * + * @method qui/controls/windows/Confirm#submit */ - $onSubmit: function () { - var selected = this.$List.getSelected(); + submit: function () { + this.fireEvent('submit', [this, this.$List.getSelected()]); + if (this.getAttribute('autoclose')) { + this.close(); + } } }); }); diff --git a/bin/backend/utils/ShippingUtils.js b/bin/backend/utils/ShippingUtils.js new file mode 100644 index 0000000000000000000000000000000000000000..0bbc4ea43ead2670c0be88b29dd573f405c594c5 --- /dev/null +++ b/bin/backend/utils/ShippingUtils.js @@ -0,0 +1,44 @@ +/** + * @module package/quiqqer/shipping/bin/backend/utils/ShippingUtils + * @author www.pcsg.de (Henning Leutz) + */ +define('package/quiqqer/shipping/bin/backend/utils/ShippingUtils', [ + + 'Locale' + +], function (QUILocale) { + + "use strict"; + + return { + + /** + * Return a rule data from ajax for a rule grid + * + * @param {Array} rules + * @return {Array} + */ + parseRulesDataForGrid: function (rules) { + var self = this; + + return rules.map(function (entry) { + return self.parseRuleDataForGrid(entry); + }); + }, + + /** + * parse one rule entry of an ajax rule array to a rule grid entry + * + * @param {Object} ruleData + * @return {Object} + */ + parseRuleDataForGrid: function (ruleData) { + var current = QUILocale.getCurrent(); + + ruleData.title = ruleData.title[current]; + ruleData.workingTitle = ruleData.workingTitle[current]; + + return ruleData; + } + }; +}); \ No newline at end of file diff --git a/src/QUI/ERP/Shipping/Types/Factory.php b/src/QUI/ERP/Shipping/Types/Factory.php index d4c044e6939fbc191a1b5f71714cdebbbf85debb..5d50a5602f049e780e6ce9044923fd0ef0d04851 100644 --- a/src/QUI/ERP/Shipping/Types/Factory.php +++ b/src/QUI/ERP/Shipping/Types/Factory.php @@ -49,14 +49,6 @@ public function createChild($data = []) $data['active'] = 0; } -// if (!isset($data['purchase_quantity_from']) || !\is_integer($data['purchase_quantity_from'])) { -// $data['purchase_quantity_from'] = 0; -// } -// -// if (!isset($data['purchase_quantity_until']) || !\is_integer($data['purchase_quantity_until'])) { -// $data['purchase_quantity_until'] = 0; -// } - if (!isset($data['priority']) || !\is_integer($data['priority'])) { $data['priority'] = 0; } diff --git a/src/QUI/ERP/Shipping/Types/ShippingEntry.php b/src/QUI/ERP/Shipping/Types/ShippingEntry.php index a16d9fba82ee8f2c1aafdd283c18dcf9f14cd1ec..bfe894c240e5fc19f870bbdff8b14d7a55ac0044 100644 --- a/src/QUI/ERP/Shipping/Types/ShippingEntry.php +++ b/src/QUI/ERP/Shipping/Types/ShippingEntry.php @@ -12,8 +12,8 @@ use QUI\Permissions\Permission; use QUI\ERP\Shipping\Api; -use QUI\ERP\Areas\Utils as AreaUtils; -use QUI\ERP\Shipping\Exceptions\ShippingCanNotBeUsed; +use QUI\ERP\Shipping\Rules\Factory as RuleFactory; +use QUI\ERP\Shipping\Rules\ShippingRule; /** * Class ShippingEntry @@ -384,4 +384,63 @@ protected function setShippingLocale($var, $title) } } //endregion + + //region rules + + /** + * @param ShippingRule $Rule + */ + public function addShippingRule(ShippingRule $Rule) + { + $shippingRules = $this->getAttribute('shipping_rules'); + $shippingRules = \json_decode($shippingRules, true); + + if (!\in_array($Rule->getId(), $shippingRules)) { + $shippingRules[] = $Rule->getId(); + } + + $this->setAttribute('shipping_rules', \json_encode($shippingRules)); + } + + /** + * Add a shipping rule by its id + * + * @param integer $shippingRuleId + * @throws QUI\Exception + */ + public function addShippingRuleId($shippingRuleId) + { + /* @var $Rule ShippingRule */ + $Rule = RuleFactory::getInstance()->getChild($shippingRuleId); + $this->addShippingRule($Rule); + } + + /** + * Return the shipping rules of the + * @return ShippingRule[] + */ + public function getShippingRules() + { + $shippingRules = $this->getAttribute('shipping_rules'); + $shippingRules = \json_decode($shippingRules, true); + + if (!is_array($shippingRules)) { + return []; + } + + $result = []; + $Rules = RuleFactory::getInstance(); + + foreach ($shippingRules as $shippingRule) { + try { + $result[] = $Rules->getChild($shippingRule); + } catch (QUI\Exception $Exception) { + QUI\System\Log::addDebug($Exception); + } + } + + return $result; + } + + //endregion }