From 79926fbe5d1d5be0b349b4dfce0be2c8751bb2bd Mon Sep 17 00:00:00 2001 From: Frederik Jaeckel Date: Wed, 6 Mar 2024 23:02:24 +0100 Subject: [PATCH] add test for eur --> chf (asset in usd) --- planner.py | 12 +++-- tests/planner.py | 117 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 5 deletions(-) diff --git a/planner.py b/planner.py index 5af2ca4..57b7223 100644 --- a/planner.py +++ b/planner.py @@ -511,20 +511,22 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView): Returns: dict: dictionary to create cashbook-line record """ - asset_book = Cashbook(aline['booktransf']) + from_book = Cashbook(aline['cashbook']) + to_book = Cashbook(aline['booktransf']) # add 2nd currency if currencies are different - aline = Line.add_2nd_currency(aline, asset_book.currency) + aline = Line.add_2nd_currency(aline, from_book.currency) target_amount = aline.get('amount_2nd_currency', aline['amount']) - asset_rate = asset_book.asset.rate + asset_rate = to_book.asset.rate with Transaction().set_context({'date': aline['date']}): # convert rate of asset to currency of target-cashbook asset_rate = Currency.compute( - asset_book.asset.currency, asset_rate, asset_book.currency, + to_book.asset.currency, asset_rate, to_book.currency, round=False) aline['quantity'] = Decimal('0.0') if asset_rate: - aline['quantity'] = target_amount / asset_rate + aline['quantity'] = (target_amount / asset_rate).quantize( + Decimal(Decimal(1) / 10 ** to_book.quantity_digits)) return aline to_create = [] diff --git a/tests/planner.py b/tests/planner.py index 466a832..6720696 100644 --- a/tests/planner.py +++ b/tests/planner.py @@ -620,4 +620,121 @@ class PlannerTestCase(object): IrDate.today = MagicMock(return_value=date.today()) + @with_transaction() + def test_planner_cronjobs_booking_transfer_asset_eur_usd1(self): + """ create job, configure transfer-booking to asset-cashbook, + from euro to usd, + same units between asset and cashbook + """ + pool = Pool() + Planner = pool.get('cashbook.planner') + IrDate = pool.get('ir.date') + Category = pool.get('cashbook.category') + Cashbook = pool.get('cashbook.book') + Currency = pool.get('currency.currency') + + company = self.prep_company() + with Transaction().set_context({'company': company.id}): + asset_book = self.prep_planner_asset_book() + + (usd, euro) = self.prep_2nd_currency(company) + chf, = Currency.create([{ + 'name': 'Swiss Franc', + 'symbol': 'SFr', + 'code': 'CHF', + 'rates': [('create', [{ + 'date': date(2022, 5, 1), + 'rate': Decimal('0.95'), + }])]}]) + + self.assertEqual(len(usd.rates), 1) + self.assertEqual(usd.rates[0].rate, Decimal('1.05')) + self.assertEqual(usd.rates[0].date, date(2022, 5, 2)) + self.assertEqual(euro.rates[0].rate, Decimal('1.0')) + self.assertEqual(euro.rates[0].date, date(2022, 5, 2)) + self.assertEqual(company.currency.rec_name, 'Euro') + + job = self.prep_create_job() + self.assertEqual(job.cashbook.rec_name, 'Book 1 | 0.00 € | Open') + + # asset-cashbook in CHF + Cashbook.write(*[[asset_book], {'currency': chf.id}]) + self.assertEqual( + asset_book.rec_name, + 'Depot | 0.00 SFr | Open | 0.0000 u') + # rate of asset = 12.5 usd + self.assertEqual( + asset_book.asset.rec_name, + 'Product 1 | 12.5000 usd/u | 05/02/2022') + self.assertEqual(len(asset_book.lines), 0) + + IrDate.today = MagicMock(return_value=date(2022, 5, 24)) + + category, = Category.search([('name', '=', 'Cat1')]) + Planner.write(*[ + [job], + { + 'name': 'buy asset', + 'amount': Decimal('10.0'), + 'bookingtype': 'mvout', + 'category': category.id, + 'subject': 'invest 10.00 € to buy 0.xx units', + 'booktransf': asset_book.id, + 'wfcheck': True}]) + self.assertEqual(job.rec_name, 'buy asset') + self.assertEqual(job.cashbook.rec_name, 'Book 1 | 0.00 € | Open') + self.assertEqual( + job.booktransf.rec_name, + 'Depot | 0.00 SFr | Open | 0.0000 u') + self.assertEqual(len(job.cashbook.lines), 0) + + # check both cashbooks + with Transaction().set_context({'date': date(2022, 6, 1)}): + job, = Planner.search([]) + self.assertEqual(job.nextrun[0].date, date(2022, 6, 1)) + IrDate.today = MagicMock(return_value=date(2022, 6, 1)) + Planner.cronjob() + self.assertEqual(job.nextrun[0].date, date(2022, 7, 1)) + + # check rates to euro + self.assertEqual(chf.rate, Decimal('0.95')) + self.assertEqual(euro.rate, Decimal('1.0')) + self.assertEqual(usd.rate, Decimal('1.05')) + self.assertEqual(asset_book.asset.rate, Decimal('12.5')) + + # we invest 10€ + # transfer to chf-account, buy asset with rate in usd + # 10€ --> 9.50 SFr + # rate in CHF: 12.50 usd * 0.95 (SFr) / 1.05 (usd) = 11,3095 + # quantity = 9,50 SFr / 11,3095 = 0,8400 + cashbook, = Cashbook.browse([job.cashbook]) + self.assertEqual(cashbook.rec_name, 'Book 1 | -10.00 € | Open') + self.assertEqual(len(cashbook.lines), 1) + self.assertEqual( + cashbook.lines[0].rec_name, + "06/01/2022|to|-10.00 €|invest 10.00 € to buy 0.xx units " + + "[Depot | 9.50 SFr | Open | 0.8400 u]") + self.assertEqual(cashbook.lines[0].state, 'check') + + asset_book, = Cashbook.browse([job.booktransf]) + self.assertEqual( + asset_book.rec_name, 'Depot | 9.50 SFr | Open | 0.8400 u') + self.assertEqual(len(asset_book.lines), 1) + self.assertEqual( + asset_book.lines[0].rec_name, + "06/01/2022|from|9.50 SFr|invest 10.00 € to buy 0.xx units " + + "[Book 1 | -10.00 € | Open]|0.8400 u") + self.assertEqual(asset_book.lines[0].state, 'check') + self.assertEqual(asset_book.lines[0].state, 'check') + + IrDate.today = MagicMock(return_value=date.today()) + + @with_transaction() + def test_planner_cronjobs_booking_transfer_asset_eur_usd2(self): + """ create job, configure transfer-booking to asset-cashbook, + from euro to usd, + asset-unit = u, cashbook-unit = 10x u + """ + raise ValueError('stop') + # end PlannerTestCase