Premium composition

This commit is contained in:
2026-05-31 20:50:23 +02:00
parent 38c614af98
commit 735c5431af
10 changed files with 239 additions and 51 deletions

View File

@@ -1907,6 +1907,13 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(trigger.from_a, datetime.date(2026, 4, 1))
self.assertEqual(trigger.to_a, datetime.date(2026, 4, 30))
def test_pricing_trigger_average_defaults_to_true_and_last_label_is_latest(self):
'pricing trigger defaults to Avg and labels last as Latest'
Trigger = Pool().get('pricing.trigger')
self.assertTrue(Trigger.default_average())
self.assertEqual(Trigger.last.string, 'Latest')
def test_pricing_component_matrix_returns_generic_line_price(self):
'matrix pricing can use an unconditional matrix line as a component price'
Component = Pool().get('pricing.component')
@@ -2041,6 +2048,37 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(Sale.default_tolerance_option(), '')
self.assertEqual(Purchase.default_tolerance_option(), '')
def test_purchase_line_premium_sums_decomposition_base_amounts(self):
'purchase line premium is the sum of premium decomposition base amounts'
Line = Pool().get('purchase.line')
line = Line()
line.premium_decomposition = [
Mock(base_amount=Decimal('12.50')),
Mock(base_amount=Decimal('-2.25')),
]
self.assertEqual(line.get_premium('premium'), Decimal('10.2500'))
def test_premium_composition_base_amount_converts_on_contract_date(self):
'premium composition base amount converts to contract currency at spot date'
Premium = Pool().get('premium.composition')
premium = Premium()
source_currency = Mock(id=1)
target_currency = Mock(id=2)
premium.premium = Decimal('100')
premium.currency = source_currency
premium.line = Mock(purchase=Mock(
currency=target_currency,
purchase_date=datetime.date(2026, 5, 1)))
currency_model = Mock(
compute=Mock(return_value=Decimal('120')))
with patch('trytond.modules.purchase_trade.purchase.Pool') as PoolMock:
PoolMock.return_value.get.return_value = currency_model
amount = premium.get_base_amount('base_amount')
self.assertEqual(amount, Decimal('120.000000'))
def test_fee_rule_matches_purchase_line_conditions(self):
'fee rule matches purchase line conditions'
party = Mock(id=1)