add test for eur --> chf (asset in usd)

This commit is contained in:
Frederik Jaeckel 2024-03-06 23:02:24 +01:00
parent d7aaa5eacc
commit 79926fbe5d
2 changed files with 124 additions and 5 deletions

View file

@ -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 = []

View file

@ -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