diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js index a0103947658..00173540039 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_model.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js @@ -281,7 +281,6 @@ var StatementModel = BasicModel.extend({ if (last && !this._isValid(last)) { return $.Deferred().resolve(false); } - prop = this._formatQuickCreate(line); line.reconciliation_proposition.push(prop); line.createForm = _.pick(prop, this.quickCreateFields); @@ -493,13 +492,6 @@ var StatementModel = BasicModel.extend({ var focus = this._formatQuickCreate(line, _.pick(reconcileModel, fields)); focus.reconcileModelId = reconcileModelId; - if (!line.reconciliation_proposition.every(function(prop) {return prop.to_check == focus.to_check})) { - new CrashManager().show_warning({data: { - exception_type: _t("Incorrect Operation"), - message: _t("You cannot mix items with and without the 'To Check' checkbox ticked.") - }}); - return $.when(); - } line.reconciliation_proposition.push(focus); if (reconcileModel.has_second_line) { @@ -620,18 +612,16 @@ var StatementModel = BasicModel.extend({ var self = this; var line = this.getLine(handle); var prop = _.last(_.filter(line.reconciliation_proposition, '__focus')); + if ('to_check' in values && values.to_check === false) { + // check if we have another line with to_check and if yes don't change value of this proposition + prop.to_check = line.reconciliation_proposition.some(function(rec_prop, index) { + return rec_prop.id !== prop.id && rec_prop.to_check; + }); + } if (!prop) { prop = this._formatQuickCreate(line); line.reconciliation_proposition.push(prop); } - if ('to_check' in values && !line.reconciliation_proposition.slice(0,-1).every(function(prop) {return prop.to_check == values.to_check})) { - new CrashManager().show_warning({data: { - exception_type: _t("Incorrect Operation"), - message: _t("You cannot mix items with and without the 'To Check' checkbox ticked.") - }}); - $('.create_to_check input:visible').prop('checked', !values.to_check).change(); - return $.when(); - } _.each(values, function (value, fieldName) { if (fieldName === 'analytic_tag_ids') { switch (value.operation) { @@ -671,7 +661,6 @@ var StatementModel = BasicModel.extend({ prop.amount = prop.base_amount; } line.createForm = _.pick(prop, this.quickCreateFields); - // If you check/uncheck the force_tax_included box, reset the createForm amount. if(prop.base_amount) line.createForm.amount = prop.base_amount; @@ -724,16 +713,8 @@ var StatementModel = BasicModel.extend({ "new_aml_dicts": _.map(_.filter(props, function (prop) { return isNaN(prop.id) && prop.display; }), self._formatToProcessReconciliation.bind(self, line)), + "to_check": line.to_check, }; - line.reconciliation_proposition.some(function(prop) { - if (prop.to_check) { - values_dict['to_check'] = true; - return true; - } - }) - if (line.reconciliation_proposition[0].to_check) { - values_dict['to_check'] = true; - } // If the lines are not fully balanced, create an unreconciled amount. // line.st_line.currency_id is never false here because its equivalent to @@ -845,7 +826,12 @@ var StatementModel = BasicModel.extend({ var formatOptions = { currency_id: line.st_line.currency_id, }; + line.to_check = false; _.each(line.reconciliation_proposition, function (prop) { + if (prop.to_check) { + // If one of the proposition is to_check, set the global to_check flag to true + line.to_check = true; + } if (prop.is_tax) { if (!_.find(line.reconciliation_proposition, {'id': prop.link}).__tax_to_recompute) { reconciliation_proposition.push(prop); @@ -1129,7 +1115,7 @@ var StatementModel = BasicModel.extend({ 'link': values.link, 'display': true, 'invalid': true, - 'to_check': values.to_check || false, + 'to_check': !!values.to_check, '__tax_to_recompute': true, 'is_tax': values.is_tax, '__focus': '__focus' in values ? values.__focus : true, diff --git a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js index 9cd6bd772c0..33e5844fc75 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js @@ -343,7 +343,7 @@ var LineRenderer = Widget.extend(FieldManagerMixin, { update: function (state) { var self = this; // isValid - var to_check_checked = !!(state.reconciliation_proposition[0] && state.reconciliation_proposition[0].to_check); + var to_check_checked = !!(state.to_check); this.$('caption .o_buttons button.o_validate').toggleClass('d-none', !!state.balance.type && !to_check_checked); this.$('caption .o_buttons button.o_reconcile').toggleClass('d-none', state.balance.type <= 0 || to_check_checked); this.$('caption .o_buttons .o_no_valid').toggleClass('d-none', state.balance.type >= 0); @@ -460,6 +460,10 @@ var LineRenderer = Widget.extend(FieldManagerMixin, { // Set the 'Tax Include' field editable or not depending of the 'price_include' value. this.$('.create_force_tax_included input').attr('disabled', state.createForm.tax_id.price_include); } + if (state.to_check) { + // Set the to_check field to true if global to_check is set + this.$('.create_to_check input').prop('checked', state.to_check).change(); + } } this.$('.create .add_line').toggle(!!state.balance.amount_currency); }, diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js index 5f6831f6b34..3f51680f2bf 100644 --- a/addons/account/static/tests/reconciliation_tests.js +++ b/addons/account/static/tests/reconciliation_tests.js @@ -742,7 +742,7 @@ QUnit.module('account', { "name": "INV/2017/0003", "analytic_tag_ids": [[6, null, []]] }], - payment_aml_ids: [], new_aml_dicts: []}]], + payment_aml_ids: [], new_aml_dicts: [], to_check: false}]], "Should call process_bank_statement_line with ids"); var def = $.Deferred(); def.abort = function () {}; @@ -780,8 +780,10 @@ QUnit.module('account', { // line is send back to server. testUtils.mock.intercept(clientAction, 'call_service', function (event) { assert.deepEqual(event.data.args[1].args, - [[5],[{partner_id: 8, counterpart_aml_dicts: [], - payment_aml_ids: [], new_aml_dicts: [{ + [[5],[{partner_id: 8, to_check: false, counterpart_aml_dicts: [], + payment_aml_ids: [], + to_check: false, + new_aml_dicts: [{ account_id: 287, credit: 1175, debit: 0, @@ -829,7 +831,7 @@ QUnit.module('account', { // We also create a line which is the open balance. testUtils.mock.intercept(clientAction, 'call_service', function (event) { assert.deepEqual(event.data.args[1].args, - [[5],[{partner_id: 8, + [[5],[{partner_id: 8, to_check: false, counterpart_aml_dicts: [{ counterpart_aml_id: 109, credit: 650, @@ -879,6 +881,7 @@ QUnit.module('account', { }], payment_aml_ids: [], new_aml_dicts: [], + to_check: false, }] ], "should call process_bank_statement_line with partial reconcile values"); } @@ -1381,6 +1384,7 @@ QUnit.module('account', { payment_aml_ids: [], partner_id: 8, + to_check: false, new_aml_dicts: []}] ], "should call process_bank_statement_line with partial reconcile values"); } @@ -1472,6 +1476,7 @@ QUnit.module('account', { payment_aml_ids: [], partner_id: 8, + to_check: false, new_aml_dicts: [ {account_id: 282, credit: 0, @@ -1580,6 +1585,7 @@ QUnit.module('account', { payment_aml_ids: [], partner_id: 8, + to_check: false, new_aml_dicts: [] }] ], "should call process_bank_statement_line with correct counterpart_aml_dicts");