"""Ledger Vat Summary model tests.""" from datetime import datetime from decimal import Decimal import pytest from moneyhub.constants.constants import VatCategory from moneyhub.models import LedgerVatSummary from tests.unit.conftest import insert_mock_data def _insert_mock_data(): """Insert mock data for the tests.""" insert_mock_data({ 'account': [ {'account_id': 1235}, ], 'reference_payment_entity': {'reference_payment_entity_id': 1}, 'reference_sap_profit_center': { 'reference_sap_profit_center_id': 1, 'profit_center': 'UK1234', 'company_code': '1234', 'business_group': 'ORC' }, 'reference_signing_entity': { 'reference_signing_entity_id': 1, 'reference_payment_entity_id': 1, 'reference_sap_profit_center_id': 1, 'company_code': '1234', 'tax_entity_company_code': '1234', 'legal_name': 'Company', 'vat_number': '12341234', 'company_registration_number': '12341234', 'address': None, }, 'contract': [ { 'contract_id': 4343, 'reference_signing_entity_id': 1, }, ], 'statement_period': [ {'statement_period_id': 284, 'statement_period_status': 'closed'}, {'statement_period_id': 285, 'statement_period_status': 'closed'}, {'statement_period_id': 286, 'statement_period_status': 'current'}, ], 'abacus_event': { 'abacus_event_id': 1, 'statement_period_id': 285, 'target_type': 'vat_summary_file', 'target_id': 555, }, 'account_payment_term': [ { 'account_payment_term_id': 1, 'account_id': 1235, 'currency_code': 'GBP', 'payment_minimum': 42.00, 'payment_entity_id': 1, 'payment_schedule': None, } ], 'ledger_vat_summary': [ { 'ledger_vat_summary_id': 1, 'abacus_event_id': 1, 'account_id': 1235, 'statement_period_id': 285, 'activity_statement_period_id': 284, 'contract_id': 4343, 'description': None, 'vat_category': VatCategory.GROSS_REVENUE, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'base_amount_payee_currency': Decimal('12.34'), 'vat_rate': None, 'vat_amount_payee_currency': None, 'vat_amount_vat_currency': None, 'net_amount_payee_currency': Decimal('12.34'), 'abacus_exempt_reason': None, 'is_reporting_only': True, 'created_at': datetime(2022, 11, 17, 22, 2, 42), 'created_by': 'me', 'last_modified': datetime(2022, 12, 17, 22, 2, 42), 'last_modified_by': 'me' }, { 'ledger_vat_summary_id': 2, 'abacus_event_id': 1, 'account_id': 1235, 'statement_period_id': 285, 'activity_statement_period_id': 284, 'contract_id': 4343, 'description': None, 'vat_category': VatCategory.CLOSING_BALANCE, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'base_amount_payee_currency': Decimal('12.34'), 'vat_rate': None, 'vat_amount_payee_currency': None, 'vat_amount_vat_currency': None, 'net_amount_payee_currency': Decimal('12.34'), 'abacus_exempt_reason': None, 'is_reporting_only': False, 'created_at': datetime(2022, 11, 17, 22, 2, 42), 'created_by': 'me', 'last_modified': datetime(2022, 12, 17, 22, 2, 42), 'last_modified_by': 'me' }, ] }) def test_get_by_account_id(): """Test to get ledger vat summary for a specified account.""" account_id = 1235 statement_period_id = 285 _insert_mock_data() res = LedgerVatSummary.get_by_account_id( account_id=account_id, contract_id=None, statement_period_id=statement_period_id ) assert len(res) == 2 assert all(entry.account_id == account_id for entry in res) def test_get_by_account_and_contract_id(): """Test to get ledger vat summary for a specified account and contract.""" account_id = 1235 contract_id = 4343 statement_period_id = 285 _insert_mock_data() res = LedgerVatSummary.get_by_account_id( account_id=account_id, contract_id=contract_id, statement_period_id=statement_period_id ) assert len(res) == 2 assert all(entry.account_id == account_id for entry in res) assert all(entry.contract_id == contract_id for entry in res) def test_get_by_account_and_contract_id_and_vat_category(): """Test to get ledger vat summary for a specified account and contract and category.""" account_id = 1235 contract_id = 4343 statement_period_id = 285 vat_categories = ['gross_revenue', 'closing_balance'] _insert_mock_data() res = LedgerVatSummary.get_by_account_id( account_id=account_id, statement_period_id=statement_period_id, contract_id=contract_id, vat_categories=vat_categories ) assert len(res) == 2 assert all(entry.account_id == account_id for entry in res) assert all(entry.contract_id == contract_id for entry in res) def test_get_by_account_id_and_activity_period(): """Test to get ledger vat summary for a specified account and activity period.""" account_id = 1235 statement_period_id = 284 _insert_mock_data() res = LedgerVatSummary.get_by_account_id( account_id=account_id, contract_id=None, activity_statement_period_id=statement_period_id ) assert len(res) == 2 assert all(entry.account_id == account_id for entry in res) def test_get_by_account_id_missing_statement_period(): """Test to get ledger vat summary when missing a statement period ID.""" account_id = 1235 _insert_mock_data() with pytest.raises(Exception) as excinfo: LedgerVatSummary.get_by_account_id( account_id=account_id, contract_id=None ) assert str(excinfo.value) == 'Missing statement period ID' def test_get_by_activity_statement_period(): """Test getting by activity statement period.""" statement_period_id = 284 _insert_mock_data() res = LedgerVatSummary.get_by_activity_statement_period(statement_period_id) assert len(res) == 2 assert all(entry.activity_statement_period_id == statement_period_id for entry in res) def test_get_by_payment_entity_and_activity_statement_period(): """Test to get ledger vat summary data for payment entity and statement period.""" payment_entity_id = 1 statement_period_id = 284 _insert_mock_data() result = LedgerVatSummary.get_by_payment_entity_and_activity_statement_period( payment_entity_id, statement_period_id) assert result.ledger_vat_summary_id == 1 def test_get_by_vat_summary_file(): """Test getting entries by a VAT summary file.""" _insert_mock_data() (results, total_records) = LedgerVatSummary.get_by_vat_summary_file(555, 1, 1) assert total_records == 2 assert [item.to_dict() for item in results] == [ { 'ledger_vat_summary_id': 2, 'abacus_event_id': 1, 'account_id': 1235, 'statement_period_id': 285, 'activity_statement_period_id': 284, 'contract_id': 4343, 'description': None, 'vat_category': VatCategory.CLOSING_BALANCE, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'base_amount_payee_currency': Decimal('12.34'), 'vat_rate': None, 'vat_amount_payee_currency': None, 'vat_amount_vat_currency': None, 'wht_amount_payee_currency': None, 'wht_amount_vat_currency': None, 'wht_rate': None, 'net_amount_payee_currency': Decimal('12.34'), 'abacus_exempt_reason': None, 'is_reporting_only': False, 'created_at': datetime(2022, 11, 17, 22, 2, 42), 'created_by': 'me', 'last_modified': datetime(2022, 12, 17, 22, 2, 42), 'last_modified_by': 'me' }, ] def test_get_visible_by_account_and_statement_periods(): """Test getting visible entries by an account and statement periods.""" _insert_mock_data() results = LedgerVatSummary.get_visible_by_account_and_statement_periods(1235, None, [285]) assert [item.to_dict() for item in results] == [ { 'ledger_vat_summary_id': 2, 'abacus_event_id': 1, 'account_id': 1235, 'statement_period_id': 285, 'activity_statement_period_id': 284, 'contract_id': 4343, 'description': None, 'vat_category': VatCategory.CLOSING_BALANCE, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'base_amount_payee_currency': Decimal('12.34'), 'vat_rate': None, 'vat_amount_payee_currency': None, 'vat_amount_vat_currency': None, 'wht_amount_payee_currency': None, 'wht_amount_vat_currency': None, 'wht_rate': None, 'net_amount_payee_currency': Decimal('12.34'), 'abacus_exempt_reason': None, 'is_reporting_only': False, 'created_at': datetime(2022, 11, 17, 22, 2, 42), 'created_by': 'me', 'last_modified': datetime(2022, 12, 17, 22, 2, 42), 'last_modified_by': 'me' }, ] def test_get_activity_by_account_id(): """Test getting the first ledger vat summary entry for an account.""" account_id = 1235 _insert_mock_data() result = LedgerVatSummary.get_activity_by_account_id(account_id) assert result is not None assert result.account_id == account_id assert result.ledger_vat_summary_id == 1