add: field 'asset_gainloss' + searcher + test +todos

This commit is contained in:
Frederik Jaeckel 2023-02-15 22:34:52 +01:00
parent 5aad26da71
commit 9287db67ed
3 changed files with 125 additions and 14 deletions

54
line.py
View file

@ -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):