01.04.26
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user