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