Fee rules

This commit is contained in:
2026-05-25 13:36:11 +02:00
parent 7a39754a63
commit 436d0b9a0c
12 changed files with 473 additions and 37 deletions

View File

@@ -1784,6 +1784,75 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(Sale.default_tolerance_option(), '')
self.assertEqual(Purchase.default_tolerance_option(), '')
def test_fee_rule_matches_purchase_line_conditions(self):
'fee rule matches purchase line conditions'
party = Mock(id=1)
product = Mock(id=2)
incoterm = Mock(id=3)
from_location = Mock(id=4)
to_location = Mock(id=5)
plan = Mock(id=6)
contract = Mock(
party=party,
incoterm=incoterm,
from_location=from_location,
to_location=to_location,
plan=plan,
)
line = Mock(product=product, purchase=contract, sale=None)
rule = fee_module.FeeRule()
rule.apply_on = 'purchase_line'
rule.party = party
rule.line_product = product
rule.incoterm = incoterm
rule.from_location = from_location
rule.to_location = to_location
rule.execution_plan = plan
self.assertTrue(rule._matches_line(line, 'purchase_line'))
def test_fee_rule_builds_budgeted_sale_fee_values(self):
'fee rule builds budgeted fee values for a sale line'
currency = Mock(id=1)
unit = Mock(id=2)
party = Mock(id=3)
product = Mock(id=4)
fee_product = Mock(id=5)
sale = Mock(party=party, currency=currency)
line = Mock(
id=10,
product=product,
sale=sale,
purchase=None,
unit=unit,
quantity_theorical=Decimal('100'),
quantity=Decimal('90'),
)
rule = fee_module.FeeRule()
rule.id = 20
rule.fee_product = fee_product
rule.supplier = None
rule.p_r = 'pay'
rule.mode = 'perqt'
rule.price = Decimal('12.50')
rule.quantity = None
rule.currency = None
rule.unit = None
rule.qt_state = None
rule.weight_type = 'brut'
values = rule._fee_values(line, 'sale_line')
self.assertEqual(values['source_rule'], 20)
self.assertTrue(values['generated_by_rule'])
self.assertEqual(values['type'], 'budgeted')
self.assertEqual(values['sale_line'], 10)
self.assertEqual(values['product'], 5)
self.assertEqual(values['supplier'], 3)
self.assertEqual(values['currency'], 1)
self.assertEqual(values['unit'], 2)
self.assertEqual(values['quantity'], Decimal('100'))
def test_sale_line_basis_price_and_progress_use_manual_summary_without_component(self):
'sale line basis values use manual summary rows even without a component'
SaleLine = Pool().get('sale.line')