From 181c4b3d34b24887839e7f675f881872577ecc6b Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 27 May 2026 22:03:51 +0200 Subject: [PATCH] Template Melya --- modules/account_invoice/invoice_melya.fodt | 4 +- modules/purchase_trade/invoice.py | 4 ++ modules/purchase_trade/lot.py | 2 +- modules/purchase_trade/stock.py | 39 +++++++++++++++ modules/purchase_trade/tests/test_module.py | 48 ++++++++++++++++++- .../view/lot_tree_sequence5.xml | 2 - modules/stock/insurance.fodt | 1 + 7 files changed, 94 insertions(+), 6 deletions(-) diff --git a/modules/account_invoice/invoice_melya.fodt b/modules/account_invoice/invoice_melya.fodt index 496a6f9..db22084 100644 --- a/modules/account_invoice/invoice_melya.fodt +++ b/modules/account_invoice/invoice_melya.fodt @@ -1645,7 +1645,7 @@ - <if test="invoice.report_rate_rows"> + <if test="invoice.report_melya_rate_rows"> @@ -1653,7 +1653,7 @@ - <for each="pc in invoice.report_rate_rows"> + <for each="pc in invoice.report_melya_rate_rows"> diff --git a/modules/purchase_trade/invoice.py b/modules/purchase_trade/invoice.py index 11770e4..d109d0a 100644 --- a/modules/purchase_trade/invoice.py +++ b/modules/purchase_trade/invoice.py @@ -931,6 +931,10 @@ class Invoice(metaclass=PoolMeta): 'amount': None, } for line in self._get_report_rate_line_details()] + @property + def report_melya_rate_rows(self): + return self._get_report_price_composition_rows() + def _get_report_rate_line_details(self): details = [] for line in self._get_report_invoice_lines(): diff --git a/modules/purchase_trade/lot.py b/modules/purchase_trade/lot.py index c90e379..7343025 100755 --- a/modules/purchase_trade/lot.py +++ b/modules/purchase_trade/lot.py @@ -3453,7 +3453,7 @@ class LotAddLine(ModelView): __name__ = "lot.add.line" lal = fields.Many2One('lot.add.lot',"Lots") - lot_qt = fields.Numeric("Quantity") + lot_qt = fields.Numeric("Packing detail") lot_unit = fields.Many2One('product.uom', "Unit",required=True) lot_quantity = fields.Numeric("Net weight") lot_gross_quantity = fields.Numeric("Gross weight") diff --git a/modules/purchase_trade/stock.py b/modules/purchase_trade/stock.py index bead915..a0dfef0 100755 --- a/modules/purchase_trade/stock.py +++ b/modules/purchase_trade/stock.py @@ -623,6 +623,34 @@ class ShipmentIn(metaclass=PoolMeta): return None return getattr(line, 'sale', None) or getattr(line, 'purchase', None) + @staticmethod + def _get_report_sale_from_lot(lot): + sale_line = getattr(lot, 'sale_line', None) if lot else None + sale = getattr(sale_line, 'sale', None) if sale_line else None + return sale + + def _get_report_sales(self): + sales = [] + seen = set() + + def add_sale(sale): + if not sale: + return + sale_id = getattr(sale, 'id', None) + key = sale_id if sale_id is not None else id(sale) + if key in seen: + return + seen.add(key) + sales.append(sale) + + for move in (self.incoming_moves or self.moves or []): + add_sale(self._get_report_sale_from_lot( + getattr(move, 'lot', None))) + for lot_qt in getattr(self, 'lotqt', []) or []: + add_sale(self._get_report_sale_from_lot( + getattr(lot_qt, 'lot_s', None))) + return sales + def _get_report_weight_totals(self): net = Decimal('0') gross = Decimal('0') @@ -677,6 +705,17 @@ class ShipmentIn(metaclass=PoolMeta): def report_insurance_certificate_number(self): return self.bl_number or self.number or '' + @property + def report_insurance_order_reference(self): + sales = self._get_report_sales() + if len(sales) != 1: + return '' + sale = sales[0] + return ( + getattr(sale, 'report_melya_proforma_number', None) + or getattr(sale, 'report_deal', None) + or '') + @property def report_insurance_account_of(self): line = self._get_report_trade_line() diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index f5623c1..1d2fca6 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -2776,7 +2776,11 @@ class PurchaseTradeTestCase(ModuleTestCase): shipment.supplier = Mock(rec_name='MELYA SA') sale_party = Mock(rec_name='SGT FR') - sale = Mock(party=sale_party) + sale = Mock( + id=1, + party=sale_party, + report_melya_proforma_number='P-12 S-34', + ) product = Mock(name='COTTON UPLAND', description='RAW WHITE COTTON') line = Mock(product=product, sale=sale) lot = Mock(sale_line=line, line=None) @@ -2815,6 +2819,8 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual( shipment.report_insurance_goods_description, 'COTTON UPLAND - RAW WHITE COTTON') + self.assertEqual( + shipment.report_insurance_order_reference, 'P-12 S-34') self.assertEqual( shipment.report_insurance_amount, 'USD 1234.56') self.assertEqual( @@ -2857,6 +2863,23 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual( shipment.report_insurance_surveyor, 'SGS') + def test_shipment_insurance_order_reference_falls_back_to_lot_qt(self): + 'insurance order reference can read sale deal through matching lot.qt' + ShipmentIn = Pool().get('stock.shipment.in') + shipment = ShipmentIn() + sale = Mock( + id=1, + report_melya_proforma_number='', + report_deal='P-12 S-34', + ) + sale_lot = Mock(sale_line=Mock(sale=sale)) + shipment.incoming_moves = [] + shipment.moves = [] + shipment.lotqt = [Mock(lot_s=sale_lot)] + + self.assertEqual( + shipment.report_insurance_order_reference, 'P-12 S-34') + def test_shipment_packing_helpers_use_today_and_trade_unit(self): 'packing list helpers expose today date and trade line unit' ShipmentIn = Pool().get('stock.shipment.in') @@ -2998,6 +3021,29 @@ class PurchaseTradeTestCase(ModuleTestCase): {'label': 'FREIGHT value in EUR', 'amount': Decimal('25')}, ]) + def test_invoice_report_melya_rate_rows_has_no_price_fallback(self): + 'invoice_melya rate block stays empty without price composition' + Invoice = Pool().get('account.invoice') + line = Mock( + type='line', + report_rate_currency_upper='USD', + report_rate_value=Decimal('2050'), + report_rate_unit_upper='MT', + report_rate_price_words='TWO THOUSAND FIFTY DOLLARS', + report_rate_pricing_text='', + ) + invoice = Invoice() + invoice.lines = [line] + + self.assertEqual(invoice.report_melya_rate_rows, []) + self.assertEqual( + invoice.report_rate_rows, + [{ + 'label': 'USD 2050.0000 PER MT ' + '(TWO THOUSAND FIFTY DOLLARS)', + 'amount': None, + }]) + def test_fee_delete_detects_generated_ordered_purchase(self): 'ordered fee deletion targets only its generated service purchase' Fee = Pool().get('fee.fee') diff --git a/modules/purchase_trade/view/lot_tree_sequence5.xml b/modules/purchase_trade/view/lot_tree_sequence5.xml index 35d9101..d8c7cbb 100755 --- a/modules/purchase_trade/view/lot_tree_sequence5.xml +++ b/modules/purchase_trade/view/lot_tree_sequence5.xml @@ -5,6 +5,4 @@ - - diff --git a/modules/stock/insurance.fodt b/modules/stock/insurance.fodt index 58605be..313b8d0 100644 --- a/modules/stock/insurance.fodt +++ b/modules/stock/insurance.fodt @@ -1036,6 +1036,7 @@ Marine Insurance Policy No. 4.008.227.782the following shipment: Description of goods and/or services: <records[0].report_insurance_goods_description or ''> + Order reference: <records[0].report_insurance_order_reference or ''>