From a99efcfc5b6857c562176b3ce4b6981b821069cb Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Thu, 2 Apr 2026 13:00:19 +0200 Subject: [PATCH] 02.04.26 --- modules/purchase_trade/lot.py | 76 ++++++++++++--------- modules/purchase_trade/tests/test_module.py | 15 ++++ 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/modules/purchase_trade/lot.py b/modules/purchase_trade/lot.py index c96f975..dcc061f 100755 --- a/modules/purchase_trade/lot.py +++ b/modules/purchase_trade/lot.py @@ -2774,40 +2774,54 @@ class LotInvoice(Wizard): 'action': act } - def transition_invoicing(self): - Lot = Pool().get('lot.lot') - Purchase = Pool().get('purchase.purchase') - Sale = Pool().get('sale.sale') - lots = [] - action = self.inv.action - for r in self.records: - purchase = r.r_line.purchase - sale = None - if r.r_sale_line: - sale = r.r_sale_line.sale - lot = Lot(r.r_lot_p) - # if lot.move == None: - # Warning = Pool().get('res.user.warning') - # warning_name = Warning.format("Lot not confirmed", []) - # if Warning.check(warning_name): + def transition_invoicing(self): + Lot = Pool().get('lot.lot') + Purchase = Pool().get('purchase.purchase') + Sale = Pool().get('sale.sale') + lots = [] + purchases = [] + sales = [] + action = self.inv.action + for r in self.records: + purchase = r.r_line.purchase if r.r_line else None + sale = r.r_sale_line.sale if r.r_sale_line else None + if purchase and purchase not in purchases: + purchases.append(purchase) + if sale and sale not in sales: + sales.append(sale) + lot = Lot(r.r_lot_p) + # if lot.move == None: + # Warning = Pool().get('res.user.warning') + # warning_name = Warning.format("Lot not confirmed", []) + # if Warning.check(warning_name): # raise QtWarning(warning_name, # "Lot not confirmed, click yes to confirm and invoice") # continue - if lot.invoice_line: - continue - lots.append(lot) - - invoice_line = None - if self.inv.type == 'purchase': - Purchase._process_invoice([purchase],lots,action,self.inv.pp_pur) - invoice_line = r.r_lot_p.invoice_line if r.r_lot_p.invoice_line else r.r_lot_p.invoice_line_prov - else: - if sale: - Sale._process_invoice([sale],lots,action,self.inv.pp_sale) - invoice_line = r.r_lot_p.invoice_line if r.r_lot_p.sale_invoice_line else r.r_lot_p.sale_invoice_line_prov - self.message.invoice = invoice_line.invoice - - return 'message' + if lot.invoice_line: + continue + lots.append(lot) + + invoice_line = None + if self.inv.type == 'purchase': + Purchase._process_invoice(purchases, lots, action, self.inv.pp_pur) + for lot in lots: + lot = Lot(lot.id) + invoice_line = lot.invoice_line or lot.invoice_line_prov + if invoice_line: + break + else: + if sales: + Sale._process_invoice(sales, lots, action, self.inv.pp_sale) + for lot in lots: + lot = Lot(lot.id) + invoice_line = lot.sale_invoice_line or lot.sale_invoice_line_prov + if invoice_line: + break + if not invoice_line: + raise UserError("No invoice line was generated from the selected lots.") + self.message.invoice = invoice_line.invoice + + return 'message' def default_message(self, fields): return { diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index b2b293a..0031903 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -333,5 +333,20 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual(invoice.report_net, Decimal('800')) + def test_lot_invoice_sale_uses_sale_invoice_line_reference(self): + 'sale invoicing must resolve the generated invoice from sale invoice links' + sale_invoice = Mock() + sale_invoice_line = Mock(invoice=sale_invoice) + lot = Mock( + sale_invoice_line=sale_invoice_line, + sale_invoice_line_prov=None, + invoice_line=None, + invoice_line_prov=None, + ) + + invoice_line = lot.sale_invoice_line or lot.sale_invoice_line_prov + + self.assertIs(invoice_line.invoice, sale_invoice) + del ModuleTestCase