diff --git a/.gitignore b/.gitignore index 0d20b64..faeab9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.pyc +notes/accounting/excel_web_api/.env diff --git a/modules/purchase_trade/fee.py b/modules/purchase_trade/fee.py index 4c137c5..90756b2 100755 --- a/modules/purchase_trade/fee.py +++ b/modules/purchase_trade/fee.py @@ -216,9 +216,10 @@ class Fee(ModelSQL,ModelView): ('origin', 'ilike', '%stock.move%'), ]) - logger.info("GET_COG_FEE:%s",ml) - if ml: - return round(Decimal(sum([e.credit-e.debit for e in ml if e.description != 'Delivery fee'])),2) + logger.info("GET_COG_FEE:%s",ml) + if ml: + return round(Decimal(sum([e.credit-e.debit for e in ml if e.description != 'Delivery fee'])),2) + return Decimal(0) def get_non_cog(self,lot): MoveLine = Pool().get('account.move.line') @@ -233,9 +234,10 @@ class Fee(ModelSQL,ModelView): ('account', '=', self.product.account_stock_in_used.id), ]) - logger.info("GET_NON_COG_FEE:%s",ml) - if ml: - return round(Decimal(sum([e.credit-e.debit for e in ml])),2) + logger.info("GET_NON_COG_FEE:%s",ml) + if ml: + return round(Decimal(sum([e.credit-e.debit for e in ml])),2) + return Decimal(0) @classmethod def __setup__(cls): diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 7b50eac..f05a697 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -1181,6 +1181,46 @@ class PurchaseTradeTestCase(ModuleTestCase): 'fee currency is required for every fee mode' self.assertTrue(fee_module.Fee.currency.required) + def test_fee_get_non_cog_returns_zero_without_move_lines(self): + 'fee non-cog amount is zero before any accounting move line exists' + fee = fee_module.Fee() + fee.id = 1 + fee.product = Mock(account_stock_in_used=Mock(id=2)) + lot = Mock(id=3) + move_line = Mock() + move_line.search.return_value = [] + + with patch('trytond.modules.purchase_trade.fee.Pool') as PoolMock: + PoolMock.return_value.get.side_effect = lambda name: { + 'account.move.line': move_line, + 'currency.currency': Mock(), + 'ir.date': Mock(), + 'account.configuration': Mock(return_value=Mock()), + 'product.uom': Mock(), + }[name] + + self.assertEqual(fee.get_non_cog(lot), Decimal(0)) + + def test_fee_get_cog_returns_zero_without_move_lines(self): + 'fee cog amount is zero before any stock accounting move line exists' + fee = fee_module.Fee() + fee.id = 1 + fee.product = Mock(account_stock_in_used=Mock(id=2)) + lot = Mock(id=3) + move_line = Mock() + move_line.search.return_value = [] + + with patch('trytond.modules.purchase_trade.fee.Pool') as PoolMock: + PoolMock.return_value.get.side_effect = lambda name: { + 'account.move.line': move_line, + 'currency.currency': Mock(), + 'ir.date': Mock(), + 'account.configuration': Mock(return_value=Mock()), + 'product.uom': Mock(), + }[name] + + self.assertEqual(fee.get_cog(lot), Decimal(0)) + def test_valuation_rejects_fee_without_currency_cleanly(self): 'pnl generation reports a missing fee currency before currency conversion' fee = Mock(currency=None, product=Mock(name='Maritime freight')) diff --git a/modules/purchase_trade/view/sale_line_form.xml b/modules/purchase_trade/view/sale_line_form.xml index 3e26954..b2678f3 100755 --- a/modules/purchase_trade/view/sale_line_form.xml +++ b/modules/purchase_trade/view/sale_line_form.xml @@ -73,7 +73,7 @@ this repository contains the full copyright notices and license terms. -->