diagram: interpolator ergänzt,
asset: berechnung 'nextupdate' korrigiert
This commit is contained in:
parent
d08cf19b60
commit
7334e53f9f
7 changed files with 303 additions and 67 deletions
190
asset.py
190
asset.py
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue