Add SOF calculation overrides

This commit is contained in:
2026-07-12 13:10:13 +02:00
parent 47d0f025b3
commit ddd88cd840
3 changed files with 146 additions and 29 deletions

View File

@@ -1457,6 +1457,30 @@ class PurchaseTradeTestCase(ModuleTestCase):
sof._applied_compensation_amount(), Decimal('-12000.00'))
self.assertEqual(sof.compensation_type, 'demurrage')
@with_transaction()
def test_sof_calculation_rate_overrides_win_over_condition_rates(self):
'sof calculation rate overrides are used before condition rates'
Sof = Pool().get('sof.statement')
sof = Sof()
sof.applied_condition = Mock(
laytime_allowed=None,
rates=[
Mock(rate=Decimal('24000'), rate_type=Mock(category='demurrage')),
Mock(rate=Decimal('100'), rate_type=Mock(category='pumping')),
])
sof.demurrage_rate_override = Decimal('36000')
sof.pumping_rate_override = Decimal('200')
sof.laytime_balance = -Decimal('12')
self.assertEqual(
sof._applied_laytime_allowed(Decimal('1000')), 5.0)
self.assertEqual(
sof._applied_compensation_amount(), Decimal('-18000.00'))
self.assertEqual(sof.compensation_type, 'demurrage')
self.assertEqual(
sof.get_calculation_info('calculation_demurrage_rate'),
'36000 / day')
@with_transaction()
def test_sof_available_conditions_include_shipment_contracts(self):
'sof applied condition choices include owner, purchase and sale terms'
@@ -1539,13 +1563,25 @@ class PurchaseTradeTestCase(ModuleTestCase):
'sof laytime end reads the structured end event'
Sof = Pool().get('sof.statement')
sof = Sof()
sof.applied_condition = Mock(laytime_end_event='hoses_disconnected')
sof.applied_condition = Mock(laytime_end_event='documents_on_board')
sof.end_pumping = datetime.datetime(2026, 6, 1, 12, 0)
sof.hoses_disconnected = datetime.datetime(2026, 6, 1, 13, 0)
sof.documents_on_board = datetime.datetime(2026, 6, 1, 14, 0)
self.assertEqual(
sof._applied_laytime_end(),
datetime.datetime(2026, 6, 1, 13, 0))
datetime.datetime(2026, 6, 1, 14, 0))
@with_transaction()
def test_sof_additional_quantity_is_added_to_calculation_quantity(self):
'sof additional quantity is added to the quantity used for calculation'
Sof = Pool().get('sof.statement')
sof = Sof()
sof.additional_quantity = Decimal('25')
self.assertEqual(
sof._calculation_quantity(Decimal('100')),
Decimal('125'))
@with_transaction()
def test_sof_laytime_ignores_free_text_clauses(self):
@@ -1627,6 +1663,8 @@ class PurchaseTradeTestCase(ModuleTestCase):
'notice_of_readiness_hour': datetime.time(8, 0),
'all_fast_date': datetime.date(2026, 7, 6),
'all_fast_hour': datetime.time(10, 30),
'documents_on_board_date': datetime.date(2026, 7, 6),
'documents_on_board_hour': datetime.time(12, 0),
})
self.assertEqual(
@@ -1635,6 +1673,9 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(
values['all_fast'],
datetime.datetime(2026, 7, 6, 10, 30))
self.assertEqual(
values['documents_on_board'],
datetime.datetime(2026, 7, 6, 12, 0))
@with_transaction()
def test_sof_event_date_time_values_sync_to_datetime(self):