"""Post tax corrections processor.""" import typing from config import app_logger as logger from src.connectors import ows_abacus_account, ows_payee from src.connectors.exceptions import OwsPayeeException from src.models import PayeeDetails from src.processors.banking_details import utils from src.processors.base import Processor from src.processors.exceptions import ProcessingError class PostBankingDetailsProcessor(Processor): """ Processor to post payee`s banking details info. Expects the CSV file with the following columns: - vendorId (str) - payeeType (str) - firstName (str) - lastName (str) - dateOfBirth (str) - email (str) - companyName (str) - address1 (str) - address2 (str) - city (str) - state (str) - country (str) - postal_code (str) - bankAccountType (str) - bankCountry (str) - currency (str) - BankName (str) - OtherBankName (str) - AccountName (str) - AccountNumber (str) - Swift (str) - IBAN (str) - AccountType (str) - OtherAccountType (str) - RoutingNumber (str) - SortCode (str) - BIC (str) - BankNumber (str) - AccountNameEnglish (str) - BIN (str) - PassportNumber (str) - StorefrontURL (str) - State (str) - IdNumber (str) - BankCode (str) - BSB (str) - IdType (str) - AccountTaxNumber (str) - BranchName (str) - AccountHolderCitizenship (str) - CityCode (str) - BranchCode (str) - Address (str) - Suffix (str) - CNIC (str) - IncorporationNumber (str) - ForeignIDNumber (str) - TIN (str) - ProvinceCode (str) - SNIC (str) - CardorAccount (str) - CardNumber (str) The first row is a header. """ _data: typing.List[PayeeDetails] def process(self) -> None: """Run main logic.""" self._load_data() self._post_banking_details() def _load_data(self) -> None: """Load data from file.""" logger.info('Loading data from csv file') self._data = [] try: raw_data = list(self.csv_dict_reader) except Exception as e: raise ProcessingError(f'Unable to read the file: {e}') account_ids = [row['vendorId'] for row in raw_data] account_payees = ows_abacus_account.get_payees_by_accounts(account_ids) for record in raw_data: account_id = record.get('vendorId') try: if account_id is None: raise ValueError('Vendor ID is not specified') account_payee_id = account_payees.get(int(account_id)) if account_payee_id is None: raise ValueError( f'AccountPayee with account_id {account_id} not found.' ) bank_details = utils.map_to_banking_details(record, account_payee_id) self._data.append(bank_details) except ValueError as e: error_message = f'Got error during mapping {account_id} to banking details object: {e}' self._add_log(error_message) if not self._data: raise ProcessingError('No items in file to post') logger.info(f'Loaded {len(self._data)} items.') def _post_banking_details(self) -> None: """Post banking_details via the ows-payee.""" logger.info('Saving banking details.') for payee_details in self._data: try: ows_payee.save_bank_details(payee_details) except OwsPayeeException as e: self._add_log(str(e))