abfrage der prozentwerte für tag/1 monat, 3 monate, 6 monate, 12 monate

test muß noch
This commit is contained in:
Frederik Jaeckel 2022-11-25 15:28:49 +01:00
parent a99d11a4a0
commit 64b8383096
6 changed files with 159 additions and 95 deletions

168
asset.py
View file

@ -15,6 +15,9 @@ from sql.conditionals import Case, Coalesce
from sql import Literal from sql import Literal
digits_percent = 2
class Asset(ModelSQL, ModelView): class Asset(ModelSQL, ModelView):
'Asset' 'Asset'
__name__ = 'investment.asset' __name__ = 'investment.asset'
@ -56,8 +59,7 @@ class Asset(ModelSQL, ModelView):
currency = fields.Many2One(string='Currency', select=True, currency = fields.Many2One(string='Currency', select=True,
required=True, model_name='currency.currency', ondelete='RESTRICT') required=True, model_name='currency.currency', ondelete='RESTRICT')
currency_digits = fields.Integer(string='Currency Digits', currency_digits = fields.Integer(string='Digits', required=True)
required=True)
wkn = fields.Function(fields.Char(string='NSIN', readonly=True, wkn = fields.Function(fields.Char(string='NSIN', readonly=True,
help='National Securities Identifying Number'), help='National Securities Identifying Number'),
@ -81,33 +83,33 @@ class Asset(ModelSQL, ModelView):
'get_nextupdtates', searcher='search_nextupdtate') 'get_nextupdtates', searcher='search_nextupdtate')
# percentage change # percentage change
change_today = fields.Function(fields.Numeric(string='Previous Day', change_day1 = fields.Function(fields.Numeric(string='Previous Day',
help='percentage change in value compared to the previous day', help='percentage change in value compared to the previous day',
readonly=True, digits=(16,1)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change')
change_month = fields.Function(fields.Numeric(string='1 Month', change_month1 = fields.Function(fields.Numeric(string='1 Month',
help='percentage change in value compared to last month', help='percentage change in value compared to last month',
readonly=True, digits=(16,1)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change')
change_3month = fields.Function(fields.Numeric(string='3 Months', change_month3 = fields.Function(fields.Numeric(string='3 Months',
help='percentage change in value during 3 months', help='percentage change in value during 3 months',
readonly=True, digits=(16,1)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change')
change_6month = fields.Function(fields.Numeric(string='6 Months', change_month6 = fields.Function(fields.Numeric(string='6 Months',
help='percentage change in value during 6 months', help='percentage change in value during 6 months',
readonly=True, digits=(16,1)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change')
change_12month = fields.Function(fields.Numeric(string='1 Year', change_month12 = fields.Function(fields.Numeric(string='1 Year',
help='percentage change in value during 1 year', help='percentage change in value during 1 year',
readonly=True, digits=(16,1)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change')
@classmethod @classmethod
def view_attributes(cls): def view_attributes(cls):
return super().view_attributes() + [ return super().view_attributes() + [
('/tree', 'visual', ('/tree', 'visual',
If(Eval('change_today', 0) < 0, 'warning', If(Eval('change_day1', 0) < 0, 'warning',
If(Eval('change_today', 0) > 0, 'success', '') If(Eval('change_day1', 0) > 0, 'success', '')
)), )),
] ]
@ -134,17 +136,25 @@ class Asset(ModelSQL, ModelView):
return 4 return 4
@classmethod @classmethod
def get_percentage_sql(cls, table_asset): def get_percentage_sql(cls, table_asset, name_lst):
""" get table for percentages and dates """ get table for percentages and dates
generate adapted query
""" """
pool = Pool() pool = Pool()
Rate = pool.get('investment.rate') Rate = pool.get('investment.rate')
tab_rate_today = Rate.__table__() tab_rate_today = Rate.__table__()
tab_rate_1day = Rate.__table__()
tab_rate_1month = Rate.__table__() rate_tab = {
tab_rate_3month = Rate.__table__() 'day1': {'tab': Rate.__table__(), 'day': 0},
'month1': {'tab': Rate.__table__(), 'day': 30},
'month3': {'tab': Rate.__table__(), 'day': 3*30},
'month6': {'tab': Rate.__table__(), 'day': 6*30},
'month12': {'tab': Rate.__table__(), 'day': 12*30},
}
context = Transaction().context context = Transaction().context
# create tables to query percentual changes for
# 1 day, 30 days, 3 months, 6 months, 1 year
query_date = context.get('qdate', CurrentDate()) query_date = context.get('qdate', CurrentDate())
query_today = table_asset.join(tab_rate_today, query_today = table_asset.join(tab_rate_today,
condition=table_asset.id==tab_rate_today.asset, condition=table_asset.id==tab_rate_today.asset,
@ -157,41 +167,76 @@ class Asset(ModelSQL, ModelView):
where=tab_rate_today.date <= query_date, where=tab_rate_today.date <= query_date,
) )
query = query_today.join(tab_rate_1day, # create join for requested fields, to minimize database-load
# select newest date from yesterday until 3 days old query = query_today
condition=(query_today.id==tab_rate_1day.asset) & \ for name in name_lst:
(query_today.date > tab_rate_1day.date) & \ query = query.join(rate_tab[name]['tab'],
(query_today.date < tab_rate_1day.date + Literal(3)), # select newest date from <period> until 3 days older
type_ = 'LEFT OUTER', condition=(query_today.id==rate_tab[name]['tab'].asset) & \
).join(tab_rate_1month, (query_today.date > (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day']))) & \
# select newest date from 1 month ago until +3 days old (query_today.date < (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day'] + 3))),
condition=(query_today.id==tab_rate_1month.asset) & \ type_ = 'LEFT OUTER')
(query_today.date > tab_rate_1month.date + Literal(30)) & \
(query_today.date < tab_rate_1month.date + Literal(33)), # add select for requested fields to join
type_ = 'LEFT OUTER', select_lst = [
).select( query_today.id,
query_today.id, query_today.date,
query_today.date, ]
for name in name_lst:
select_lst.append(
Case( Case(
((tab_rate_1day.rate != None) & (query_today.rate != None) & \ ((rate_tab[name]['tab'].rate != None) & (query_today.rate != None) & \
(tab_rate_1day.rate != Literal(0.0)), (rate_tab[name]['tab'].rate != Literal(0.0)),
query_today.rate * Literal(100.0) / tab_rate_1day.rate - Literal(100.0)), query_today.rate * Literal(100.0) / rate_tab[name]['tab'].rate - Literal(100.0)),
else_ = None, else_ = None,
).as_('day1'), ).as_(name))
Case(
((tab_rate_1month.rate != None) & (query_today.rate != None) & \ order_by_lst = [query_today.id]
(tab_rate_1month.rate != Literal(0.0)), order_by_lst.extend([
query_today.rate * Literal(100.0) / tab_rate_1month.rate - Literal(100.0)), rate_tab[name]['tab'].date.desc for name in name_lst
else_ = None, ])
).as_('month1'),
distinct_on=[query_today.id], query = query.select(
order_by=[ *select_lst,
query_today.id, distinct_on=[query_today.id],
tab_rate_1day.date.desc, order_by=order_by_lst,
tab_rate_1month.date.desc,
],
) )
# ~ query = query_today.join(tab_rate_1day,
# ~ # select newest date from yesterday until 3 days old
# ~ condition=(query_today.id==tab_rate_1day.asset) & \
# ~ (query_today.date > tab_rate_1day.date) & \
# ~ (query_today.date < tab_rate_1day.date + Literal(3)),
# ~ type_ = 'LEFT OUTER',
# ~ ).join(tab_rate_1month,
# ~ # select newest date from 1 month ago until +3 days old
# ~ condition=(query_today.id==tab_rate_1month.asset) & \
# ~ (query_today.date > tab_rate_1month.date + Literal(30)) & \
# ~ (query_today.date < tab_rate_1month.date + Literal(33)),
# ~ type_ = 'LEFT OUTER',
# ~ ).select(
# ~ query_today.id,
# ~ query_today.date,
# ~ Case(
# ~ ((tab_rate_1day.rate != None) & (query_today.rate != None) & \
# ~ (tab_rate_1day.rate != Literal(0.0)),
# ~ query_today.rate * Literal(100.0) / tab_rate_1day.rate - Literal(100.0)),
# ~ else_ = None,
# ~ ).as_('day1'),
# ~ Case(
# ~ ((tab_rate_1month.rate != None) & (query_today.rate != None) & \
# ~ (tab_rate_1month.rate != Literal(0.0)),
# ~ query_today.rate * Literal(100.0) / tab_rate_1month.rate - Literal(100.0)),
# ~ else_ = None,
# ~ ).as_('month1'),
# ~ distinct_on=[query_today.id],
# ~ order_by=[
# ~ query_today.id,
# ~ tab_rate_1day.date.desc,
# ~ tab_rate_1month.date.desc,
# ~ ],
# ~ )
return query return query
@classmethod @classmethod
@ -203,33 +248,26 @@ class Asset(ModelSQL, ModelView):
tab_asset = Asset.__table__() tab_asset = Asset.__table__()
cursor = Transaction().connection.cursor() cursor = Transaction().connection.cursor()
tab_percent = cls.get_percentage_sql(tab_asset) name_lst = [x[len('change_'):] for x in names]
tab_percent = cls.get_percentage_sql(tab_asset, name_lst)
query = tab_percent.select( query = tab_percent.select(
tab_percent.id, tab_percent.id,
tab_percent.day1, *[getattr(tab_percent, x) for x in name_lst],
tab_percent.month1,
where=tab_percent.id.in_([x.id for x in assets]), where=tab_percent.id.in_([x.id for x in assets]),
) )
cursor.execute(*query) cursor.execute(*query)
records = cursor.fetchall() records = cursor.fetchall()
result = {x:{y.id: None for y in assets} for x in names} result = {x:{y.id: None for y in assets} for x in names}
exp = Decimal(Decimal(1) / 10 ** digits_percent)
for record in records: for record in records:
values = { cnt1 = 1
'change_today': record[1].quantize(Decimal('0.1')) \ for x in name_lst:
if record[1] is not None else None, result['change_%s' % x][record[0]] = record[cnt1].quantize(exp) \
'change_month': record[2].quantize(Decimal('0.1')) \ if record[cnt1] is not None else None
if record[2] is not None else None, cnt1 += 1
'change_3month': None,
'change_6month': None,
'change_12month': None,
}
for name in names:
result[name][record[0]] = values[name]
return result return result
@classmethod @classmethod
def get_rate_data(cls, assets, names): def get_rate_data(cls, assets, names):
""" get date and rate of asset """ get date and rate of asset

View file

@ -86,6 +86,10 @@ msgctxt "view:investment.asset:"
msgid "Currency and Units" msgid "Currency and Units"
msgstr "Währung und Einheiten" msgstr "Währung und Einheiten"
msgctxt "view:investment.asset:"
msgid "Gain and Loss"
msgstr "Gewinn und Verlust"
msgctxt "view:investment.asset:" msgctxt "view:investment.asset:"
msgid "Identifiers" msgid "Identifiers"
msgstr "Bezeichner" msgstr "Bezeichner"
@ -115,8 +119,8 @@ msgid "Currency"
msgstr "Währung" msgstr "Währung"
msgctxt "field:investment.asset,currency_digits:" msgctxt "field:investment.asset,currency_digits:"
msgid "Currency Digits" msgid "Digits"
msgstr "Nachkommastellen Währung" msgstr "Nachkommastellen"
msgctxt "field:investment.asset,product:" msgctxt "field:investment.asset,product:"
msgid "Product" msgid "Product"
@ -194,43 +198,43 @@ msgctxt "field:investment.asset,nextupdtate:"
msgid "Next Update" msgid "Next Update"
msgstr "nächste Aktualisierung" msgstr "nächste Aktualisierung"
msgctxt "field:investment.asset,change_today:" msgctxt "field:investment.asset,change_day1:"
msgid "Previous Day" msgid "Previous Day"
msgstr "Vortag" msgstr "Vortag"
msgctxt "help:investment.asset,change_today:" msgctxt "help:investment.asset,change_day1:"
msgid "percentage change in value compared to the previous day" msgid "percentage change in value compared to the previous day"
msgstr "prozentuale Wertänderung zum Vortag" msgstr "prozentuale Wertänderung zum Vortag"
msgctxt "field:investment.asset,change_month:" msgctxt "field:investment.asset,change_month1:"
msgid "1 Month" msgid "1 Month"
msgstr "1 Monat" msgstr "1 Monat"
msgctxt "help:investment.asset,change_month:" msgctxt "help:investment.asset,change_month1:"
msgid "percentage change in value compared to last month" msgid "percentage change in value compared to last month"
msgstr "prozentuale Wertänderung zum letzten Monat" msgstr "prozentuale Wertänderung zum letzten Monat"
msgctxt "field:investment.asset,change_3month:" msgctxt "field:investment.asset,change_month3:"
msgid "3 Months" msgid "3 Months"
msgstr "3 Monate" msgstr "3 Monate"
msgctxt "help:investment.asset,change_3month:" msgctxt "help:investment.asset,change_month3:"
msgid "percentage change in value during 3 months" msgid "percentage change in value during 3 months"
msgstr "Prozentuale Wertänderung während 3 Monate" msgstr "Prozentuale Wertänderung während 3 Monate"
msgctxt "field:investment.asset,change_6month:" msgctxt "field:investment.asset,change_month6:"
msgid "6 Months" msgid "6 Months"
msgstr "6 Monate" msgstr "6 Monate"
msgctxt "help:investment.asset,change_6month:" msgctxt "help:investment.asset,change_month6:"
msgid "percentage change in value during 6 months" msgid "percentage change in value during 6 months"
msgstr "Prozentuale Wertänderung während 6 Monate" msgstr "Prozentuale Wertänderung während 6 Monate"
msgctxt "field:investment.asset,change_12month:" msgctxt "field:investment.asset,change_month12:"
msgid "1 Year" msgid "1 Year"
msgstr "1 Jahr" msgstr "1 Jahr"
msgctxt "help:investment.asset,change_12month:" msgctxt "help:investment.asset,change_month12:"
msgid "percentage change in value during 1 year" msgid "percentage change in value during 1 year"
msgstr "Prozentuale Wertänderung während 1 Jahr" msgstr "Prozentuale Wertänderung während 1 Jahr"

View file

@ -58,6 +58,10 @@ msgctxt "view:investment.asset:"
msgid "Currency and Units" msgid "Currency and Units"
msgstr "Currency and Units" msgstr "Currency and Units"
msgctxt "view:investment.asset:"
msgid "Gain and Loss"
msgstr "Gain and Loss"
msgctxt "view:investment.asset:" msgctxt "view:investment.asset:"
msgid "Identifiers" msgid "Identifiers"
msgstr "Identifiers" msgstr "Identifiers"
@ -87,8 +91,8 @@ msgid "Currency"
msgstr "Currency" msgstr "Currency"
msgctxt "field:investment.asset,currency_digits:" msgctxt "field:investment.asset,currency_digits:"
msgid "Currency Digits" msgid "Digits"
msgstr "Currency Digits" msgstr "Digits"
msgctxt "field:investment.asset,product:" msgctxt "field:investment.asset,product:"
msgid "Product" msgid "Product"
@ -166,43 +170,43 @@ msgctxt "field:investment.asset,nextupdtate:"
msgid "Next Update" msgid "Next Update"
msgstr "Next Update" msgstr "Next Update"
msgctxt "field:investment.asset,change_today:" msgctxt "field:investment.asset,change_day1:"
msgid "Previous Day" msgid "Previous Day"
msgstr "Previous Day" msgstr "Previous Day"
msgctxt "help:investment.asset,change_today:" msgctxt "help:investment.asset,change_day1:"
msgid "percentage change in value compared to the previous day" msgid "percentage change in value compared to the previous day"
msgstr "percentage change in value compared to the previous day" msgstr "percentage change in value compared to the previous day"
msgctxt "field:investment.asset,change_month:" msgctxt "field:investment.asset,change_month1:"
msgid "1 Month" msgid "1 Month"
msgstr "1 Month" msgstr "1 Month"
msgctxt "help:investment.asset,change_month:" msgctxt "help:investment.asset,change_month1:"
msgid "percentage change in value compared to last month" msgid "percentage change in value compared to last month"
msgstr "percentage change in value compared to last month" msgstr "percentage change in value compared to last month"
msgctxt "field:investment.asset,change_3month:" msgctxt "field:investment.asset,change_month3:"
msgid "3 Months" msgid "3 Months"
msgstr "3 Months" msgstr "3 Months"
msgctxt "help:investment.asset,change_3month:" msgctxt "help:investment.asset,change_month3:"
msgid "percentage change in value during 3 months" msgid "percentage change in value during 3 months"
msgstr "percentage change in value during 3 months" msgstr "percentage change in value during 3 months"
msgctxt "field:investment.asset,change_6month:" msgctxt "field:investment.asset,change_month6:"
msgid "6 Months" msgid "6 Months"
msgstr "6 Months" msgstr "6 Months"
msgctxt "help:investment.asset,change_6month:" msgctxt "help:investment.asset,change_month6:"
msgid "percentage change in value during 6 months" msgid "percentage change in value during 6 months"
msgstr "percentage change in value during 6 months" msgstr "percentage change in value during 6 months"
msgctxt "field:investment.asset,change_12month:" msgctxt "field:investment.asset,change_month12:"
msgid "1 Year" msgid "1 Year"
msgstr "1 Year" msgstr "1 Year"
msgctxt "help:investment.asset,change_12month:" msgctxt "help:investment.asset,change_month12:"
msgid "percentage change in value during 1 year" msgid "percentage change in value during 1 year"
msgstr "percentage change in value during 1 year" msgstr "percentage change in value during 1 year"

View file

@ -156,8 +156,8 @@ class AssetTestCase(ModuleTestCase):
]) ])
self.assertEqual(asset1.rec_name, 'Product 1 - 2.6000 usd/Unit [05/16/2022]') self.assertEqual(asset1.rec_name, 'Product 1 - 2.6000 usd/Unit [05/16/2022]')
self.assertEqual(asset2.rec_name, 'Product 1 - 5.2500 usd/Unit [05/15/2022]') self.assertEqual(asset2.rec_name, 'Product 1 - 5.2500 usd/Unit [05/15/2022]')
self.assertEqual(asset1.change_today, Decimal('6.1')) self.assertEqual(asset1.change_day1, Decimal('6.1'))
self.assertEqual(asset2.change_today, Decimal('-8.7')) self.assertEqual(asset2.change_day1, Decimal('-8.7'))
@with_transaction() @with_transaction()
def test_asset_check_onlinesource_onoff(self): def test_asset_check_onlinesource_onoff(self):

View file

@ -8,12 +8,28 @@ full copyright notices and license terms. -->
<label name="rate" /> <label name="rate" />
<field name="rate" symbol="currency"/> <field name="rate" symbol="currency"/>
<label id="labdate" colspan="2" string=" "/> <label id="labdate" string=" "/>
<label name="nextupdtate" /> <label name="nextupdtate" colspan="2"/>
<field name="nextupdtate"/> <field name="nextupdtate"/>
<label name="date" /> <label name="date" />
<field name="date"/> <field name="date"/>
<separator id="sepperc" colspan="6" string="Gain and Loss"/>
<label name="change_day1" />
<field name="change_day1" />
<label name="change_month1" />
<field name="change_month1" />
<label name="change_month3" />
<field name="change_month3" />
<label name="change_month6" />
<field name="change_month6" />
<label name="change_month12" />
<field name="change_month12" />
<newline/>
<separator id="sepunits" colspan="6" string="Currency and Units"/> <separator id="sepunits" colspan="6" string="Currency and Units"/>
<label name="currency" /> <label name="currency" />
<field name="currency" /> <field name="currency" />

View file

@ -6,10 +6,12 @@ full copyright notices and license terms. -->
<field name="name" expand="2"/> <field name="name" expand="2"/>
<field name="isin" expand="1"/> <field name="isin" expand="1"/>
<field name="wkn" expand="1"/> <field name="wkn" expand="1"/>
<field name="change_day1" />
<field name="change_month1" />
<field name="change_month3" />
<field name="change_month6" />
<field name="date" expand="1"/> <field name="date" expand="1"/>
<field name="rate" expand="1"/> <field name="rate" expand="1"/>
<field name="currency"/> <field name="currency"/>
<field name="uom" /> <field name="uom" />
<field name="change_today" />
</tree> </tree>