diff --git a/planner.py b/planner.py index 57b7223..2180de4 100644 --- a/planner.py +++ b/planner.py @@ -498,35 +498,36 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView): IrDate = pool.get('ir.date') Line = pool.get('cashbook.line') Currency = pool.get('currency.currency') - Cashbook = pool.get('cashbook.book') - def add_asset_values(aline): + def add_asset_values(aline, from_book, to_book): """ compute quantity from rate of asset and amount to invest Args: aline (dict): prepared dictionary to create cashbook-line-record + from_book (record): cashbook record, + to_book (record): cashbook record Returns: dict: dictionary to create cashbook-line record """ - from_book = Cashbook(aline['cashbook']) - to_book = Cashbook(aline['booktransf']) - - # add 2nd currency if currencies are different - aline = Line.add_2nd_currency(aline, from_book.currency) - target_amount = aline.get('amount_2nd_currency', aline['amount']) - 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( - 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).quantize( - Decimal(Decimal(1) / 10 ** to_book.quantity_digits)) + # convert amount to target-currency + target_amount = Currency.compute( + from_book.currency, aline['amount'], + to_book.currency, round=False) + # convert asset-rate of target-cashbook to target-currency + asset_rate = (Currency.compute( + to_book.asset.currency, to_book.asset.rate, + to_book.currency, round=False) * Decimal( + to_book.asset.uom.factor / + to_book.quantity_uom.factor)) + + aline['quantity'] = Decimal('0.0') + if asset_rate: + aline['quantity'] = (target_amount / asset_rate).quantize( + Decimal(Decimal(1) / 10 ** to_book.quantity_digits)) return aline to_create = [] @@ -548,7 +549,8 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView): if record.booktransf: line['booktransf'] = record.booktransf.id if record.booktransf.feature == 'asset': - line.update(add_asset_values(line)) + line.update(add_asset_values( + line, record.cashbook, record.booktransf)) if record.wfcheck: to_create_check.append(line) diff --git a/tests/planner.py b/tests/planner.py index 6720696..7930d90 100644 --- a/tests/planner.py +++ b/tests/planner.py @@ -632,6 +632,8 @@ class PlannerTestCase(object): Category = pool.get('cashbook.category') Cashbook = pool.get('cashbook.book') Currency = pool.get('currency.currency') + Uom = pool.get('product.uom') + Asset = pool.get('investment.asset') company = self.prep_company() with Transaction().set_context({'company': company.id}): @@ -657,15 +659,41 @@ class PlannerTestCase(object): job = self.prep_create_job() self.assertEqual(job.cashbook.rec_name, 'Book 1 | 0.00 € | Open') + uom_u, = Uom.search([('symbol', '=', 'u')]) + self.assertEqual(uom_u.factor, Decimal('1.0')) + self.assertEqual(uom_u.rate, Decimal('1.0')) + + uom_10u, = Uom.create([{ + 'category': uom_u.category.id, + 'name': '10 Units', + 'symbol': '10xU', + 'factor': Decimal('10.0'), + 'rate': Decimal('0.1'), + 'rounding': Decimal('0.01'), + 'digits': 2}]) + self.assertEqual(uom_10u.factor, Decimal('10.0')) + self.assertEqual(uom_10u.rate, 0.1) + # check conversion: 1 [u] = 0.1 [10xU] + self.assertEqual(Uom.compute_qty(uom_u, 1.0, uom_10u), 0.1) + # 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 + + Asset.write(*[ + [asset_book.asset], + { + 'uom': uom_10u.id, + 'rates': [( + 'write', + [asset_book.asset.rates[0]], + {'rate': Decimal('1.25')})]}]) + # rate of asset = 1.25 usd self.assertEqual( asset_book.asset.rec_name, - 'Product 1 | 12.5000 usd/u | 05/02/2022') + 'Product 1 | 1.2500 usd/10xU | 05/02/2022') self.assertEqual(len(asset_book.lines), 0) IrDate.today = MagicMock(return_value=date(2022, 5, 24)) @@ -700,7 +728,8 @@ class PlannerTestCase(object): 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')) + self.assertEqual(asset_book.asset.rate, Decimal('1.25')) + self.assertEqual(asset_book.asset.uom.factor, Decimal('10.0')) # we invest 10€ # transfer to chf-account, buy asset with rate in usd