Purchase form

This commit is contained in:
2026-07-25 23:31:39 +02:00
parent 94e60fef6c
commit fa6198296b

View File

@@ -1044,6 +1044,8 @@ class Purchase(metaclass=PoolMeta):
line_id = getattr(line, 'id', None)
pnl = Decimal('0')
mtm = Decimal('0')
previous_pnl = Decimal('0')
has_previous = False
records = (
getattr(purchase, 'pnl', None)
if getattr(purchase, 'group_pnl', False)
@@ -1059,7 +1061,45 @@ class Purchase(metaclass=PoolMeta):
mtm += cls._summary_decimal(
getattr(record, 'r_mtm', None)
if hasattr(record, 'r_mtm') else getattr(record, 'mtm', None))
return pnl, mtm
amount_prev = (
getattr(record, 'r_amount_prev', None)
if hasattr(record, 'r_amount_prev')
else getattr(record, 'amount_prev', None))
if amount_prev in (None, ''):
continue
base_amount = (
getattr(record, 'r_base_amount', None)
if hasattr(record, 'r_base_amount')
else getattr(record, 'base_amount', None))
previous_pnl += (
cls._summary_decimal(base_amount)
- cls._summary_decimal(amount_prev))
has_previous = True
return pnl, mtm, previous_pnl if has_previous else None
@classmethod
def _pnl_change_percent(cls, current, previous):
if previous in (None, ''):
return None
previous = cls._summary_decimal(previous)
if not previous:
return None
current = cls._summary_decimal(current)
return float(round(((current - previous) / abs(previous)) * 100, 2))
def _purchase_pnl_change_percent(self):
changes = []
for line in (self.lines or []):
if getattr(line, 'type', 'line') != 'line':
continue
line_pnl, _line_mtm, previous_pnl = self._line_pnl_values(
self, line)
change = self._pnl_change_percent(line_pnl, previous_pnl)
if change is not None:
changes.append(Decimal(str(change)))
if not changes:
return None
return float(round(sum(changes) / Decimal(len(changes)), 2))
def get_execution_summary_viewer(self, name=None):
data = self._get_purchase_execution_summary_data()
@@ -1254,7 +1294,10 @@ class Purchase(metaclass=PoolMeta):
unit = getattr(getattr(line, 'unit', None), 'rec_name', '') or ''
product = getattr(getattr(line, 'product', None), 'rec_name', '') or ''
amount = self._line_amount_value(line)
line_pnl, line_mtm = self._line_pnl_values(self, line)
line_pnl, line_mtm, previous_pnl = self._line_pnl_values(
self, line)
line_pnl_change = self._pnl_change_percent(
line_pnl, previous_pnl)
route = (shipped_routes[0] if shipped_routes else '%s > %s' % (
getattr(getattr(self, 'from_location', None), 'rec_name', None)
or '-',
@@ -1275,6 +1318,7 @@ class Purchase(metaclass=PoolMeta):
'paid': self._line_invoice_quantity_percent(
line, quantity, states={'paid'}),
'pnl': self._json_decimal(line_pnl),
'pnl_change_d1': line_pnl_change,
'amount': self._json_decimal(amount),
'mtm': self._json_decimal(line_mtm),
'open': max(quantity - shipped, 0.0),
@@ -1309,6 +1353,7 @@ class Purchase(metaclass=PoolMeta):
def _get_purchase_pnl_summary_data(self):
currency = getattr(getattr(self, 'currency', None), 'code', None) or ''
pnl_change_percent = self._purchase_pnl_change_percent()
graph = list(getattr(self, 'pnl_graph', None) or [])
graph = sorted(
graph, key=lambda line: (
@@ -1321,10 +1366,6 @@ class Purchase(metaclass=PoolMeta):
mtm_value = getattr(current, 'mtm', None)
previous_pnl = getattr(previous, 'pnl', None) if previous else None
previous_mtm = getattr(previous, 'mtm', None) if previous else None
pnl_change = (
pnl_value - previous_pnl
if pnl_value is not None and previous_pnl is not None
else None)
mtm_change = (
mtm_value - previous_mtm
if mtm_value is not None and previous_mtm is not None
@@ -1333,7 +1374,11 @@ class Purchase(metaclass=PoolMeta):
"pnl": {
"value": self._json_decimal(pnl_value),
"currency": currency,
"change_d1": self._json_decimal(pnl_change),
"change_d1": (
pnl_change_percent
if pnl_change_percent is not None
else self._json_decimal(self._pnl_change_percent(
pnl_value, previous_pnl))),
},
"mtm": {
"value": self._json_decimal(mtm_value),
@@ -1358,7 +1403,7 @@ class Purchase(metaclass=PoolMeta):
"pnl": {
"value": self._json_decimal(pnl_value),
"currency": currency,
"change_d1": None,
"change_d1": pnl_change_percent,
},
"mtm": {
"value": self._json_decimal(mtm_value),