[FIX] account: reconciliation widget monetary values comparison

Since balance_end and balance_end_real are floats, they cannot be compared without rounding.

Fixes #9957
This commit is contained in:
Arthur Maniet 2015-12-11 13:16:11 +01:00 committed by Goffin Simon
parent dfb0e4b8f1
commit 2a68634dca
1 changed files with 13 additions and 3 deletions

View File

@ -33,6 +33,7 @@ openerp.account = function (instance) {
this.model_bank_statement = new instance.web.Model("account.bank.statement");
this.model_bank_statement_line = new instance.web.Model("account.bank.statement.line");
this.reconciliation_menu_id = false; // Used to update the needaction badge
this.monetaryIsZero; // Method that tests if a monetary amount == 0 ; loaded from the server
this.formatCurrency; // Method that formats the currency ; loaded from the server
// Only for statistical purposes
@ -176,6 +177,14 @@ openerp.account = function (instance) {
})
);
// Get the function to compare monetary values
deferred_promises.push(new instance.web.Model("decimal.precision")
.call("precision_get", ["Account"])
.then(function(digits) {
self.monetaryIsZero = _.partial(instance.web.float_is_zero, _, digits);
})
);
// Get statement lines
deferred_promises.push(self.model_bank_statement_line
.query(['id'])
@ -288,7 +297,7 @@ openerp.account = function (instance) {
keyboardShortcutsHandler: function(e) {
var self = this;
if ((e.which === 13 || e.which === 10) && (e.ctrlKey || e.metaKey)) {
self.persistReconciliations(_.filter(self.getChildren(), function(o) { return o.get("balance").toFixed(3) === "0.000"; }));
self.persistReconciliations(_.filter(self.getChildren(), function(o) { return self.monetaryIsZero(o.get("balance")); }));
}
},
@ -574,7 +583,7 @@ openerp.account = function (instance) {
.filter([['id', 'in', self.statement_ids]])
.all()
.then(function(data){
if (_.all(data, function(o) { return o.balance_end_real === o.balance_end })) {
if (_.all(data, function(o) { return self.monetaryIsZero(o.balance_end_real - o.balance_end) })) {
self.$(".button_close_statement").show();
self.$(".button_close_statement").click(function() {
self.$(".button_close_statement").attr("disabled", "disabled");
@ -650,6 +659,7 @@ openerp.account = function (instance) {
this._super(parent);
this.formatCurrency = this.getParent().formatCurrency;
this.monetaryIsZero = this.getParent().monetaryIsZero;
if (context.initial_data_provided) {
// Process data
_.each(context.reconciliation_proposition, function(line) {
@ -1283,7 +1293,7 @@ openerp.account = function (instance) {
// Find out if the counterpart is lower than, equal or greater than the transaction being reconciled
var balance_type = undefined;
if (Math.abs(self.get("balance")).toFixed(3) === "0.000") balance_type = "equal";
if (self.monetaryIsZero(self.get("balance"))) balance_type = "equal";
else if (self.get("balance") * self.st_line.amount > 0) balance_type = "greater";
else if (self.get("balance") * self.st_line.amount < 0) balance_type = "lower";