Duplicate custom

This commit is contained in:
2026-06-18 13:33:41 +02:00
parent 6c2061e779
commit 1c20181d06
3 changed files with 314 additions and 32 deletions

View File

@@ -6207,9 +6207,24 @@ class PurchaseTradeTestCase(ModuleTestCase):
'custom duplicate can default mirror party from the matched sale'
purchase_party = SimpleNamespace(id=1)
sale_party = SimpleNamespace(id=2)
sale_currency = SimpleNamespace(id=30)
sale_payment_term = SimpleNamespace(id=31)
sale_incoterm = SimpleNamespace(id=32)
sale_unit = SimpleNamespace(id=33)
purchase_lot = SimpleNamespace(id=10)
sale = SimpleNamespace(party=sale_party)
sale_line = SimpleNamespace(id=20, sale=sale)
sale = SimpleNamespace(
party=sale_party,
currency=sale_currency,
payment_term=sale_payment_term,
incoterm=sale_incoterm)
sale_line = SimpleNamespace(
id=20,
sale=sale,
unit=sale_unit,
quantity=Decimal('99'),
quantity_theorical=Decimal('99'),
unit_price=Decimal('52'),
price_type='basis')
lot_qt = SimpleNamespace(lot_s=SimpleNamespace(sale_line=sale_line))
class FakeLotQt:
@@ -6248,6 +6263,110 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(values['mirror_mode'], 'duplicate_pair')
self.assertEqual(values['mirror_party'], sale_party.id)
self.assertEqual(values['mirror_currency'], sale_currency.id)
self.assertEqual(values['mirror_payment_term'], sale_payment_term.id)
self.assertEqual(values['mirror_incoterm'], sale_incoterm.id)
self.assertEqual(values['mirror_quantity'], Decimal('99'))
self.assertEqual(values['mirror_unit'], sale_unit.id)
self.assertEqual(values['mirror_unit_price'], Decimal('52'))
self.assertEqual(values['mirror_price_type'], 'basis')
def test_custom_duplicate_defaults_new_mirror_from_source_purchase(self):
'new mirror options default from the duplicated source contract'
purchase_party = SimpleNamespace(id=1)
purchase_currency = SimpleNamespace(id=4)
purchase_payment_term = SimpleNamespace(id=5)
purchase_incoterm = SimpleNamespace(id=6)
unit = SimpleNamespace(id=3)
class FakeLotQt:
@classmethod
def search(cls, domain):
return []
pool = Mock()
pool.get.side_effect = lambda name: {'lot.qt': FakeLotQt}[name]
line = SimpleNamespace(
__name__='purchase.line',
id=11,
type='line',
product=Mock(),
lots=[],
unit=unit,
quantity=Decimal('100'),
quantity_theorical=Decimal('100'),
unit_price=Decimal('25'),
price_type='priced',
)
record = SimpleNamespace(
__name__='purchase.purchase',
id=12,
lines=[line],
party=purchase_party,
currency=purchase_currency,
payment_term=purchase_payment_term,
incoterm=purchase_incoterm,
btb=None,
)
wizard = duplicate_module.TradeCustomDuplicate()
wizard.records = [record]
with patch.object(duplicate_module, 'Pool', return_value=pool):
values = wizard.default_start(None)
self.assertEqual(values['mirror_mode'], 'new_mirror')
self.assertEqual(values['mirror_party'], purchase_party.id)
self.assertEqual(values['mirror_currency'], purchase_currency.id)
self.assertEqual(values['mirror_payment_term'], purchase_payment_term.id)
self.assertEqual(values['mirror_incoterm'], purchase_incoterm.id)
self.assertEqual(values['mirror_quantity'], Decimal('100'))
self.assertEqual(values['mirror_unit'], unit.id)
self.assertEqual(values['mirror_unit_price'], Decimal('25'))
self.assertEqual(values['mirror_price_type'], 'priced')
def test_custom_duplicate_mirror_mode_change_refreshes_source_defaults(self):
'changing mirror mode refreshes mirror fields from the source contract'
purchase_party = SimpleNamespace(id=1)
purchase_currency = SimpleNamespace(id=4)
purchase_payment_term = SimpleNamespace(id=5)
purchase_incoterm = SimpleNamespace(id=6)
unit = SimpleNamespace(id=3)
line = SimpleNamespace(
__name__='purchase.line',
id=11,
type='line',
product=Mock(),
lots=[],
unit=unit,
quantity=Decimal('100'),
quantity_theorical=Decimal('100'),
unit_price=Decimal('25'),
price_type='priced',
)
record = SimpleNamespace(
__name__='purchase.purchase',
id=12,
lines=[line],
party=purchase_party,
currency=purchase_currency,
payment_term=purchase_payment_term,
incoterm=purchase_incoterm,
)
start = duplicate_module.TradeCustomDuplicateStart()
start.source = record
start.mirror_mode = 'new_mirror'
start.mirror_party = SimpleNamespace(id=99)
start.on_change_mirror_mode()
self.assertIs(start.mirror_party, purchase_party)
self.assertIs(start.mirror_currency, purchase_currency)
self.assertIs(start.mirror_payment_term, purchase_payment_term)
self.assertIs(start.mirror_incoterm, purchase_incoterm)
self.assertEqual(start.mirror_quantity, Decimal('100'))
self.assertIs(start.mirror_unit, unit)
self.assertEqual(start.mirror_unit_price, Decimal('25'))
self.assertEqual(start.mirror_price_type, 'priced')
def test_custom_duplicate_defaults_mirror_from_back_to_back_sale(self):
'custom duplicate can use the back-to-back sale as matched pair'