"""Tests for the neighbouring rights perfomer revenue report generation.""" from decimal import Decimal from os import path from unittest.mock import patch import config from src.documents import neighbouring_rights_performer_revenue from src.utils.constants import CONTRIBUTOR_ONLY_SCHEDULE_MSG HEADERS = [ 'Statement', 'Contract ID', 'Contracting Party', 'Contributor Name', 'ISRC', 'Recording Title', 'Recording Version', 'Recording Artist', 'Collection Society', 'Country', 'Transaction Type', 'Transaction Subtype', 'Usage Start Date', 'Usage End Date', 'Pre-WHT Amount', 'WHT Amount', 'Gross Revenue', 'Client Share %', 'Commission', 'Net Revenue', 'Currency', 'Schedule Name', 'Royalty Type', 'Original Statement Period', ] def test_process_row(account_fixture): """Test processing a fact_sales row.""" input_row = { 'ABACUS_SALE_TYPE': 'royalty', 'ACCOUNT_PAYEE_CURRENCY': 'SEK', 'CONTRACT_ID': 'AGR653111', 'SCHEDULE_NAME': 'NRS9861 - Schedule One - Soon, Joshua Paul', 'CONTRIBUTOR_NAME': 'Schmidt, Jon Richard', 'COUNTRYNAME': 'Lithuania', 'END_DATE': '30/06/2021', 'GROSS_REVENUE_AFTER_WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('17.127'), 'GROSS_REVENUE_PAYEE_CURRENCY': Decimal('19.457'), 'ISRC': 'USQX91201619', 'MAIN_ARTIST': 'The Piano Guys', 'NET_SHARE_PAYEE_CURRENCY': Decimal(15), 'ORIGINAL_STATEMENT_PERIOD': 'June 2021', 'ROYALTY_RATE': Decimal(90), 'SOUND_RECORDING_NAME': 'Over the Rainbow / Simple Gifts', 'START_DATE': '01/01/2021', 'STATEMENT_PERIOD_NAME': 'Test Period', 'CUSTOMER_NAME': 'AGATA', 'TRANSACTION_SUBTYPE_DESCRIPTION': 'Adjustment', 'TRANSACTIONTYPEDESC': 'Public Performance', 'VERSION': 'Radio edit', 'WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('0.000000000000'), 'TERM_TYPE': 'contribution_schedule', 'CONTRACT_TERM_NAME': 'Legacy contract term schedule', } expected = [ 'Test Period', # Statement 'AGR653111', # Contract ID account_fixture['account_name'], # Contracting Party 'Schmidt, Jon Richard', # Contributor Name 'USQX91201619', # ISRC 'Over the Rainbow / Simple Gifts', # Recording Title 'Radio edit', # Recording Version 'The Piano Guys', # Recording Artist 'AGATA', # Source CMO 'Lithuania', # Country 'Public Performance', # Transaction Type 'Adjustment', # Transaction Subtype '01/01/2021', # Usage Start Date '30/06/2021', # Usage End Date Decimal('19.457'), # Pre-WHT Amount 0, # WHT Amount Decimal('17.127'), # Gross Amount Decimal(90), # Client Share Decimal('17.127') - Decimal(15), # Commission Decimal(15), # Net Revenue 'SEK', # Currency 'NRS9861 - Schedule One - Soon, Joshua Paul', # Schedule Name 'royalty', # Royalty Type 'June 2021', # Original Statement Period ] result = neighbouring_rights_performer_revenue._process_row(input_row, account_fixture) assert result == expected def test_process_row_contributor(account_fixture): """Test processing a fact_sales row if contract term is contributor.""" input_row = { 'ABACUS_SALE_TYPE': 'royalty', 'ACCOUNT_PAYEE_CURRENCY': 'SEK', 'CONTRACT_ID': 'AGR653111', 'SCHEDULE_NAME': 'NRS9861 - Schedule One - Soon, Joshua Paul', 'CONTRIBUTOR_NAME': 'Schmidt, Jon Richard', 'COUNTRYNAME': 'Lithuania', 'END_DATE': '30/06/2021', 'GROSS_REVENUE_AFTER_WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('17.127'), 'GROSS_REVENUE_PAYEE_CURRENCY': Decimal('19.457'), 'ISRC': 'USQX91201619', 'MAIN_ARTIST': 'The Piano Guys', 'NET_SHARE_PAYEE_CURRENCY': Decimal(15), 'ORIGINAL_STATEMENT_PERIOD': 'June 2021', 'ROYALTY_RATE': Decimal(90), 'SOUND_RECORDING_NAME': 'Over the Rainbow / Simple Gifts', 'START_DATE': '01/01/2021', 'STATEMENT_PERIOD_NAME': 'Test Period', 'CUSTOMER_NAME': 'AGATA', 'TRANSACTION_SUBTYPE_DESCRIPTION': 'Adjustment', 'TRANSACTIONTYPEDESC': 'Public Performance', 'VERSION': 'Radio edit', 'WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('0.000000000000'), 'TERM_TYPE': 'contributor_schedule', 'CONTRACT_TERM_NAME': 'Legacy contract term schedule', } expected = [ 'Test Period', # Statement 'AGR653111', # Contract ID account_fixture['account_name'], # Contracting Party 'Schmidt, Jon Richard', # Contributor Name 'USQX91201619', # ISRC 'Over the Rainbow / Simple Gifts', # Recording Title 'Radio edit', # Recording Version 'The Piano Guys', # Recording Artist 'AGATA', # Source CMO 'Lithuania', # Country 'Public Performance', # Transaction Type 'Adjustment', # Transaction Subtype '01/01/2021', # Usage Start Date '30/06/2021', # Usage End Date Decimal('19.457'), # Pre-WHT Amount 0, # WHT Amount Decimal('17.127'), # Gross Amount Decimal(90), # Client Share Decimal('17.127') - Decimal(15), # Commission Decimal(15), # Net Revenue 'SEK', # Currency CONTRIBUTOR_ONLY_SCHEDULE_MSG, # Schedule Name 'royalty', # Royalty Type 'June 2021', # Original Statement Period ] result = neighbouring_rights_performer_revenue._process_row(input_row, account_fixture) assert result == expected def test_process_row_no_schedule(account_fixture): """Test processing a row if there is no schedule.""" input_row = { 'ABACUS_SALE_TYPE': 'royalty', 'ACCOUNT_PAYEE_CURRENCY': 'SEK', 'CONTRACT_ID': 'AGR653111', 'SCHEDULE_NAME': None, 'CONTRIBUTOR_NAME': 'Schmidt, Jon Richard', 'COUNTRYNAME': 'Lithuania', 'END_DATE': '30/06/2021', 'GROSS_REVENUE_AFTER_WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('17.127'), 'GROSS_REVENUE_PAYEE_CURRENCY': Decimal('19.457'), 'ISRC': 'USQX91201619', 'MAIN_ARTIST': 'The Piano Guys', 'NET_SHARE_PAYEE_CURRENCY': Decimal(15), 'ORIGINAL_STATEMENT_PERIOD': 'June 2021', 'ROYALTY_RATE': Decimal(90), 'SOUND_RECORDING_NAME': 'Over the Rainbow / Simple Gifts', 'START_DATE': '01/01/2021', 'STATEMENT_PERIOD_NAME': 'Test Period', 'CUSTOMER_NAME': 'AGATA', 'TRANSACTION_SUBTYPE_DESCRIPTION': 'Adjustment', 'TRANSACTIONTYPEDESC': 'Public Performance', 'VERSION': 'Radio edit', 'WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('0.000000000000'), 'TERM_TYPE': 'contribution_schedule', 'CONTRACT_TERM_NAME': 'Legacy contract term schedule', } expected = [ 'Test Period', # Statement 'AGR653111', # Contract ID account_fixture['account_name'], # Contracting Party 'Schmidt, Jon Richard', # Contributor Name 'USQX91201619', # ISRC 'Over the Rainbow / Simple Gifts', # Recording Title 'Radio edit', # Recording Version 'The Piano Guys', # Recording Artist 'AGATA', # Source CMO 'Lithuania', # Country 'Public Performance', # Transaction Type 'Adjustment', # Transaction Subtype '01/01/2021', # Usage Start Date '30/06/2021', # Usage End Date Decimal('19.457'), # Pre-WHT Amount 0, # WHT Amount Decimal('17.127'), # Gross Amount Decimal(90), # Client Share Decimal('17.127') - Decimal(15), # Commission Decimal(15), # Net Revenue 'SEK', # Currency 'Legacy contract term schedule', # Schedule Name 'royalty', # Royalty Type 'June 2021', # Original Statement Period ] result = neighbouring_rights_performer_revenue._process_row(input_row, account_fixture) assert result == expected def test_process_row_contribution(account_fixture): """Test processing a row if it is a legacy contribution term type.""" input_row = { 'ABACUS_SALE_TYPE': 'royalty', 'ACCOUNT_PAYEE_CURRENCY': 'SEK', 'CONTRACT_ID': 'AGR653111', 'SCHEDULE_NAME': 'Who care', 'CONTRIBUTOR_NAME': 'Schmidt, Jon Richard', 'COUNTRYNAME': 'Lithuania', 'END_DATE': '30/06/2021', 'GROSS_REVENUE_AFTER_WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('17.127'), 'GROSS_REVENUE_PAYEE_CURRENCY': Decimal('19.457'), 'ISRC': 'USQX91201619', 'MAIN_ARTIST': 'The Piano Guys', 'NET_SHARE_PAYEE_CURRENCY': Decimal(15), 'ORIGINAL_STATEMENT_PERIOD': 'June 2021', 'ROYALTY_RATE': Decimal(90), 'SOUND_RECORDING_NAME': 'Over the Rainbow / Simple Gifts', 'START_DATE': '01/01/2021', 'STATEMENT_PERIOD_NAME': 'Test Period', 'CUSTOMER_NAME': 'AGATA', 'TRANSACTION_SUBTYPE_DESCRIPTION': 'Adjustment', 'TRANSACTIONTYPEDESC': 'Public Performance', 'VERSION': 'Radio edit', 'WITHHOLDING_TAX_PAYEE_CURRENCY': Decimal('0.000000000000'), 'TERM_TYPE': 'contribution', 'CONTRACT_TERM_NAME': 'Legacy contract term schedule', } expected = [ 'Test Period', # Statement 'AGR653111', # Contract ID account_fixture['account_name'], # Contracting Party 'Schmidt, Jon Richard', # Contributor Name 'USQX91201619', # ISRC 'Over the Rainbow / Simple Gifts', # Recording Title 'Radio edit', # Recording Version 'The Piano Guys', # Recording Artist 'AGATA', # Source CMO 'Lithuania', # Country 'Public Performance', # Transaction Type 'Adjustment', # Transaction Subtype '01/01/2021', # Usage Start Date '30/06/2021', # Usage End Date Decimal('19.457'), # Pre-WHT Amount 0, # WHT Amount Decimal('17.127'), # Gross Amount Decimal(90), # Client Share Decimal('17.127') - Decimal(15), # Commission Decimal(15), # Net Revenue 'SEK', # Currency 'Legacy contract term schedule', # Schedule Name 'royalty', # Royalty Type 'June 2021', # Original Statement Period ] result = neighbouring_rights_performer_revenue._process_row(input_row, account_fixture) assert result == expected @patch('src.documents.neighbouring_rights_performer_revenue.create_report_file') @patch('src.documents.neighbouring_rights_performer_revenue.OwsAbacusAccount.get_account') @patch('src.documents.neighbouring_rights_performer_revenue.snowflake') @patch('src.documents.neighbouring_rights_performer_revenue.OwsRoyalties.get_statement_period') def test_build_document( get_statement_period_mock, snowflake_mock, get_account_mock, create_report_file_mock, account_fixture, statement_period_fixture, ): """Test building a revnue detail report.""" account_id = 24601 contract_id = 20001 statement_period_id = 123 expected = path.join( config.FILE_OUTPUT_PATH, 'Jeans_Nest_20001_July_2022_nr_revenue_details.csv' ) get_account_mock.return_value = account_fixture get_statement_period_mock.return_value = statement_period_fixture snowflake_mock.get_neighbouring_rights_performer_fact_sales.return_value = ([1, 2, 3], 3) create_report_file_mock.return_value = expected result = neighbouring_rights_performer_revenue.build_document( account_id, contract_id, statement_period_id ) assert result == expected create_report_file_mock.assert_called_once() assert create_report_file_mock.call_args.args[0] == HEADERS assert create_report_file_mock.call_args.args[1] == [1, 2, 3] assert create_report_file_mock.call_args.args[2] == 3 assert create_report_file_mock.call_args.args[3] == expected