From f53a9bce272a783e1d69a6da7da84d34d87ba377 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 1 Apr 2026 15:22:21 +0200 Subject: [PATCH] 01.04.26 --- modules/purchase_trade/valuation.py | 163 ++++++++++------------------ 1 file changed, 58 insertions(+), 105 deletions(-) diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index 3a472b9..9ff0b4f 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -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