diff --git a/line.py b/line.py index 78f342c..b77dd7a 100644 --- a/line.py +++ b/line.py @@ -207,6 +207,7 @@ class EvaluationLine(ModelSQL, ModelView): ) cursor.execute(*query) balances = cursor.fetchall() + for balance in balances: (id_currency, bal1) = balance diff --git a/templates.py b/templates.py index 753e2ef..3e6f022 100644 --- a/templates.py +++ b/templates.py @@ -3,9 +3,12 @@ # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. -cashbook_types = ['cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc', 'cashbooks_glvalue'] -category_types = ['categories', 'category_gldiff', 'category_glvalue', 'category_glperc'] -booktype_types = ['types', 'types_gldiff', 'types_glvalue', 'types_glperc'] +cashbook_types = ['cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc', + 'cashbooks_glvalue', 'cashbooks_glyield'] +category_types = ['categories', 'category_gldiff', 'category_glvalue', + 'category_glperc', 'category_glyield'] +booktype_types = ['types', 'types_gldiff', 'types_glvalue', + 'types_glperc', 'types_glyield'] template_view_line = '' diff --git a/tests/test_report.py b/tests/test_report.py index 8004a45..592ca85 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -29,27 +29,14 @@ class ReportTestCase(CashbookInvestmentTestCase): pool = Pool() Book = pool.get('cashbook.book') Line = pool.get('cashbook.line') - BookType = pool.get('cashbook.type') ResUser = pool.get('res.user') user_admin, = ResUser.search([]) company = self.prep_company() - asset_cfg = self.prep_yield_config( - fee = 'Fee', - dividend = 'Dividend', - gainloss = 'Gain-Loss', - company = company) - - type_cash, = BookType.search([('name', '=', 'Cash')]) + type_cash = self.prep_type() type_bank = self.prep_type(name='Bank', short='BK') - type_asset = self.prep_type(name='Asset', short='A') - BookType.write(*[ - [type_asset], - { - 'feature': 'asset', - }]) ResUser.write(*[ [user_admin], { @@ -60,10 +47,6 @@ class ReportTestCase(CashbookInvestmentTestCase): sequ_id = self.prep_sequence().id category = self.prep_category(cattype='in') - asset = self.prep_asset_item( - company=company, - product = self.prep_asset_product(name='Product 1')) - self.assertEqual(asset.symbol, 'usd/u') (usd, euro) = self.prep_2nd_currency(company) party = self.prep_party() @@ -133,43 +116,9 @@ class ReportTestCase(CashbookInvestmentTestCase): 'category': category.id, 'party': party.id, }])], - }, { - 'name': 'Book 4 - Asset', - 'btype': type_asset.id, - 'asset': asset.id, - 'quantity_uom': asset.uom.id, - 'company': company.id, - 'currency': euro.id, - 'number_sequ': sequ_id, - 'start_date': date(2022, 4, 1), - 'lines': [('create', [{ - 'date': date(2022, 5, 1), - 'description': 'Buy Shares', - 'bookingtype': 'in', - 'amount': Decimal('100.0'), - 'quantity': Decimal('1.0'), - 'category': category.id, - 'party': party.id, - }, { - 'date': date(2022, 5, 5), - 'description': 'Fee', - 'bookingtype': 'out', - 'amount': Decimal('2.5'), - 'quantity': Decimal('0.0'), - 'category': asset_cfg.fee_category.id, - 'party': party.id, - }, { - 'date': date(2022, 5, 3), - 'description': 'Dividend', - 'bookingtype': 'in', - 'amount': Decimal('5.0'), - 'quantity': Decimal('0.0'), - 'category': asset_cfg.dividend_category.id, - 'party': party.id, - }])], }]) Line.wfcheck([line for book in books for line in book.lines]) - self.assertEqual(len(books), 4) + self.assertEqual(len(books), 3) self.assertEqual(books[0].name, 'Book 1') self.assertEqual(books[0].btype.rec_name, 'CAS - Cash') self.assertEqual(len(books[0].lines), 2) @@ -184,11 +133,6 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(books[2].btype.rec_name, 'BK - Bank') self.assertEqual(len(books[2].lines), 2) self.assertEqual(books[2].balance, Decimal('23.0')) - - self.assertEqual(books[3].name, 'Book 4 - Asset') - self.assertEqual(books[3].btype.rec_name, 'A - Asset') - self.assertEqual(len(books[3].lines), 3) - self.assertEqual(books[3].balance, Decimal('102.5')) return books @with_transaction() @@ -229,8 +173,10 @@ class ReportTestCase(CashbookInvestmentTestCase): usd, = Currency.search([('code', '=', 'usd')]) self.assertEqual(usd.cashbook_hasbookings, True) + Lines.wfedit(books[0].lines) Lines.delete(books[0].lines) self.assertEqual(usd.cashbook_hasbookings, True) + Lines.wfedit(books[1].lines) Lines.delete(books[1].lines) self.assertEqual(usd.cashbook_hasbookings, False) @@ -325,15 +271,13 @@ class ReportTestCase(CashbookInvestmentTestCase): 'dtype': 'types', 'types': [('add', [x.id for x in Type.search([])])], }]) - self.assertEqual(len(evaluation2.types), 3) + self.assertEqual(len(evaluation2.types), 2) self.assertEqual(evaluation2.currency.rec_name, 'Euro') - self.assertEqual(len(evaluation2.line_values), 3) - self.assertEqual(evaluation2.line_values[0].name, 'A - Asset') - self.assertEqual(evaluation2.line_values[0].balance, Decimal('35.71')) - self.assertEqual(evaluation2.line_values[1].name, 'BK - Bank') - self.assertEqual(evaluation2.line_values[1].balance, Decimal('0.0')) - self.assertEqual(evaluation2.line_values[2].name, 'CAS - Cash') - self.assertEqual(evaluation2.line_values[2].balance, Decimal('35.71')) + self.assertEqual(len(evaluation2.line_values), 2) + self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank') + self.assertEqual(evaluation2.line_values[0].balance, Decimal('0.0')) + self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash') + self.assertEqual(evaluation2.line_values[1].balance, Decimal('35.71')) evaluation3, = Evaluation.create([{ 'name': 'Evaluation User 1 - Currencies', @@ -520,8 +464,8 @@ class ReportTestCase(CashbookInvestmentTestCase): 'dtype': 'cashbooks', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(len(evaluation.cashbooks), 4) - self.assertEqual(len(evaluation.line_values), 4) + self.assertEqual(len(evaluation.cashbooks), 3) + self.assertEqual(len(evaluation.line_values), 3) self.assertEqual(evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open') self.assertEqual(evaluation.line_values[0].name_line, None) @@ -575,7 +519,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'dtype': 'cashbooks', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(len(evaluation.cashbooks), 4) + self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.currencies), 0) self.assertEqual(len(evaluation.categories), 0) @@ -588,7 +532,7 @@ class ReportTestCase(CashbookInvestmentTestCase): { 'dtype': 'cashbooks_gldiff', }]) - self.assertEqual(len(evaluation.cashbooks), 4) + self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.currencies), 0) self.assertEqual(len(evaluation.categories), 0) @@ -598,7 +542,7 @@ class ReportTestCase(CashbookInvestmentTestCase): { 'dtype': 'cashbooks_glperc', }]) - self.assertEqual(len(evaluation.cashbooks), 4) + self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.currencies), 0) self.assertEqual(len(evaluation.categories), 0) @@ -612,7 +556,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'types': [('add', [x.id for x in Types.search([])])], }]) self.assertEqual(len(evaluation.cashbooks), 0) - self.assertEqual(len(evaluation.types), 3) + self.assertEqual(len(evaluation.types), 2) self.assertEqual(len(evaluation.currencies), 0) self.assertEqual(len(evaluation.categories), 0) @@ -623,7 +567,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'dtype': 'types', }]) self.assertEqual(len(evaluation.cashbooks), 0) - self.assertEqual(len(evaluation.types), 3) + self.assertEqual(len(evaluation.types), 2) self.assertEqual(len(evaluation.currencies), 0) self.assertEqual(len(evaluation.categories), 0) @@ -779,6 +723,145 @@ class ReportTestCase(CashbookInvestmentTestCase): if DashboardAction is not None: self.assertEqual(DashboardAction.search_count([]), 1) + @with_transaction() + def test_report_cashbook_yield(self): + """ create 3x cashbooks, add bookings, rates + create yield-reports + """ + pool = Pool() + Evaluation = pool.get('cashbook_report.evaluation') + Book = pool.get('cashbook.book') + Line = pool.get('cashbook.line') + BType = pool.get('cashbook.type') + Asset = pool.get('investment.asset') + CbCategory = pool.get('cashbook.bookcategory') + MemCache = pool.get('cashbook.memcache') + + company = self.prep_company() + with Transaction().set_context({ + 'company': company.id, + }): + asset_cfg = self.prep_yield_config( + fee = 'Fee', + dividend = 'Dividend', + gainloss = 'Gain-Loss', + company = company) + + cb_cat, = CbCategory.create([{'name': 'CB Category'}]) + category_in = self.prep_category(cattype='in') + type_depot = self.prep_type('Depot', 'D') + BType.write(*[ + [type_depot], + { + 'feature': 'asset', + }]) + asset = self.prep_asset_item( + company=company, + product = self.prep_asset_product(name='Product 1')) + self.assertEqual(asset.symbol, 'usd/u') + + Asset.write(*[ + [asset], + { + 'rates': [('create', [{ + 'date': date(2022, 5, 1), + 'rate': Decimal('102.0'), + }, { + 'date': date(2022, 5, 2), + 'rate': Decimal('105.5'), + }])], + }]) + self.assertEqual(asset.rec_name, 'Product 1 | 105.5000 usd/u | 05/02/2022') + + book_asset, = Book.create([{ + 'name': 'Depot', + 'btype': type_depot.id, + 'company': company.id, + 'currency': company.currency.id, + 'number_sequ': self.prep_sequence().id, + 'asset': asset.id, + 'quantity_uom': asset.uom.id, + 'categories': [('add', [cb_cat.id])], + 'start_date': date(2022, 5, 1), + 'lines': [('create', [{ + 'bookingtype': 'in', + 'date': date(2022, 5, 2), + 'amount': Decimal('100.0'), + 'quantity': Decimal('1.0'), + 'category': category_in.id, + 'description': 'Init', + }, { + 'bookingtype': 'in', + 'date': date(2022, 5, 3), + 'amount': Decimal('5.0'), + 'quantity': Decimal('0.0'), + 'category': asset_cfg.dividend_category.id, + 'description': 'Dividend', + }, { + 'bookingtype': 'out', + 'date': date(2022, 5, 4), + 'amount': Decimal('2.0'), + 'quantity': Decimal('0.0'), + 'category': asset_cfg.fee_category.id, + 'description': 'Fee', + }, { + 'bookingtype': 'mvin', + 'date': date(2022, 5, 5), + 'amount': Decimal('15.0'), + 'quantity': Decimal('0.0'), + 'booktransf': asset_cfg.gainloss_book.id, + 'description': 'Gain', + },])], + }]) + Line.wfcheck(book_asset.lines) + MemCache._cashbook_value_cache.clear_all() + + self.assertEqual(book_asset.rec_name, + 'Depot | 118.00 usd | Open | 1.0000 u') + self.assertEqual(book_asset.balance, Decimal('118.0')) + self.assertEqual(book_asset.current_value, Decimal('105.5')) + self.assertEqual(book_asset.diff_amount, Decimal('-14.5')) + self.assertEqual(book_asset.yield_dividend_total, Decimal('5.0')) + self.assertEqual(book_asset.yield_fee_total, Decimal('2.0')) + self.assertEqual(book_asset.yield_sales, Decimal('15.0')) + self.assertEqual(book_asset.yield_balance, Decimal('5.5')) + + # evaluation: cashbooks - total yield + evaluation1, = Evaluation.create([{ + 'name': 'Evaluation 1', + 'dtype': 'cashbooks_glyield', + 'chart': 'hbar', + 'cashbooks': [('add', [book_asset.id])], + }]) + self.assertEqual(evaluation1.dtype, 'cashbooks_glyield') + self.assertEqual(evaluation1.currency.code, 'usd') + self.assertEqual(len(evaluation1.line_values), 1) + self.assertEqual(evaluation1.line_values[0].balance, Decimal('5.5')) + + # evaluation: categories - total yield + evaluation2, = Evaluation.create([{ + 'name': 'Evaluation 2', + 'dtype': 'category_glyield', + 'chart': 'hbar', + 'categories': [('add', [book_asset.categories[0].id])], + }]) + self.assertEqual(evaluation2.dtype, 'category_glyield') + self.assertEqual(evaluation2.currency.code, 'usd') + self.assertEqual(len(evaluation2.line_values), 1) + self.assertEqual(evaluation2.line_values[0].balance, Decimal('5.5')) + + # evaluation: types - total yield + evaluation3, = Evaluation.create([{ + 'name': 'Evaluation 3', + 'dtype': 'types_glyield', + 'chart': 'hbar', + 'types': [('add', [book_asset.btype.id])], + }]) + self.assertEqual(evaluation3.dtype, 'types_glyield') + self.assertEqual(evaluation3.currency.code, 'usd') + self.assertEqual(len(evaluation3.line_values), 1) + self.assertEqual(evaluation3.line_values[0].balance, Decimal('5.5')) + @with_transaction() def test_report_chart_hbar_book_investment(self): """ create 3x cashbooks, add bookings, rates @@ -793,15 +876,12 @@ class ReportTestCase(CashbookInvestmentTestCase): with Transaction().set_context({ 'company': company.id, }): - if 'cashbooks_gldiff' not in [x[0] for x in Evaluation.get_sel_etype()]: - print('\n--== Module "cashbook_investment" not installed ==--') - return - AccType = pool.get('cashbook.type') Asset = pool.get('investment.asset') Product = pool.get('product.template') Uom = pool.get('product.uom') CbCategory = pool.get('cashbook.bookcategory') + MemCache = pool.get('cashbook.memcache') at, = AccType.create([{ 'name': 'depot', @@ -835,8 +915,12 @@ class ReportTestCase(CashbookInvestmentTestCase): 'Aurum | 1,750.0000 usd/u | 05/01/2022') books = self.prep_report_3books() + self.assertEqual(books[0].rec_name, 'Book 1 | 25.00 usd | Open') + self.assertEqual(books[1].rec_name, 'Book 2 | 12.50 usd | Open') + self.assertEqual(books[2].rec_name, 'Book 3 | 23.00 € | Open') + cb_cat, = CbCategory.create([{'name': 'CB Category'}]) - Line.wfedit([books.lines]) + Line.wfedit([line for book in books for line in book.lines]) Book.write(*[ books, { @@ -845,21 +929,24 @@ class ReportTestCase(CashbookInvestmentTestCase): 'categories': [('add', [cb_cat.id])], 'quantity_uom': asset.uom.id, 'quantity_digits': 3, - 'lines': [('write', - [books[0].lines[0].id], # usd - {'quantity': Decimal('2.0'), 'amount': Decimal('3000.0')}, - [books[0].lines[1].id], - {'quantity': Decimal('2.0'), 'amount': Decimal('3100.0')}, - [books[1].lines[0].id], # usd - {'quantity': Decimal('2.0'), 'amount': Decimal('3200.0')}, - [books[1].lines[1].id], - {'quantity': Decimal('2.0'), 'amount': Decimal('3300.0')}, - [books[2].lines[0].id], # euro - {'quantity': Decimal('2.0'), 'amount': Decimal('3300.0')}, - [books[2].lines[1].id], - {'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')}, - )], - }]) + }, + ]) + Line.write(*[ + [books[0].lines[0]], # usd + {'quantity': Decimal('2.0'), 'amount': Decimal('3000.0')}, + [books[0].lines[1]], + {'quantity': Decimal('2.0'), 'amount': Decimal('3100.0')}, + [books[1].lines[0]], # usd + {'quantity': Decimal('2.0'), 'amount': Decimal('3200.0')}, + [books[1].lines[1]], + {'quantity': Decimal('2.0'), 'amount': Decimal('3300.0')}, + [books[2].lines[0]], # euro + {'quantity': Decimal('2.0'), 'amount': Decimal('3300.0')}, + [books[2].lines[1]], + {'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')}, + ]) + MemCache._cashbook_value_cache.clear_all() + self.assertEqual(books[0].rec_name, 'Book 1 | 6,100.00 usd | Open | 4.000 u') self.assertEqual(books[0].current_value, Decimal('7000.0')) self.assertEqual(books[0].diff_amount, Decimal('900.0')) @@ -1020,31 +1107,26 @@ class ReportTestCase(CashbookInvestmentTestCase): """) - self.assertEqual(len(evaluation.cashbooks), 4) + self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(evaluation.cashbooks[0].rec_name, 'Book 1 | 25.00 usd | Open') self.assertEqual(evaluation.cashbooks[1].rec_name, 'Book 2 | 12.50 usd | Open') self.assertEqual(evaluation.cashbooks[2].rec_name, 'Book 3 | 23.00 € | Open') - self.assertEqual(evaluation.cashbooks[3].rec_name, 'Book 4 - Asset | 102.50 € | Open | 1.0000 u') self.assertEqual(evaluation.cashbooks[0].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[1].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[2].currency.code, 'EUR') - self.assertEqual(evaluation.cashbooks[3].currency.code, 'EUR') - self.assertEqual(len(evaluation.line_values), 4) + self.assertEqual(len(evaluation.line_values), 3) self.assertEqual(evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open') self.assertEqual(evaluation.line_values[1].name, 'Book 2 | 12.50 usd | Open') self.assertEqual(evaluation.line_values[2].name, 'Book 3 | 23.00 € | Open') - self.assertEqual(evaluation.line_values[3].name, 'Book 4 - Asset | 102.50 € | Open | 1.0000 u') self.assertEqual(evaluation.line_values[0].eval_currency.code, 'EUR') self.assertEqual(evaluation.line_values[1].eval_currency.code, 'EUR') self.assertEqual(evaluation.line_values[2].eval_currency.code, 'EUR') - self.assertEqual(evaluation.line_values[3].eval_currency.code, 'EUR') self.assertEqual(evaluation.line_values[0].balance, Decimal('23.81')) self.assertEqual(evaluation.line_values[1].balance, Decimal('11.90')) self.assertEqual(evaluation.line_values[2].balance, Decimal('23.00')) - self.assertEqual(evaluation.line_values[3].balance, Decimal('102.50')) @with_transaction() def test_report_chart_pie_type_red(self): @@ -1076,27 +1158,21 @@ class ReportTestCase(CashbookInvestmentTestCase): # 37.50 USD, Cash # 23.00 EUR, Bank - self.assertEqual(len(evaluation.types), 3) - self.assertEqual(evaluation.types[0].rec_name, 'A - Asset') - self.assertEqual(evaluation.types[1].rec_name, 'BK - Bank') - self.assertEqual(evaluation.types[2].rec_name, 'CAS - Cash') + self.assertEqual(len(evaluation.types), 2) + self.assertEqual(evaluation.types[0].rec_name, 'BK - Bank') + self.assertEqual(evaluation.types[1].rec_name, 'CAS - Cash') - self.assertEqual(len(evaluation.line_values), 3) - - # xx.xx USD --> EUR - self.assertEqual(evaluation.line_values[0].name, 'A - Asset') - self.assertEqual(evaluation.line_values[0].eval_currency.code, 'EUR') - self.assertEqual(evaluation.line_values[0].balance, Decimal('102.50')) + self.assertEqual(len(evaluation.line_values), 2) # 23.00 EUR - self.assertEqual(evaluation.line_values[1].eval_currency.code, 'EUR') - self.assertEqual(evaluation.line_values[1].name, 'BK - Bank') - self.assertEqual(evaluation.line_values[1].balance, Decimal('23.0')) + self.assertEqual(evaluation.line_values[0].eval_currency.code, 'EUR') + self.assertEqual(evaluation.line_values[0].name, 'BK - Bank') + self.assertEqual(evaluation.line_values[0].balance, Decimal('23.0')) # 37.50 USD --> EUR - self.assertEqual(evaluation.line_values[2].name, 'CAS - Cash') - self.assertEqual(evaluation.line_values[2].eval_currency.code, 'EUR') - self.assertEqual(evaluation.line_values[2].balance, Decimal('35.71')) + self.assertEqual(evaluation.line_values[1].name, 'CAS - Cash') + self.assertEqual(evaluation.line_values[1].eval_currency.code, 'EUR') + self.assertEqual(evaluation.line_values[1].balance, Decimal('35.71')) @with_transaction() def test_report_chart_pie_currency_red(self): @@ -1131,7 +1207,7 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation.line_values), 2) self.assertEqual(evaluation.line_values[0].name, 'Euro') - self.assertEqual(evaluation.line_values[0].balance, Decimal('125.5')) + self.assertEqual(evaluation.line_values[0].balance, Decimal('23.0')) self.assertEqual(evaluation.line_values[1].name, 'usd') self.assertEqual(evaluation.line_values[1].balance, Decimal('35.71'))