From c5facf6ba0fd49215b52a80b517aeffc50b331c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 16 Jan 2025 17:38:14 +0100 Subject: [PATCH] Link invoice lines and stock moves for different quantity sign if invoice method is not shipment Closes #13821 (grafted from 09524e5cc8c4edd63a556b5c5dc723af9edb4cfa) --HG-- branch : 6.0 --- modules/purchase/purchase.py | 14 ++++++++------ modules/sale/sale.py | 15 ++++++++------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/modules/purchase/purchase.py b/modules/purchase/purchase.py index d7eae8784f..4d862dff74 100644 --- a/modules/purchase/purchase.py +++ b/modules/purchase/purchase.py @@ -1590,8 +1590,8 @@ class Line(sequence_ordered(), ModelSQL, ModelView): gettext('purchase' '.msg_purchase_missing_account_expense', purchase=self.purchase.rec_name)) - if samesign(self.quantity, invoice_line.quantity): - invoice_line.stock_moves = self._get_invoice_line_moves() + invoice_line.stock_moves = self._get_invoice_line_moves( + invoice_line.quantity) return [invoice_line] def _get_invoice_not_line(self): @@ -1645,12 +1645,13 @@ class Line(sequence_ordered(), ModelSQL, ModelView): quantity += invoice_line.quantity return quantity - def _get_invoice_line_moves(self): + def _get_invoice_line_moves(self, quantity): 'Return the stock moves that should be invoiced' moves = [] if self.purchase.invoice_method == 'order': moves.extend(self.moves) - elif self.purchase.invoice_method == 'shipment': + elif (self.purchase.invoice_method == 'shipment' + and samesign(self.quantity, quantity)): for move in self.moves: if move.state == 'done': if move.invoiced_quantity < move.quantity: @@ -1725,8 +1726,9 @@ class Line(sequence_ordered(), ModelSQL, ModelView): lines = self.invoice_lines else: lines = filter(lambda l: not l.stock_moves, self.invoice_lines) - return list(filter( - lambda l: samesign(self.quantity, l.quantity), lines)) + lines = filter( + lambda l: samesign(self.quantity, l.quantity), lines) + return list(lines) def set_actual_quantity(self): pool = Pool() diff --git a/modules/sale/sale.py b/modules/sale/sale.py index 30d0e5f0db..24438e34b4 100644 --- a/modules/sale/sale.py +++ b/modules/sale/sale.py @@ -1538,8 +1538,8 @@ class SaleLine(TaxableMixin, sequence_ordered(), ModelSQL, ModelView): raise AccountError( gettext('sale.msg_sale_missing_account_revenue', sale=self.sale.rec_name)) - if samesign(self.quantity, invoice_line.quantity): - invoice_line.stock_moves = self._get_invoice_line_moves() + invoice_line.stock_moves = self._get_invoice_line_moves( + invoice_line.quantity) return [invoice_line] def _get_invoice_not_line(self): @@ -1593,13 +1593,14 @@ class SaleLine(TaxableMixin, sequence_ordered(), ModelSQL, ModelView): quantity += invoice_line.quantity return quantity - def _get_invoice_line_moves(self): + def _get_invoice_line_moves(self, quantity): 'Return the stock moves that should be invoiced' moves = [] if self.sale.invoice_method == 'order': if self.sale.shipment_method != 'order': moves.extend(self.moves) - elif self.sale.invoice_method == 'shipment': + elif (self.sale.invoice_method == 'shipment' + and samesign(self.quantity, quantity)): for move in self.moves: if move.state == 'done': if move.invoiced_quantity < move.quantity: @@ -1691,11 +1692,11 @@ class SaleLine(TaxableMixin, sequence_ordered(), ModelSQL, ModelView): elif self.sale.shipment_method == 'invoice': for invoice_line in self.invoice_lines: if (invoice_line.invoice - and invoice_line.invoice.state == 'paid'): + and invoice_line.invoice.state == 'paid' + and samesign(self.quantity, invoice_line.quantity)): if invoice_line.moved_quantity < invoice_line.quantity: invoice_lines.append(invoice_line) - return list(filter( - lambda l: samesign(self.quantity, l.quantity), invoice_lines)) + return invoice_lines def set_actual_quantity(self): pool = Pool()