From 8da01d066519802ef9295c806721220f4542c903 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 13 Sep 2021 21:50:21 +0200 Subject: [PATCH] Add script to fix old rounding data bug --- account_usability/account.py | 54 +++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/account_usability/account.py b/account_usability/account.py index d798d34..b238213 100644 --- a/account_usability/account.py +++ b/account_usability/account.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import models, fields, api, _ -from odoo.tools import float_compare, float_is_zero +from odoo.tools import float_compare, float_is_zero, float_round from odoo.tools.misc import formatLang from odoo.exceptions import UserError, ValidationError from odoo.osv import expression @@ -407,6 +407,58 @@ class AccountMove(models.Model): move.default_credit = default_credit move.default_debit = default_debit + @api.model + def _fix_debit_credit_round_bug(self): + logger.info('START script _fix_debit_credit_round_bug') + moves = self.sudo().search([]) # sudo to search in all companies + bug_move_ids = [] + for move in moves: + buggy = False + for l in move.line_ids: + if not float_is_zero(l.debit, precision_digits=2): + debit_rounded = float_round(l.debit, precision_digits=2) + if float_compare(l.debit, debit_rounded, precision_digits=6): + logger.info('Bad move to fix ID %d company_id %d name %s ref %s date %s journal %s (line ID %d debit=%s)', move.id, move.company_id.id, move.name, move.ref, move.date, move.journal_id.code, l.id, l.debit) + buggy = True + break + else: + credit_rounded = float_round(l.credit, precision_digits=2) + if float_compare(l.credit, credit_rounded, precision_digits=6): + logger.info('Bad move to fix ID %d company_id %d name %s ref %s date %s journal %s (line ID %d credit=%s)', move.id, move.company_id.id, move.name, move.ref, move.date, move.journal_id.code, l.id, l.credit) + buggy = True + break + if buggy: + bug_move_ids.append(move.id) + bal = 0.0 + max_credit = (False, 0) + for l in move.line_ids: + if not float_is_zero(l.debit, precision_digits=2): + new_debit = float_round(l.debit, precision_digits=2) + self._cr.execute( + 'UPDATE account_move_line set debit=%s, balance=%s where id=%s', + (new_debit, new_debit, l.id)) + bal -= new_debit + elif not float_is_zero(l.credit, precision_digits=2): + new_credit = float_round(l.credit, precision_digits=2) + self._cr.execute( + 'UPDATE account_move_line set credit=%s, balance=%s where id=%s', + (new_credit, new_credit * -1, l.id)) + bal += new_credit + if new_credit > max_credit[1]: + max_credit = (l, new_credit) + if not float_is_zero(bal, precision_digits=2): + assert abs(bal) < 0.05 + l = max_credit[0] + new_credit = max_credit[1] + new_new_credit = float_round(new_credit - bal, precision_digits=2) + assert new_new_credit > 0 + self._cr.execute( + 'UPDATE account_move_line set credit=%s, balance=%s where id=%s', + (new_new_credit, new_new_credit * -1, l.id)) + logger.info('Move ID %d fixed', move.id) + logger.info('%d buggy moves fixed (IDs: %s)', len(bug_move_ids), bug_move_ids) + logger.info('END _fix_debit_credit_round_bug') + class AccountMoveLine(models.Model): _inherit = 'account.move.line'