"""worksheet_tax_corrections tests.""" from datetime import datetime import pytest from payment.constants import constants from payment.models import WorksheetTaxCorrection from payment.repository import worksheet_tax_correction as repository from tests.utils.factories import ( PaymentGroupPaymentAccountDetailFactory, WorksheetAccountContractClosingBalanceFactory, WorksheetAccountContractPayableDetailsFactory, WorksheetPayableBalanceAfterTaxFactory, WorksheetTaxCorrectionFactory, ) @pytest.mark.parametrize( 'correction_type, correction_status', ( (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.ACTIVE), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.ACTIVE), ), ) def test_get_filtered_worksheet_tax_corrections_statement_period( correction_type, correction_status, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, ): """Test get_filtered_worksheet_tax_corrections method statement_period filter.""" statement_period_id_1 = 1 payable_detail_type_id = constants.CORRECTION_TYPE_TO_PAYABLE_DETAIL_TYPE_ID.get( correction_type ) deleted_at = ( datetime.now() if correction_status == constants.CORRECTION_STATUSES.PENDING else None ) worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax1 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_1, ) detail1 = PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax1.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, ) correction1 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance.contract_id, account_id=worksheet_closing_balance.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_1, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax1, statement_period_id=statement_period_id_1, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction1.worksheet_tax_correction_id, ) statement_period_id_2 = 2 worksheet_after_tax2 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_2, ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax2.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, ) correction2 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance.contract_id, account_id=worksheet_closing_balance.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_2, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax2, statement_period_id=statement_period_id_2, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction2.worksheet_tax_correction_id, ) corrections = repository.get_filtered_worksheet_tax_corrections( correction_type, correction_status, statement_period_id_1, [detail1.contract_id] ) assert corrections == ([correction1], 1) @pytest.mark.parametrize( 'correction_type, correction_status', ( (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.ACTIVE), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.ACTIVE), ), ) def test_get_filtered_worksheet_tax_corrections_contract_ids( correction_type, correction_status, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, ): """Test get_filtered_worksheet_tax_corrections method contract_ids filter.""" contract_id_1 = 1 statement_period_id_1 = 1 deleted_at = ( datetime.now() if correction_status == constants.CORRECTION_STATUSES.PENDING else None ) payable_detail_type_id = constants.CORRECTION_TYPE_TO_PAYABLE_DETAIL_TYPE_ID.get( correction_type ) worksheet_closing_balance1 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=contract_id_1 ) worksheet_after_tax1 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance1.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_1, contract_id=contract_id_1, ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax1.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, contract_id=contract_id_1, ) correction1 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance1.contract_id, account_id=worksheet_closing_balance1.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_1, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax1, statement_period_id=statement_period_id_1, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction1.worksheet_tax_correction_id, ) contract_id_2 = 2 statement_period_id_2 = 2 worksheet_closing_balance2 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=contract_id_2 ) worksheet_after_tax2 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance2.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_2, contract_id=contract_id_2, ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax2.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, contract_id=contract_id_2, ) correction2 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance2.contract_id, account_id=worksheet_closing_balance2.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_2, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax1, statement_period_id=statement_period_id_2, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction2.worksheet_tax_correction_id, ) corrections = repository.get_filtered_worksheet_tax_corrections( correction_type, correction_status, statement_period_id_2, [contract_id_2] ) assert corrections == ([correction2], 1) @pytest.mark.parametrize( 'correction_type, correction_status', ( (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.PENDING), (constants.CORRECTION_TYPES.WHT, constants.CORRECTION_STATUSES.ACTIVE), (constants.CORRECTION_TYPES.VAT, constants.CORRECTION_STATUSES.ACTIVE), ), ) def test_get_filtered_worksheet_tax_corrections_limit_offset( correction_type, correction_status, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, ): """Test get_filtered_worksheet_tax_corrections method limit/offset.""" statement_period_id_1 = 1 payable_detail_type_id = constants.CORRECTION_TYPE_TO_PAYABLE_DETAIL_TYPE_ID.get( correction_type ) deleted_at = ( datetime.now() if correction_status == constants.CORRECTION_STATUSES.PENDING else None ) worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax1 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_1, ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax1.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, ) correction1 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance.contract_id, account_id=worksheet_closing_balance.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_1, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax1, statement_period_id=statement_period_id_1, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction1.worksheet_tax_correction_id, ) statement_period_id_2 = 2 worksheet_after_tax2 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id, statement_period_id=statement_period_id_2, ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax2.worksheet_account_contract_payable_after_tax_id, deleted_at=deleted_at, ) correction2 = WorksheetTaxCorrectionFactory.create( contract_id=worksheet_closing_balance.contract_id, account_id=worksheet_closing_balance.account_id, payable_detail_type_id=payable_detail_type_id, correction_statement_period_id=statement_period_id_2, ) WorksheetAccountContractPayableDetailsFactory.create( # noqa worksheet_account_contract_payable_after_tax=worksheet_after_tax2, statement_period_id=statement_period_id_2, payable_detail_type_id=payable_detail_type_id, target_table=WorksheetTaxCorrection.__tablename__, target_id=correction2.worksheet_tax_correction_id, ) corrections = repository.get_filtered_worksheet_tax_corrections( correction_type, correction_status, ) assert corrections == ([correction1, correction2], 2) corrections = repository.get_filtered_worksheet_tax_corrections( correction_type, correction_status, None, None, 1, 0 ) assert corrections == ([correction1], 2) corrections = repository.get_filtered_worksheet_tax_corrections( correction_type, correction_status, None, None, 1, 1 ) assert corrections == ([correction2], 2)