"""Royalty Accounting Processor. Event: commit_adjustment Action: Create ledger entries from the results of an accounting run. """ from snowflake_connector.etl_connector import SnowflakeSQLExecutor from commit_adjustment.config import SNOWFLAKE_CONFIG from commit_adjustment.logging import app_logger from commit_adjustment.payee_ledger_processor import PayeeLedgerProcessor from commit_adjustment.template import get_formatted_query class CommitAdjustmentProcessor: """commit_adjustment event processor.""" GET_PAYEE_PERIOD_ADJUSTMENTS_SQL = """ SELECT DISTINCT PAYEE_ID FROM $db.$schema.ACCOUNTING_RUN_ADJUSTMENTS WHERE ACCOUNTING_RUN_ID = $accounting_run_id """ def __init__(self, event): """Init action.""" self._entries = [] self._event = event app_logger.info('Starting adjustments processor for accounting run {}'.format( self._event.get('target_id'))) def process(self): """Process the event.""" payee_ids = self.get_distinct_payees_for_accounting_run() payee_count = len(payee_ids) app_logger.info(f'Starting ledger entry creation for {payee_count} payees') current_index = 0 with SnowflakeSQLExecutor(SNOWFLAKE_CONFIG) as sf_executor: for payee_id in payee_ids: current_index += 1 app_logger.info( f'Processing payee {payee_id}; {current_index} of {payee_count}') self.generate_ledger_items(payee_id, sf_executor) app_logger.debug(f'Finished ledger entry creation for payee {payee_id}') app_logger.info('Stopping royalties processor') def get_distinct_payees_for_accounting_run(self): """Get a list of the accounting run's payee ids.""" payee_ids = [] template_parameters = { 'accounting_run_id': str(int(self._event.get('target_id'))) } sql = get_formatted_query( self.GET_PAYEE_PERIOD_ADJUSTMENTS_SQL, template_parameters ) with SnowflakeSQLExecutor(SNOWFLAKE_CONFIG) as sf_executor: for row in sf_executor.fetchall(sql, dict_cursor=True): payee_ids.append(row['PAYEE_ID']) return payee_ids def generate_ledger_items(self, payee_id, sf_executor): """Generate all ledger items.""" payee_processor = PayeeLedgerProcessor(payee_id, self._event, sf_executor) payee_processor.process()