"""WorksheetPaymentContractAdvance functional tests.""" from datetime import datetime, timedelta from urllib.parse import urlencode from tests.utils.factories import WorksheetPaymentContractAdvanceFactory def test_worksheet_payment_contact_advance_create_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceCreateView.""" test_data = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'AUD', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.000000', 'is_internal': True, } res = fixture_client.post('/payment/advance/1', json=test_data) assert res.status_code == 201 assert res.json == { 'worksheet_payment_contract_advance_id': 1, 'contract_advance_id': 1, 'exchange_rate_statement_period_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'amount_payee_currency': '149.92', 'currency_code': 'USD', 'payee_currency_code': 'AUD', 'exchange_rate': '1.4991820000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-15.00', 'vat_amount_payee_currency': '29.99', 'amount_after_withholding_and_vat_payee_currency': '164.91', 'us_source_income_rate': '90.000000', 'salesforce_id': None, 'is_internal': True, } def test_worksheet_payment_contact_advance_create_failure_same_contract_advance( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceCreateView failure.""" test_data = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'AUD', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.000000', 'is_internal': True, } res = fixture_client.post('/payment/advance/1', json=test_data) res = fixture_client.post('/payment/advance/1', json=test_data) assert res.status_code == 400 assert res.json == {'code': 'error', 'message': 'The worksheet already exists'} def test_worksheet_payment_contact_advance_create_failure_invalid_currency( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceCreateView failure.""" test_data = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'currency_code': '___', 'payee_currency_code': 'AUD', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.000000', 'is_internal': True, } res = fixture_client.post('/payment/advance/1', json=test_data) assert res.status_code == 400 assert res.json == {'code': 'error', 'message': 'Currency code not recognized: ___'} def test_get_worksheet_payment_contact_advance_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceItemView get method.""" WorksheetPaymentContractAdvanceFactory.create() res = fixture_client.get('/payment/advance/worksheet/1') assert res.status_code == 200 assert res.json == { 'worksheet_payment_contract_advance_id': 1, 'contract_advance_id': 1, 'statement_period_id': 1, 'exchange_rate_statement_period_id': 1, 'payment_name': 'test payment', 'amount': '100.00', 'amount_payee_currency': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-10.00', 'vat_amount_payee_currency': '20.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'us_source_income_rate': '50.000000', 'salesforce_id': 'test_id', 'is_internal': True, } def test_get_worksheet_payment_contact_advance_failure_no_worksheet( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceItemView get method failure.""" res = fixture_client.get('/payment/advance/worksheet/1') assert res.status_code == 404 def test_get_worksheet_payments_contact_advances_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceListView get method.""" WorksheetPaymentContractAdvanceFactory.create( created_at=datetime.now() - timedelta(days=2), is_internal=True ) WorksheetPaymentContractAdvanceFactory.create( created_at=datetime.now() - timedelta(days=1), is_internal=True ) WorksheetPaymentContractAdvanceFactory.create( deleted_at=datetime.now(), is_internal=True ) WorksheetPaymentContractAdvanceFactory.create(is_internal=False) WorksheetPaymentContractAdvanceFactory.create(deleted_at=datetime.now()) res = fixture_client.get('/payments/advances/') assert res.status_code == 200 assert res.json == { 'total_count': 2, 'items': [ { 'worksheet_payment_contract_advance_id': 2, 'contract_advance_id': 1, 'statement_period_id': 1, 'exchange_rate_statement_period_id': 1, 'payment_name': 'test payment', 'amount': '100.00', 'amount_payee_currency': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-10.00', 'vat_amount_payee_currency': '20.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'us_source_income_rate': '50.000000', 'salesforce_id': 'test_id', 'is_internal': True, }, { 'worksheet_payment_contract_advance_id': 1, 'contract_advance_id': 1, 'statement_period_id': 1, 'exchange_rate_statement_period_id': 1, 'payment_name': 'test payment', 'amount': '100.00', 'amount_payee_currency': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-10.00', 'vat_amount_payee_currency': '20.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'us_source_income_rate': '50.000000', 'salesforce_id': 'test_id', 'is_internal': True, }, ], } def test_get_worksheet_payments_contact_advances_with_filter_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance, create_mock_payment_state, ): """Test WorksheetPaymentContractAdvanceListView get method with filter.""" test_contract_advance_id = 2 test_salesforce_id = 'test salesforce id for search' WorksheetPaymentContractAdvanceFactory.create( created_at=datetime.now() - timedelta(days=2), is_internal=True, salesforce_id=test_salesforce_id, contract_advance_id=test_contract_advance_id, ) WorksheetPaymentContractAdvanceFactory.create( created_at=datetime.now() - timedelta(days=1), is_internal=True ) WorksheetPaymentContractAdvanceFactory.create( deleted_at=datetime.now(), is_internal=True ) WorksheetPaymentContractAdvanceFactory.create(is_internal=False) WorksheetPaymentContractAdvanceFactory.create(deleted_at=datetime.now()) params = urlencode( { 'salesforce_id': test_salesforce_id, 'contract_advance_id': test_contract_advance_id, 'payment_statuses': 'init', } ) res = fixture_client.get(f'/payments/advances/?{params}') assert res.status_code == 200 assert res.json == { 'total_count': 1, 'items': [ { 'worksheet_payment_contract_advance_id': 1, 'contract_advance_id': 2, 'statement_period_id': 1, 'exchange_rate_statement_period_id': 1, 'payment_name': 'test payment', 'amount': '100.00', 'amount_payee_currency': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-10.00', 'vat_amount_payee_currency': '20.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'us_source_income_rate': '50.000000', 'salesforce_id': 'test salesforce id for search', 'is_internal': True, }, ], } def test_worksheet_payment_contact_advance_update_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceCreateView.""" WorksheetPaymentContractAdvanceFactory.create() test_data = { 'salesforce_id': 'new test salesforce id', } res = fixture_client.put('/payment/advance/worksheet/1', json=test_data) assert res.status_code == 201 assert res.json == { 'amount': '100.00', 'amount_after_withholding_and_vat': '110.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'amount_payee_currency': '100.00', 'contract_advance_id': 1, 'currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'exchange_rate_statement_period_id': 1, 'is_internal': True, 'payee_currency_code': 'USD', 'payment_name': 'test payment', 'salesforce_id': 'new test salesforce id', 'statement_period_id': 1, 'us_source_income_rate': '50.000000', 'vat_amount': '20.00', 'vat_amount_payee_currency': '20.00', 'withholding_tax_amount': '-10.00', 'withholding_tax_amount_payee_currency': '-10.00', 'worksheet_payment_contract_advance_id': 1, } def test_worksheet_payment_contact_advance_update_failure_no_worksheet( fixture_client, ): """Test WorksheetPaymentContractAdvanceCreateView failure no worksheet.""" test_data = { 'salesforce_id': 'new test salesforce id', } res = fixture_client.put('/payment/advance/worksheet/1', json=test_data) assert res.status_code == 404 def test_worksheet_payment_contact_advance_delete_success( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance, create_mock_payment_state, ): """Test delete for WorksheetPaymentContractAdvanceItemView.""" WorksheetPaymentContractAdvanceFactory.create() res = fixture_client.delete('/payment/advance/worksheet/1') assert res.status_code == 204 def test_worksheet_payment_contact_advance_delete_failure_status( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance, create_mock_payment_state, ): """Test delete failure on status for WorksheetPaymentContractAdvanceItemView.""" WorksheetPaymentContractAdvanceFactory.create() WorksheetPaymentContractAdvanceFactory.create() res = fixture_client.delete('/payment/advance/worksheet/2') assert res.status_code == 400 assert res.json == { 'code': 'error', 'message': 'The worksheet action "send_payments" should have the "init" status.', } def test_worksheet_payment_contact_advance_delete_failure_no_id( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance, create_mock_payment_state, ): """Test delete failure on status for WorksheetPaymentContractAdvanceItemView.""" res = fixture_client.delete('/payment/advance/worksheet/999') assert res.status_code == 404 def test_dataloader_worksheets_by_ids( fixture_client, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test abacus worksheets dataloader endpoint.""" worksheet = WorksheetPaymentContractAdvanceFactory.create() worksheet_ids = [worksheet.worksheet_payment_contract_advance_id, 999] res = fixture_client.post( '/payment/advance/worksheet/dataloader', json=worksheet_ids ) assert res.status_code == 200 assert res.json == { 'items': [ { 'data': { 'worksheet_payment_contract_advance_id': 1, 'contract_advance_id': 1, 'statement_period_id': 1, 'exchange_rate_statement_period_id': 1, 'payment_name': 'test payment', 'amount': '100.00', 'amount_payee_currency': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'USD', 'exchange_rate': '0.7900000000000000000', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'withholding_tax_amount_payee_currency': '-10.00', 'vat_amount_payee_currency': '20.00', 'amount_after_withholding_and_vat_payee_currency': '110.00', 'us_source_income_rate': '50.000000', 'salesforce_id': 'test_id', 'is_internal': True, } }, {'data': None}, ] }