diff --git a/bin/backend/controls/articles/Article.js b/bin/backend/controls/articles/Article.js index 48c385d524b55ab3bdd63939f08906c83c15a2a0..8c36c7a55ca48671116fc05f436d395ad0d8e8fc 100644 --- a/bin/backend/controls/articles/Article.js +++ b/bin/backend/controls/articles/Article.js @@ -43,7 +43,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ 'text!package/quiqqer/erp/bin/backend/controls/articles/Article.html', 'css!package/quiqqer/erp/bin/backend/controls/articles/Article.css' -], function( +], function ( QUI, QUIControl, QUIButton, @@ -122,21 +122,30 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ User: false, // special user object (see this.addUser) - deletable: true, // show "delete" button + deletable: true, // show "delete" button replaceable: true, // show "replace" button calcByList: true // calculate article prices by the associated ArticleList }, - initialize: function(options) { + initialize: function (options) { this.setAttributes(this.__proto__.options); // set the default values this.parent(options); this.$user = {}; + this.$calculate = true; // calculation is running or not this.$calculations = {}; this.$bruttoCalc = {}; if (typeof options !== 'undefined' && typeof options.calculated !== 'undefined') { this.$calculations = options.calculated; + + if (typeof this.$calculations.bruttoCalculated !== 'undefined') { + this.$bruttoCalc = this.$calculations.bruttoCalculated; + } + } + + if (typeof options !== 'undefined' && typeof options.calculate !== 'undefined') { + this.$calculate = options.calculate; } if (typeof this.$calculations.nettoPriceNotRounded !== 'undefined' && this.$calculations.nettoPriceNotRounded) { @@ -178,7 +187,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @returns {HTMLDivElement} */ - create: function() { + create: function () { const self = this; this.$Elm = this.parent(); @@ -226,7 +235,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ if (showSelectCheckbox) { this.$SelectCheckbox = this.$Elm.getElement('.quiqqer-erp-backend-erpArticle-selectbox > input'); - this.$SelectCheckbox.addEvent('change', function(event) { + this.$SelectCheckbox.addEvent('change', function (event) { if (event.target.checked) { self.select(); } else { @@ -275,7 +284,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ this.$VAT.addEvent('click', this.$onEditVat); // Special VAT cell events - this.$VAT.addEvent('keydown', function(event) { + this.$VAT.addEvent('keydown', function (event) { if (event.key === 'tab') { this.$editNext(event); return; @@ -286,7 +295,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ } }.bind(this)); - this.$VAT.addEvent('blur', function(event) { + this.$VAT.addEvent('blur', function (event) { if (event.key === 'tab') { this.$editNext(event); } @@ -305,7 +314,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ this.$QuantityUnit.addEvent('click', this.$onEditQuantityUnit); // Special quantity unit cell events - this.$QuantityUnit.addEvent('keydown', function(event) { + this.$QuantityUnit.addEvent('keydown', function (event) { if (event.key === 'tab') { this.$editNext(event); return; @@ -316,7 +325,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ } }.bind(this)); - this.$QuantityUnit.addEvent('blur', function(event) { + this.$QuantityUnit.addEvent('blur', function (event) { if (event.key === 'tab') { this.$editNext(event); } @@ -411,7 +420,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ this.setQuantityUnit(this.getAttribute('quantityUnit')); if (!this.getAttribute('quantityUnit')) { - this.$loadDefaultQuantityUnit().catch(function(err) { + this.$loadDefaultQuantityUnit().catch(function (err) { console.error(err); }); } @@ -438,7 +447,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ this.calc(); - this.addEvent('onEditKeyDown', function(me, event) { + this.addEvent('onEditKeyDown', function (me, event) { if (event.key === 'tab') { this.$editNext(event); } @@ -454,7 +463,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @fires onRemove [self] * @fires onDrop [self] */ - remove: function() { + remove: function () { this.fireEvent('delete', [this]); this.fireEvent('remove', [this]); this.fireEvent('drop', [this]); @@ -465,7 +474,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * Trigger the replace event */ - $onReplaceClick: function() { + $onReplaceClick: function () { this.fireEvent('replace', [this]); }, @@ -474,7 +483,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {Object} user */ - setUser: function(user) { + setUser: function (user) { this.$user = user; }, @@ -483,7 +492,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @return {Promise} */ - calc: function() { + calc: function () { if (!this.$created) { return Promise.resolve(); } @@ -503,7 +512,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ const price = Formatter.format(product.calculated.nettoSubSum); const total = Formatter.format(product.calculated.nettoSum); - const setElement = function(Node, text) { + const setElement = function (Node, text) { const isInEditMode = Node.getElement('input'); if (isInEditMode) { @@ -553,7 +562,10 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ } this.hideLoader(); - this.fireEvent('calc', [this]); + + if (!this.$calculate) { + this.fireEvent('calc', [this]); + } return product; }); @@ -564,11 +576,29 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @return {Promise} */ - $calc: function() { + $calc: function () { + if (!this.$calculate) { + return Promise.resolve({ + vat: this.getAttribute('vat'), + unitPrice: this.getAttribute('unitPrice'), + + id: this.getAttribute('id'), + articleNo: this.getAttribute('articleNo'), + description: this.getAttribute('description'), + discount: this.getAttribute('discount'), + position: this.getAttribute('position'), + price: this.getAttribute('price'), + quantity: this.getAttribute('quantity'), + quantityUnit: this.getAttribute('quantityUnit'), + title: this.getAttribute('title'), + + calculated: this.$calculations + }); + } + let Calc; - const self = this, - attr = self.getAttributes(), + const attr = this.getAttributes(), pos = parseInt(attr.position); let calcByList = false; @@ -577,41 +607,47 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ Calc = this.getAttribute('List').$executeCalculation(); calcByList = true; } else { - Calc = new Promise(function(resolve, reject) { + Calc = new Promise((resolve, reject) => { QUIAjax.get('package_quiqqer_erp_ajax_products_calc', resolve, { 'package': 'quiqqer/erp', onError: reject, articles: JSON.encode({ articles: [attr] }), - user: JSON.encode(self.$user), - currency: self.getAttribute('currency') + user: JSON.encode(this.$user), + currency: this.getAttribute('currency') }); }); } - return Calc.then(function(result) { + return Calc.then((result) => { let articleList; let brutto; - let articles = result.articles; + let articles = []; - if (!calcByList) { - articleList = articles[0]; - brutto = result.brutto.articles[0]; + if (!result || typeof result.articles === 'undefined') { + brutto = !this.getAttribute('List').$Switch.getStatus(); } else { - articleList = articles.filter(function(article) { - return parseInt(article.position) === pos; - })[0]; + articles = result.articles; - brutto = result.brutto.articles.filter(function(article) { - return parseInt(article.position) === pos; - })[0]; + if (!calcByList) { + articleList = articles[0]; + brutto = result.brutto.articles[0]; + } else { + articleList = articles.filter(function (article) { + return parseInt(article.position) === pos; + })[0]; + + brutto = result.brutto.articles.filter(function (article) { + return parseInt(article.position) === pos; + })[0]; + } } - self.$calculations = articleList; - self.$bruttoCalc = brutto; - self.fireEvent('calc', [ - self, + this.$calculations = articleList; + this.$bruttoCalc = brutto; + this.fireEvent('calc', [ + this, result, articleList ]); @@ -625,7 +661,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @returns {{}|*} */ - getCalculations: function() { + getCalculations: function () { if (!this.$calculations) { return {}; } @@ -633,10 +669,27 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ return this.$calculations.calculated; }, + setCalculations: function (calculations) { + this.$calculations = calculations; + }, + + disableCalculations: function () { + this.$calculate = false; + this.$calculations.calculate = 0; + }, + + enableCalculations: function () { + this.$calculate = true; + + if (typeof this.$calculations.calculate !== 'undefined') { + delete this.$calculations.calculate; + } + }, + /** * @returns {*} */ - getBruttoCalc: function() { + getBruttoCalc: function () { return this.$bruttoCalc; }, @@ -645,7 +698,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @return {Promise|*} */ - getCurrencyFormatter: function() { + getCurrencyFormatter: function () { if (this.$Formatter) { return Promise.resolve(this.$Formatter); } @@ -687,7 +740,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {String} currency */ - setCurrency: function(currency) { + setCurrency: function (currency) { if (this.getAttribute('currency') === currency) { return; } @@ -701,7 +754,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {String} title */ - setTitle: function(title) { + setTitle: function (title) { this.setAttribute('title', title); this.$Title.set('html', title); @@ -717,7 +770,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {String} description */ - setDescription: function(description) { + setDescription: function (description) { this.setAttribute('description', description); this.$Description.set('html', description); @@ -739,7 +792,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {String} articleNo */ - setArticleNo: function(articleNo) { + setArticleNo: function (articleNo) { this.setAttribute('articleNo', articleNo); this.$ArticleNo.set('html', articleNo); @@ -755,7 +808,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {Number} pos */ - setPosition: function(pos) { + setPosition: function (pos) { this.setAttribute('position', parseInt(pos)); if (this.$Position) { @@ -771,7 +824,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param {Number} quantity * @return {Promise} */ - setQuantity: function(quantity) { + setQuantity: function (quantity) { this.setAttribute('quantity', parseFloat(quantity)); if (this.$Quantity) { @@ -788,7 +841,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {Object} quantityUnit - {id:'piece', title:''} */ - setQuantityUnit: function(quantityUnit) { + setQuantityUnit: function (quantityUnit) { if (typeof quantityUnit.id === 'undefined') { return; } @@ -811,7 +864,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param {Number} price * @return {Promise} */ - setUnitPrice: function(price) { + setUnitPrice: function (price) { this.setAttribute('unitPrice', parseFloat(price)); if (this.$UnitPrice) { @@ -829,7 +882,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param {Number|String} vat * @return {Promise} */ - setVat: function(vat) { + setVat: function (vat) { if (vat === '-' || vat === '') { this.setAttribute('vat', ''); this.$VAT.set('html', '-'); @@ -862,7 +915,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param {String|Number} discount - 100 = 100€, 100€ = 100€ or 10% = calculation */ - setDiscount: function(discount) { + setDiscount: function (discount) { const self = this; let value = '', type = ''; @@ -887,7 +940,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ } } - return Prom.then(function(discountResult) { + return Prom.then(function (discountResult) { if (discountResult && type === '%') { discountResult = (discountResult).toString().replace(/\%/g, '') + type; value = discountResult; @@ -909,21 +962,21 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * Show the loader */ - showLoader: function() { + showLoader: function () { this.$Loader.setStyle('display', null); }, /** * Hide the loader */ - hideLoader: function() { + hideLoader: function () { this.$Loader.setStyle('display', 'none'); }, /** * select the article */ - select: function() { + select: function () { if (!this.$Elm) { return; } @@ -946,7 +999,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * unselect the article */ - unselect: function() { + unselect: function () { if (!this.$Elm) { return; } @@ -965,7 +1018,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * @return {boolean} */ - isSelected: function() { + isSelected: function () { return this.$isSelected; }, @@ -976,7 +1029,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * Opens the delete dialog */ - openDeleteDialog: function() { + openDeleteDialog: function () { new QUIConfirm({ icon: 'fa fa-trash', texticon: 'fa fa-trash', @@ -998,11 +1051,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event : on title edit */ - $onEditTitle: function() { + $onEditTitle: function () { this.$createEditField( this.$Title, this.getAttribute('title') - ).then(function(value) { + ).then(function (value) { this.setTitle(value); }.bind(this)); }, @@ -1010,7 +1063,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event : on description edit */ - $onEditDescription: function() { + $onEditDescription: function () { if (this.$Editor) { return; } @@ -1026,7 +1079,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ maxHeight: 600, maxWidth: 800, events: { - onOpen: function(Win) { + onOpen: function (Win) { Win.Loader.show(); const Content = Win.getContent(); @@ -1050,7 +1103,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ Title.set('placeholder', QUILocale.get('quiqqer/system', 'title')); Title.focus(); - Editors.getEditor(null).then(function(Editor) { + Editors.getEditor(null).then(function (Editor) { self.$Editor = Editor; // minimal toolbar @@ -1107,7 +1160,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ ] }); - self.$Editor.addEvent('onLoaded', function() { + self.$Editor.addEvent('onLoaded', function () { self.$Editor.switchToWYSIWYG(); self.$Editor.showToolbar(); self.$Editor.setContent(self.getAttribute('description')); @@ -1119,14 +1172,14 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ self.$Editor.setHeight(340); }); - Title.addEvent('keyup', function(event) { + Title.addEvent('keyup', function (event) { if (event.key === 'enter') { Win.submit(); } }); }, - onSubmit: function(Win) { + onSubmit: function (Win) { const description = self.$Editor.getContent(); Win.Loader.show(); @@ -1145,7 +1198,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ }); }, - onClose: function() { + onClose: function () { self.$Editor.destroy(); self.$Editor = null; } @@ -1156,11 +1209,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event: on Article-Number edit */ - $onEditArticleNo: function() { + $onEditArticleNo: function () { this.$createEditField( this.$ArticleNo, this.getAttribute('articleNo') - ).then(function(value) { + ).then(function (value) { this.setArticleNo(value); }.bind(this)); }, @@ -1168,12 +1221,12 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event : on quantity edit */ - $onEditQuantity: function() { + $onEditQuantity: function () { this.$createEditField( this.$Quantity, this.getAttribute('quantity'), 'number' - ).then(function(value) { + ).then(function (value) { this.setQuantity(value); }.bind(this)); }, @@ -1181,15 +1234,15 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * Edit quantity unit */ - $onEditQuantityUnit: function() { + $onEditQuantityUnit: function () { const self = this; require([ 'package/quiqqer/erp/bin/backend/controls/articles/product/QuantityUnitWindow' - ], function(QuantityUnitWindow) { + ], function (QuantityUnitWindow) { new QuantityUnitWindow({ events: { - onSubmit: function(Win, value, title) { + onSubmit: function (Win, value, title) { self.setQuantityUnit({ id: value, title: title @@ -1209,14 +1262,14 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event : on quantity edit */ - $onEditUnitPriceQuantity: function() { + $onEditUnitPriceQuantity: function () { const self = this; this.$createEditField( this.$UnitPrice, this.getAttribute('unitPrice'), 'number' - ).then(function(value) { + ).then(function (value) { self.setUnitPrice(value); }); }, @@ -1224,16 +1277,16 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event : on brutto price edit */ - $onEditBruttoPrice: function() { + $onEditBruttoPrice: function () { const self = this; this.$createEditField( this.$UnitPriceBrutto, this.$UnitPriceBrutto.get('data-value'), 'number' - ).then(function(value) { + ).then(function (value) { return self.getNettoPrice(value, false); - }).then(function(value) { + }).then(function (value) { self.setUnitPrice(value); }); }, @@ -1241,15 +1294,15 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event: on edit VAT */ - $onEditVat: function() { + $onEditVat: function () { const self = this; require([ 'package/quiqqer/tax/bin/controls/taxList/AvailableTaxListWindow' - ], function(AvailableTaxListWindow) { + ], function (AvailableTaxListWindow) { new AvailableTaxListWindow({ events: { - onSubmit: function(Win, value) { + onSubmit: function (Win, value) { self.setVat(value); QUIElements.simulateEvent( @@ -1265,7 +1318,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event: on edit discount */ - $onEditDiscount: function() { + $onEditDiscount: function () { let discount = this.getAttribute('discount'); if (discount === '-' || discount === false || !discount) { @@ -1279,7 +1332,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ this.$createEditField( this.$Discount, discount - ).then(function(value) { + ).then(function (value) { this.setDiscount(value); }.bind(this)); }, @@ -1287,7 +1340,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * event: on brutto edit discount */ - $onEditBruttoDiscount: function() { + $onEditBruttoDiscount: function () { const self = this; let discount = this.$DiscountBrutto.get('data-value'); @@ -1299,7 +1352,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ } } - this.$createEditField(this.$DiscountBrutto, discount).then(function(value) { + this.$createEditField(this.$DiscountBrutto, discount).then(function (value) { if (value.match('%')) { return self.setDiscount(value); } @@ -1308,7 +1361,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ return self.setDiscount(0); } - return self.getNettoPrice(value).then(function(nettoValue) { + return self.getNettoPrice(value).then(function (nettoValue) { self.setDiscount(nettoValue); }); }); @@ -1317,7 +1370,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ /** * Edit custom fields */ - $onCustomFieldClick: function() { + $onCustomFieldClick: function () { this.fireEvent('editCustomFields', [this]); }, @@ -1330,12 +1383,12 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param {Object} [inputAttributes] - input attributes * @returns {Promise} */ - $createEditField: function(Container, value, type, inputAttributes) { + $createEditField: function (Container, value, type, inputAttributes) { const self = this; type = type || 'text'; - return new Promise(function(resolve) { + return new Promise(function (resolve) { const Edit = new Element('input', { type: type, value: value, @@ -1371,17 +1424,17 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ Edit.focus(); Edit.select(); - const onFinish = function() { + const onFinish = function () { Edit.destroy(); resolve(Edit.value); }; Edit.addEvents({ - click: function(event) { + click: function (event) { event.stop(); }, - keydown: function(event) { + keydown: function (event) { self.fireEvent('editKeyDown', [ self, event @@ -1407,7 +1460,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @param event */ - $editNext: function(event) { + $editNext: function (event) { let Cell = event.target; if (!Cell.hasClass('cell')) { @@ -1483,11 +1536,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * * @return {Promise} */ - $loadDefaultQuantityUnit: function() { + $loadDefaultQuantityUnit: function () { const self = this; - return new Promise(function(resolve) { - QUIAjax.get('package_quiqqer_erp_ajax_products_getQuantityUnitList', function(unitList) { + return new Promise(function (resolve) { + QUIAjax.get('package_quiqqer_erp_ajax_products_getQuantityUnitList', function (unitList) { let i, title, entry; let current = QUILocale.getCurrent(); @@ -1529,10 +1582,10 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param formatted * @return {Promise} */ - getNettoPrice: function(value, formatted) { + getNettoPrice: function (value, formatted) { const self = this; - return new Promise(function(resolve) { + return new Promise(function (resolve) { QUIAjax.get('package_quiqqer_erp_ajax_calcNettoPrice', resolve, { 'package': 'quiqqer/erp', price: value, @@ -1549,10 +1602,10 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param formatted * @return {Promise} */ - getBruttoPrice: function(value, formatted) { + getBruttoPrice: function (value, formatted) { const self = this; - return new Promise(function(resolve) { + return new Promise(function (resolve) { QUIAjax.get('package_quiqqer_erp_ajax_calcBruttoPrice', resolve, { 'package': 'quiqqer/erp', price: value, @@ -1568,7 +1621,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/Article', [ * @param {String} description * @return {Promise} */ - $sanitizeArticleDescription: function(description) { + $sanitizeArticleDescription: function (description) { return new Promise((resolve, reject) => { QUIAjax.get('package_quiqqer_erp_ajax_utils_sanitizeArticleDescription', resolve, { 'package': 'quiqqer/erp', diff --git a/bin/backend/controls/articles/ArticleList.js b/bin/backend/controls/articles/ArticleList.js index b9229a09d23f25b4eba8b5836001d60b3d53447d..dd471187fb9838066c541397ad6ec7955ba43e5a 100644 --- a/bin/backend/controls/articles/ArticleList.js +++ b/bin/backend/controls/articles/ArticleList.js @@ -27,8 +27,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ 'text!package/quiqqer/erp/bin/backend/controls/articles/ArticleList.sortablePlaceholder.html', 'css!package/quiqqer/erp/bin/backend/controls/articles/ArticleList.css' -], function(QUI, QUIControl, QUISwitch, QUILoader, Mustache, - QUIAjax, QUILocale, AddProductWindow, Article, Sortables, template, templateSortablePlaceholder +], function (QUI, QUIControl, QUISwitch, QUILoader, Mustache, + QUIAjax, QUILocale, AddProductWindow, Article, Sortables, template, templateSortablePlaceholder ) { 'use strict'; @@ -58,7 +58,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ nettoinput: true }, - initialize: function(options) { + initialize: function (options) { this.parent(options); this.$articles = []; @@ -68,6 +68,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ this.$calculationTimer = null; this.$isIncalculationFrame = false; + this.$calculate = true; // calculation is running or not + this.$calculations = { currencyData: {}, isEuVat: 0, @@ -95,7 +97,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @returns {HTMLDivElement} */ - create: function() { + create: function () { const self = this; this.$Elm = this.parent(); @@ -131,7 +133,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ switchTextOff: 'brutto', switchTextOffIcon: false, events: { - onChange: function() { + onChange: function () { self.$Loader.show(); self.setAttribute('nettoinput', !!self.$Switch.getStatus()); self.$refreshNettoBruttoDisplay(); @@ -144,7 +146,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ this.$Elm.getElement('.quiqqer-erp-backend-erpItems-container-switch-btn') ); - SwitchDesc.addEvent('click', function() { + SwitchDesc.addEvent('click', function () { self.$Switch.toggle(); }); @@ -156,8 +158,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ /** * event: on inject */ - $onInject: function() { - (function() { + $onInject: function () { + (function () { if (this.$articles.length) { this.$articles[0].select(); } @@ -169,8 +171,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @returns {Object} */ - serialize: function() { - const articles = this.$getArticles().map(function(ArticleInstance) { + serialize: function () { + const articles = this.$getArticles().map(function (ArticleInstance) { const attr = ArticleInstance.getAttributes(); attr.control = typeOf(ArticleInstance); @@ -183,21 +185,31 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ }; }, + getArticles: function () { + return this.$getArticles(); + }, + /** * Get internal article list * * @return {[]} */ - $getArticles: function() { + $getArticles: function () { return this.$articles; }, + clear: function () { + this.$articles = []; + this.$priceFactors = []; + this.$Container.innerHTML = ''; + }, + /** * Return the articles count * * @returns {number} */ - count: function() { + count: function () { return this.$articles.length; }, @@ -210,7 +222,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * @param {Object|String} list * @return {Promise} */ - unserialize: function(list) { + unserialize: function (list) { const self = this; let data = {}; @@ -251,7 +263,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ this.$Container.set('html', ''); } - const controls = data.articles.map(function(ArticleInstance) { + const controls = data.articles.map(function (ArticleInstance) { if (typeof ArticleInstance.control !== 'undefined' && ArticleInstance.control !== '') { return ArticleInstance.control; } @@ -259,7 +271,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ return 'package/quiqqer/erp/bin/backend/controls/articles/Article'; }).unique(); - require(controls, function() { // dont use () => { + require(controls, function () { // dont use () => { let i, len, article, index; for (i = 0, len = data.articles.length; i < len; i++) { @@ -294,10 +306,10 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param {Object} user */ - setUser: function(user) { + setUser: function (user) { this.$user = user; - this.$articles.each(function(ArticleInstance) { + this.$articles.each(function (ArticleInstance) { ArticleInstance.setUser(this.$user); }.bind(this)); }, @@ -307,7 +319,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @return {Object|*|{}} */ - getUser: function() { + getUser: function () { return this.$user; }, @@ -317,7 +329,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param {Object} Child */ - addArticle: function(Child) { + addArticle: function (Child) { if (typeof Child !== 'object') { return; } @@ -330,6 +342,13 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ Child.setCurrency(this.getAttribute('currency')); } + if (!this.$calculate) { + console.log('add -> disableCalculation'); + if (typeof Child.disableCalculation === 'function') Child.disableCalculation(); + } else { + console.log('add -> enableCalculation'); + if (typeof Child.enableCalculation === 'function') Child.enableCalculation(); + } this.$articles.push(Child); @@ -359,7 +378,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * @param {Object} NewArticle * @param {Number} position */ - replaceArticle: function(NewArticle, position) { + replaceArticle: function (NewArticle, position) { if (typeof NewArticle !== 'object') { return; } @@ -368,7 +387,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ return; } - const Wanted = this.$articles.find(function(ArticleInstance) { + const Wanted = this.$articles.find(function (ArticleInstance) { return ArticleInstance.getAttribute('position') === position; }); @@ -389,7 +408,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ /** * Insert a new empty product */ - insertNewProduct: function() { + insertNewProduct: function () { this.addArticle(new Article()); }, @@ -398,8 +417,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @return {Array} */ - save: function() { - return this.$articles.map(function(ArticleInstance) { + save: function () { + return this.$articles.map(function (ArticleInstance) { return Object.merge(ArticleInstance.getAttributes(), { control: ArticleInstance.getType() }); @@ -409,7 +428,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ /** * Calculate the list */ - $calc: function() { + $calc: function () { + if (!this.$calculate) { + return Promise.resolve(); + } + return new Promise((resolve) => { if (this.$calculationTimer) { clearTimeout(this.$calculationTimer); @@ -418,7 +441,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ const self = this; - this.$calculationTimer = (function() { + this.$calculationTimer = (function () { self.$executeCalculation().then(resolve); }).delay(500); }); @@ -433,7 +456,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @returns {Promise} */ - $executeCalculation: function() { + $executeCalculation: function () { + if (!this.$calculate) { + return Promise.resolve(); + } + const self = this; if (this.$isIncalculationFrame) { @@ -486,7 +513,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ user: JSON.encode(this.$user), currency: this.getAttribute('currency'), nettoInput: this.getAttribute('nettoinput') ? 1 : 0, - onError: function(err) { + onError: function (err) { console.error(err); reject(); } @@ -499,27 +526,64 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @return {Array} */ - $getArticleDataForCalculation: function() { - return this.$articles.map(function(ArticleInstance) { + $getArticleDataForCalculation: function () { + return this.$articles.map(function (ArticleInstance) { return ArticleInstance.getAttributes(); }); }, + /** + * @deprecated use getCalculations() + */ + getCalculation: function () { + return this.getCalculations(); + }, + /** * Return the current calculations * * @returns {{currencyData: {}, isEuVat: number, isNetto: boolean, nettoSubSum: number, nettoSum: number, subSum: number, sum: number, vatArray: Array, vatText: Array}|*} */ - getCalculation: function() { + getCalculations: function () { return this.$calculations; }, + setCalculations: function (calculations) { + this.$calculations = calculations; + + this.fireEvent('calc', [ + this, + this.$calculations + ]); + }, + + disableCalculations: function () { + this.$calculate = false; + this.$calculations.calculate = 0; + + this.$articles.forEach((Article) => { + Article.disableCalculations(); + }); + }, + + enableCalculations: function () { + this.$calculate = true; + + if (typeof this.$calculations.calculate !== 'undefined') { + delete this.$calculations.calculate; + } + + this.$articles.forEach((Article) => { + Article.disableCalculations(); + }); + }, + /** * Return the first / main vat of the list * * @returns {number} */ - getVat: function() { + getVat: function () { const calculations = this.getCalculation(); const articles = calculations.articles; const calc = calculations.calculations; @@ -543,7 +607,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @return {[]} */ - getPriceFactors: function() { + getPriceFactors: function () { return this.$priceFactors; }, @@ -552,7 +616,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param no */ - removePriceFactor: function(no) { + removePriceFactor: function (no) { let newList = []; for (let i = 0, len = this.$priceFactors.length; i < len; i++) { @@ -585,7 +649,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * } * @param priceFactor */ - addPriceFactor: function(priceFactor) { + addPriceFactor: function (priceFactor) { const prio = priceFactor.index; if (prio === this.$priceFactors.length) { @@ -619,7 +683,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * @param index * @param priceFactor */ - editPriceFactor: function(index, priceFactor) { + editPriceFactor: function (index, priceFactor) { for (let k in priceFactor) { if (priceFactor.hasOwnProperty(k)) { this.$priceFactors[index][k] = priceFactor[k]; @@ -632,7 +696,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @returns {number} */ - countPriceFactors: function() { + countPriceFactors: function () { return this.$priceFactors.length; }, @@ -643,7 +707,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ /** * Toggles the sorting */ - toggleSorting: function() { + toggleSorting: function () { if (this.$sorting) { this.disableSorting(); return; @@ -656,13 +720,13 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * Enables the sorting * Articles can be sorted by drag and drop */ - enableSorting: function() { + enableSorting: function () { const self = this; const Elm = this.getElm(), elements = Elm.getElements('.article'); - elements.each(function(Node) { + elements.each(function (Node) { const ArticleInstance = QUI.Controls.getById(Node.get('data-quiid')); const attributes = ArticleInstance.getAttributes(); @@ -683,7 +747,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ transition: 'elastic:out' }, - clone: function(event) { + clone: function (event) { let Target = event.target; if (!Target.hasClass('article')) { @@ -705,7 +769,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ }); }, - onStart: function(element) { + onStart: function (element) { element.addClass('quiqqer-erp-sortableClone'); self.$Container.setStyles({ @@ -715,7 +779,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ }); }, - onComplete: function(element) { + onComplete: function (element) { element.removeClass('quiqqer-erp-sortableClone'); self.$Container.setStyles({ @@ -735,7 +799,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * Disables the sorting * Articles can not be sorted */ - disableSorting: function() { + disableSorting: function () { this.$sorting = false; const self = this, @@ -744,7 +808,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ Elm.getElements('.quiqqer-erp-sortableClone-placeholder').destroy(); - elements.each(function(Node) { + elements.each(function (Node) { const ArticleInstance = QUI.Controls.getById(Node.get('data-quiid')); ArticleInstance.removeEvents({ @@ -755,7 +819,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ this.$Sortables.detach(); this.$Sortables = null; - this.$articles.sort(function(A, B) { + this.$articles.sort(function (A, B) { return A.getAttribute('position') - B.getAttribute('position'); }); }, @@ -765,7 +829,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @return {boolean} */ - isSortingEnabled: function() { + isSortingEnabled: function () { return this.$sorting; }, @@ -774,7 +838,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param Article */ - $onArticleSetPosition: function(ArticleInstance) { + $onArticleSetPosition: function (ArticleInstance) { ArticleInstance.getElm().getElement('.quiqqer-erp-backend-erpArticlePlaceholder-pos').set( 'html', ArticleInstance.getAttribute('position') @@ -784,7 +848,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ /** * Recalculate the Position of all Articles */ - $recalculatePositions: function() { + $recalculatePositions: function () { let i, len, ArticleInstance; const Elm = this.getElm(), @@ -805,7 +869,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param {Object} ArticleInstance */ - $onArticleDelete: function(ArticleInstance) { + $onArticleDelete: function (ArticleInstance) { if (this.$selectedArticle) { this.$selectedArticle.unselect(); } @@ -830,7 +894,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ this.$articles = articles; - this.$executeCalculation().then(function() { + this.$executeCalculation().then(function () { if (self.$articles.length) { self.$articles[0].select(); } @@ -842,7 +906,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param {Object} Article */ - $onArticleSelect: function(ArticleInstance) { + $onArticleSelect: function (ArticleInstance) { if (this.$selectedArticle && this.$selectedArticle !== ArticleInstance) { this.$selectedArticle.unselect(); @@ -860,7 +924,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param Article */ - $onArticleUnSelect: function(ArticleInstance) { + $onArticleUnSelect: function (ArticleInstance) { if (this.$selectedArticle === ArticleInstance) { this.$selectedArticle = null; this.fireEvent('articleUnSelect', [ @@ -875,7 +939,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param Article */ - $onArticleReplace: function(ArticleInstance) { + $onArticleReplace: function (ArticleInstance) { this.fireEvent('articleReplaceClick', [ this, ArticleInstance @@ -887,7 +951,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @param {Object} EditArticle - package/quiqqer/erp/bin/backend/controls/articles/Article */ - $onArticleEditCustomFields: function(EditArticle) { + $onArticleEditCustomFields: function (EditArticle) { const ArticleCustomFields = EditArticle.getAttribute('customFields'); const FieldValues = {}; @@ -934,14 +998,14 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ * * @returns {null|Object} */ - getSelectedArticle: function() { + getSelectedArticle: function () { return this.$selectedArticle; }, /** * refresh the brutto / netto switch display */ - $refreshNettoBruttoDisplay: function() { + $refreshNettoBruttoDisplay: function () { const SwitchDesc = this.$Elm.getElement('.quiqqer-erp-backend-erpItems-container-switch-desc'); const Container = this.$Elm.getElement('.quiqqer-erp-backend-erpItems-container-switch'); @@ -982,12 +1046,12 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleList', [ require([ URL_OPT_DIR + 'quiqqer/core/bin/QUI/lib/tippy/tippy.min.js', 'css!' + URL_OPT_DIR + 'quiqqer/core/bin/QUI/lib/tippy/tippy.css' - ], function(tippy) { + ], function (tippy) { tippy(Warning, { animateFill: false, animation: 'shift-away', allowHTML: true, - content: function() { + content: function () { return warning.replace(/ +(?= )/g, '').replace('\n', '').trim(); } }); diff --git a/bin/backend/controls/articles/ArticleSummary.js b/bin/backend/controls/articles/ArticleSummary.js index f51186f77331bf3150f5b86f86872e3cc68517e4..52e27f2618ae6bb6b446fee946e6ad5c59cccb51 100644 --- a/bin/backend/controls/articles/ArticleSummary.js +++ b/bin/backend/controls/articles/ArticleSummary.js @@ -25,11 +25,11 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ return new Class({ Extends: QUIControl, - Type : 'package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', + Type: 'package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', options: { - List : null, - styles : false, + List: null, + styles: false, currency: 'EUR', showPosSummary: true // show summary for selected article @@ -57,7 +57,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ }, /** - * Create the domnode element + * Create the dom-node element * * @returns {HTMLDivElement} */ @@ -66,16 +66,16 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ this.$Elm = new Element('div', { 'data-qui': 'package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', - 'class' : 'quiqqer-erp-backend-temporaryErp-summary', - html : Mustache.render(template, { + 'class': 'quiqqer-erp-backend-temporaryErp-summary', + html: Mustache.render(template, { showPosSummary: showPosSummary, - labelPosInfo : QUILocale.get(lg, 'article.summary.tpl.labelPosInfo'), - labelNet : QUILocale.get(lg, 'article.summary.tpl.labelNet'), - labelGross : QUILocale.get(lg, 'article.summary.tpl.labelGross'), - labelSums : QUILocale.get(lg, 'article.summary.tpl.labelSums'), - labelVat : QUILocale.get(lg, 'article.summary.tpl.labelVat'), + labelPosInfo: QUILocale.get(lg, 'article.summary.tpl.labelPosInfo'), + labelNet: QUILocale.get(lg, 'article.summary.tpl.labelNet'), + labelGross: QUILocale.get(lg, 'article.summary.tpl.labelGross'), + labelSums: QUILocale.get(lg, 'article.summary.tpl.labelSums'), + labelVat: QUILocale.get(lg, 'article.summary.tpl.labelVat'), }), - events : { + events: { mouseenter: this.showPriceFactors, mouseleave: this.hidePriceFactors } @@ -137,8 +137,8 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ Currency.getCurrency(currency).then((currency) => { this.$Formatter = QUILocale.getNumberFormatter({ - style : 'currency', - currency : currency.code, + style: 'currency', + currency: currency.code, minimumFractionDigits: currency.precision, maximumFractionDigits: currency.precision }); @@ -208,7 +208,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ Content.set('html', Mustache.render(template, { priceFactors: priceFactors, - vatArray : Object.values(calculations.vatArray) + vatArray: Object.values(calculations.vatArray) })); const Total = Content.getElement('.quiqqer-erp-backend-temporaryErp-summaryWin-total'); @@ -241,7 +241,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ * @param ArticleInstance */ $refreshArticleSelect: function (List, ArticleInstance) { - let calculated = List.getCalculation(); + let calculated = List.getCalculations(); if (typeof calculated.calculations === 'undefined') { return; @@ -314,7 +314,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ showPriceFactors: function () { const ArticleList = this.getAttribute('List'); let priceFactors = ArticleList.getPriceFactors(); - let calculated = ArticleList.getCalculation(); + let calculated = ArticleList.getCalculations(); if (typeof calculated.calculations === 'undefined') { calculated.calculations = {}; @@ -326,19 +326,21 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ } this.getCurrencyFormatter().then(() => { + console.log(calculated.calculations.vatArray); + const vat = Object.entries(calculated.calculations.vatArray).map((val) => { return { text: val[1].text, - sum : this.$Formatter.format(val[1].sum) + sum: this.$Formatter.format(val[1].sum) }; }); - + this.$PriceFactors.set('html', Mustache.render(templatePriceFactor, { - valueSubSum : calculated.calculations.display_subSum, - valueSum : calculated.calculations.display_sum, - vat : vat, - textSubSum : QUILocale.get(lg, 'article.list.articles.subtotal'), - textSum : QUILocale.get(lg, 'article.list.articles.sumtotal'), + valueSubSum: calculated.calculations.display_subSum, + valueSum: calculated.calculations.display_sum, + vat: vat, + textSubSum: QUILocale.get(lg, 'article.list.articles.subtotal'), + textSum: QUILocale.get(lg, 'article.list.articles.sumtotal'), priceFactors: priceFactors })); @@ -347,7 +349,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ this.$PriceFactors.setStyle('bottom', 70); this.$PFFX.animate({ - bottom : 80, + bottom: 80, opacity: 1 }, { duration: 300 @@ -357,7 +359,7 @@ define('package/quiqqer/erp/bin/backend/controls/articles/ArticleSummary', [ hidePriceFactors: function () { this.$PFFX.animate({ - bottom : 70, + bottom: 70, opacity: 0 }, { duration: 300,