diagram: interpolator ergänzt,

asset: berechnung 'nextupdate' korrigiert
This commit is contained in:
Frederik Jaeckel 2022-11-28 23:15:28 +01:00
parent d08cf19b60
commit 7334e53f9f
7 changed files with 303 additions and 67 deletions

190
asset.py
View file

@ -6,17 +6,22 @@
from trytond.model import ModelView, ModelSQL, fields
from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.pyson import Eval, Bool, And, If
from trytond.pyson import Eval, Bool, And, If, Date
from trytond.report import Report
from decimal import Decimal
from datetime import time
from sql.functions import CurrentDate, CurrentTimestamp, Round
from sql.functions import CurrentDate, CurrentTimestamp, Round, Extract
from sql.conditionals import Case, Coalesce
from sql import Literal
digits_percent = 2
sel_updtdays = [
('work', 'Mon - Fri'),
('week', 'Mon - Sun'),
]
class Asset(ModelSQL, ModelView):
'Asset'
@ -45,9 +50,11 @@ class Asset(ModelSQL, ModelView):
model_name='investment.rate')
rate = fields.Function(fields.Numeric(string='Current Rate',
readonly=True, digits=(16, Eval('currency_digits', 4)),
depends=['currency_digits']), 'get_rate_data')
depends=['currency_digits']),
'get_rate_data', searcher='search_rate')
date = fields.Function(fields.Date(string='Date', readonly=True,
help='Date of current rate'), 'get_rate_data')
help='Date of current rate'),
'get_rate_data', searcher='search_date')
company_currency = fields.Function(fields.Many2One(readonly=True,
string='Company Currency', states={'invisible': True},
@ -74,6 +81,8 @@ class Asset(ModelSQL, ModelView):
updtsource = fields.Many2One(string='Update Source',
help='Select a source for the course update.',
ondelete='SET NULL', model_name='investment.source')
updtdays = fields.Selection(string='Select days', required=True,
selection=sel_updtdays)
updttime = fields.Time(string='Time',
states={
'readonly': ~Bool(Eval('updtsource')),
@ -114,7 +123,7 @@ class Asset(ModelSQL, ModelView):
def view_attributes(cls):
return super().view_attributes() + [
('/tree', 'visual',
If(Eval('date') < Date(delta_days=-5), 'muted',
If(Eval('date', Date()) < Date(delta_days=-5), 'muted',
If(Eval('change_day1', 0) < 0, 'warning',
If(Eval('change_day1', 0) > 0, 'success', '')
))
@ -150,43 +159,10 @@ class Asset(ModelSQL, ModelView):
return time(14, 0)
@classmethod
def get_rate_data(cls, assets, names):
""" get date and rate of asset
def default_updtdays(cls):
""" default: mon - fri
"""
pool = Pool()
Asset = pool.get('investment.asset')
Rate = pool.get('investment.rate')
tab_asset = Asset.__table__()
tab_rate = Rate.__table__()
cursor = Transaction().connection.cursor()
query = tab_asset.join(tab_rate,
condition=tab_asset.id==tab_rate.asset
).select(
tab_asset.id,
tab_rate.rate,
tab_rate.date,
distinct_on=[tab_asset.id],
order_by=[tab_asset.id, tab_rate.date.desc],
where=tab_asset.id.in_([x.id for x in assets]),
)
cursor.execute(*query)
records = cursor.fetchall()
result = {x:{y.id: None for y in assets} for x in names}
for record in records:
(id1, rate1, date1) = record
asset = Asset(id1)
exp = Decimal(Decimal(1) / 10 ** (asset.currency_digits or 4))
values = {'rate': record[1].quantize(exp), 'date': record[2]}
for name in names:
result[name][record[0]] = values[name]
return result
return 'work'
@fields.depends('updtsource', 'updttime')
def on_change_updtsource(self):
@ -246,6 +222,106 @@ class Asset(ModelSQL, ModelView):
if self.company.currency.id != self.currency.id:
return self.company.currency.id
@classmethod
def get_rate_data_sql(cls):
""" get sql for rate/date
"""
pool = Pool()
Asset = pool.get('investment.asset')
Rate = pool.get('investment.rate')
tab_asset = Asset.__table__()
tab_rate = Rate.__table__()
query = tab_asset.join(tab_rate,
condition=tab_asset.id==tab_rate.asset
).select(
tab_asset.id,
Round(tab_rate.rate, tab_asset.currency_digits).as_('rate'),
tab_rate.date,
distinct_on=[tab_asset.id],
order_by=[tab_asset.id, tab_rate.date.desc],
)
return (query, tab_asset)
@classmethod
def get_rate_data(cls, assets, names):
""" get date and rate of asset
"""
cursor = Transaction().connection.cursor()
(query, tab_asset) = cls.get_rate_data_sql()
query.where=tab_asset.id.in_([x.id for x in assets])
cursor.execute(*query)
records = cursor.fetchall()
result = {x:{y.id: None for y in assets} for x in names}
for record in records:
(id1, rate1, date1) = record
asset = Asset(id1)
exp = Decimal(Decimal(1) / 10 ** (asset.currency_digits or 4))
values = {'rate': record[1].quantize(exp), 'date': record[2]}
for name in names:
result[name][record[0]] = values[name]
return result
@classmethod
def search_date(cls, names, clause):
""" search in date
"""
(tab_query, tab_asset) = cls.get_rate_data_sql()
Operator = fields.SQL_OPERATORS[clause[1]]
query = tab_query.select(
tab_query.id,
where=Operator(tab_query.date, clause[2]),
)
return [('id', 'in', query)]
@classmethod
def search_rate(cls, names, clause):
""" search in rate
"""
(tab_query, tab_asset) = cls.get_rate_data_sql()
Operator = fields.SQL_OPERATORS[clause[1]]
query = tab_query.select(
tab_query.id,
where=Operator(tab_query.rate, clause[2]),
)
return [('id', 'in', query)]
@staticmethod
def order_date(tables):
""" order date
"""
(tab_query, tab_asset) = Asset.get_rate_data_sql()
table, _ = tables[None]
query = tab_query.select(
tab_query.date,
where=tab_query.id==table.id,
)
return [query]
@staticmethod
def order_rate(tables):
""" order rate
"""
(tab_query, tab_asset) = Asset.get_rate_data_sql()
table, _ = tables[None]
query = tab_query.select(
tab_query.rate,
where=tab_query.id==table.id,
)
return [query]
@classmethod
def get_percentage_sql(cls, name_lst, select_date=True):
""" get table for percentages and dates,
@ -331,7 +407,7 @@ class Asset(ModelSQL, ModelView):
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'day1'),
tab_asset.day1,
where=tab_asset.id==table.id,
)
return [query]
@ -345,7 +421,7 @@ class Asset(ModelSQL, ModelView):
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month1'),
tab_asset.month1,
where=tab_asset.id==table.id,
)
return [query]
@ -359,7 +435,7 @@ class Asset(ModelSQL, ModelView):
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month3'),
tab_asset.month3,
where=tab_asset.id==table.id,
)
return [query]
@ -373,7 +449,7 @@ class Asset(ModelSQL, ModelView):
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month6'),
tab_asset.month6,
where=tab_asset.id==table.id,
)
return [query]
@ -387,7 +463,7 @@ class Asset(ModelSQL, ModelView):
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month12'),
tab_asset.month12,
where=tab_asset.id==table.id,
)
return [query]
@ -443,16 +519,30 @@ class Asset(ModelSQL, ModelView):
context = Transaction().context
query_date = context.get('qdate', CurrentDate() - Literal(1))
query = tab_asset.join(tab_rate,
# get last date of rate
tab_date = tab_asset.join(tab_rate,
condition=tab_asset.id == tab_rate.asset,
type_ = 'LEFT OUTER',
).select(
tab_asset.id,
((Coalesce(tab_rate.date, query_date) + Literal(1)) + \
tab_asset.updttime).as_('updttime'),
(Coalesce(tab_rate.date, query_date) + Literal(1)).as_('date'),
tab_asset.updtdays,
tab_asset.updttime,
distinct_on = [tab_asset.id],
order_by = [tab_asset.id, tab_rate.date.desc],
where=(tab_asset.updtsource != None),
where=tab_asset.updtsource != None,
)
query = tab_date.select(
tab_date.id,
(Case(
((tab_date.updtdays == 'work') & \
(Extract('dow', tab_date.date) == 0), tab_date.date + Literal(1)),
((tab_date.updtdays == 'work') & \
(Extract('dow', tab_date.date) == 6), tab_date.date + Literal(2)),
else_ = tab_date.date,
) + tab_date.updttime).as_('updttime'),
)
return query