diff --git a/line.py b/line.py index 83c058a..d1203a2 100644 --- a/line.py +++ b/line.py @@ -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], diff --git a/tests/test_yield.py b/tests/test_yield.py index 9bcaa0b..1591dea 100644 --- a/tests/test_yield.py +++ b/tests/test_yield.py @@ -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')