add: field 'asset_gainloss' + searcher + test +todos
This commit is contained in:
parent
5aad26da71
commit
9287db67ed
3 changed files with 125 additions and 14 deletions
54
line.py
54
line.py
|
@ -128,7 +128,7 @@ class Line(SecondUomMixin, metaclass=PoolMeta):
|
|||
states = {
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']),
|
||||
'get_gainloss_data')
|
||||
'get_yield_data', searcher='search_asset_gainloss')
|
||||
|
||||
@classmethod
|
||||
def get_gainloss_data_sql(cls):
|
||||
|
@ -307,12 +307,24 @@ class Line(SecondUomMixin, metaclass=PoolMeta):
|
|||
)
|
||||
return [('id', 'in', query)]
|
||||
|
||||
@classmethod
|
||||
def search_asset_gainloss(cls, name, clause):
|
||||
""" search for profit/loss
|
||||
"""
|
||||
Operator = fields.SQL_OPERATORS[clause[1]]
|
||||
(tab_line, tab_query) = cls.get_gainloss_data_sql()
|
||||
|
||||
query = tab_query.select(
|
||||
tab_query.id,
|
||||
where=Operator(tab_query.gainloss, clause[2]),
|
||||
)
|
||||
return [('id', 'in', query)]
|
||||
|
||||
@classmethod
|
||||
def get_yield_data(cls, lines, names):
|
||||
""" collect data for fee, dividend, gain/loss per line
|
||||
"""
|
||||
Line2 = Pool().get('cashbook.line')
|
||||
(tab_line, query) = cls.get_yield_data_sql()
|
||||
cursor = Transaction().connection.cursor()
|
||||
|
||||
def quantize_val(value, line):
|
||||
|
@ -323,19 +335,35 @@ class Line(SecondUomMixin, metaclass=PoolMeta):
|
|||
).quantize(Decimal(str(1/10**line.currency_digits)))
|
||||
|
||||
result = {x:{y.id: None for y in lines} for x in names}
|
||||
query.where = tab_line.id.in_([x.id for x in lines])
|
||||
cursor.execute(*query)
|
||||
records = cursor.fetchall()
|
||||
|
||||
for record in records:
|
||||
line = Line2(record[0])
|
||||
values = {
|
||||
'trade_fee': quantize_val(record[1], line),
|
||||
'asset_dividend': quantize_val(record[2], line),
|
||||
}
|
||||
# read fee, dividend
|
||||
name_set = set({'trade_fee', 'asset_dividend'}).intersection(set(names))
|
||||
if len(name_set) > 0:
|
||||
(tab_line, query) = cls.get_yield_data_sql()
|
||||
query.where = tab_line.id.in_([x.id for x in lines])
|
||||
cursor.execute(*query)
|
||||
records = cursor.fetchall()
|
||||
|
||||
for record in records:
|
||||
line = Line2(record[0])
|
||||
values = {
|
||||
'trade_fee': quantize_val(record[1], line),
|
||||
'asset_dividend': quantize_val(record[2], line),
|
||||
}
|
||||
for name in list(name_set):
|
||||
result[name][record[0]] = values[name]
|
||||
|
||||
# read asset_gainloss
|
||||
if 'asset_gainloss' in names:
|
||||
(tab_line, query) = cls.get_gainloss_data_sql()
|
||||
query.where = tab_line.id.in_([x.id for x in lines])
|
||||
cursor.execute(*query)
|
||||
records = cursor.fetchall()
|
||||
|
||||
for record in records:
|
||||
line = Line2(record[0])
|
||||
result['asset_gainloss'][record[0]] = quantize_val(record[1], line)
|
||||
|
||||
for name in names:
|
||||
result[name][record[0]] = values[name]
|
||||
return result
|
||||
|
||||
def get_rec_name(self, name):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue