This commit is contained in:
2026-04-01 15:22:21 +02:00
parent a7753b974f
commit f53a9bce27

View File

@@ -184,6 +184,10 @@ class ValuationBase(ModelSQL):
total += value
return round(total, 4)
@staticmethod
def _supports_strategy_mtm(values):
return values and values.get('type') in {'pur. priced', 'sale priced'}
@classmethod
def _build_basis_pnl(cls, *, line, lot, sale_line, pc, sign):
@@ -286,7 +290,8 @@ class ValuationBase(ModelSQL):
'product': sale_line.product.id if sale_line else line.product.id,
'reference': (
('Sale/Physic' if lot.lot_type == 'physic' else 'Sale/Open')
if sale_line else 'Purchase/Physic'
if sale_line else
('Purchase/Physic' if lot.lot_type == 'physic' else 'Purchase/Open')
),
})
@@ -305,7 +310,7 @@ class ValuationBase(ModelSQL):
if values and lot.sale_line:
values['sale'] = lot.sale_line.sale.id
values['sale_line'] = lot.sale_line.id
if line.mtm:
if line.mtm and cls._supports_strategy_mtm(values):
for strat in line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, line)
values['mtm'] = strat.get_mtm(line,values['quantity'])
@@ -330,7 +335,7 @@ class ValuationBase(ModelSQL):
if values and lot.sale_line:
values['sale'] = lot.sale_line.sale.id
values['sale_line'] = lot.sale_line.id
if line.mtm:
if line.mtm and cls._supports_strategy_mtm(values):
for strat in line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, line)
values['mtm'] = strat.get_mtm(line,values['quantity'])
@@ -358,7 +363,7 @@ class ValuationBase(ModelSQL):
if sl_line.price_type == 'basis':
for pc in sl_line.price_summary or []:
values = cls._build_basis_pnl(line=line, lot=sl, sale_line=sl_line, pc=pc, sign=+1)
if sl_line.mtm:
if sl_line.mtm and cls._supports_strategy_mtm(values):
for strat in line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, sl_line)
values['mtm'] = strat.get_mtm(sl_line,values['quantity'])
@@ -380,7 +385,7 @@ class ValuationBase(ModelSQL):
sign=+1,
pnl_type=f'sale {sl_line.price_type}'
)
if sl_line.mtm:
if sl_line.mtm and cls._supports_strategy_mtm(values):
for strat in sl_line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, sl_line)
values['mtm'] = strat.get_mtm(sl_line,values['quantity'])
@@ -493,7 +498,7 @@ class ValuationBase(ModelSQL):
for pc in sale_line.price_summary or []:
values = cls._build_basis_pnl_from_sale_line(
sale_line=sale_line, lot=lot, pc=pc)
if sale_line.mtm:
if sale_line.mtm and cls._supports_strategy_mtm(values):
for strat in sale_line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, sale_line)
values['mtm'] = strat.get_mtm(sale_line, values['quantity'])
@@ -513,7 +518,7 @@ class ValuationBase(ModelSQL):
state='fixed' if sale_line.price_type == 'priced' else 'not fixed',
pnl_type=f'sale {sale_line.price_type}'
)
if sale_line.mtm:
if sale_line.mtm and cls._supports_strategy_mtm(values):
for strat in sale_line.mtm:
values['mtm_price'] = cls._get_strategy_mtm_price(strat, sale_line)
values['mtm'] = strat.get_mtm(sale_line, values['quantity'])
@@ -577,57 +582,30 @@ class ValuationBase(ModelSQL):
if sf.currency != line.purchase.currency:
with Transaction().set_context(date=Date.today()):
price = Currency.compute(sf.currency, price, line.purchase.currency)
if line.mtm:
for strat in line.mtm:
fee_lines.append({
'lot': lot.id,
'sale': lot.sale_line.sale.id if lot.sale_line else None,
'purchase': line.purchase.id,
'line': line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee' if sf.sale_line
else 'pur. fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': cls._get_strategy_mtm_price(strat, line),
'mtm': strat.get_mtm(line,qty),
'strategy': strat,
'unit': sf.unit.id if sf.unit else line.unit.id,
'currency': sf.currency.id,
})
else:
fee_lines.append({
'lot': lot.id,
'sale': lot.sale_line.sale.id if lot.sale_line else None,
'purchase': line.purchase.id,
'line': line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee' if sf.sale_line
else 'pur. fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': None,
'mtm': Decimal(0),
'strategy': None,
'unit': sf.unit.id if sf.unit else line.unit.id,
'currency': sf.currency.id,
})
fee_lines.append({
'lot': lot.id,
'sale': lot.sale_line.sale.id if lot.sale_line else None,
'purchase': line.purchase.id,
'line': line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee' if sf.sale_line
else 'pur. fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': None,
'mtm': None,
'strategy': None,
'unit': sf.unit.id if sf.unit else line.unit.id,
'currency': sf.currency.id,
})
return fee_lines
@@ -663,53 +641,28 @@ class ValuationBase(ModelSQL):
if sf.currency != sale_line.sale.currency:
with Transaction().set_context(date=Date.today()):
price = Currency.compute(sf.currency, price, sale_line.sale.currency)
if sale_line.mtm:
for strat in sale_line.mtm:
fee_lines.append({
'lot': lot.id,
'sale': sale_line.sale.id,
'sale_line': sale_line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': cls._get_strategy_mtm_price(strat, sale_line),
'mtm': strat.get_mtm(sale_line, qty),
'strategy': strat,
'unit': sf.unit.id if sf.unit else sale_line.unit.id,
'currency': sf.currency.id,
})
else:
fee_lines.append({
'lot': lot.id,
'sale': sale_line.sale.id,
'sale_line': sale_line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': None,
'mtm': Decimal(0),
'strategy': None,
'unit': sf.unit.id if sf.unit else sale_line.unit.id,
'currency': sf.currency.id,
})
fee_lines.append({
'lot': lot.id,
'sale': sale_line.sale.id,
'sale_line': sale_line.id,
'type': (
'shipment fee' if sf.shipment_in
else 'sale fee'
),
'date': Date.today(),
'price': price,
'counterparty': sf.supplier.id,
'reference': f"{sf.product.name}/{'Physic' if lot.lot_type == 'physic' else 'Open'}",
'product': sf.product.id,
'state': sf.type,
'quantity': qty,
'amount': amount,
'mtm_price': None,
'mtm': None,
'strategy': None,
'unit': sf.unit.id if sf.unit else sale_line.unit.id,
'currency': sf.currency.id,
})
return fee_lines