line: negate amount if splitline=spout - tests

This commit is contained in:
Frederik Jaeckel 2023-02-14 22:27:25 +01:00
parent 798da563ec
commit 3243ccc471
2 changed files with 62 additions and 26 deletions

12
line.py
View file

@ -4,7 +4,7 @@
# full copyright notices and license terms.
from decimal import Decimal
from sql.conditionals import Coalesce
from sql.conditionals import Coalesce, Case
from sql.aggregate import Sum
from trytond.model import fields
from trytond.pool import PoolMeta, Pool
@ -212,13 +212,19 @@ class Line(SecondUomMixin, metaclass=PoolMeta):
Sum(Coalesce(
tab_inout_fee.credit - tab_inout_fee.debit,
tab_mv_spline_fee.amount,
tab_spline_fee.amount,
Case(
(tab_line.bookingtype == 'spin', tab_spline_fee.amount),
(tab_line.bookingtype == 'spout', tab_spline_fee.amount * Decimal('-1.0')),
),
Decimal('0.0'),
)).as_('fee'),
Sum(Coalesce(
tab_inout_divi.credit - tab_inout_divi.debit,
tab_mv_spline_divi.amount,
tab_spline_divi.amount,
Case(
(tab_line.bookingtype == 'spin', tab_spline_divi.amount),
(tab_line.bookingtype == 'spout', tab_spline_divi.amount * Decimal('-1.0')),
),
Decimal('0.0'),
)).as_('dividend'),
group_by=[tab_line.id],

View file

@ -176,7 +176,6 @@ class YieldTestCase(ModuleTestCase):
}])],
}])
# dividend, incoming + link to depot-account
book_cash, = Cashbook.create([{
'name': 'Cash',
'btype': type_cash.id,
@ -185,6 +184,7 @@ class YieldTestCase(ModuleTestCase):
'number_sequ': self.prep_sequence().id,
'start_date': date(2022, 5, 1),
'lines': [('create', [{
# dividend, incoming + link to depot-account
'bookingtype': 'spin', # [BK05]
'date': date(2022, 5, 1),
'description': 'Dividend',
@ -200,59 +200,89 @@ class YieldTestCase(ModuleTestCase):
'amount': Decimal('0.0'),
'quantity': Decimal('0.0'),
}])],
}, {
# buy shares with trade fee, outgoing + link to depot-account
'bookingtype': 'spout', # [BK06]
'date': date(2022, 5, 1),
'description': '2x shares, trade fee',
'splitlines': [('create', [{
'description': '2x Shares',
'splittype': 'tr',
'booktransf': book_asset.id,
'amount': Decimal('10.0'),
'quantity': Decimal('2.0'),
}, {
'description': 'Trade Fee',
'splittype': 'cat',
'category': as_cfg.fee_category.id,
'amount': Decimal('2.5'),
}])],
}])],
}])
self.assertEqual(len(book_cash.lines), 1)
Line.wfcheck([book_cash.lines[0]])
self.assertEqual(len(book_cash.lines), 2)
Line.wfcheck(book_cash.lines)
self.assertEqual(book_cash.lines[0].rec_name,
'05/01/2022|Rev/Sp|5.00 usd|Dividend [-]')
self.assertEqual(book_cash.lines[0].reference, None)
self.assertEqual(len(book_cash.lines[0].references), 1)
self.assertEqual(book_cash.lines[0].references[0].rec_name,
'05/01/2022|to|0.00 usd|Dividend [Cash | 5.00 usd | Open]|0.0000 u')
'05/01/2022|to|0.00 usd|Dividend [Cash | -7.50 usd | Open]|0.0000 u')
self.assertEqual(book_asset.rec_name, 'Depot | 13.50 usd | Open | 1.0000 u')
self.assertEqual(book_cash.lines[1].rec_name,
'05/01/2022|Exp/Sp|-12.50 usd|2x shares, trade fee [-]')
self.assertEqual(book_cash.lines[1].reference, None)
self.assertEqual(len(book_cash.lines[1].references), 1)
self.assertEqual(book_cash.lines[1].references[0].rec_name,
'05/01/2022|from|10.00 usd|2x Shares [Cash | -7.50 usd | Open]|2.0000 u')
self.assertEqual(book_asset.rec_name, 'Depot | 23.50 usd | Open | 3.0000 u')
self.assertEqual(book_asset.btype.rec_name, 'D - Depot')
self.assertEqual(len(book_asset.lines), 5)
self.assertEqual(len(book_asset.lines), 6)
# reference to dividend (1) [BK05]
self.assertEqual(book_asset.lines[0].rec_name,
'05/01/2022|to|0.00 usd|Dividend [Cash | 5.00 usd | Open]|0.0000 u')
'05/01/2022|to|0.00 usd|Dividend [Cash | -7.50 usd | Open]|0.0000 u')
self.assertEqual(book_asset.lines[0].trade_fee, Decimal('0.0'))
self.assertEqual(book_asset.lines[0].asset_dividend, Decimal('5.0'))
self.assertEqual(book_asset.lines[0].reference.rec_name,
'05/01/2022|Rev/Sp|5.00 usd|Dividend [-]')
self.assertEqual(len(book_asset.lines[0].references), 0)
#self.assertEqual(book_asset.lines[0].asset_gainloss, Decimal('0.0'))
# reference to fee [BK06]
self.assertEqual(book_asset.lines[1].rec_name,
'05/01/2022|from|10.00 usd|2x Shares [Cash | -7.50 usd | Open]|2.0000 u')
self.assertEqual(book_asset.lines[1].trade_fee, Decimal('2.5'))
self.assertEqual(book_asset.lines[1].asset_dividend, Decimal('0.0'))
self.assertEqual(book_asset.lines[1].reference.rec_name,
'05/01/2022|Exp/Sp|-12.50 usd|2x shares, trade fee [-]')
self.assertEqual(len(book_asset.lines[1].references), 0)
# fee payed from asset-account [BK01]
self.assertEqual(book_asset.lines[1].rec_name,
self.assertEqual(book_asset.lines[2].rec_name,
'05/01/2022|Exp|-2.00 usd|Fee [Fee]|0.0000 u')
self.assertEqual(book_asset.lines[1].trade_fee, Decimal('-2.0'))
self.assertEqual(book_asset.lines[1].asset_dividend, Decimal('0.0'))
#self.assertEqual(book_asset.lines[1].asset_gainloss, Decimal('0.0'))
self.assertEqual(book_asset.lines[2].trade_fee, Decimal('-2.0'))
self.assertEqual(book_asset.lines[2].asset_dividend, Decimal('0.0'))
# dividend (2) added to asset-account [BK02]
self.assertEqual(book_asset.lines[2].rec_name,
self.assertEqual(book_asset.lines[3].rec_name,
'05/01/2022|Rev|10.00 usd|reinvested dividend [Dividend]|1.0000 u')
self.assertEqual(book_asset.lines[2].trade_fee, Decimal('0.0'))
self.assertEqual(book_asset.lines[2].asset_dividend, Decimal('10.0'))
#self.assertEqual(book_asset.lines[2].asset_gainloss, Decimal('0.0'))
self.assertEqual(book_asset.lines[3].trade_fee, Decimal('0.0'))
self.assertEqual(book_asset.lines[3].asset_dividend, Decimal('10.0'))
# dividend as split.booking on asset-account, two lines [BK03]
self.assertEqual(book_asset.lines[3].rec_name,
self.assertEqual(book_asset.lines[4].rec_name,
'05/01/2022|Rev/Sp|7.00 usd|Dividend [-]|0.0000 u')
self.assertEqual(book_asset.lines[3].trade_fee, Decimal('0.0'))
self.assertEqual(book_asset.lines[3].asset_dividend, Decimal('7.0'))
self.assertEqual(book_asset.lines[4].trade_fee, Decimal('0.0'))
self.assertEqual(book_asset.lines[4].asset_dividend, Decimal('7.0'))
# fee as split.booking on asset-account [BK04]
self.assertEqual(book_asset.lines[4].rec_name,
self.assertEqual(book_asset.lines[5].rec_name,
'05/01/2022|Exp/Sp|-1.50 usd|Fee [-]|0.0000 u')
self.assertEqual(book_asset.lines[4].trade_fee, Decimal('1.5'))
self.assertEqual(book_asset.lines[4].asset_dividend, Decimal('0.0'))
self.assertEqual(book_asset.lines[5].trade_fee, Decimal('-1.5'))
self.assertEqual(book_asset.lines[5].asset_dividend, Decimal('0.0'))
lines = Line.search([('trade_fee', '=', Decimal('1.5'))])
lines = Line.search([('trade_fee', '=', Decimal('-1.5'))])
self.assertEqual(len(lines), 1)
self.assertEqual(lines[0].rec_name,
'05/01/2022|Exp/Sp|-1.50 usd|Fee [-]|0.0000 u')