CSV2MentorBtrl.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. '''Created 15 Jun 2023 Levi'''
  2. from datetime import date
  3. import pandas as pd
  4. from pymt940.languages import LANG
  5. from pymt940.utils import (get_partners, re_check, dig_it, get_last_month, find_line_number)
  6. class PaymentsProcessorBtrl:
  7. def __init__(self, csv_path, partner_data, account_name=None, account_number=None,
  8. currency=None, account_location=None, account_agency=None, account_symbol=None):
  9. self.csv_path = csv_path
  10. self.partner_data = partner_data
  11. self._account_name = account_name
  12. self._account_number = account_number
  13. self._currency = currency
  14. self._account_location = account_location
  15. self._account_agency = account_agency
  16. self._account_symbol = account_symbol
  17. self.trans_dict = None
  18. self.names_dict = None
  19. self.obs_dict = None
  20. self.counts = None
  21. self.doc_list = None
  22. self.unique_count = None
  23. self.fiscal_code_dict = None
  24. self.days = None
  25. @property
  26. def account_name(self):
  27. return self._account_name
  28. @account_name.setter
  29. def account_name(self, value):
  30. self._account_name = value
  31. @property
  32. def account_number(self):
  33. return self._account_number
  34. @account_number.setter
  35. def account_number(self, value):
  36. self._account_number = value
  37. @property
  38. def currency(self):
  39. return self._currency
  40. @currency.setter
  41. def currency(self, value):
  42. self._currency = value
  43. @property
  44. def account_location(self):
  45. return self._account_location
  46. @account_location.setter
  47. def account_location(self, value):
  48. self._account_location = value
  49. @property
  50. def account_agency(self):
  51. return self._account_agency
  52. @account_agency.setter
  53. def account_agency(self, value):
  54. self._account_agency = value
  55. @property
  56. def account_symbol(self):
  57. return self._account_symbol
  58. @account_symbol.setter
  59. def account_symbol(self, value):
  60. self._account_symbol = value
  61. def process_payment_data(self, lang=LANG.RO, day_slice=(0, 2)):
  62. df_dict = get_partners(self.partner_data)
  63. fiscal_codes = df_dict['CodFiscal']
  64. mentor_names = df_dict['Denumire']
  65. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  66. skip_r = find_line_number(self.csv_path, 'Rezultat cautare')
  67. payments_df = pd.read_csv(self.csv_path, skiprows=skip_r, keep_default_na=False).astype({lang['Balance']: 'object'})
  68. payments_df[lang['Credit']] = payments_df[lang['Credit']].replace(' ', '', regex=True)
  69. payments_df[lang['Debit']] = payments_df[lang['Debit']].replace(' ', '', regex=True)
  70. payments_df = payments_df.loc[payments_df[lang['Debit']] != '']
  71. payments_df['Amount'] = payments_df[lang['Debit']].map(str).apply(dig_it).map(abs)
  72. payments_df['symbols'] = ''
  73. payments_df['types'] = ''
  74. payments_df.loc[payments_df['symbols'] == '', 'symbols'] = 401
  75. payments_df.loc[payments_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT'
  76. self._calculate_payment_attributes(payments_df, mentor_names=mentor_names, lang=lang, day_slice=day_slice)
  77. return payments_df
  78. def process_income_data(self, lang=LANG.RO, day_slice=(0, 2)):
  79. df_dict = get_partners(self.partner_data)
  80. fiscal_codes = df_dict['CodFiscal']
  81. mentor_names = df_dict['Denumire']
  82. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  83. skip_r = find_line_number(self.csv_path, 'Rezultat cautare')
  84. income_df = pd.read_csv(self.csv_path, skiprows=skip_r, keep_default_na=False).astype({lang['Balance']: 'object'})
  85. income_df[lang['Credit']] = income_df[lang['Credit']].replace(' ', '', regex=True)
  86. income_df[lang['Debit']] = income_df[lang['Debit']].replace(' ', '', regex=True)
  87. income_df = income_df.loc[income_df[lang['Credit']] != '']
  88. income_df['Amount'] = income_df[lang['Credit']].map(str).apply(dig_it)
  89. income_df['symbols'] = ''
  90. income_df['types'] = ''
  91. income_df.loc[income_df['symbols'] == '', 'symbols'] = 411.01
  92. income_df.loc[income_df['types'] == '', 'types'] = 'ALIMENTARE CREDIT'
  93. self._calculate_payment_attributes(income_df, mentor_names, lang=lang, day_slice=day_slice)
  94. return income_df
  95. def _calculate_payment_attributes(self, df, mentor_names, lang=LANG.RO, day_slice=(0, 2)):
  96. # df['Amount'] = df['Credit'].map(str).apply(dig_it).map(abs)
  97. df['Name'] = df[lang['Description']].apply(re_check)
  98. names = [name for name in df['Name'] if name != '']
  99. for name2 in names:
  100. index_ = name2.count(' ')
  101. # nname = name2 # ' '.join(name2.split()[:index_]).upper()
  102. # print(name2)
  103. for name in mentor_names:
  104. # index_ = name.count(' ')
  105. if ' '.join(name.split()[:index_]).upper().count(' ') < 3:
  106. index_ = 2
  107. elif ' '.join(name.split()[:index_]).upper().count(' ') < 2:
  108. index_ = 1
  109. if ' '.join(name2.split()[:index_]).upper() in name.upper():
  110. # print(name)
  111. for index, row in df.iterrows():
  112. if row['Name'] == name2:
  113. df.loc[index, 'Name'] = name
  114. df['Transaction details'] = df[lang['Description']]
  115. df['day'] = df[lang['Transaction date']].str.slice(*day_slice)
  116. # df['symbols'] = ''
  117. df.loc[df['Transaction details'].str.lower().str.startswith('comision'), 'symbols'] = 627
  118. df.loc[df['Transaction details'].str.lower().str.startswith('abonament'), 'symbols'] = 627
  119. df.loc[df['symbols'] == 627, 'types'] = 'DIRECT PE CHELTUIELI'
  120. df.loc[df['Transaction details'].str.lower().str.startswith('dobanda'), 'symbols'] = 766
  121. df.loc[df['symbols'] == 766, 'types'] = 'DIRECT PE VENITURI'
  122. unique_count = df['day'].nunique()
  123. self.doc_list = list(range(1, unique_count + 1))
  124. days = df['day'].unique().tolist()
  125. self.days = days
  126. trans = []
  127. cl_names = []
  128. obs = []
  129. counts = []
  130. symbols = []
  131. types = []
  132. for day in days:
  133. values = df.loc[df['day'] == day, 'Amount'].tolist()
  134. trans.append(values)
  135. self.trans_dict = {k: v for k, v in zip(days, trans)}
  136. for day in days:
  137. values = df.loc[df['day'] == day, 'Name'].tolist()
  138. for ind in range(len(mentor_names)):
  139. index_ = mentor_names[ind].count(' ')
  140. mentor_names[ind] = ' '.join(mentor_names[ind].split()[:index_]).upper()
  141. # print(mentor_names[ind])
  142. for i in range(len(values)):
  143. # print(values[i])
  144. if values[i] not in mentor_names:
  145. values[i] = ''
  146. cl_names.append(values)
  147. self.names_dict = {k: v for k, v in zip(days, cl_names)}
  148. # print(self.names_dict)
  149. for day in days:
  150. values = df.loc[df['day'] == day, 'Transaction details'].tolist()
  151. obs.append(values)
  152. self.obs_dict = {k: v for k, v in zip(days, obs)}
  153. for day in days:
  154. value_counts = df['day'].value_counts()
  155. count_of_value = value_counts[day]
  156. counts.append(count_of_value)
  157. self.counts = counts
  158. for day in days:
  159. acc_symbol = df.loc[df['day'] == day, 'symbols'].tolist()
  160. symbols.append(acc_symbol)
  161. self.symbol_list = {k: v for k, v in zip(days, symbols)}
  162. for day in days:
  163. type_ = df.loc[df['day'] == day, 'types'].tolist()
  164. types.append(type_)
  165. self.type_list = {k: v for k, v in zip(days, types)}
  166. self.unique_count = unique_count
  167. def to_dict(self, kind: str, month_back: int, std_client: str, acc_symbol: int):
  168. kinds = ['TotalIncasari', 'TotalPlati']
  169. if kind not in kinds:
  170. raise TypeError(f'type not in {kinds}')
  171. else:
  172. data = {'AnLucru': date.today().year,
  173. 'LunaLucru': get_last_month(month_back),
  174. 'TotalDocumente': self.unique_count,
  175. 'documents': self.doc_list,
  176. 'AccountName': self.account_name,
  177. 'AccountSymbol': self.account_symbol,
  178. 'AccountNumber': self.account_number,
  179. 'AccountLocation': self.account_location,
  180. 'AccountAgencyLocation': self.account_agency,
  181. 'Currency': self.currency,
  182. 'days': self.days,
  183. kind: self.counts,
  184. 'incasari': self.counts,
  185. 'clients': self.names_dict,
  186. 'cods': self.fiscal_code_dict,
  187. 'amount': self.trans_dict,
  188. 'cont': self.symbol_list,
  189. 'std_client': std_client,
  190. 'obs': self.obs_dict,
  191. 'represents': self.type_list
  192. }
  193. return data