From 57cb06d60e00e36ccf09c51900d5b8d3c4dd3a76 Mon Sep 17 00:00:00 2001 From: Frederik Jaeckel Date: Thu, 24 Nov 2022 23:17:44 +0100 Subject: [PATCH] prozentwerte begonnen --- asset.py | 129 ++++++++++++++++++++++++++++++++++++++++++-- locale/de.po | 40 ++++++++++++++ locale/en.po | 40 ++++++++++++++ tests/test_asset.py | 48 +++++++++++++++++ view/asset_list.xml | 2 + 5 files changed, 255 insertions(+), 4 deletions(-) diff --git a/asset.py b/asset.py index a6feab2..0b1ef2c 100644 --- a/asset.py +++ b/asset.py @@ -10,8 +10,9 @@ from trytond.pyson import Eval, Bool, And from trytond.report import Report from decimal import Decimal from datetime import time -from sql.functions import CurrentTime +from sql.functions import CurrentTime, CurrentDate from sql.conditionals import Case +from sql import Literal class Asset(ModelSQL, ModelView): @@ -79,6 +80,28 @@ class Asset(ModelSQL, ModelView): readonly=True), 'on_change_with_updtneeded', searcher='search_updtneeded') + # percentage change + change_today = fields.Function(fields.Numeric(string='Previous Day', + help='percentage change in value compared to the previous day', + readonly=True, digits=(16,1)), + 'get_percentage_change') + change_month = fields.Function(fields.Numeric(string='1 Month', + help='percentage change in value compared to last month', + readonly=True, digits=(16,1)), + 'get_percentage_change') + change_3month = fields.Function(fields.Numeric(string='3 Months', + help='percentage change in value during 3 months', + readonly=True, digits=(16,1)), + 'get_percentage_change') + change_6month = fields.Function(fields.Numeric(string='6 Months', + help='percentage change in value during 6 months', + readonly=True, digits=(16,1)), + 'get_percentage_change') + change_12month = fields.Function(fields.Numeric(string='1 Year', + help='percentage change in value during 1 year', + readonly=True, digits=(16,1)), + 'get_percentage_change') + @classmethod def default_currency(cls): """ currency of company @@ -101,6 +124,105 @@ class Asset(ModelSQL, ModelView): """ return 4 + @classmethod + def get_percentage_sql(cls, table_asset): + """ get table for percentages and dates + """ + pool = Pool() + Rate = pool.get('investment.rate') + tab_rate_today = Rate.__table__() + tab_rate_1day = Rate.__table__() + tab_rate_1month = Rate.__table__() + tab_rate_3month = Rate.__table__() + context = Transaction().context + + query_date = context.get('qdate', CurrentDate()) + query_today = table_asset.join(tab_rate_today, + condition=table_asset.id==tab_rate_today.asset, + ).select( + table_asset.id, + tab_rate_today.date, + tab_rate_today.rate, + distinct_on=[table_asset.id], + order_by=[table_asset.id, tab_rate_today.date.desc], + where=tab_rate_today.date <= query_date, + ) + + 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 + + @classmethod + def get_percentage_change(cls, assets, names): + """ get percentage per period + """ + pool = Pool() + Asset = pool.get('investment.asset') + tab_asset = Asset.__table__() + cursor = Transaction().connection.cursor() + + tab_percent = cls.get_percentage_sql(tab_asset) + query = tab_percent.select( + tab_percent.id, + tab_percent.day1, + tab_percent.month1, + where=tab_percent.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: + values = { + 'change_today': record[1].quantize(Decimal('0.1')) \ + if record[1] is not None else None, + 'change_month': record[2].quantize(Decimal('0.1')) \ + if record[2] is not None else None, + 'change_3month': None, + 'change_6month': None, + 'change_12month': None, + } + + for name in names: + result[name][record[0]] = values[name] + + print('-- result:', result) + return result + + @classmethod def get_rate_data(cls, assets, names): """ get date and rate of asset @@ -219,13 +341,12 @@ class Asset(ModelSQL, ModelView): pool = Pool() Asset2 = pool.get('investment.asset') Rate = pool.get('investment.rate') - IrDate = pool.get('ir.date') tab_asset = Asset2.__table__() tab_rate = Rate.__table__() Operator = fields.SQL_OPERATORS[clause[1]] context = Transaction().context - query_date = context.get('qdate', IrDate.today()) + query_date = context.get('qdate', CurrentDate()) query_time = context.get('qtime', CurrentTime()) query = tab_asset.join(tab_rate, @@ -330,7 +451,7 @@ class Asset(ModelSQL, ModelView): """ return '%(prod)s - %(rate)s %(curr)s/%(unit)s [%(date)s]' % { 'prod': getattr(self.product, 'rec_name', '-'), - 'curr': getattr(self.currency, 'rec_name', '-'), + 'curr': getattr(self.currency, 'symbol', '-'), 'unit': getattr(self.uom, 'rec_name', '-'), 'rate': Report.format_number(self.rate, lang=None, digits=self.currency_digits or 4) \ diff --git a/locale/de.po b/locale/de.po index 024a2d5..1a91ba8 100644 --- a/locale/de.po +++ b/locale/de.po @@ -194,6 +194,46 @@ msgctxt "field:investment.asset,updtneeded:" msgid "Course update needed" msgstr "Kursaktualisierung nötig" +msgctxt "field:investment.asset,change_today:" +msgid "Previous Day" +msgstr "Vortag" + +msgctxt "help:investment.asset,change_today:" +msgid "percentage change in value compared to the previous day" +msgstr "prozentuale Wertänderung zum Vortag" + +msgctxt "field:investment.asset,change_month:" +msgid "1 Month" +msgstr "1 Monat" + +msgctxt "help:investment.asset,change_month:" +msgid "percentage change in value compared to last month" +msgstr "prozentuale Wertänderung zum letzten Monat" + +msgctxt "field:investment.asset,change_3month:" +msgid "3 Months" +msgstr "3 Monate" + +msgctxt "help:investment.asset,change_3month:" +msgid "percentage change in value during 3 months" +msgstr "Prozentuale Wertänderung während 3 Monate" + +msgctxt "field:investment.asset,change_6month:" +msgid "6 Months" +msgstr "6 Monate" + +msgctxt "help:investment.asset,change_6month:" +msgid "percentage change in value during 6 months" +msgstr "Prozentuale Wertänderung während 6 Monate" + +msgctxt "field:investment.asset,change_12month:" +msgid "1 Year" +msgstr "1 Jahr" + +msgctxt "help:investment.asset,change_12month:" +msgid "percentage change in value during 1 year" +msgstr "Prozentuale Wertänderung während 1 Jahr" + ##################### # investment.source # diff --git a/locale/en.po b/locale/en.po index 5025b1e..12bd997 100644 --- a/locale/en.po +++ b/locale/en.po @@ -166,6 +166,46 @@ msgctxt "field:investment.asset,updtneeded:" msgid "Course update needed" msgstr "Course update needed" +msgctxt "field:investment.asset,change_today:" +msgid "Previous Day" +msgstr "Previous Day" + +msgctxt "help:investment.asset,change_today:" +msgid "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:" +msgid "1 Month" +msgstr "1 Month" + +msgctxt "help:investment.asset,change_month:" +msgid "percentage change in value compared to last month" +msgstr "percentage change in value compared to last month" + +msgctxt "field:investment.asset,change_3month:" +msgid "3 Months" +msgstr "3 Months" + +msgctxt "help:investment.asset,change_3month:" +msgid "percentage change in value during 3 months" +msgstr "percentage change in value during 3 months" + +msgctxt "field:investment.asset,change_6month:" +msgid "6 Months" +msgstr "6 Months" + +msgctxt "help:investment.asset,change_6month:" +msgid "percentage change in value during 6 months" +msgstr "percentage change in value during 6 months" + +msgctxt "field:investment.asset,change_12month:" +msgid "1 Year" +msgstr "1 Year" + +msgctxt "help:investment.asset,change_12month:" +msgid "percentage change in value during 1 year" +msgstr "percentage change in value during 1 year" + msgctxt "model:investment.source,name:" msgid "Online Source" msgstr "Online Source" diff --git a/tests/test_asset.py b/tests/test_asset.py index cad1f97..d2928a1 100644 --- a/tests/test_asset.py +++ b/tests/test_asset.py @@ -111,6 +111,54 @@ class AssetTestCase(ModuleTestCase): }]) self.assertEqual(asset.rec_name, 'Product 1 - 2.4500 usd/Unit [05/15/2022]') + @with_transaction() + def test_asset_percentges(self): + """ create asset, add rates, check percentages + """ + Asset = Pool().get('investment.asset') + + company = self.prep_asset_company() + product = self.prep_asset_product( + name='Product 1', + description='some asset') + + asset1 = self.prep_asset_item( + company=company, + product = product) + asset2 = self.prep_asset_item( + company=company, + product = product) + + self.assertEqual(asset1.rec_name, 'Product 1 - - usd/Unit [-]') + self.assertEqual(asset2.rec_name, 'Product 1 - - usd/Unit [-]') + + Asset.write(*[ + [asset1], + { + 'rates': [('create', [{ + 'date': date(2022, 5, 15), + 'rate': Decimal('2.45'), + }, { + 'date': date(2022, 5, 16), + 'rate': Decimal('2.6'), + }])], + }, + [asset2], + { + 'rates': [('create', [{ + 'date': date(2022, 5, 14), + 'rate': Decimal('5.75'), + }, { + 'date': date(2022, 5, 15), + 'rate': Decimal('5.25'), + }])], + }, + ]) + 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(asset1.change_today, Decimal('6.1')) + self.assertEqual(asset2.change_today, Decimal('-8.7')) + @with_transaction() def test_asset_check_onlinesource_onoff(self): """ create asset, switch online-source on/off diff --git a/view/asset_list.xml b/view/asset_list.xml index 9fae2d6..a9990f8 100644 --- a/view/asset_list.xml +++ b/view/asset_list.xml @@ -10,4 +10,6 @@ full copyright notices and license terms. --> + +