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

View File

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