This commit is contained in:
2026-04-01 21:19:31 +02:00
parent 3976b387d7
commit 97eae6e4a6
10 changed files with 572 additions and 137 deletions

View File

@@ -188,9 +188,22 @@ class ValuationBase(ModelSQL):
@staticmethod
def _supports_strategy_mtm(values):
return values and values.get('type') in {'pur. priced', 'sale priced'}
@staticmethod
def _get_basis_component_total(record):
getter = getattr(record, '_get_basis_component_price', None)
if getter:
return Decimal(getter() or 0)
return Decimal(0)
@classmethod
def _get_basis_premium_delta(cls, record):
total = Decimal(record.get_basis_price() or 0)
components = cls._get_basis_component_total(record)
return round(total - components, 4)
@classmethod
def _build_basis_pnl(cls, *, line, lot, sale_line, pc, sign):
def _build_basis_pnl(cls, *, line, lot, sale_line, pc, sign, extra_price=Decimal(0)):
Currency = Pool().get('currency.currency')
Date = Pool().get('ir.date')
values = cls._base_pnl(
@@ -210,6 +223,7 @@ class ValuationBase(ModelSQL):
logger.info("COMPONENTS:%s",c)
if c:
price = c[0].manual_price
price = Decimal(price or 0) + Decimal(extra_price or 0)
values.update({
'reference': f"{pc.get_name()} / {pc.ratio}%",
@@ -305,8 +319,11 @@ class ValuationBase(ModelSQL):
for lot in line.lots:
if line.price_type == 'basis':
premium_delta = cls._get_basis_premium_delta(line)
for pc in line.price_summary or []:
values = cls._build_basis_pnl(line=line, lot=lot, sale_line=None, pc=pc, sign=-1)
values = cls._build_basis_pnl(
line=line, lot=lot, sale_line=None, pc=pc, sign=-1,
extra_price=premium_delta)
if values and lot.sale_line:
values['sale'] = lot.sale_line.sale.id
values['sale_line'] = lot.sale_line.id
@@ -361,8 +378,11 @@ class ValuationBase(ModelSQL):
continue
if sl_line.price_type == 'basis':
premium_delta = cls._get_basis_premium_delta(sl_line)
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,
extra_price=premium_delta)
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)
@@ -400,7 +420,7 @@ class ValuationBase(ModelSQL):
return price_lines
@classmethod
def _build_basis_pnl_from_sale_line(cls, *, sale_line, lot, pc):
def _build_basis_pnl_from_sale_line(cls, *, sale_line, lot, pc, extra_price=Decimal(0)):
Currency = Pool().get('currency.currency')
Date = Pool().get('ir.date')
values = cls._base_sale_pnl(
@@ -410,7 +430,7 @@ class ValuationBase(ModelSQL):
)
qty = lot.get_current_quantity_converted()
price = pc.price
price = Decimal(pc.price or 0) + Decimal(extra_price or 0)
values.update({
'reference': f"{pc.get_name()} / {pc.ratio}%",
@@ -506,7 +526,7 @@ class ValuationBase(ModelSQL):
values = cls._build_simple_pnl_from_sale_line(
sale_line=sale_line,
lot=lot,
price=Decimal(0),
price=Decimal(sale_line.unit_price or 0),
state='unfixed',
pnl_type='sale priced'
)
@@ -523,9 +543,11 @@ class ValuationBase(ModelSQL):
price_lines.append(values)
continue
premium_delta = cls._get_basis_premium_delta(sale_line)
for pc in summaries:
values = cls._build_basis_pnl_from_sale_line(
sale_line=sale_line, lot=lot, pc=pc)
sale_line=sale_line, lot=lot, pc=pc,
extra_price=premium_delta)
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)