diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 7a00c6a..7039923 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -2206,6 +2206,34 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual(values[1]['quantity'], Decimal('132.00000')) self.assertEqual(values[1]['amount'], Decimal('-1320.00')) + def test_shipment_fee_pnl_sums_all_shipment_lotqt(self): + 'shipment fee pnl sums every lot.qt linked to the shipment' + Valuation = Pool().get('valuation.valuation') + shipment = Mock(id=70) + unit = Mock(id=2) + lot = Mock(id=5, lot_type='virtual', sale_line=None) + lot.get_current_quantity_converted.return_value = Decimal('18000') + line = Mock(id=4, unit=unit) + lot_qt_model = Mock() + lot_qt_model.search.return_value = [ + Mock(id=1, lot_quantity=Decimal('5000'), lot_unit=unit, + lot_shipment_in=shipment), + Mock(id=2, lot_quantity=Decimal('6000'), lot_unit=unit, + lot_shipment_in=shipment), + Mock(id=3, lot_quantity=Decimal('7000'), lot_unit=unit, + lot_shipment_in=shipment), + ] + fee = Mock(shipment_in=shipment) + + segments = Valuation._fee_segments_for_fee( + fee, lot, line, lot_qt_model) + + self.assertEqual(segments, [{ + 'quantity': Decimal('18000'), + 'share': Decimal('1'), + 'shipment_in': shipment.id, + }]) + def test_snapshot_identity_prefers_sale_line_over_purchase_line(self): 'valuation snapshot identity ignores purchase line when sale line exists' Valuation = Pool().get('valuation.valuation') diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index de91d16..ab5b8fa 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -1180,7 +1180,20 @@ class ValuationBase(ModelSQL): segment for segment in segments if segment.get('shipment_in') == shipment_id] if selected: - return selected + quantities = [ + Decimal(str(segment['quantity'])) + for segment in selected + if segment.get('quantity') is not None] + shares = [ + Decimal(str(segment['share'])) + for segment in selected + if segment.get('share') is not None] + return [{ + 'quantity': ( + sum(quantities, Decimal(0)) if quantities else None), + 'share': sum(shares, Decimal(0)) if shares else None, + 'shipment_in': shipment_id, + }] return [{ 'quantity': None, 'share': None,