"""Hold or unhold payments processor.""" from csv import DictReader import datetime import config from config import app_logger as logger from src.connectors import ows_abacus_account from src.models import PaymentHold, PaymentHoldInput from src.processors.base import Processor from src.processors.exceptions import ProcessingError class PaymentHoldProcessor(Processor): """ Processor to hold payments. Expects the CSV file with the following columns: - account_id (int) The first row could be a header or not. """ is_on_hold = True _data: list[PaymentHold] def process(self) -> None: """Run main logic.""" self._load_data() self._create_or_update_payment_holds() def _load_data(self) -> None: """Load data from file.""" logger.info('Loading data from csv file') try: reader = DictReader( self._input_file_buffer, fieldnames=('account_id', 'reason') ) raw_data = list(reader) if raw_data and not raw_data[0]['account_id'].isnumeric(): raw_data = raw_data[1:] except Exception as e: raise ProcessingError(f'Unable to read the file: {e}') try: self._raw_data = PaymentHoldInput.list_validate( raw_data # type: ignore ) self._data = [ PaymentHold( account_id=row.account_id, is_on_hold=self.is_on_hold, start_date=datetime.date.today(), reason=row.reason, created_by=config.APPLICATION_NAME, last_modified_by=config.APPLICATION_NAME, ) for row in self._raw_data ] except Exception as e: raise ProcessingError(f'Invalid file content: {e}') if not self._data: raise ProcessingError('No items in file to post') logger.info(f'Loaded {len(self._data)} items.') def _create_or_update_payment_holds(self) -> None: """Create or update payment holds via the ows-abacus-account.""" for item in self._data: ows_abacus_account.create_or_update_payment_hold(item) class PaymentUnholdProcessor(PaymentHoldProcessor): is_on_hold = False