diff --git a/planner.py b/planner.py index 2c038f1..63273ff 100644 --- a/planner.py +++ b/planner.py @@ -513,17 +513,29 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView): elif record.bookingtype in ['mvin', 'mvout']: if record.booktransf: line['booktransf'] = record.booktransf.id + if record.booktransf.feature == 'asset': + # add 2nd currency if currencies are different + line = Line.add_2nd_currency( + line, record.booktransf.currency) + print('-- line-1:', line) + if record.booktransf.current_rate: + line['quantity'] = (line.get( + 'amount_2nd_currency', record.amount) / + record.booktransf.asset.rate) + print('-- line-2:', line) if record.wfcheck: to_create_check.append(line) else: to_create.append(line) if to_create_check: + print('-- to_create_check:', to_create_check) lines = Line.create(to_create_check) Line.wfcheck(lines) if to_create: + print('-- to_create:', to_create) Line.create(to_create) @classmethod diff --git a/tests/planner.py b/tests/planner.py index 1af453e..e40b8d7 100644 --- a/tests/planner.py +++ b/tests/planner.py @@ -36,7 +36,9 @@ class PlannerTestCase(object): 'number_sequ': self.prep_sequence().id, 'start_date': date(2022, 5, 1), }]) - self.assertEqual(book.rec_name, 'Book 1 | 0.00 usd | Open') + self.assertEqual( + book.rec_name, + 'Book 1 | 0.00 %s | Open' % company.currency.symbol) category = self.prep_category() party, = Party.create([{ @@ -71,10 +73,12 @@ class PlannerTestCase(object): pool = Pool() Asset = pool.get('investment.asset') Book = pool.get('cashbook.book') + BType = pool.get('cashbook.type') company = self.prep_company() with Transaction().set_context({'company': company.id}): type_depot = self.prep_type('Depot', 'D') + BType.write(*[[type_depot], {'feature': 'asset'}]) asset = self.prep_asset_item( company=company, @@ -107,7 +111,9 @@ class PlannerTestCase(object): 'quantity_uom': asset.uom.id, }]) self.prep_valstore_run_worker() - self.assertEqual(book.rec_name, 'ww') + self.assertEqual( + book.rec_name, + 'Depot | 0.00 usd | Open | 0.0000 u') return book @with_transaction() @@ -393,7 +399,7 @@ class PlannerTestCase(object): IrDate.today = MagicMock(return_value=date.today()) @with_transaction() - def test_planner_cronjobs_booking_transfer_nonasset_eur(self): + def test_planner_cronjobs_booking_transfer_nonasset(self): """ create job, configure transfer-booking to non-asset-cashbook, run job """ @@ -463,4 +469,151 @@ class PlannerTestCase(object): IrDate.today = MagicMock(return_value=date.today()) + @with_transaction() + def test_planner_cronjobs_booking_transfer_nonasset_usd_eur(self): + """ create job, configure transfer-booking to non-asset-cashbook, + from usd to eur, run job + """ + pool = Pool() + Planner = pool.get('cashbook.planner') + IrDate = pool.get('ir.date') + Category = pool.get('cashbook.category') + Cashbook = pool.get('cashbook.book') + + company = self.prep_company() + with Transaction().set_context({'company': company.id}): + (usd, euro) = self.prep_2nd_currency(company) + 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() + target_book, = Cashbook.create([{ + 'name': 'Book 2', + 'btype': job.cashbook.btype.id, + 'company': company.id, + 'currency': usd.id, + 'number_sequ': self.prep_sequence().id, + 'start_date': date(2022, 5, 1)}]) + self.assertEqual(target_book.rec_name, 'Book 2 | 0.00 usd | Open') + self.assertEqual(len(target_book.lines), 0) + + IrDate.today = MagicMock(return_value=date(2022, 5, 24)) + + category, = Category.search([('name', '=', 'Cat1')]) + Planner.write(*[ + [job], + { + 'name': 'Transfer to Book-2', + 'amount': Decimal('10.0'), + 'bookingtype': 'mvout', + 'category': category.id, + 'subject': 'booking 10 € --> 10.5 usd', + 'booktransf': target_book.id, + 'wfcheck': True}]) + self.assertEqual(job.rec_name, 'Transfer to Book-2') + self.assertEqual(job.cashbook.rec_name, 'Book 1 | 0.00 € | Open') + self.assertEqual(job.booktransf.rec_name, 'Book 2 | 0.00 usd | Open') + self.assertEqual(len(job.cashbook.lines), 0) + + 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 both cashbooks + with Transaction().set_context({'date': date(2022, 6, 1)}): + 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 €|booking 10 € --> 10.5 usd" + + " [Book 2 | 10.50 usd | Open]") + self.assertEqual(cashbook.lines[0].state, 'check') + + target_book, = Cashbook.browse([job.booktransf]) + self.assertEqual(target_book.rec_name, 'Book 2 | 10.50 usd | Open') + self.assertEqual(len(target_book.lines), 1) + self.assertEqual( + target_book.lines[0].rec_name, + "06/01/2022|from|10.50 usd|booking 10 € --> 10.5 usd" + + " [Book 1 | -10.00 € | Open]") + self.assertEqual(target_book.lines[0].state, 'check') + self.assertEqual(target_book.lines[0].state, 'check') + + IrDate.today = MagicMock(return_value=date.today()) + + @with_transaction() + def test_planner_cronjobs_booking_transfer_asset(self): + """ create job, configure transfer-booking to asset-cashbook, + """ + pool = Pool() + Planner = pool.get('cashbook.planner') + IrDate = pool.get('ir.date') + Category = pool.get('cashbook.category') + Cashbook = pool.get('cashbook.book') + + company = self.prep_company() + with Transaction().set_context({'company': company.id}): + job = self.prep_create_job() + asset_book = self.prep_planner_asset_book() + self.assertEqual( + asset_book.rec_name, + 'Depot | 0.00 usd | Open | 0.0000 u') + 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': 'Transfer to Book-2', + 'amount': Decimal('10.0'), + 'bookingtype': 'mvout', + 'category': category.id, + 'subject': 'booking 10 usd --> 10.5 usd', + 'booktransf': asset_book.id, + 'wfcheck': True}]) + self.assertEqual(job.rec_name, 'Transfer to Book-2') + self.assertEqual(job.cashbook.rec_name, 'Book 1 | 0.00 usd | Open') + self.assertEqual( + job.booktransf.rec_name, + 'Depot | 0.00 usd | 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)) + + cashbook, = Cashbook.browse([job.cashbook]) + self.assertEqual(cashbook.rec_name, 'Book 1 | -10.00 usd | Open') + self.assertEqual(len(cashbook.lines), 1) + self.assertEqual( + cashbook.lines[0].rec_name, + "06/01/2022|to|-10.00 €|booking 10 usd --> 10.5 usd" + + " [Depot | 10.50 usd | Open]") + self.assertEqual(cashbook.lines[0].state, 'check') + + asset_book, = Cashbook.browse([job.booktransf]) + self.assertEqual(asset_book.rec_name, 'Depot | 10.50 usd | Open') + self.assertEqual(len(asset_book.lines), 1) + self.assertEqual( + asset_book.lines[0].rec_name, + "06/01/2022|from|10.50 usd|booking 10 € --> 10.5 usd" + + " [Book 1 | -10.00 € | Open]") + self.assertEqual(asset_book.lines[0].state, 'check') + self.assertEqual(asset_book.lines[0].state, 'check') + + IrDate.today = MagicMock(return_value=date.today()) + # end PlannerTestCase