diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index bf71f45..8fd65bc 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -198,6 +198,9 @@ class ValuationBase(ModelSQL): @classmethod def _get_basis_premium_delta(cls, record): + premium_getter = getattr(record, '_get_premium_price', None) + if premium_getter: + return round(Decimal(premium_getter() or 0), 4) total = Decimal(record.get_basis_price() or 0) components = cls._get_basis_component_total(record) return round(total - components, 4) @@ -320,7 +323,34 @@ class ValuationBase(ModelSQL): if line.price_type == 'basis': premium_delta = cls._get_basis_premium_delta(line) - for pc in line.price_summary or []: + summaries = line.price_summary or [] + if not summaries: + values = cls._build_simple_pnl( + line=line, + lot=lot, + sale_line=None, + price=Decimal(line.unit_price or 0) + premium_delta, + state='unfixed', + sign=-1, + pnl_type='pur. priced' + ) + if values and lot.sale_line: + values['sale'] = lot.sale_line.sale.id + values['sale_line'] = lot.sale_line.id + 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']) + values['strategy'] = strat + + if values: + price_lines.append(values) + else: + if values: + price_lines.append(values) + continue + + for pc in summaries: values = cls._build_basis_pnl( line=line, lot=lot, sale_line=None, pc=pc, sign=-1, extra_price=premium_delta) @@ -522,11 +552,12 @@ class ValuationBase(ModelSQL): for lot in sale_line.lots or []: if sale_line.price_type == 'basis': summaries = sale_line.price_summary or [] + premium_delta = cls._get_basis_premium_delta(sale_line) if not summaries: values = cls._build_simple_pnl_from_sale_line( sale_line=sale_line, lot=lot, - price=Decimal(sale_line.unit_price or 0), + price=Decimal(sale_line.unit_price or 0) + premium_delta, state='unfixed', pnl_type='sale priced' ) @@ -543,7 +574,6 @@ 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,