CSV2MentorBrd.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. '''Created 15 Jun 2023 Levi'''
  2. import zipfile
  3. import os
  4. from datetime import date
  5. import pandas as pd
  6. from pymt940.utils import (get_partners, dig_it, get_last_month)
  7. class PaymentsProcessorBrd:
  8. def __init__(self, csv_path, partner_data, account_name=None, account_number=None,
  9. currency=None, account_location=None, account_agency=None, account_symbol=None):
  10. self.csv_path = csv_path
  11. self.partner_data = partner_data
  12. self._account_name = account_name
  13. self._account_number = account_number
  14. self._currency = currency
  15. self._account_location = account_location
  16. self._account_agency = account_agency
  17. self._account_symbol = account_symbol
  18. self.trans_dict = None
  19. self.names_dict = None
  20. self.obs_dict = None
  21. self.counts = None
  22. self.doc_list = None
  23. self.unique_count = None
  24. self.fiscal_code_dict = None
  25. self.days = None
  26. self.columns = ['Banca', 'Cont', 'ID1', 'Data extras', 'Moneda', 'Total debit', 'Total credit',
  27. 'Data inregistrarii', 'Data valutei', 'Suma', 'tip', 'Referinta client',
  28. 'BLANK1', 'Detalii', 'BLANK2', 'BLANK3', 'Banca parteber', 'Cod parteber', 'Partener',
  29. 'ID6', 'Referinta interna', 'Detalii2', 'Referinta banca', 'Blank4', 'Blank5', 'Blank6',
  30. 'Blank7', 'Iban partener']
  31. @property
  32. def account_name(self):
  33. return self._account_name
  34. @account_name.setter
  35. def account_name(self, value):
  36. self._account_name = value
  37. @property
  38. def account_number(self):
  39. return self._account_number
  40. @account_number.setter
  41. def account_number(self, value):
  42. self._account_number = value
  43. @property
  44. def currency(self):
  45. return self._currency
  46. @currency.setter
  47. def currency(self, value):
  48. self._currency = value
  49. @property
  50. def account_location(self):
  51. return self._account_location
  52. @account_location.setter
  53. def account_location(self, value):
  54. self._account_location = value
  55. @property
  56. def account_agency(self):
  57. return self._account_agency
  58. @account_agency.setter
  59. def account_agency(self, value):
  60. self._account_agency = value
  61. @property
  62. def account_symbol(self):
  63. return self._account_symbol
  64. @account_symbol.setter
  65. def account_symbol(self, value):
  66. self._account_symbol = value
  67. def _concat_dfs(self):
  68. with zipfile.ZipFile(self.csv_path, 'r') as zip_ref:
  69. csv_files = [file for file in zip_ref.namelist() if file.endswith('.csv'.upper())]
  70. print(csv_files)
  71. dir_ = self.csv_path.split(sep='\\')[:-1]
  72. # print(dir_)
  73. dir_ = os.path.join(*dir_)
  74. _extracted_files = zip_ref.extractall(path='C:/' + dir_[2:])
  75. dfs = []
  76. for csv_file in csv_files:
  77. df = pd.read_csv(os.path.join('C:/' + dir_[2:], csv_file), sep=';', header=None, names=self.columns, keep_default_na=False)
  78. dfs.append(df)
  79. concatenated_df = pd.concat(dfs, ignore_index=True)
  80. return concatenated_df
  81. def process_payment_data(self, day_slice=(0, 2)):
  82. df_dict = get_partners(self.partner_data)
  83. fiscal_codes = df_dict['CodFiscal']
  84. mentor_names = df_dict['Denumire']
  85. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  86. # payments_df = pd.read_csv(self.csv_path, sep=';', header=None, names=self.columns, keep_default_na=False)
  87. payments_df = self._concat_dfs()
  88. payments_df['Suma'] = payments_df['Suma'].apply(dig_it)
  89. payments_df = payments_df.loc[(payments_df['Suma'] < 0)]
  90. # print(payments_df['Debit (suma)'])
  91. payments_df['Amount'] = payments_df['Suma'].map(abs)
  92. payments_df['symbols'] = ''
  93. payments_df['types'] = ''
  94. payments_df.loc[payments_df['symbols'] == '', 'symbols'] = 401
  95. payments_df.loc[payments_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT'
  96. self._calculate_payment_attributes(payments_df, mentor_names=mentor_names, day_slice=day_slice)
  97. return payments_df
  98. def process_income_data(self, day_slice=(0, 2)):
  99. df_dict = get_partners(self.partner_data)
  100. fiscal_codes = df_dict['CodFiscal']
  101. mentor_names = df_dict['Denumire']
  102. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  103. # income_df = pd.read_csv(self.csv_path, sep=';', header=None, names=self.columns, keep_default_na=False)
  104. income_df = self._concat_dfs()
  105. income_df['Suma'] = income_df['Suma'].apply(dig_it)
  106. # income_df = income_df.iloc[1:]
  107. income_df = income_df.loc[(income_df['Suma'] > 0)]
  108. # print(income_df['Credit (suma)'])
  109. income_df['Amount'] = income_df['Suma']
  110. income_df['symbols'] = ''
  111. income_df['types'] = ''
  112. income_df.loc[income_df['symbols'] == '', 'symbols'] = 411.01
  113. income_df.loc[income_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT'
  114. self._calculate_payment_attributes(income_df, mentor_names, day_slice=day_slice)
  115. return income_df
  116. def _calculate_payment_attributes(self, df, mentor_names, day_slice=(0, 2)):
  117. # df['Amount'] = df['Credit'].map(str).apply(dig_it).map(abs)
  118. df['Name'] = df['Partener']
  119. names = [name for name in df['Name'] if name != '']
  120. for name2 in names:
  121. index_ = name2.count(' ')
  122. # nname = name2 # ' '.join(name2.split()[:index_]).upper()
  123. # print(name2)
  124. for name in mentor_names:
  125. # index_ = name.count(' ')
  126. if len(' '.join(name.split()[:index_]).upper()) < 3:
  127. index_ = 2
  128. elif len(' '.join(name.split()[:index_]).upper()) < 2:
  129. index_ = 1
  130. if ' '.join(name2.split()[:index_]).upper() in name.upper():
  131. # print(name)
  132. for index, row in df.iterrows():
  133. if row['Name'] == name2:
  134. df.loc[index, 'Name'] = name
  135. df['Transaction details'] = df['Detalii']
  136. df['day'] = df['Data inregistrarii'].str.slice(*day_slice)
  137. df.loc[df['Transaction details'].str.lower().str.startswith('comision'), 'symbols'] = 627
  138. df.loc[df['Transaction details'].str.lower().str.startswith('abonament'), 'symbols'] = 627
  139. # df.loc[df['Transaction details'].str.lower().str.startswith('inchidere depozit'), 'symbols'] = 508.01
  140. df.loc[df['symbols'] == 627, 'types'] = 'DIRECT PE CHELTUIELI'
  141. df.loc[df['Transaction details'].str.lower().str.startswith('dobanda'), 'symbols'] = 766
  142. # df.loc[df['Transaction details'].str.lower().str.startswith('alimentare cont depozit'), 'symbols'] = 508.01
  143. df.loc[df['symbols'] == 766, 'types'] = 'DIRECT PE VENITURI'
  144. # df.loc[df['symbols'] == 508.01, 'types'] = direction
  145. unique_count = df['day'].nunique()
  146. self.doc_list = list(range(1, unique_count + 1))
  147. days = df['day'].unique().tolist()
  148. self.days = days
  149. trans = []
  150. cl_names = []
  151. obs = []
  152. counts = []
  153. symbols = []
  154. types = []
  155. for day in days:
  156. values = df.loc[df['day'] == day, 'Amount'].tolist()
  157. trans.append(values)
  158. self.trans_dict = {k: v for k, v in zip(days, trans)}
  159. for day in days:
  160. values = df.loc[df['day'] == day, 'Name'].tolist()
  161. for i in range(len(values)):
  162. if values[i] not in mentor_names:
  163. values[i] = ''
  164. cl_names.append(values)
  165. self.names_dict = {k: v for k, v in zip(days, cl_names)}
  166. # print(self.names_dict)
  167. for day in days:
  168. values = df.loc[df['day'] == day, 'Transaction details'].tolist()
  169. obs.append(values)
  170. self.obs_dict = {k: v for k, v in zip(days, obs)}
  171. for day in days:
  172. value_counts = df['day'].value_counts()
  173. count_of_value = value_counts[day]
  174. counts.append(count_of_value)
  175. self.counts = counts
  176. for day in days:
  177. acc_symbol = df.loc[df['day'] == day, 'symbols'].tolist()
  178. symbols.append(acc_symbol)
  179. self.symbol_list = {k: v for k, v in zip(days, symbols)}
  180. for day in days:
  181. type_ = df.loc[df['day'] == day, 'types'].tolist()
  182. types.append(type_)
  183. self.type_list = {k: v for k, v in zip(days, types)}
  184. self.unique_count = unique_count
  185. def to_dict(self, kind: str, month_back: int, std_client: str, acc_symbol: int):
  186. kinds = ['TotalIncasari', 'TotalPlati']
  187. if kind not in kinds:
  188. raise TypeError(f'type not in {kinds}')
  189. else:
  190. data = {'AnLucru': date.today().year,
  191. 'LunaLucru': get_last_month(month_back),
  192. 'TotalDocumente': self.unique_count,
  193. 'documents': self.doc_list,
  194. 'AccountName': self.account_name,
  195. 'AccountSymbol': self.account_symbol,
  196. 'AccountNumber': self.account_number,
  197. 'AccountLocation': self.account_location,
  198. 'AccountAgencyLocation': self.account_agency,
  199. 'Currency': self.currency,
  200. 'days': self.days,
  201. kind: self.counts,
  202. 'incasari': self.counts,
  203. 'clients': self.names_dict,
  204. 'cods': self.fiscal_code_dict,
  205. 'amount': self.trans_dict,
  206. 'cont': self.symbol_list,
  207. 'std_client': std_client,
  208. 'obs': self.obs_dict,
  209. 'represents': self.type_list
  210. }
  211. return data
  212. if __name__ == '__main__':
  213. columns = ['Banca', 'Cont', 'ID1', 'Data extras', 'Moneda', 'Total debit', 'Total credit',
  214. 'Data inregistrarii', 'Data valutei', 'Suma', 'tip', 'Referinta client',
  215. 'BLANK1', 'Detalii', 'BLANK2', 'BLANK3', 'Banca parteber', 'Cod parteber', 'Partener',
  216. 'ID6', 'Referinta interna', 'Detalii2', 'Referinta banca', 'Blank4', 'Blank5', 'Blank6',
  217. 'Blank7', 'Iban partener']
  218. df = pd.read_csv('../csv/230502_05130927.CSV', sep=';', header=None, names=columns, keep_default_na=False)
  219. df['Suma'] = df['Suma'].apply(dig_it)
  220. # df = df.loc[(df['Suma'] < 0)]
  221. # df.columns = columns
  222. # print(len(columns))
  223. print(df['Partener'])