diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index bca586c7fe6..9188bc8ecf4 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -13,10 +13,6 @@ from json import dumps import json import re -import logging -import psycopg2 - -_logger = logging.getLogger(__name__) #forbidden fields INTEGRITY_HASH_MOVE_FIELDS = ('date', 'journal_id', 'company_id') @@ -2121,22 +2117,11 @@ class AccountMove(models.Model): for move in self: if not move.partner_id: continue if move.type.startswith('out_'): - field='customer_rank' + move.partner_id._increase_rank('customer_rank') elif move.type.startswith('in_'): - field='supplier_rank' + move.partner_id._increase_rank('supplier_rank') else: continue - try: - with self.env.cr.savepoint(): - self.env.cr.execute("SELECT "+field+" FROM res_partner WHERE ID=%s FOR UPDATE NOWAIT", (move.partner_id.id,)) - self.env.cr.execute("UPDATE res_partner SET "+field+"="+field+"+1 WHERE ID=%s", (move.partner_id.id,)) - self.env.cache.remove(move.partner_id, move.partner_id._fields[field]) - except psycopg2.DatabaseError as e: - if e.pgcode == '55P03': - _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.') - continue - else: - raise e def action_reverse(self): action = self.env.ref('account.action_view_account_move_reversal').read()[0] diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 4dc1252eded..114afa929d0 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -3,12 +3,15 @@ import time import logging +import psycopg2 from odoo import api, fields, models, _ from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT from odoo.exceptions import ValidationError from odoo.addons.base.models.res_partner import WARNING_MESSAGE, WARNING_HELP +_logger = logging.getLogger(__name__) + class AccountFiscalPosition(models.Model): _name = 'account.fiscal.position' _description = 'Fiscal Position' @@ -499,3 +502,17 @@ class ResPartner(models.Model): elif is_supplier and 'supplier_rank' not in vals: vals['supplier_rank'] = 1 return super().create(vals_list) + + def _increase_rank(self, field): + if self.ids: + try: + with self.env.cr.savepoint(): + self.env.cr.execute("SELECT "+field+" FROM res_partner WHERE ID IN %(partner_ids)s FOR UPDATE NOWAIT", {'partner_ids': tuple(self.ids)}) + self.env.cr.execute("UPDATE res_partner SET "+field+"="+field+"+1 WHERE ID IN %(partner_ids)s", {'partner_ids': tuple(self.ids)}) + for partner in self: + self.env.cache.remove(partner, partner._fields[field]) + except psycopg2.DatabaseError as e: + if e.pgcode == '55P03': + _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.') + else: + raise e diff --git a/addons/point_of_sale/models/pos_session.py b/addons/point_of_sale/models/pos_session.py index f7235a8584e..f28739ca729 100644 --- a/addons/point_of_sale/models/pos_session.py +++ b/addons/point_of_sale/models/pos_session.py @@ -455,6 +455,9 @@ class PosSession(models.Model): diff = order.amount_paid - order.amount_total rounding_difference = self._update_amounts(rounding_difference, {'amount': diff}, order.date_order) + # Increasing current partner's customer_rank + order.partner_id._increase_rank('customer_rank') + if self.company_id.anglo_saxon_accounting: global_session_pickings = self.picking_ids.filtered(lambda p: not p.pos_order_id) if global_session_pickings: