"""Ledger vat summary logic tests.""" from unittest.mock import call from unittest.mock import patch from moneyhub.constants.constants import ABACUS_EVENT_BACKFILL from moneyhub.constants.constants import PAGINATION_TYPE_STANDARD from moneyhub.constants.constants import VatCategory from moneyhub.logic import ledger_vat_summary as logic from moneyhub.schemas.ledger_vat_summary import LedgerVatSummaryBackfillSchema from moneyhub.schemas.ledger_vat_summary import PaginatedLedgerVatSummarySchema from moneyhub.schemas.pagination import PaginationSchema from tests.utils.factories import AbacusEventFactory from tests.utils.factories import LedgerVatSummaryFactory from tests.utils.factories import WorksheetAdjustmentFactory @patch('moneyhub.logic.ledger_vat_summary.datetime') @patch('moneyhub.logic.ledger_vat_summary.models') def test_backfill_vat_summary_entries(mock_models, mock_datetime): """Test for backfilling VAT summary entries using worksheet adjustments.""" statement_period_id = 123 payload = [ LedgerVatSummaryBackfillSchema( account_id=24601, contract_id=10001, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='NOK', vat_currency_code='NOK', base_amount_payee_currency=100.0, vat_rate=20, vat_amount_payee_currency=20, vat_amount_vat_currency=20, wht_amount_payee_currency=None, wht_amount_vat_currency=None, wht_rate=None, net_amount_payee_currency=80, ), LedgerVatSummaryBackfillSchema( account_id=24601, contract_id=10002, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='NOK', vat_currency_code='NOK', base_amount_payee_currency=12.34, vat_rate=10, vat_amount_payee_currency=1.23, vat_amount_vat_currency=1.23, wht_amount_payee_currency=None, wht_amount_vat_currency=None, wht_rate=None, net_amount_payee_currency=11.11, ), LedgerVatSummaryBackfillSchema( account_id=24601, contract_id=10003, vat_category=VatCategory.CLOSING_BALANCE, payee_currency_code='NOK', vat_currency_code='NOK', base_amount_payee_currency=100.0, vat_rate=20, vat_amount_payee_currency=20, vat_amount_vat_currency=20, wht_amount_payee_currency=None, wht_amount_vat_currency=None, wht_rate=None, net_amount_payee_currency=80, ), ] mock_datetime.now.return_value = 'NOW' mock_models.LedgerVatSummary.get_by_statement_period.return_value = [ LedgerVatSummaryFactory.build( account_id=24601, statement_period_id=statement_period_id, contract_id=10001, vat_category=VatCategory.GROSS_REVENUE, base_amount_payee_currency=100.0, vat_rate=20, vat_amount_payee_currency=20, vat_amount_vat_currency=20, wht_amount_payee_currency=None, wht_amount_vat_currency=None, wht_rate=None, net_amount_payee_currency=80, ), LedgerVatSummaryFactory.build( account_id=25011, statement_period_id=286, contract_id=9876, vat_category=VatCategory.CLOSING_BALANCE, base_amount_payee_currency=1.34, ), ] mock_models.WorksheetAdjustment.get_vat_adjustments.return_value = [ WorksheetAdjustmentFactory.build( abacus_event_id=11, account_id=payload[1].account_id, contract_id=payload[1].contract_id, adjustment_amount=payload[1].vat_amount_payee_currency, adjustment_currency_code=payload[1].payee_currency_code, ), WorksheetAdjustmentFactory.build( abacus_event_id=22, account_id=payload[2].account_id, contract_id=payload[2].contract_id, adjustment_amount=payload[2].vat_amount_payee_currency, adjustment_currency_code=payload[2].payee_currency_code, ) ] mock_models.AbacusEvent.create.side_effect = [ AbacusEventFactory.build(abacus_event_id=111), AbacusEventFactory.build(abacus_event_id=222), ] mock_models.LedgerVatSummary.create.side_effect = [1, 2] result = logic.backfill_vat_summary_entries(statement_period_id, payload) assert result == [1, 2] mock_models.AbacusEvent.create.assert_has_calls([ call( statement_period_id=statement_period_id, event_name=ABACUS_EVENT_BACKFILL, target_type='statement_period', target_id=statement_period_id, event_date='NOW', previous_abacus_event_id=11, created_by='default_user_id', ), call( statement_period_id=statement_period_id, event_name=ABACUS_EVENT_BACKFILL, target_type='statement_period', target_id=statement_period_id, event_date='NOW', previous_abacus_event_id=22, created_by='default_user_id', ), ]) mock_models.LedgerVatSummary.create.assert_has_calls([ call( statement_period_id=statement_period_id, activity_statement_period_id=statement_period_id, abacus_event_id=111, account_id=payload[1].account_id, contract_id=payload[1].contract_id, vat_category=payload[1].vat_category, payee_currency_code=payload[1].payee_currency_code, vat_currency_code=payload[1].vat_currency_code, base_amount_payee_currency=payload[1].base_amount_payee_currency, vat_rate=payload[1].vat_rate, vat_amount_payee_currency=payload[1].vat_amount_payee_currency, vat_amount_vat_currency=payload[1].vat_amount_vat_currency, wht_amount_payee_currency=payload[1].wht_amount_payee_currency, wht_amount_vat_currency=payload[1].wht_amount_vat_currency, wht_rate=payload[1].wht_rate, net_amount_payee_currency=payload[1].net_amount_payee_currency, is_reporting_only=True, created_by='default_user_id', created_at='NOW', last_modified_by='default_user_id', last_modified='NOW', ), call( statement_period_id=statement_period_id, activity_statement_period_id=statement_period_id, abacus_event_id=222, account_id=payload[2].account_id, contract_id=payload[2].contract_id, vat_category=payload[2].vat_category, payee_currency_code=payload[2].payee_currency_code, vat_currency_code=payload[2].vat_currency_code, base_amount_payee_currency=payload[2].base_amount_payee_currency, vat_rate=payload[2].vat_rate, vat_amount_payee_currency=payload[2].vat_amount_payee_currency, vat_amount_vat_currency=payload[2].vat_amount_vat_currency, wht_amount_payee_currency=payload[2].wht_amount_payee_currency, wht_amount_vat_currency=payload[2].wht_amount_vat_currency, wht_rate=payload[2].wht_rate, net_amount_payee_currency=payload[2].net_amount_payee_currency, is_reporting_only=True, created_by='default_user_id', created_at='NOW', last_modified_by='default_user_id', last_modified='NOW', ), ]) mock_models.LedgerAdjustment.get_vat_adjustments.assert_not_called() @patch('moneyhub.logic.ledger_vat_summary.models') def test_get_by_account_id(mock_models): """Test get_by_account_id method.""" account_id = 24601 contract_id = 1234 statement_period_id = 286 vat_categories = ['gross_revenue', 'closing_balance'] vat_summary = [ LedgerVatSummaryFactory.build( ledger_vat_summary_id=1, abacus_event_id=1, account_id=account_id, statement_period_id=286, contract_id=contract_id, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='USD', vat_currency_code='USD', base_amount_payee_currency=0.001406240000, vat_rate=None, vat_amount_payee_currency=None, vat_amount_vat_currency=None, net_amount_payee_currency=0.001406240000, abacus_exempt_reason=None, created_at='2022-11-17T22:02:42', created_by='me', last_modified='2022-12-17T22:02:42', last_modified_by='me' ), LedgerVatSummaryFactory.build( ledger_vat_summary_id=2, abacus_event_id=1, account_id=account_id, statement_period_id=286, contract_id=contract_id, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='USD', vat_currency_code='USD', base_amount_payee_currency=0.001406240000, vat_rate=None, vat_amount_payee_currency=None, vat_amount_vat_currency=None, net_amount_payee_currency=0.001406240000, abacus_exempt_reason=None, created_at='2022-11-17T22:02:42', created_by='me', last_modified='2022-12-17T22:02:42', last_modified_by='me' ), ] mock_models.LedgerVatSummary.get_by_account_id.return_value = vat_summary result = logic.get_by_account_id(account_id, statement_period_id, contract_id, vat_categories) assert result == [ vat_summary[0], vat_summary[1], ] mock_models.LedgerVatSummary.get_by_account_id.assert_called_once_with( account_id=account_id, contract_id=contract_id, statement_period_id=statement_period_id, vat_categories=vat_categories ) @patch('moneyhub.logic.ledger_vat_summary.models') def test_get_activity_by_account_id(mock_models): """Test getting activity entries by account ID.""" account_id = 24601 contract_id = 1234 statement_period_id = 286 vat_categories = ['gross_revenue', 'closing_balance'] vat_summary = [ LedgerVatSummaryFactory.build( ledger_vat_summary_id=1, abacus_event_id=1, account_id=account_id, activity_statement_period_id=statement_period_id, contract_id=contract_id, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='USD', vat_currency_code='USD', base_amount_payee_currency=0.001406240000, vat_rate=None, vat_amount_payee_currency=None, vat_amount_vat_currency=None, net_amount_payee_currency=0.001406240000, abacus_exempt_reason=None, created_at='2022-11-17T22:02:42', created_by='me', last_modified='2022-12-17T22:02:42', last_modified_by='me' ), LedgerVatSummaryFactory.build( ledger_vat_summary_id=2, abacus_event_id=1, account_id=account_id, activity_statement_period_id=statement_period_id, contract_id=contract_id, vat_category=VatCategory.GROSS_REVENUE, payee_currency_code='USD', vat_currency_code='USD', base_amount_payee_currency=0.001406240000, vat_rate=None, vat_amount_payee_currency=None, vat_amount_vat_currency=None, net_amount_payee_currency=0.001406240000, abacus_exempt_reason=None, created_at='2022-11-17T22:02:42', created_by='me', last_modified='2022-12-17T22:02:42', last_modified_by='me' ), ] mock_models.LedgerVatSummary.get_by_account_id.return_value = vat_summary result = logic.get_activity_by_account_id( account_id, statement_period_id, contract_id, vat_categories ) assert result == [ vat_summary[0], vat_summary[1], ] mock_models.LedgerVatSummary.get_by_account_id.assert_called_once_with( account_id=account_id, contract_id=contract_id, activity_statement_period_id=statement_period_id, vat_categories=vat_categories ) @patch('moneyhub.logic.ledger_vat_summary.models') def test_get_by_vat_summary_file(mock_models): """Test getting VAT summary entries by a VAT summary file ID.""" vat_summary_file_id = 123 limit = 100 offset = 0 entries = [ LedgerVatSummaryFactory.build(ledger_vat_summary_id=1), LedgerVatSummaryFactory.build(ledger_vat_summary_id=2), ] expected = PaginatedLedgerVatSummarySchema( items=entries, pagination=PaginationSchema( pagination_type=PAGINATION_TYPE_STANDARD, total_records=100 ), ) mock_models.LedgerVatSummary.get_by_vat_summary_file.return_value = (entries, 100) result = logic.get_by_vat_summary_file(vat_summary_file_id, limit, offset) assert result == expected mock_models.LedgerVatSummary.get_by_vat_summary_file.assert_called_once_with( vat_summary_file_id, limit, offset)