'''Created 15 Jun 2023 Levi''' from datetime import date import pandas as pd import csv import os import shutil from pymt940.utils import (get_partners, re_check_otp, dig_it, get_last_month) class PaymentsProcessorOtp: def __init__(self, csv_path, partner_data, account_name=None, account_number=None, currency=None, account_location=None, account_agency=None, account_symbol=None): self.csv_path = csv_path self.partner_data = partner_data self._account_name = account_name self._account_number = account_number self._currency = currency self._account_location = account_location self._account_agency = account_agency self._account_symbol = account_symbol self.trans_dict = None self.names_dict = None self.obs_dict = None self.counts = None self.doc_list = None self.unique_count = None self.fiscal_code_dict = None self.days = None @property def account_name(self): return self._account_name @account_name.setter def account_name(self, value): self._account_name = value @property def account_number(self): return self._account_number @account_number.setter def account_number(self, value): self._account_number = value @property def currency(self): return self._currency @currency.setter def currency(self, value): self._currency = value @property def account_location(self): return self._account_location @account_location.setter def account_location(self, value): self._account_location = value @property def account_agency(self): return self._account_agency @account_agency.setter def account_agency(self, value): self._account_agency = value @property def account_symbol(self): return self._account_symbol @account_symbol.setter def account_symbol(self, value): self._account_symbol = value def process_payment_data(self, day_slice=(0, 2)): df_dict = get_partners(self.partner_data) fiscal_codes = df_dict['CodFiscal'] mentor_names = df_dict['Denumire'] self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)} empty_row_index = -1 with open(self.csv_path, 'r') as csvfile: reader = csv.reader(csvfile) for i, row in enumerate(reader): if all(not cell or cell.isspace() for cell in row): empty_row_index = i break # Temporary file to hold the non-empty rows temp_file_path = os.path.join(os.path.expanduser('~'), self.csv_path) # '/home/deeejas/Documents/temp.csv' with open(self.csv_path, 'r') as csvfile, open(temp_file_path, 'w', newline='') as temp_csv: reader = csv.reader(csvfile) writer = csv.writer(temp_csv) for i, row in enumerate(reader): if i >= empty_row_index: break writer.writerow(row) # Overwrite the original file by renaming the temp file shutil.move(temp_file_path, self.csv_path) payments_df = pd.read_csv(self.csv_path, keep_default_na=False) payments_df = payments_df.iloc[1:] payments_df = payments_df.loc[(payments_df['Suma Debit'] != '') & (payments_df['Suma Debit'] != '0.00')] # print(payments_df['Suma Debit']) payments_df['Amount'] = payments_df['Suma Debit'].map(str).apply(dig_it).map(abs) self._calculate_payment_attributes(payments_df, mentor_names=mentor_names, day_slice=day_slice) def process_income_data(self, day_slice=(0, 2)): df_dict = get_partners(self.partner_data) fiscal_codes = df_dict['CodFiscal'] mentor_names = df_dict['Denumire'] self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)} empty_row_index = -1 with open(self.csv_path, 'r') as csvfile: reader = csv.reader(csvfile) for i, row in enumerate(reader): if all(not cell or cell.isspace() for cell in row): empty_row_index = i break # Temporary file to hold the non-empty rows temp_file_path = os.path.join(os.path.expanduser('~'), self.csv_path) # '/home/deeejas/Documents/temp.csv' with open(self.csv_path, 'r') as csvfile, open(temp_file_path, 'w', newline='') as temp_csv: reader = csv.reader(csvfile) writer = csv.writer(temp_csv) for i, row in enumerate(reader): if i >= empty_row_index: break writer.writerow(row) # Overwrite the original file by renaming the temp file shutil.move(temp_file_path, self.csv_path) income_df = pd.read_csv(self.csv_path, keep_default_na=False) income_df = income_df.iloc[1:] # income_df['Credit'].replace(' ', '', regex=True, inplace=True) # income_df['Debit'].replace(' ', '', regex=True, inplace=True) income_df = income_df.loc[(income_df['Suma Credit'] != '') & (income_df['Suma Credit'] != 0.00)] # print(income_df['Suma Credit']) income_df['Amount'] = income_df['Suma Credit'].map(str).apply(dig_it) self._calculate_payment_attributes(income_df, mentor_names, day_slice=day_slice) def _calculate_payment_attributes(self, df, mentor_names, day_slice=(0, 2)): # df['Amount'] = df['Credit'].map(str).apply(dig_it).map(abs) df['Name'] = df['Explicatie'].apply(re_check_otp) names = [name for name in df['Name'] if name != ''] for name2 in names: index_ = name2.count(' ') # nname = name2 # ' '.join(name2.split()[:index_]).upper() # print(name2) for name in mentor_names: # index_ = name.count(' ') if len(' '.join(name.split()[:index_]).upper()) < 3: index_ = 2 elif len(' '.join(name.split()[:index_]).upper()) < 2: index_ = 1 if ' '.join(name2.split()[:index_]).upper() in name.upper(): # print(name) for index, row in df.iterrows(): if row['Name'] == name2: df.loc[index, 'Name'] = name df['Transaction details'] = df['Explicatie'] df['day'] = df['Data op.'].str.slice(*day_slice) unique_count = df['day'].nunique() self.doc_list = list(range(1, unique_count + 1)) days = df['day'].unique().tolist() self.days = days trans = [] cl_names = [] obs = [] counts = [] for day in days: values = df.loc[df['day'] == day, 'Amount'].tolist() trans.append(values) self.trans_dict = {k: v for k, v in zip(days, trans)} for day in days: values = df.loc[df['day'] == day, 'Name'].tolist() for i in range(len(values)): if values[i] not in mentor_names: values[i] = '' cl_names.append(values) self.names_dict = {k: v for k, v in zip(days, cl_names)} # print(self.names_dict) for day in days: values = df.loc[df['day'] == day, 'Transaction details'].tolist() obs.append(values) self.obs_dict = {k: v for k, v in zip(days, obs)} for day in days: value_counts = df['day'].value_counts() count_of_value = value_counts[day] counts.append(count_of_value) self.counts = counts self.unique_count = unique_count def to_dict(self, kind: str, month_back: int, std_client: str, acc_symbol: int): kinds = ['TotalIncasari', 'TotalPlati'] if kind not in kinds: raise TypeError(f'type not in {kinds}') else: data = {'AnLucru': date.today().year, 'LunaLucru': get_last_month(month_back), 'TotalDocumente': self.unique_count, 'documents': self.doc_list, 'AccountName': self.account_name, 'AccountSymbol': self.account_symbol, 'AccountNumber': self.account_number, 'AccountLocation': self.account_location, 'AccountAgencyLocation': self.account_agency, 'Currency': self.currency, 'days': self.days, kind: self.counts, 'incasari': self.counts, 'clients': self.names_dict, 'cods': self.fiscal_code_dict, 'amount': self.trans_dict, 'cont': acc_symbol, 'std_client': std_client, 'obs': self.obs_dict } return data