diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index f4f3b103609..4152d0dc333 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -366,6 +366,21 @@ class PosOrder(models.Model): raise UserError(_("Order %s is not fully paid.") % self.name) self.write({'state': 'paid'}) + + if self.partner_id: + try: + with self.env.cr.savepoint(): + self.env.cr.execute("SELECT 'customer_rank' FROM res_partner WHERE ID=%s FOR UPDATE NOWAIT", + (self.partner_id.id,)) + self.env.cr.execute("UPDATE res_partner SET customer_rank = customer_rank +1 WHERE ID=%s", + (self.partner_id.id,)) + self.env.cache.remove(self.partner_id, self.partner_id._fields['customer_rank']) + except psycopg2.DatabaseError as e: + if e.pgcode == '55P03': + _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.') + else: + raise e + return True def action_pos_order_invoice(self): diff --git a/addons/point_of_sale/views/point_of_sale_view.xml b/addons/point_of_sale/views/point_of_sale_view.xml index 31d9db50398..933233bc9a6 100644 --- a/addons/point_of_sale/views/point_of_sale_view.xml +++ b/addons/point_of_sale/views/point_of_sale_view.xml @@ -17,7 +17,7 @@