'''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) payments_df['symbols'] = '' payments_df['types'] = '' payments_df.loc[payments_df['symbols'] == '', 'symbols'] = 401 payments_df.loc[payments_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT' self._calculate_payment_attributes(payments_df, mentor_names=mentor_names, day_slice=day_slice) return payments_df 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) income_df['symbols'] = '' income_df['types'] = '' income_df.loc[income_df['symbols'] == '', 'symbols'] = 411.01 income_df.loc[income_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT' self._calculate_payment_attributes(income_df, mentor_names, day_slice=day_slice) return income_df 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) df.loc[df['Transaction details'].str.lower().str.startswith('comision'), 'symbols'] = 627 df.loc[df['Transaction details'].str.lower().str.startswith('abonament'), 'symbols'] = 627 # df.loc[df['Transaction details'].str.lower().str.startswith('inchidere depozit'), 'symbols'] = 508.01 df.loc[df['symbols'] == 627, 'types'] = 'DIRECT PE CHELTUIELI' df.loc[df['Transaction details'].str.lower().str.startswith('dobanda'), 'symbols'] = 766 # df.loc[df['Transaction details'].str.lower().str.startswith('alimentare cont depozit'), 'symbols'] = 508.01 df.loc[df['symbols'] == 766, 'types'] = 'DIRECT PE VENITURI' # df.loc[df['symbols'] == 508.01, 'types'] = direction 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 = [] symbols = [] types = [] 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 for day in days: acc_symbol = df.loc[df['day'] == day, 'symbols'].tolist() symbols.append(acc_symbol) self.symbol_list = {k: v for k, v in zip(days, symbols)} for day in days: type_ = df.loc[df['day'] == day, 'types'].tolist() types.append(type_) self.type_list = {k: v for k, v in zip(days, types)} self.unique_count = unique_count def to_dict(self, kind: str, month_back: int, std_client: str, acc_symbol: int|float): 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': self.symbol_list, 'std_client': std_client, 'obs': self.obs_dict, 'represents': self.type_list } return data