Pnl
This commit is contained in:
@@ -2069,6 +2069,96 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
{'type': 'derivative'},
|
||||
])
|
||||
|
||||
def test_purchase_derivative_pnl_uses_direction_and_market_delta(self):
|
||||
'purchase derivative pnl is entry versus market with long short direction'
|
||||
Valuation = Pool().get('valuation.valuation')
|
||||
today = datetime.date(2026, 7, 16)
|
||||
currency = Mock(id=1)
|
||||
company_currency = Mock(id=2)
|
||||
unit = Mock(id=3)
|
||||
price_index = Mock(
|
||||
price_index='ICE',
|
||||
get_price_per_qt=Mock(return_value=Decimal('100')),
|
||||
get_price=Mock(return_value=Decimal('80')))
|
||||
party = Mock(id=4)
|
||||
product = Mock(id=5)
|
||||
purchase = Mock(
|
||||
id=6,
|
||||
currency=currency,
|
||||
company=Mock(currency=company_currency))
|
||||
line = Mock(id=7, unit=unit, purchase=purchase)
|
||||
|
||||
def derivative(direction):
|
||||
return Mock(
|
||||
price_index=price_index,
|
||||
price=Decimal('100'),
|
||||
direction=direction,
|
||||
quantity=Decimal('10'),
|
||||
party=party,
|
||||
product=product)
|
||||
|
||||
line.derivatives = [derivative('long'), derivative('short')]
|
||||
|
||||
with patch('trytond.modules.purchase_trade.valuation.Pool') as PoolMock, patch.object(
|
||||
Valuation, '_base_amount_values',
|
||||
side_effect=[
|
||||
(Decimal('-200'), Decimal('1'), 2),
|
||||
(Decimal('200'), Decimal('1'), 2),
|
||||
]):
|
||||
PoolMock.return_value.get.return_value = Mock(
|
||||
today=Mock(return_value=today))
|
||||
values = Valuation.create_pnl_der_from_line(line)
|
||||
|
||||
self.assertEqual(values[0]['amount'], Decimal('-200.00'))
|
||||
self.assertEqual(values[0]['base_amount'], Decimal('-200'))
|
||||
self.assertIsNone(values[0]['mtm_price'])
|
||||
self.assertIsNone(values[0]['mtm'])
|
||||
self.assertEqual(values[1]['amount'], Decimal('200.00'))
|
||||
self.assertEqual(values[1]['base_amount'], Decimal('200'))
|
||||
self.assertIsNone(values[1]['mtm_price'])
|
||||
self.assertIsNone(values[1]['mtm'])
|
||||
|
||||
def test_sale_derivative_pnl_uses_direction_and_market_delta(self):
|
||||
'sale derivative pnl is stored in amount and base amount only'
|
||||
Valuation = Pool().get('valuation.valuation')
|
||||
today = datetime.date(2026, 7, 16)
|
||||
currency = Mock(id=1)
|
||||
company_currency = Mock(id=2)
|
||||
unit = Mock(id=3)
|
||||
price_index = Mock(
|
||||
price_index='ICE',
|
||||
get_price_per_qt=Mock(return_value=Decimal('100')),
|
||||
get_price=Mock(return_value=Decimal('120')))
|
||||
derivative = Mock(
|
||||
price_index=price_index,
|
||||
price=Decimal('100'),
|
||||
direction='long',
|
||||
quantity=Decimal('10'),
|
||||
party=Mock(id=4),
|
||||
product=Mock(id=5))
|
||||
sale = Mock(
|
||||
id=6,
|
||||
currency=currency,
|
||||
company=Mock(currency=company_currency))
|
||||
sale_line = Mock(
|
||||
id=7,
|
||||
unit=unit,
|
||||
sale=sale,
|
||||
derivatives=[derivative])
|
||||
|
||||
with patch('trytond.modules.purchase_trade.valuation.Pool') as PoolMock, patch.object(
|
||||
Valuation, '_base_amount_values',
|
||||
return_value=(Decimal('200'), Decimal('1'), 2)):
|
||||
PoolMock.return_value.get.return_value = Mock(
|
||||
today=Mock(return_value=today))
|
||||
values = Valuation.create_pnl_der_from_sale_line(sale_line)
|
||||
|
||||
self.assertEqual(values[0]['price'], Decimal('100.0000'))
|
||||
self.assertEqual(values[0]['amount'], Decimal('200.00'))
|
||||
self.assertEqual(values[0]['base_amount'], Decimal('200'))
|
||||
self.assertIsNone(values[0]['mtm_price'])
|
||||
self.assertIsNone(values[0]['mtm'])
|
||||
|
||||
def test_update_daily_snapshot_generates_all_purchases_and_unmatched_sales(self):
|
||||
'daily valuation cron snapshots purchases and unmatched sale lines'
|
||||
Valuation = Pool().get('valuation.valuation')
|
||||
|
||||
Reference in New Issue
Block a user