"""Integration tests.""" from abacus_common_logic.connectors.database import db import pytest from sqlalchemy import text # from tests.conftest import TestConfig from tests.integration.conftest import ( check_db_field_value, create_abacus_event, create_account, create_contract_advance_fixture, create_contract_fixture, create_ledger_account_contract, create_payment_group_payment, generate_abacus_states, generate_payment_group_body, get_table_row_count, ows_abacus_account_api_client, ows_abacus_state_api_client, ows_payment_api_client, query_the_db, ) from tests.integration.utils.generic_helper import generate_random_string @pytest.mark.jira('ACC-2720') def test_get_hello(basic_headers): """Get Hello Endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) response = ows_payment_client.get_hello() assert response.status_code == 200, '\nReason: {}\nURL: {}'.format( response.reason, response.url ) response_body = response.json() assert 'status' in response_body assert 'ok' in response_body['status'] @pytest.mark.jira('ACC-2802', 'ACC-2791') def test_post_get_payment_group(basic_headers): """POST and GET /payment-group endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) body = generate_payment_group_body() response_post = ows_payment_client.post_payment_group(body) assert response_post.status_code == 201 payment_group_id = response_post.json()['payment_group_id'] response_get = ows_payment_client.get_payment_group(payment_group_id) assert response_get.status_code == 200 expected_item = dict(**body, payment_group_id=payment_group_id) expected_item.pop('payment_name') assert expected_item == response_get.json() @pytest.mark.jira('ACC-2851') def test_post_get_group_payment(basic_headers): """POST and GET /payment-group-payment endpoints.""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_body = generate_payment_group_body() response_post_payment_group = ows_payment_client.post_payment_group( payment_group_body ) assert response_post_payment_group.status_code == 201 payment_group_id = response_post_payment_group.json()['payment_group_id'] payment_group_payment_body = { 'payment_group_id': payment_group_id, 'payment_name': 'orcd_autotest_{}'.format(generate_random_string(16)), } response_post_group_payment = ows_payment_client.post_group_payment( payment_group_payment_body ) assert response_post_group_payment.status_code == 201 payment_group_payment_id = response_post_group_payment.json()[ 'payment_group_payment_id' ] response_get_payment_group_payment = ows_payment_client.get_group_payment( payment_group_payment_id ) assert response_get_payment_group_payment.status_code == 200 response_get_payment_group_payment_json = response_get_payment_group_payment.json() assert ( response_get_payment_group_payment_json['payment_name'] == payment_group_payment_body['payment_name'] ) assert 'payment_status' not in response_get_payment_group_payment_json res_get = ows_payment_client.get_payment_group_payments() assert res_get.status_code == 200 res_body = res_get.json()['items'][0] assert res_body['payment_name'] == payment_group_payment_body['payment_name'] @pytest.mark.jira('ACC-3942') def test_get_reusable_groups(basic_headers): """GET /payment-group/reusable-groups endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_body = generate_payment_group_body() response_post_payment_group = ows_payment_client.post_payment_group( payment_group_body ) assert response_post_payment_group.status_code == 201 response_get_reusable_groups = ows_payment_client.get_reusable_groups() assert response_get_reusable_groups.status_code == 200 for group in response_get_reusable_groups.json()['items']: assert group['is_reusable'] is True @pytest.mark.jira('ACC-2851') def test_post_payment_group_payment_accounts_bulk( basic_headers, mock_reference_payoneer_program_integration ): """POST /payment-group-payment/{payment_group_payment_id}/accounts endpoint.""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_contract_fixture(account_id, contract_id) post_body = { 'currency_code': 'USD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'USD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 first_item = response_group_payment_accounts_bulk.json()[0] assert first_item['currency_code'] == post_body['currency_code'] assert first_item['current_balance'] == post_body['current_balance'] assert first_item['last_payment'] == post_body['last_payment'] assert first_item['account_id'] == account_id assert first_item['payment_group_payment_id'] == payment_group_payment_id assert not first_item['prior_payment_group_payment_id'] assert first_item['payment_group_payment_account_id'] @pytest.mark.jira('ACC-2851') def test_get_account_latest_payment( basic_headers, fresh_db, mock_reference_payoneer_program_integration, mock_abacus_state, ): """GET /payment-group-payment-account/last-payment/{account_id} endpoint.""" account_id = 123123 contract_id = 123 payoneer_program_id = 1001 batch_num = 1 ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) payment_account_post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': payoneer_program_id, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, payment_account_post_body ) ) assert response_payment_accounts_bulk.status_code == 201 payment_batch_post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num, 'payoneer_program_id': payoneer_program_id, } response_post_payment_batch = ows_payment_client.post_payment_group_payment_batch( payment_batch_post_body ) assert response_post_payment_batch.status_code == 201 payment_group_payment_account_id = response_payment_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] # noqa: E501 payment_group_payment_batch_id = response_post_payment_batch.json()[ 'payment_group_payment_batch_id' ] payment_batch_accounts_post_body = [ { 'payment_group_payment_account_id': payment_group_payment_account_id, 'payment_group_payment_batch_id': payment_group_payment_batch_id, } ] response_payment_batch_accounts_bulk = ( ows_payment_client.post_payment_group_payment_batch_account_bulk( payment_batch_accounts_post_body ) ) assert response_payment_batch_accounts_bulk.status_code == 201 payment_group_payment_account_id = response_payment_batch_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] response_get_last_payment = ows_payment_client.get_last_payment_for_account( account_id ) assert response_get_last_payment.status_code == 200 response_get_last_payment_body = response_get_last_payment.json() assert response_get_last_payment_body['account_id'] == account_id assert ( response_get_last_payment_body['current_balance'] == payment_account_post_body['current_balance'] ) assert ( response_get_last_payment_body['last_payment'] == payment_account_post_body['last_payment'] ) assert ( response_get_last_payment_body['currency_code'] == payment_account_post_body['currency_code'] ) assert ( response_get_last_payment_body['payment_group_payment_id'] == payment_group_payment_id ) assert 'payment_group_payment_account_id' in response_get_last_payment_body assert 'prior_payment_group_payment_id' in response_get_last_payment_body assert 'note' in response_get_last_payment_body @pytest.mark.jira('ACC-2807') def test_get_delete_payment_group_payment_accounts( basic_headers, mock_reference_payoneer_program_integration ): """GET and DELETE /payment-group-payment/{payment_group_payment_id}/accounts/ .""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) ows_abacus_state_client = ows_abacus_state_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) ows_abacus_state_client.post_states( generate_abacus_states(payment_group_payment_id) ) post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 payment_group_payment_account_id = response_group_payment_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] response_get_payment_group_payment_account = ( ows_payment_client.get_payment_group_payment_account( payment_group_payment_account_id ) ) assert response_get_payment_group_payment_account.status_code == 200 payment_group_payment_accounts = response_get_payment_group_payment_account.json() assert payment_group_payment_accounts['currency_code'] == post_body['currency_code'] assert payment_group_payment_accounts['last_payment'] == post_body['last_payment'] assert ( payment_group_payment_accounts['current_balance'] == post_body['current_balance'] ) response_delete = ows_payment_client.delete_payment_group_payment_account( payment_group_payment_account_id ) assert response_delete.status_code == 204 @pytest.mark.jira('ACC-2835') def test_delete_payment_group_payment(basic_headers): """DELETE /payment-group-payment/{payment_group_payment_id} .""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_body = generate_payment_group_body() response_post_payment_group = ows_payment_client.post_payment_group( payment_group_body ) assert response_post_payment_group.status_code == 201 payment_group_id = response_post_payment_group.json()['payment_group_id'] payment_group_payment_body = { 'payment_group_id': payment_group_id, 'payment_name': 'orcd_autotest_{}'.format(generate_random_string(16)), } response_post_group_payment = ows_payment_client.post_group_payment( payment_group_payment_body ) assert response_post_group_payment.status_code == 201 payment_group_payment_id = response_post_group_payment.json()[ 'payment_group_payment_id' ] get_group_payment_response = ows_payment_client.get_group_payment( payment_group_payment_id ) assert get_group_payment_response.status_code == 200 assert ( get_group_payment_response.json()['payment_name'] == payment_group_payment_body['payment_name'] ) delete_group_payment_response = ows_payment_client.delete_payment_group_payment( payment_group_payment_id ) assert delete_group_payment_response.status_code == 204 @pytest.mark.skip( reason='Outdated and duplicating functional test without real integration exists' ) @pytest.mark.jira('ACC-2808') def test_get_account_pending_payments_by_payment_group_payment_id( basic_headers, drop_fks, mock_account_payees_integration, mock_reference_payoneer_program_integration, ): """GET /payment-group-payment/{payment_group_payment_id}/accounts/ .""" account_id = 123123 contract_id = 123 account_name = 'Test Account' ows_payment_client = ows_payment_api_client(basic_headers) ows_abacus_state_client = ows_abacus_state_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) payment_group_payment_id_2 = create_payment_group_payment(basic_headers) abacus_states = ows_abacus_state_client.post_states( generate_abacus_states(payment_group_payment_id) ) for state in abacus_states.json(): if state['action_name'] in ('generate_payments', 'generate_export'): new_status = 'complete' else: new_status = 'init' ows_abacus_state_client.update_status(state['abacus_state_id'], new_status) post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 prior_payment_group_payment_id = payment_group_payment_id post_body['prior_payment_group_payment_id'] = prior_payment_group_payment_id response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id_2, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 response_pending_payment = ows_payment_client.get_accounts_with_pending_payments( payment_group_payment_id_2 ) assert response_pending_payment.status_code == 200 pending_payment_response_body = response_pending_payment.json()['items'][0] assert ( pending_payment_response_body['payment_group_payment_id'] == payment_group_payment_id_2 ) assert pending_payment_response_body['last_payment'] == post_body['last_payment'] assert pending_payment_response_body['prior_payment_group_payment_id'] == 1 assert pending_payment_response_body['currency_code'] == post_body['currency_code'] assert ( pending_payment_response_body['current_balance'] == post_body['current_balance'] ) assert pending_payment_response_body['account_id'] == post_body['account_id'] assert pending_payment_response_body['account_name'] == account_name @pytest.mark.jira('ACC-3792', 'ACC-2433') def test_get_payment_minimums(basic_headers, payment_minimum_fixtures): """GET /payment-minimums endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) response_get = ows_payment_client.get_payment_minimums() assert response_get.status_code == 200 for item in response_get.json()['items']: assert 'currency_name' in item assert 'wire_transfer_amount' in item assert 'currency_code' in item assert 'western_union_amount' in item assert 'check_amount' in item assert 'payment_minimum_id' in item @pytest.mark.jira('ACC-3792', 'ACC-2433') @pytest.mark.parametrize('currency_id', ['USD', 'EUR', 'GBP']) def test_get_payment_minimums_for_currency( basic_headers, currency_id, payment_minimum_fixtures ): """GET /payment-minimum/ endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) response_get = ows_payment_client.get_payment_minimums_for_currency(currency_id) assert response_get.status_code == 200 assert 'currency_name' in response_get.json() assert 'wire_transfer_amount' in response_get.json() assert 'currency_code' in response_get.json() assert 'western_union_amount' in response_get.json() assert 'check_amount' in response_get.json() assert 'payment_minimum_id' in response_get.json() @pytest.mark.jira('ACC-3792', 'ACC-2433') def test_put_payment_minimums(basic_headers, payment_minimum_fixtures): """PUT /payment-minimums endpoint.""" ows_payment_client = ows_payment_api_client(basic_headers) response_get = ows_payment_client.get_payment_minimums() assert response_get.status_code == 200 # store values prior to update usd_default_values = next( item for item in response_get.json()['items'] if item['currency_code'] == 'USD' ) payment_minimum_id = usd_default_values['payment_minimum_id'] put_payee_minimum_body = [ { 'payment_minimum_id': payment_minimum_id, 'check_amount': '102.00', 'wire_transfer_amount': '102.00', 'western_union_amount': '302.00', } ] # update payment minimums and verify the response response_put_payment_minimum = ows_payment_client.put_payment_minimums( put_payee_minimum_body ) assert response_put_payment_minimum.status_code == 201 usd_updated_values = next( item for item in response_put_payment_minimum.json() if item['currency_code'] == 'USD' ) assert ( usd_updated_values['check_amount'] == put_payee_minimum_body[0]['check_amount'] ) assert ( usd_updated_values['wire_transfer_amount'] == put_payee_minimum_body[0]['wire_transfer_amount'] ) assert ( usd_updated_values['western_union_amount'] == put_payee_minimum_body[0]['western_union_amount'] ) # verify values are updated within GET /payment-minimums/ endpoint response_get = ows_payment_client.get_payment_minimums_for_currency('USD') assert response_get.status_code == 200 assert usd_updated_values['check_amount'] == response_get.json()['check_amount'] assert ( usd_updated_values['wire_transfer_amount'] == response_get.json()['wire_transfer_amount'] ) assert ( usd_updated_values['western_union_amount'] == response_get.json()['western_union_amount'] ) # rollback the values usd_default_values.pop('currency_code') usd_default_values.pop('currency_name') response_rollback = ows_payment_client.put_payment_minimums([usd_default_values]) assert response_rollback.status_code == 201 @pytest.mark.jira('ACC-2807', 'ACC-3942') def test_put_get_delete_payment_group_payment_account( basic_headers, mock_reference_payoneer_program_integration ): """GET PUT DELETE /payment-group-payment-account endpoints.""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) ows_abacus_state_client = ows_abacus_state_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) abacus_states = ows_abacus_state_client.post_states( generate_abacus_states(payment_group_payment_id) ) for state in abacus_states.json(): if state['action_name'] in ('generate_payments', 'generate_export'): new_status = 'complete' else: new_status = 'init' ows_abacus_state_client.update_status(state['abacus_state_id'], new_status) body = [ { 'account_id': account_id, 'currency_code': 'USD', 'current_balance': '24.00', 'last_payment': '42.00', 'tax_withholding': '12.00', 'balance_after_tax': '15.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '24.00', 'currency_code': 'USD', } ], } ] response_post = ows_payment_client.post_payment_accounts( payment_group_payment_id, body ) assert response_post.status_code == 201 response_get = ows_payment_client.get_payment_group_payment_account(1) assert response_get.status_code == 200 assert response_get.json()['payment_group_payment_id'] == payment_group_payment_id assert response_get.json()['account_id'] == body[0]['account_id'] assert response_get.json()['currency_code'] == body[0]['currency_code'] assert float(response_get.json()['last_payment']) == float(body[0]['last_payment']) assert float(response_get.json()['current_balance']) == float( body[0]['current_balance'] ) assert response_get.json()['payoneer_program_id'] == body[0]['payoneer_program_id'] body = {'note': 'new_note'} response_put = ows_payment_client.put_payment_group_payment_account(1, body) assert response_put.status_code == 201 response_get = ows_payment_client.get_payment_group_payment_account(1) assert response_get.status_code == 200 assert response_get.json()['note'] == body['note'] response_delete = ows_payment_client.delete_payment_group_payment_account(1) assert response_delete.status_code == 204 @pytest.mark.jira('ACC-3938') def test_get_reference_tax_withholding(basic_headers): """GET /reference-tax-withholding .""" ows_payment_client = ows_payment_api_client(basic_headers) response_get = ows_payment_client.get_reference_tax_withholding() assert response_get.status_code == 200 assert len(response_get.json()['items']) > 0 assert 'tax_rate' in response_get.json()['items'][0] assert 'country_of_withholding' in response_get.json()['items'][0] assert 'country_of_tax_residence' in response_get.json()['items'][0] assert 'reference_tax_withholding_id' in response_get.json()['items'][0] @pytest.mark.jira('ACC-3942') def test_post_payment_group_for_specific_account(basic_headers): """POST /payment-group for specific account.""" ows_payment_client = ows_payment_api_client(basic_headers) ows_account_client = ows_abacus_account_api_client(basic_headers) account_id = 123123 post_account = {'account_name': 'Test Account', 'account_id': account_id} response_post = ows_account_client.post_account(post_account) assert response_post.status_code == 201 body = { 'group_name': 'orcd_autotest_{}'.format(generate_random_string(16)), 'payment_name': 'Payment Name', 'is_reusable': False, 'group_criteria': {'account_id': account_id}, } response_post = ows_payment_client.post_payment_group(body) assert response_post.status_code == 201 payment_group_id = response_post.json()['payment_group_id'] response_get = ows_payment_client.get_payment_group(payment_group_id) assert response_get.status_code == 200 expected_item = dict(**body, payment_group_id=payment_group_id) expected_item.pop('payment_name') assert expected_item == response_get.json() @pytest.mark.jira('ACC-4274') def test_post_payment_group_payment_batch( basic_headers, mock_reference_payoneer_program_integration ): """POST /payment-group-payment-batch .""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_payment_id = create_payment_group_payment(basic_headers) batch_num = 1 # defined in db fixtures payoneer_program_id = 1001 post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num, 'payoneer_program_id': payoneer_program_id, } response_post = ows_payment_client.post_payment_group_payment_batch(post_body) assert response_post.status_code == 201 assert response_post.json()['batch_num'] == batch_num assert response_post.json()['payment_group_payment_id'] == payment_group_payment_id assert 'payment_group_payment_batch_id' in response_post.json() @pytest.mark.jira('ACC-4274') def test_post_payment_group_payment_batch_account_bulk( basic_headers, mock_reference_payoneer_program_integration ): """POST /payment-group-payment-batch-account/bulk/ .""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) ows_abacus_state_client = ows_abacus_state_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) ows_abacus_state_client.post_states( generate_abacus_states(payment_group_payment_id) ) post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 payment_group_payment_account_id = response_group_payment_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] batch_num = 1 # defined in db fixtures payoneer_program_id = 1001 post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num, 'payoneer_program_id': payoneer_program_id, } response_post = ows_payment_client.post_payment_group_payment_batch(post_body) assert response_post.status_code == 201 payment_group_payment_batch_id = response_post.json()[ 'payment_group_payment_batch_id' ] post_body = [ { 'payment_group_payment_account_id': payment_group_payment_account_id, 'payment_group_payment_batch_id': payment_group_payment_batch_id, } ] response_post = ows_payment_client.post_payment_group_payment_batch_account_bulk( post_body ) assert response_post.status_code == 201 assert ( response_post.json()[0]['payment_group_payment_batch_id'] == payment_group_payment_batch_id ) assert ( response_post.json()[0]['payment_group_payment_account_id'] == payment_group_payment_account_id ) assert 'payment_group_payment_batch_account_id' in response_post.json()[0] @pytest.mark.jira('ACC-4375') def test_post_get_reports_by_payment_id(basic_headers): """POST/GET /report-payment-group-payment//download.""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_payment_id = create_payment_group_payment(basic_headers) body = { 'report_export_url': 's3://env-abacus-payments/123-payment-name/summary/summary.tsv', 'report_type': 'summary', } res = ows_payment_client.upsert_report_payment_group_payment( payment_group_payment_id, body ) assert res.status_code == 201 report_payment_group_payment_id = res.json()['report_payment_group_payment_id'] res = ows_payment_client.get_reports_by_payment_group_payment( report_payment_group_payment_id ) assert res.status_code == 200 assert res.json()[0]['report_type'] == body['report_type'] assert res.json()[0]['report_export_url'] == body['report_export_url'] ''' @pytest.mark.jira('ACC-4375') def test_download_report(basic_headers): """GET /report-payment-group-payment//download.""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_payment_id = create_payment_group_payment(basic_headers) body = { 'report_export_url': 's3://env-abacus-payments/123-payment-name/summary/summary.tsv', 'report_type': 'summary' } res = ows_payment_client.upsert_report_payment_group_payment( payment_group_payment_id, body) assert res.status_code == 201 report_payment_group_payment_id = res.json()['report_payment_group_payment_id'] res = ows_payment_client.download_report_by_report_id( report_payment_group_payment_id ) assert res.status_code == 200 assert res.json()['download_url'].startswith( f'https://{TestConfig.S3_PAYMENTS_BUCKET_NAME}.s3.amazonaws.com' ) ''' @pytest.mark.jira('ACC-4357') def test_get_program_currency_totals_by_payment_id(basic_headers, drop_fks): """Test getting payment totals grouped by program_id.""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) payoneer_program_id = 100158970 create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) values = {'payoneer_program_id': payoneer_program_id} reference_payoneer_program_insert = """ INSERT INTO reference_payoneer_program( payoneer_program_id, payoneer_program_name, funding_currency, reference_payment_type_id ) VALUES ( {payoneer_program_id}, 'test_name', 'CAD', 3 ), ( '1001', 'test_name', 'CAD', 3 ); """ with db.engine.connect() as conn: conn.execute(text(reference_payoneer_program_insert.format(**values))) conn.commit() account_payment_term_insert = """ INSERT INTO `account_payment_term`( account_id, currency_code, payment_entity_id, created_by, created_at, last_modified_by, last_modified ) VALUES (123123, 'CAD', 2, '', NOW(), '', NOW()) """ with db.engine.connect() as conn: conn.execute(text(account_payment_term_insert)) conn.commit() body = [ { 'account_id': account_id, 'currency_code': 'USD', 'current_balance': '24.00', 'last_payment': '42.00', 'tax_withholding': '12.00', 'balance_after_tax': '15.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '100.00', 'currency_code': 'USD', } ], } ] response_post = ows_payment_client.post_payment_accounts( payment_group_payment_id, body ) assert response_post.status_code == 201 res = ows_payment_client.get_program_currency_totals_by_payment_id( payment_group_payment_id ) assert res.status_code == 200 assert res.json()[0]['currency_total'] == body[0]['balance_after_tax'] assert res.json()[0]['currency_code'] == body[0]['currency_code'] assert res.json()[0]['payoneer_program_id'] == body[0]['payoneer_program_id'] @pytest.mark.jira('ACC-4437') def test_get_delete_reports_by_report_id(basic_headers): """GET & DELETE report-payment-group-payment by ID .""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_payment_id = create_payment_group_payment(basic_headers) body = { 'report_export_url': 's3://env-abacus-payments/123-payment-name/summary/summary.tsv', 'report_type': 'summary', } res = ows_payment_client.upsert_report_payment_group_payment( payment_group_payment_id, body ) assert res.status_code == 201 report_payment_group_payment_id = res.json()['report_payment_group_payment_id'] res = ows_payment_client.get_report_by_report_id(report_payment_group_payment_id) assert res.status_code == 200 assert res.json()['report_type'] == body['report_type'] assert res.json()['report_export_url'] == body['report_export_url'] res = ows_payment_client.delete_report_by_report_id(report_payment_group_payment_id) assert res.status_code == 204 res = ows_payment_client.get_report_by_report_id(report_payment_group_payment_id) assert res.status_code == 404 @pytest.mark.jira('ACC-4589') def test_get_payment_batches(basic_headers, mock_abacus_state): """GET /payment_batches endpoints.""" ows_payment_client = ows_payment_api_client(basic_headers) payment_group_payment_id = create_payment_group_payment(basic_headers) batch_num_1 = 1 batch_num_2 = 2 # defined in db fixtures payoneer_program_id = 1001 post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num_1, 'payoneer_program_id': payoneer_program_id, } response_post = ows_payment_client.post_payment_group_payment_batch(post_body) assert response_post.status_code == 201 post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num_2, 'payoneer_program_id': payoneer_program_id, } response_post = ows_payment_client.post_payment_group_payment_batch(post_body) assert response_post.status_code == 201 res = ows_payment_client.get_payment_batches_by_payment_id(payment_group_payment_id) assert res.status_code == 200 assert res.json()[0]['payoneer_program_id'] == payoneer_program_id assert res.json()[0]['payment_group_payment_id'] == payment_group_payment_id assert res.json()[0]['batch_num'] == batch_num_1 assert 'action_status' in res.json()[0] assert 'error_message' in res.json()[0] assert 'payment_group_payment_batch_id' in res.json()[0] payment_batch_status = 'failed' res = ows_payment_client.get_payment_batches_by_payment_id_and_status( payment_group_payment_id, payment_batch_status ) assert res.status_code == 200 assert res.json()[0]['payoneer_program_id'] == payoneer_program_id assert res.json()[0]['payment_group_payment_id'] == payment_group_payment_id assert res.json()[0]['batch_num'] == batch_num_2 assert 'action_status' in res.json()[0] assert 'error_message' in res.json()[0] assert 'payment_group_payment_batch_id' in res.json()[0] @pytest.mark.jira('ACC-4590') def test_payment_status_overview( basic_headers, mock_reference_payoneer_program_integration, mock_abacus_state ): """GET /payment_batches endpoints.""" account_id = 123123 contract_id = 123 batch_num = 1 payoneer_program_id = 1001 ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) payment_account_post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': payoneer_program_id, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, payment_account_post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 payment_group_payment_account_id = response_group_payment_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] # noqa: E501 payment_batch_post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num, 'payoneer_program_id': payoneer_program_id, } response_post_payment_batch = ows_payment_client.post_payment_group_payment_batch( payment_batch_post_body ) assert response_post_payment_batch.status_code == 201 payment_group_payment_batch_id = response_post_payment_batch.json()[ 'payment_group_payment_batch_id' ] payment_batch_accounts_post_body = [ { 'payment_group_payment_account_id': payment_group_payment_account_id, 'payment_group_payment_batch_id': payment_group_payment_batch_id, } ] response_group_payment_batch_accounts_bulk = ( ows_payment_client.post_payment_group_payment_batch_account_bulk( payment_batch_accounts_post_body ) ) assert response_group_payment_batch_accounts_bulk.status_code == 201 res = ows_payment_client.get_payment_status_overview(payment_group_payment_id) assert res.status_code == 200 assert res.json() == { 'number_of_canceled_payments': 0, 'number_of_failed_payments': 0, 'number_of_pending_payments': 0, 'number_of_successful_payments': 1, 'number_of_payments_failed_with_batch': 0, 'payment_group_payment_id': 1, } @pytest.mark.jira('ACC-2811') def test_get_payment_group_payment_overview( basic_headers, mock_reference_payoneer_program_integration ): """GET /payment-group-payment/{payment_group_payment_id}/overview .""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) post_body = { 'currency_code': 'USD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'USD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 res_get = ows_payment_client.get_payment_group_payment_overview( payment_group_payment_id ) assert res_get.status_code == 200 assert res_get.json()[0]['currency_code'] == post_body['currency_code'] assert res_get.json()[0]['currency_total'] == post_body['balance_after_tax'] assert res_get.json()[0]['account_count'] == 1 assert res_get.json()[0]['payment_group_payment_id'] == payment_group_payment_id @pytest.mark.jira('ACC-3942') def test_get_payment_group_payment_accounts( basic_headers, mock_reference_payoneer_program_integration ): """GET /payment-group-payment/{payment_group_payment_id}/accounts .""" account_id = 123123 contract_id = 123 ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) post_body = { 'currency_code': 'USD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '100.00', 'currency_code': 'USD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 res_get = ows_payment_client.get_payment_group_payment_accounts( payment_group_payment_id ) assert res_get.status_code == 200 res_body = res_get.json()['items'][0] assert res_body['payment_group_payment_id'] == payment_group_payment_id assert res_body['account_id'] == account_id assert res_body['last_payment'] == post_body['last_payment'] assert res_body['payoneer_program_id'] == post_body['payoneer_program_id'] assert res_body['current_balance'] == post_body['current_balance'] assert res_body['balance_after_tax'] == post_body['balance_after_tax'] assert res_body['currency_code'] == post_body['currency_code'] assert 'current_statement_period_name' in res_body assert 'payment_error_code' in res_body assert 'account_payee_id' in res_body assert 'prior_payment_group_payment_id' in res_body assert 'account_name' in res_body assert 'note' in res_body assert 'percent_difference' in res_body assert 'last_statement_period_name' in res_body assert 'payment_status' in res_body assert 'payoneer_payee_id' in res_body assert 'payment_difference' in res_body assert 'last_statement_period_id' in res_body @pytest.mark.jira('ACC-3792', 'ACC-2433') def test_get_payment_minimums_by_currency(basic_headers, payment_minimum_fixtures): """GET /payment-minimums/by-currency .""" ows_payment_client = ows_payment_api_client(basic_headers) res_get = ows_payment_client.get_payment_minimums_by_currency() assert res_get.status_code == 200 assert len(res_get.json()) > 0 @pytest.mark.jira('TAP-728') def test_post_put_get_delete_payment_contract_advance( basic_headers, drop_fks, mock_exchange_rate, mock_abacus_state ): """POST PUT GET /payment/advance/ .""" account_id = 123123 contract_id = 123 contract_advance_id = 1 create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) create_contract_advance_fixture() ows_payment_client = ows_payment_api_client(basic_headers) post_body = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'integration_tests', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'GBP', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.00', 'is_internal': False, } res_post = ows_payment_client.post_payment_contract_advance( contract_advance_id, post_body ) assert res_post.status_code == 201 worksheet_payment_contract_advance_id = res_post.json()[ 'worksheet_payment_contract_advance_id' ] res_get = ows_payment_client.get_payment_contract_advance( worksheet_payment_contract_advance_id ) assert res_get.status_code == 200 assert res_get.json()['payment_name'] == post_body['payment_name'] assert res_get.json()['contract_advance_id'] == contract_advance_id assert 'worksheet_payment_contract_advance_id' in res_get.json() put_body = {'salesforce_id': '123'} res_put = ows_payment_client.put_payment_contract_advance( worksheet_payment_contract_advance_id, put_body ) assert res_put.status_code == 201 res_get = ows_payment_client.get_payment_contract_advance( worksheet_payment_contract_advance_id ) assert res_get.status_code == 200 assert res_get.json()['salesforce_id'] == put_body['salesforce_id'] res_delete = ows_payment_client.delete_payment_contract_advance( worksheet_payment_contract_advance_id ) assert res_delete.status_code == 204 res_get = ows_payment_client.get_payment_contract_advance( worksheet_payment_contract_advance_id ) assert res_get.status_code == 404 def test_post_worksheet_dataloader( basic_headers, drop_fks, mock_exchange_rate, mock_abacus_state ): """POST /payment/advance/worksheet/dataloader .""" account_id = 123123 contract_id = 123 contract_advance_id = 1 create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) create_contract_advance_fixture() ows_payment_client = ows_payment_api_client(basic_headers) post_body = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'integration_tests', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'GBP', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.00', 'is_internal': True, } res_post = ows_payment_client.post_payment_contract_advance( contract_advance_id, post_body ) assert res_post.status_code == 201 worksheet_payment_contract_advance_id = res_post.json()[ 'worksheet_payment_contract_advance_id' ] absent_worksheet_payment_contract_advance_id = 10 post_body = [ worksheet_payment_contract_advance_id, absent_worksheet_payment_contract_advance_id, ] res_post = ows_payment_client.post_worksheet_dataloader(post_body) assert res_post.status_code == 200 items = res_post.json()['items'] contains_some_value = any( item.get('data', {}).get('worksheet_payment_contract_advance_id') == worksheet_payment_contract_advance_id for item in items ) contains_none_data = any(item.get('data') is None for item in items) assert contains_some_value assert contains_none_data def test_get_delete_worksheet_payable_balance_after_tax_bulk(basic_headers, fresh_db): """DELETE /worksheet-payable-balance-after-tax/event//bulk .""" account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] assert item['contract_id'] == contract_id assert item['account_id'] == account_id assert item['statement_period_id'] == statement_period_id assert item['abacus_event_id'] == event_id res_get = ows_payment_client.get_worksheet_payable_balance_after_tax_by_event( event_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] assert item['contract_id'] == contract_id assert item['account_id'] == account_id assert item['statement_period_id'] == statement_period_id assert item['abacus_event_id'] == event_id res_del = ows_payment_client.delete_worksheet_payable_balance_after_tax_bulk( event_id ) assert res_del.status_code == 204, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 0 res = check_db_field_value( 'worksheet_account_contract_payable_after_tax', 'deleted_by', 'account_id = 123123', ) assert res is not None assert res == 'default_user_id' res_delete = ( ows_payment_client.delete_worksheet_account_contract_closing_balance_bulk( event_id ) ) assert res_delete.status_code == 204 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 assert res_get.json()['total_count'] == 0 assert len(res_get.json()['items']) == 0 def test_post_worksheet_account_contract_payable_details_bulk(basic_headers, fresh_db): """POST /worksheet-account-contract-payable-details/event//statement-period//bulk/""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] worksheet_account_contract_payable_after_tax_id = (item)[ 'worksheet_account_contract_payable_after_tax_id' ] post_body = [ { 'worksheet_account_contract_payable_after_tax_id': worksheet_account_contract_payable_after_tax_id, 'account_id': account_id, 'contract_id': contract_id, 'target_table': 'test_table', 'target_id': 1, 'reference_target_table': 'test_table_2', 'reference_target_id': 1, 'payable_detail_type_id': 1, 'amount_payable': '10.01', 'currency': 'USD', 'notes': 'test_note', } ] res_post = ows_payment_client.post_worksheet_account_contract_payable_details_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201 item = res_post.json()[0] assert 'worksheet_account_contract_payable_after_tax_id' in item assert item['account_id'] == account_id assert item['contract_id'] == contract_id assert item['notes'] == post_body[0]['notes'] assert item['target_table'] == post_body[0]['target_table'] assert item['target_id'] == post_body[0]['target_id'] assert item['amount_payable'] == post_body[0]['amount_payable'] assert item['currency'] == post_body[0]['currency'] assert item['reference_target_table'] == post_body[0]['reference_target_table'] assert item['reference_target_id'] == post_body[0]['reference_target_id'] res_delete = ows_payment_client.delete_worksheet_account_contract_payable_details( event_id ) assert res_delete.status_code == 204 @pytest.mark.skip( reason='Outdated and duplicating functional test without real integration exists' ) @pytest.mark.jira('TAP-1282') def test_get_payment_group_payment_account_credit_data( basic_headers, mock_reference_payoneer_program_integration ): """GET /payment-group-payment-account/{payment_group_payment_account_id}/{payment_type}/credit endpoint.""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] worksheet_account_contract_payable_after_tax_id = (item)[ 'worksheet_account_contract_payable_after_tax_id' ] post_body = [ { 'worksheet_account_contract_payable_after_tax_id': worksheet_account_contract_payable_after_tax_id, 'account_id': account_id, 'contract_id': contract_id, 'target_table': 'test_table', 'target_id': 1, 'reference_target_table': 'test_table_2', 'reference_target_id': 1, 'payable_detail_type_id': 1, 'amount_payable': '10.01', 'currency': 'USD', 'notes': 'test_note', } ] res_post = ows_payment_client.post_worksheet_account_contract_payable_details_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201 post_body = { 'currency_code': 'USD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'USD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 first_item = response_group_payment_accounts_bulk.json()[0] payment_group_payment_account_id = first_item['payment_group_payment_account_id'] # create a test entry in payment_group_payment_account_detail query = """ INSERT INTO payment_group_payment_account_detail ( payment_group_payment_account_id, worksheet_account_contract_payable_after_tax_id, account_id, contract_id, payable_amount_pre_tax, tax_withholding_amount, vat_amount, payable_amount_post_tax, currency_code, created_at, created_by, last_modified, last_modified_by, deleted_at, deleted_by ) VALUES ( {}, {}, {}, {}, 10.00, -2.00, 4.00, 12.00, 'USD', '2024-07-18 12:04:05', 'vz', '2024-07-18 12:04:08', 'vz', null, null ) """.format( payment_group_payment_account_id, worksheet_account_contract_closing_balance_id, account_id, contract_id, ) query_the_db(query) res_get = ows_payment_client.get_payment_group_payment_account_credit_details( payment_group_payment_account_id, 'payment' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '12.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] res_get = ows_payment_client.get_payment_group_payment_account_credit_details( payment_group_payment_account_id, 'wht' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '2.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] res_get = ows_payment_client.get_payment_group_payment_account_credit_details( payment_group_payment_account_id, 'vat' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '-4.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] @pytest.mark.jira('TAP-1281') def test_get_payment_group_payment_batch_debit_details( basic_headers, fresh_db, mock_reference_payoneer_program_integration, mock_abacus_state, ): """GET /payment-group-payment-batch/{payment_group_payment_batch_id}/{payment_type}/debit .""" # noqa account_id = 123123 contract_id = 123 payoneer_program_id = 1001 batch_num = 1 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) payment_account_post_body = { 'currency_code': 'CAD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': payoneer_program_id, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'CAD', } ], } response_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, payment_account_post_body ) ) assert response_payment_accounts_bulk.status_code == 201 payment_batch_post_body = { 'payment_group_payment_id': payment_group_payment_id, 'batch_num': batch_num, 'payoneer_program_id': payoneer_program_id, } response_post_payment_batch = ows_payment_client.post_payment_group_payment_batch( payment_batch_post_body ) assert response_post_payment_batch.status_code == 201 payment_group_payment_account_id = response_payment_accounts_bulk.json()[0][ 'payment_group_payment_account_id' ] # noqa: E501 payment_group_payment_batch_id = response_post_payment_batch.json()[ 'payment_group_payment_batch_id' ] post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] worksheet_account_contract_payable_after_tax_id = (item)[ 'worksheet_account_contract_payable_after_tax_id' ] # create a test entry in payment_group_payment_account_detail query = """ INSERT INTO payment_group_payment_account_detail ( payment_group_payment_account_id, worksheet_account_contract_payable_after_tax_id, account_id, contract_id, payable_amount_pre_tax, tax_withholding_amount, vat_amount, payable_amount_post_tax, currency_code, created_at, created_by, last_modified, last_modified_by, deleted_at, deleted_by ) VALUES ( {}, {}, {}, {}, 10.00, -2.00, 4.00, 12.00, 'USD', '2024-07-18 12:04:05', 'vz', '2024-07-18 12:04:08', 'vz', null, null ) """.format( payment_group_payment_account_id, worksheet_account_contract_payable_after_tax_id, account_id, contract_id, ) query_the_db(query) query = """ INSERT INTO payment_group_payment_batch_account ( payment_group_payment_account_id, payment_group_payment_batch_id, created_by, created_at, last_modified_by, last_modified ) VALUES ( {}, {}, 'vz', '2024-07-19 16:29:14', 'vz', '2024-07-19 16:29:17' )""".format(payment_group_payment_account_id, payment_group_payment_batch_id) query_the_db(query) res_get = ows_payment_client.get_payment_group_payment_batch_debit_details( payment_group_payment_batch_id, 'payment' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '-12.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] res_get = ows_payment_client.get_payment_group_payment_batch_debit_details( payment_group_payment_batch_id, 'wht' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '-2.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] res_get = ows_payment_client.get_payment_group_payment_batch_debit_details( payment_group_payment_batch_id, 'vat' ) assert res_get.status_code == 200 assert res_get.json()[0]['account_id'] == account_id assert res_get.json()[0]['contract_id'] == contract_id assert res_get.json()[0]['amount'] == '4.00' assert 'worksheet_account_contract_payable_after_tax_id' in res_get.json()[0] @pytest.mark.jira('TAP-1218') def test_get_worksheet_account_contract_payable_details_by_period( basic_headers, fresh_db ): # noqa """GET /worksheet-account-contract-payable-details/statement-period/ .""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] worksheet_account_contract_payable_after_tax_id = (item)[ 'worksheet_account_contract_payable_after_tax_id' ] post_body = [ { 'worksheet_account_contract_payable_after_tax_id': worksheet_account_contract_payable_after_tax_id, 'account_id': account_id, 'contract_id': contract_id, 'target_table': 'test_table', 'target_id': 1, 'reference_target_table': 'test_table_2', 'reference_target_id': 1, 'payable_detail_type_id': 1, 'amount_payable': '10.01', 'currency': 'USD', 'notes': 'test_note', } ] res_post = ows_payment_client.post_worksheet_account_contract_payable_details_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201 res_get = ( ows_payment_client.get_worksheet_account_contract_payable_details_by_period( # noqa statement_period_id, None ) ) assert res_get.status_code == 200 item = res_get.json()['items'][0] assert item['account_id'] == account_id assert item['contract_id'] == contract_id assert item['statement_period_id'] == statement_period_id assert ( item['worksheet_account_contract_payable_after_tax_id'] == post_body[0]['worksheet_account_contract_payable_after_tax_id'] ) assert item['amount_payable'] == post_body[0]['amount_payable'] assert item['reference_target_table'] == post_body[0]['reference_target_table'] assert item['target_table'] == post_body[0]['target_table'] assert item['notes'] == post_body[0]['notes'] assert item['currency'] == post_body[0]['currency'] @pytest.mark.jira('TAP-1297', 'TAP-1252') def test_post_get_delete_tax_corrections(basic_headers, fresh_db): """POST, GET, DELETE /tax-corrections/ .""" account_id = 123123 contract_id = 123 create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) statement_period_id = 304 ows_payment_client = ows_payment_api_client(basic_headers) post_body = ( { 'contract_id': contract_id, 'account_id': account_id, 'correction_statement_period_id': statement_period_id, 'payable_detail_type_id': 4, 'amount': 10.00, 'currency_code': 'USD', 'note': 'integration_tests', }, { 'contract_id': contract_id, 'account_id': account_id, 'correction_statement_period_id': statement_period_id, 'payable_detail_type_id': 5, 'amount': 20.00, 'currency_code': 'GBP', 'note': 'integration_tests_2', }, ) res_post = ows_payment_client.post_tax_corrections(post_body) assert res_post.status_code == 201 assert res_post.json()['message'] == 'OK' post_body = { 'filters': { 'correction_statement_period_id': statement_period_id, 'contract_ids': [contract_id], } } res_get = ows_payment_client.get_tax_corrections('wht', 'pending', post_body) assert res_get.status_code == 200 item = res_get.json()['items'][0] assert item['account_id'] == account_id assert item['contract_id'] == contract_id assert item['correction_statement_period_id'] == statement_period_id tax_correction_ids = [item['worksheet_tax_correction_id']] res_get = ows_payment_client.get_tax_corrections('wht', 'pending', post_body) assert res_get.status_code == 200 item = res_get.json()['items'][0] assert item['account_id'] == account_id assert item['contract_id'] == contract_id assert item['correction_statement_period_id'] == statement_period_id tax_correction_ids.append(item['worksheet_tax_correction_id']) delete_body = {'worksheet_tax_correction_ids': tax_correction_ids} res_delete = ows_payment_client.delete_tax_corrections(delete_body) assert res_delete.status_code == 204 correction_types = ['wht', 'vat'] for correction_type in correction_types: res_get = ows_payment_client.get_tax_corrections( correction_type, 'pending', post_body ) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 0 assert res_get.json()['total_count'] == 0 @pytest.mark.jira('TAP-1374') def test_post_worksheet_account_contract_closing_balance_dataloader( basic_headers, fresh_db, mock_reference_payoneer_program_integration ): """POST /worksheet-account-contract-closing-balance/by_payment_account_ids/dataloader .""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) dataloader_post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, dataloader_post_body ) assert res_post.status_code == 201 res_get = ows_payment_client.get_worksheet_account_contract_closing_balance_by_statement_period_id( # noqa statement_period_id, account_ids=[account_id], contract_ids=[contract_id] ) assert res_get.status_code == 200 worksheet_account_contract_closing_balance_id = res_get.json()['items'][0][ 'worksheet_account_contract_closing_balance_id' ] post_body = [ { 'worksheet_account_contract_closing_balance_id': worksheet_account_contract_closing_balance_id, 'account_id': account_id, 'contract_id': contract_id, 'payable_amount_pre_tax': '100.00', 'tax_withholding_amount': '10.00', 'payable_amount_post_tax': '90.00', 'currency_code': 'USD', 'country_of_tax_residence': 'IND', 'country_of_tax_policy': 'USA', } ] res_post = ows_payment_client.post_worksheet_payable_balance_after_tax_bulk( event_id, statement_period_id, post_body ) assert res_post.status_code == 201, res_post.text res_get = ows_payment_client.get_worksheet_payable_balance_after_tax( statement_period_id ) assert res_get.status_code == 200 post_body = { 'currency_code': 'USD', 'current_balance': '1000.00', 'last_payment': '500.00', 'account_id': account_id, 'balance_after_tax': '400.00', 'payoneer_program_id': 100158970, 'contracts_payable': [ { 'contract_id': contract_id, 'current_balance': '1000.00', 'currency_code': 'USD', } ], } response_group_payment_accounts_bulk = ( ows_payment_client.post_payment_group_payment_accounts_bulk( payment_group_payment_id, post_body ) ) assert response_group_payment_accounts_bulk.status_code == 201 first_item = response_group_payment_accounts_bulk.json()[0] payment_group_payment_account_id = first_item['payment_group_payment_account_id'] # create a test entry in payment_group_payment_account_detail query = """ INSERT INTO payment_group_payment_account_detail ( payment_group_payment_account_id, worksheet_account_contract_payable_after_tax_id, account_id, contract_id, payable_amount_pre_tax, tax_withholding_amount, vat_amount, payable_amount_post_tax, currency_code, created_at, created_by, last_modified, last_modified_by, deleted_at, deleted_by ) VALUES ( {}, {}, {}, {}, 42.00, 24.00, 2.00, 4.00, 'USD', '2024-07-18 12:04:05', 'vz', '2024-07-18 12:04:08', 'vz', null, null ) """.format( payment_group_payment_account_id, worksheet_account_contract_closing_balance_id, account_id, contract_id, ) query_the_db(query) res_post = ( ows_payment_client.post_worksheet_account_contract_closing_balance_dataloader( [payment_group_payment_account_id] ) ) assert res_post.status_code == 200 item = res_post.json()['items'][0]['data'] assert item['abacus_event_id'] == event_id assert item['account_id'] == account_id assert item['statement_period_id'] == statement_period_id assert item['amount'] == dataloader_post_body[0]['amount'] assert ( item['includes_tax_adjustments'] == dataloader_post_body[0]['includes_tax_adjustments'] ) @pytest.mark.jira('TAP-1400') def test_post_taxable_revenue_copy(basic_headers, fresh_db): """POST /worksheet-account-contract-closing-balance/event/{event_id}/taxable-revenue/copy/ .""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) rowcount = get_table_row_count('worksheet_account_contract_taxable_revenue') assert rowcount == 0 post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'amount': '100.00', 'ledger_account_contract_id': 1, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_bulk( event_id, statement_period_id, 1, post_body ) assert res_post.status_code == 201 res_post = ows_payment_client.post_worksheet_account_contract_closing_balance_taxable_revenue_copy( event_id ) assert res_post.status_code == 201 assert res_post.json()['message'] == 'OK' rowcount = get_table_row_count('worksheet_account_contract_taxable_revenue') assert rowcount > 0 @pytest.mark.jira('TAP-1402', 'TAP-1406', 'TAP-1425') def test_post_worksheet_account_contract_taxable_revenue_bulk(basic_headers, fresh_db): """POST /worksheet-account-contract-taxable-revenue/event//bulk/ .""" # noqa account_id = 123123 contract_id = 123 statement_period_id = 304 event_id = 1 # created in create_abacus_event ows_payment_client = ows_payment_api_client(basic_headers) create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) payment_group_payment_id = create_payment_group_payment(basic_headers) create_abacus_event(statement_period_id, payment_group_payment_id) create_ledger_account_contract(event_id, account_id, contract_id) res_get = ows_payment_client.get_taxable_revenue_by_statement_period_id( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 0 assert res_get.json()['total_count'] == 0 post_body = [ { 'account_id': account_id, 'contract_id': contract_id, 'statement_period_id': statement_period_id, 'reference_payment_entity_id': 1, 'amount': '20.00', 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', } ] res_post = ows_payment_client.post_worksheet_account_contract_taxable_revenue_bulk( event_id, post_body ) assert res_post.status_code == 201 assert res_post.json()['message'] == 'OK' res_get = ows_payment_client.get_taxable_revenue_by_statement_period_id( statement_period_id ) assert res_get.status_code == 200 item = res_get.json()['items'][0] assert item['amount'] == post_body[0]['amount'] assert item['account_id'] == post_body[0]['account_id'] assert item['contract_id'] == post_body[0]['contract_id'] assert item['is_us_revenue'] == post_body[0]['is_us_revenue'] assert item['revenue_transaction_type'] == post_body[0]['revenue_transaction_type'] res_delete = ows_payment_client.delete_taxable_revenue_by_event_id(event_id) assert res_delete.status_code == 204 res_get = ows_payment_client.get_taxable_revenue_by_statement_period_id( statement_period_id ) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 0 assert res_get.json()['total_count'] == 0 @pytest.mark.jira('TAP-1467') def test_post_get_delete_tax_corrections_vat(basic_headers, fresh_db): """POST GET DELETE /tax-corrections/vat/... .""" account_id = 123123 contract_id = 123 statement_period_id = 304 create_account(basic_headers, account_id) create_contract_fixture(account_id, contract_id) ows_payment_client = ows_payment_api_client(basic_headers) post_body = [ { 'payable_detail_type_id': 5, 'account_id': account_id, 'contract_id': contract_id, 'correction_statement_period_id': statement_period_id, 'base_amount_payee_currency': 10.00, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'vat_rate': 10.00, 'vat_amount_payee_currency': 10.00, 'vat_amount_vat_currency': 10.00, 'net_amount_payee_currency': 10.00, 'note': 'test note 1', } ] res_post = ows_payment_client.post_tax_corrections_vat_bulk(post_body) assert res_post.status_code == 201 assert res_post.json()['message'] == 'OK' body = { 'filters': { 'correction_statement_period_id': statement_period_id, 'contract_ids': [contract_id], } } params = {'limit': 1, 'offset': 0} res_get = ows_payment_client.get_tax_corrections_vat_list('pending', body, params) assert res_get.status_code == 200 assert len(res_get.json()['items']) > 0 item = res_get.json()['items'][0] assert item['account_id'] == account_id assert item['contract_id'] == contract_id assert item['note'] == post_body[0]['note'] worksheet_tax_correction_vat_id = item['worksheet_tax_correction_vat_id'] post_body = {'worksheet_tax_correction_vat_ids': [worksheet_tax_correction_vat_id]} res_delete = ows_payment_client.delete_tax_corrections_vat_list(post_body) assert res_delete.status_code == 204 body = { 'filters': { 'correction_statement_period_id': statement_period_id, 'contract_ids': [contract_id], } } params = {'limit': 1, 'offset': 0} res_get = ows_payment_client.get_tax_corrections_vat_list('pending', body, params) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 0