diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py index 5380a31..c58499e 100755 --- a/modules/purchase_trade/purchase.py +++ b/modules/purchase_trade/purchase.py @@ -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),