"""Tests for the ledger account model.""" from decimal import Decimal import pytest from moneyhub.models.ledger_account_contract import LedgerAccountContract from tests.unit.conftest import insert_mock_data def test_get_events_for_contract(): """Test getting ledger events for a contract.""" account_id = 24601 contract_id = 1002 insert_mock_data({ 'account': {'account_id': account_id}, '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': 1001, 'reference_signing_entity_id': 1, }, { 'contract_id': contract_id, 'reference_signing_entity_id': 1, }, ], 'statement_period': [ {'statement_period_id': 11, 'statement_period_status': 'closed'}, {'statement_period_id': 12, 'statement_period_status': 'closed'}, {'statement_period_id': 13, 'statement_period_status': 'closed'}, {'statement_period_id': 14, 'statement_period_status': 'current'}, {'statement_period_id': 15, 'statement_period_status': 'open'}, ], 'abacus_event': [ {'abacus_event_id': 1, 'statement_period_id': 11, 'event_name': 'evt'}, {'abacus_event_id': 2, 'statement_period_id': 12, 'event_name': 'evt'}, {'abacus_event_id': 3, 'statement_period_id': 13, 'event_name': 'evt'}, {'abacus_event_id': 4, 'statement_period_id': 13, 'event_name': 'evt'}, {'abacus_event_id': 5, 'statement_period_id': 14, 'event_name': 'evt'}, {'abacus_event_id': 6, 'statement_period_id': 14, 'event_name': 'evt'}, ], 'ledger_account_contract': [ { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 1, 'currency_code': 'NOK', 'currency_amount': 123, 'previous_balance': 0, 'current_balance': 123, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 2, 'currency_code': 'NOK', 'currency_amount': 10, 'previous_balance': 123, 'current_balance': 133, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 3, 'currency_code': 'NOK', 'currency_amount': 20, 'previous_balance': 133, 'current_balance': 153, }, { 'account_id': account_id, 'contract_id': contract_id, 'abacus_event_id': 4, 'currency_code': 'NOK', 'currency_amount': 111, 'previous_balance': 0, 'current_balance': 111, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 5, 'currency_code': 'NOK', 'currency_amount': 10, 'previous_balance': 153, 'current_balance': 163, }, { 'account_id': account_id, 'contract_id': contract_id, 'abacus_event_id': 6, 'currency_code': 'NOK', 'currency_amount': 222, 'previous_balance': 111, 'current_balance': 333, }, ], }) result = LedgerAccountContract.get_events_for_account_and_contract(account_id, contract_id) assert [item._asdict() for item in result] == [ { 'ledger_account_contract_id': 4, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'NOK', 'currency_amount': Decimal('111.00'), 'previous_balance': Decimal('0.00'), 'current_balance': Decimal('111.00'), 'statement_period_id': 13, 'event_name': 'evt', }, { 'ledger_account_contract_id': 6, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'NOK', 'currency_amount': Decimal('222.00'), 'previous_balance': Decimal('111.00'), 'current_balance': Decimal('333.00'), 'statement_period_id': 14, 'event_name': 'evt', } ] @pytest.mark.parametrize('statement_period_id, expected_current_balances', [ (11, [Decimal('100.00')]), (12, [Decimal('400.00')]), (13, [Decimal('0.00'), Decimal('123.00')]), (14, [Decimal('0.00'), Decimal('123.00')]), ]) def test_get_latest_balances_for_account(statement_period_id, expected_current_balances): """Test getting current balance for an account.""" account_id = 24601 insert_mock_data({ 'account': {'account_id': account_id}, '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': 1001, 'reference_signing_entity_id': 1, }, { 'contract_id': 1002, 'reference_signing_entity_id': 1, }, ], 'statement_period': [ {'statement_period_id': 11, 'statement_period_status': 'closed'}, {'statement_period_id': 12, 'statement_period_status': 'closed'}, {'statement_period_id': 13, 'statement_period_status': 'closed'}, {'statement_period_id': 14, 'statement_period_status': 'closed'}, ], 'abacus_event': [ {'abacus_event_id': 1, 'statement_period_id': 11, 'event_name': 'evt'}, {'abacus_event_id': 2, 'statement_period_id': 12, 'event_name': 'evt'}, {'abacus_event_id': 3, 'statement_period_id': 12, 'event_name': 'evt'}, {'abacus_event_id': 4, 'statement_period_id': 13, 'event_name': 'evt'}, {'abacus_event_id': 5, 'statement_period_id': 13, 'event_name': 'evt'}, {'abacus_event_id': 6, 'statement_period_id': 13, 'event_name': 'evt'}, ], 'ledger_account_contract': [ { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 1, 'currency_code': 'NOK', 'currency_amount': 100, 'previous_balance': 0, 'current_balance': 100, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 2, 'currency_code': 'NOK', 'currency_amount': 100, 'previous_balance': 100, 'current_balance': 200, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 3, 'currency_code': 'NOK', 'currency_amount': 200, 'previous_balance': 200, 'current_balance': 400, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 4, 'currency_code': 'NOK', 'currency_amount': -100, 'previous_balance': 400, 'current_balance': 300, }, { 'account_id': account_id, 'contract_id': 1001, 'abacus_event_id': 5, 'currency_code': 'NOK', 'currency_amount': -300, 'previous_balance': 300, 'current_balance': 0, }, { 'account_id': account_id, 'contract_id': 1002, 'abacus_event_id': 6, 'currency_code': 'NOK', 'currency_amount': 123, 'previous_balance': 0, 'current_balance': 123, }, ], }) result = LedgerAccountContract.get_latest_balances_for_account(account_id, statement_period_id) assert [item.current_balance for item in result] == expected_current_balances def test_get_payments_by_account_and_statement_periods(): """Test to get list of payment for a specified account and statement_period.""" account_id = 24601 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': 1001, 'reference_signing_entity_id': 1, }, { 'contract_id': 2002, 'reference_signing_entity_id': 1, }, ], 'reference_payoneer_program': { 'payoneer_program_id': 1, 'payoneer_program_name': 'fake-name', 'funding_currency': 'GBP' }, 'payment_group': {'payment_group_id': 3}, 'payment_group_payment': {'payment_group_payment_id': 2, 'payment_group_id': 3}, 'payment_group_payment_account': { 'payment_group_payment_account_id': 1, 'payment_group_payment_id': 2, 'account_id': account_id, 'payoneer_program_id': 1, 'current_statement_period_id': statement_period_id }, 'abacus_state': [ {'abacus_state_id': 20, 'parent_table_id': 1, 'parent_table_name': 'payment_group_payment_account', 'action_status': 'complete'}, {'abacus_state_id': 21, 'parent_table_id': 2, 'parent_table_name': 'payment_group_payment_account', 'action_status': 'complete'}, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'send_payments', 'target_type': 'payment_group_payment', 'target_id': 2}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'send_payments', 'target_type': 'payment_group_payment', 'target_id': 3}, {'abacus_event_id': 30, 'statement_period_id': statement_period_id, 'event_name': 'tax_withholding', 'target_type': 'payment_group_payment', 'target_id': 2}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': 1001, 'currency_code': 'NOK', 'currency_amount': Decimal(-5000)}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal(-2000)}, {'abacus_event_id': 30, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal(-1000)} ] }) payments = LedgerAccountContract.get_payments_by_account_and_statement_periods( account_id=account_id, contract_id=None, statement_period_ids=[statement_period_id]) assert [dict(item) for item in payments] == [ { 'ledger_account_id': 1, 'action_status': 'complete', 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': 1001, 'currency_code': 'NOK', 'currency_amount': Decimal('-5000.00'), 'created_at': None, 'event_name': 'send_payments', 'withholding_tax_ledger_account_id': 3, 'withholding_tax_currency_code': 'NOK', 'withholding_tax_currency_amount': Decimal('-1000.00'), 'withholding_tax_created_at': None, }, { 'ledger_account_id': 2, 'action_status': None, 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal('-2000.00'), 'created_at': None, 'event_name': 'send_payments', 'withholding_tax_ledger_account_id': None, 'withholding_tax_currency_code': None, 'withholding_tax_currency_amount': None, 'withholding_tax_created_at': None, }, ] def test_get_payments_by_account_and_contract_id(): """Test to get list of payment for a specified account and contract_id.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': contract_id, 'reference_signing_entity_id': 1, }, { 'contract_id': contract_id + 1, 'reference_signing_entity_id': 1, }, ], 'reference_payoneer_program': { 'payoneer_program_id': 1, 'payoneer_program_name': 'fake-name', 'funding_currency': 'GBP' }, 'payment_group': {'payment_group_id': 3}, 'payment_group_payment': {'payment_group_payment_id': 2, 'payment_group_id': 3}, 'payment_group_payment_account': { 'payment_group_payment_account_id': 1, 'payment_group_payment_id': 2, 'account_id': account_id, 'payoneer_program_id': 1, 'current_statement_period_id': statement_period_id }, 'abacus_state': [ {'abacus_state_id': 20, 'parent_table_id': 1, 'parent_table_name': 'payment_group_payment_account', 'action_status': 'complete'}, {'abacus_state_id': 21, 'parent_table_id': 2, 'parent_table_name': 'payment_group_payment_account', 'action_status': 'complete'}, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'send_payments', 'target_type': 'payment_group_payment', 'target_id': 2}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'send_payments', 'target_type': 'payment_group_payment', 'target_id': 3}, {'abacus_event_id': 30, 'statement_period_id': statement_period_id, 'event_name': 'tax_withholding', 'target_type': 'payment_group_payment', 'target_id': 2}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'NOK', 'currency_amount': Decimal(-5000)}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'NOK', 'currency_amount': Decimal(-2000)}, {'abacus_event_id': 30, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'NOK', 'currency_amount': Decimal(-1000)} ] }) payments = LedgerAccountContract.get_payments_by_account_and_statement_periods( account_id=account_id, contract_id=contract_id, statement_period_ids=[statement_period_id]) assert [dict(item) for item in payments] == [ { 'ledger_account_id': 1, 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': contract_id, 'action_status': 'complete', 'currency_code': 'NOK', 'currency_amount': Decimal('-5000.00'), 'created_at': None, 'event_name': 'send_payments', 'withholding_tax_ledger_account_id': 3, 'withholding_tax_currency_code': 'NOK', 'withholding_tax_currency_amount': Decimal('-1000.00'), 'withholding_tax_created_at': None, }, ] def test_get_credit_payments_by_account_and_statement_period(): """Test to get list of credit payments for a specified account and statement_period.""" account_id = 24601 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': 1001, 'reference_signing_entity_id': 1, }, { 'contract_id': 2002, 'reference_signing_entity_id': 1, }, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account'}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account'}, {'abacus_event_id': 30, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account'}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': 1001, 'currency_code': 'NOK', 'currency_amount': Decimal(-5000)}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal(-2000)}, {'abacus_event_id': 30, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal(-1000)} ] }) payments = LedgerAccountContract.get_credit_payments_for_account_statement_periods( account_id=account_id, contract_id=None, statement_period_ids=[statement_period_id]) assert [dict(item) for item in payments] == [ { 'ledger_account_id': 1, 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': 1001, 'currency_code': 'NOK', 'currency_amount': Decimal('-5000.00'), 'created_at': None, 'event_name': 'payment_returned' }, { 'ledger_account_id': 2, 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': 2002, 'currency_code': 'NOK', 'currency_amount': Decimal('-2000.00'), 'created_at': None, 'event_name': 'payment_returned' }, { 'account_id': 24601, 'contract_id': 2002, 'created_at': None, 'currency_amount': Decimal('-1000.00'), 'currency_code': 'NOK', 'event_name': 'payment_returned', 'ledger_account_id': 3, 'statement_period_id': 123}, ] def test_get_credit_payments_by_account_and_contract_id(): """Test to get list of credit payment for a specified account and contract_id.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': contract_id, 'reference_signing_entity_id': 1, }, { 'contract_id': contract_id + 1, 'reference_signing_entity_id': 1, }, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account', 'target_id': 2}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account', 'target_id': 3}, {'abacus_event_id': 30, 'statement_period_id': statement_period_id, 'event_name': 'payment_returned', 'target_type': 'payment_group_payment_account', 'target_id': 2}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'NOK', 'currency_amount': Decimal(-5000)}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'NOK', 'currency_amount': Decimal(-2000)}, {'abacus_event_id': 30, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'NOK', 'currency_amount': Decimal(-1000)} ] }) payments = LedgerAccountContract.get_credit_payments_for_account_statement_periods( account_id=account_id, contract_id=contract_id, statement_period_ids=[statement_period_id]) assert [dict(item) for item in payments] == [ { 'ledger_account_id': 1, 'statement_period_id': statement_period_id, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'NOK', 'currency_amount': Decimal('-5000.00'), 'created_at': None, 'event_name': 'payment_returned' }, ] def test_get_reserves_released_by_account_and_statement_periods(): """Test to get released reserves for a specified account and statement_period_ids.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': contract_id, 'reference_signing_entity_id': 1, }, { 'contract_id': contract_id + 1, 'reference_signing_entity_id': 1, }, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'release_reserves', 'target_type': 'statement_period', 'target_id': 2}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'release_reserves', 'target_type': 'statement_period', 'target_id': 3}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'GBP', 'currency_amount': Decimal('1154.15')}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'GBP', 'currency_amount': Decimal('234.12')}, ] }) reserves = LedgerAccountContract.get_reserves_released_by_account_and_statement_periods( account_id=account_id, contract_id=contract_id, statement_period_ids=[statement_period_id]) assert [dict(item) for item in reserves] == [ { 'ledger_account_contract_id': 1, 'account_id': account_id, 'currency_code': 'GBP', 'currency_amount': Decimal('1154.15'), 'statement_period_id': statement_period_id } ] def test_get_reserves_taken_by_account_and_statement_periods(): """Test to get taken reserves for a specified account and statement_period_ids.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 insert_mock_data({ 'statement_period': {'statement_period_id': statement_period_id}, 'account': {'account_id': account_id}, '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': contract_id, 'reference_signing_entity_id': 1, }, { 'contract_id': contract_id + 1, 'reference_signing_entity_id': 1, }, ], 'abacus_event': [ {'abacus_event_id': 10, 'statement_period_id': statement_period_id, 'event_name': 'take_reserves', 'target_type': 'accounting_run', 'target_id': 2}, {'abacus_event_id': 20, 'statement_period_id': statement_period_id, 'event_name': 'take_reserves', 'target_type': 'accounting_run', 'target_id': 3}, ], 'ledger_account_contract': [ {'abacus_event_id': 10, 'account_id': account_id, 'contract_id': contract_id, 'currency_code': 'GBP', 'currency_amount': Decimal('-154.15')}, {'abacus_event_id': 20, 'account_id': account_id, 'contract_id': contract_id + 1, 'currency_code': 'GBP', 'currency_amount': Decimal('-234.12')}, ] }) reserves = LedgerAccountContract.get_reserves_taken_by_account_and_statement_periods( account_id=account_id, contract_id=contract_id, statement_period_ids=[statement_period_id]) assert [dict(item) for item in reserves] == [ { 'ledger_account_contract_id': 1, 'account_id': account_id, 'currency_code': 'GBP', 'currency_amount': Decimal('-154.15'), 'statement_period_id': statement_period_id } ] @pytest.mark.parametrize('statement_period_id, expected_contract_ids', [ (101, [1001]), (102, [1001, 1002]), (103, [1003]), (104, []), ]) def test_get_contracts_by_statement_period(statement_period_id, expected_contract_ids): """Test getting contracts by statement period.""" insert_mock_data({ 'account': [ {'account_id': 1}, {'account_id': 2}, {'account_id': 3}, {'account_id': 4}, ], 'reference_payment_entity': [ {'reference_payment_entity_id': 1}, {'reference_payment_entity_id': 2} ], 'reference_sap_profit_center': [{ 'reference_sap_profit_center_id': 1, 'profit_center': 'UK1234', 'company_code': '1234', 'business_group': 'ORC' }, { 'reference_sap_profit_center_id': 2, 'profit_center': 'UK12345', 'company_code': '12345', '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, }, { 'reference_signing_entity_id': 2, 'reference_payment_entity_id': 2, 'reference_sap_profit_center_id': 2, 'company_code': '12345', 'tax_entity_company_code': '12345', 'legal_name': 'Company1', 'vat_number': '129801234', 'company_registration_number': '1278741234', 'address': None, }], 'contract': [ { 'contract_id': 1001, 'reference_signing_entity_id': 2, }, { 'contract_id': 1002, 'reference_signing_entity_id': 2, }, { 'contract_id': 1003, 'reference_signing_entity_id': 2, }, { 'contract_id': 1004, 'reference_signing_entity_id': 2, }, ], 'statement_period': [ {'statement_period_id': 101}, {'statement_period_id': 102}, {'statement_period_id': 103}, {'statement_period_id': 104}, ], 'abacus_event': [ {'abacus_event_id': 1, 'statement_period_id': 101}, {'abacus_event_id': 2, 'statement_period_id': 102}, {'abacus_event_id': 3, 'statement_period_id': 102}, {'abacus_event_id': 4, 'statement_period_id': 103}, {'abacus_event_id': 5, 'statement_period_id': 103}, {'abacus_event_id': 6, 'statement_period_id': 104}, ], 'ledger_account_contract': [ { 'account_id': 1, 'contract_id': 1001, 'abacus_event_id': 1, }, { 'account_id': 1, 'contract_id': 1001, 'abacus_event_id': 2, }, { 'account_id': 2, 'contract_id': 1002, 'abacus_event_id': 3, }, { 'account_id': 3, 'contract_id': 1003, 'abacus_event_id': 4, }, { 'account_id': 3, 'contract_id': 1003, 'abacus_event_id': 6, }, ], 'account_payment_term': [ { 'account_payment_term_id': 1, 'account_id': 1, 'payment_entity_id': 2 }, { 'account_payment_term_id': 2, 'account_id': 2, 'payment_entity_id': 2 }, { 'account_payment_term_id': 3, 'account_id': 3, 'payment_entity_id': 2 } ], 'statement_period_payment_entity': [ { 'statement_period_payment_entity_id': 1, 'statement_period_id': 101, 'reference_payment_entity_id': 2, 'is_visible_to_customer': 1 }, { 'statement_period_payment_entity_id': 2, 'statement_period_id': 102, 'reference_payment_entity_id': 2, 'is_visible_to_customer': 1 }, { 'statement_period_payment_entity_id': 3, 'statement_period_id': 103, 'reference_payment_entity_id': 2, 'is_visible_to_customer': 1 }, { 'statement_period_payment_entity_id': 4, 'statement_period_id': 104, 'reference_payment_entity_id': 2, 'is_visible_to_customer': 0 } ] }) result = LedgerAccountContract.get_contracts_by_statement_period( statement_period_id ) assert [item.contract_id for item in result] == expected_contract_ids def test_get_vat_summaries(): """Test getting VAT summaries by account and statement period.""" account_id = 24601 contract_id = 10001 statement_period_ids = [123, 124] expected = [ { 'account_id': account_id, 'currency_code': 'NOK', 'currency_amount': Decimal(123), 'statement_period_id': 123, }, { 'account_id': account_id, 'currency_code': 'JPY', 'currency_amount': Decimal(123), 'statement_period_id': 124, } ] insert_mock_data({ 'abacus_event': [ {'abacus_event_id': 1, 'event_name': 'commit_vat_summary', 'statement_period_id': 123}, {'abacus_event_id': 2, 'event_name': 'commit_vat_summary', 'statement_period_id': 124}, {'abacus_event_id': 3, 'event_name': 'commit_vat_summary', 'statement_period_id': 125}, ], 'ledger_account_contract': [ { 'abacus_event_id': 1, 'account_id': account_id, 'contract_id': contract_id, 'currency_amount': Decimal(123), 'currency_code': 'NOK', }, { 'abacus_event_id': 2, 'account_id': account_id, 'contract_id': contract_id, 'currency_amount': Decimal(123), 'currency_code': 'JPY', }, { 'abacus_event_id': 3, 'account_id': account_id, 'contract_id': contract_id, 'currency_amount': Decimal(123), 'currency_code': 'USD', }, { 'abacus_event_id': 2, 'account_id': account_id, 'contract_id': contract_id - 1, 'currency_amount': Decimal(123), 'currency_code': 'JPY', }, ], }) result = LedgerAccountContract.get_vat_summaries(account_id, contract_id, statement_period_ids) assert [item._asdict() for item in result] == expected