CSV2MentorRncb.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. '''Created 15 Jun 2023 Levi'''
  2. from datetime import date
  3. import pandas as pd
  4. from pymt940.utils import (get_partners, re_check_rncb, dig_it, get_last_month)
  5. class PaymentsProcessorRncb:
  6. def __init__(self, csv_path, partner_data, account_name=None, account_number=None,
  7. currency=None, account_location=None, account_agency=None, account_symbol=None):
  8. self.csv_path = csv_path
  9. self.partner_data = partner_data
  10. self._account_name = account_name
  11. self._account_number = account_number
  12. self._currency = currency
  13. self._account_location = account_location
  14. self._account_agency = account_agency
  15. self._account_symbol = account_symbol
  16. self.trans_dict = None
  17. self.names_dict = None
  18. self.obs_dict = None
  19. self.counts = None
  20. self.doc_list = None
  21. self.unique_count = None
  22. self.fiscal_code_dict = None
  23. self.days = None
  24. @property
  25. def account_name(self):
  26. return self._account_name
  27. @account_name.setter
  28. def account_name(self, value):
  29. self._account_name = value
  30. @property
  31. def account_number(self):
  32. return self._account_number
  33. @account_number.setter
  34. def account_number(self, value):
  35. self._account_number = value
  36. @property
  37. def currency(self):
  38. return self._currency
  39. @currency.setter
  40. def currency(self, value):
  41. self._currency = value
  42. @property
  43. def account_location(self):
  44. return self._account_location
  45. @account_location.setter
  46. def account_location(self, value):
  47. self._account_location = value
  48. @property
  49. def account_agency(self):
  50. return self._account_agency
  51. @account_agency.setter
  52. def account_agency(self, value):
  53. self._account_agency = value
  54. @property
  55. def account_symbol(self):
  56. return self._account_symbol
  57. @account_symbol.setter
  58. def account_symbol(self, value):
  59. self._account_symbol = value
  60. def process_payment_data(self, day_slice=(0, 2)):
  61. df_dict = get_partners(self.partner_data)
  62. fiscal_codes = df_dict['CodFiscal']
  63. mentor_names = df_dict['Denumire']
  64. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  65. payments_df = pd.read_csv(self.csv_path, keep_default_na=False)
  66. # payments_df = payments_df.iloc[1:]
  67. payments_df = payments_df.loc[(payments_df['Debit (suma)'] != '') & (payments_df['Debit (suma)'] != '0.00')]
  68. # print(payments_df['Debit (suma)'])
  69. payments_df['Amount'] = payments_df['Debit (suma)'].map(str).apply(dig_it)
  70. self._calculate_payment_attributes(payments_df, mentor_names=mentor_names, day_slice=day_slice)
  71. def process_income_data(self, day_slice=(0, 2)):
  72. df_dict = get_partners(self.partner_data)
  73. fiscal_codes = df_dict['CodFiscal']
  74. mentor_names = df_dict['Denumire']
  75. self.fiscal_code_dict = {k: v for k, v in zip(mentor_names, fiscal_codes)}
  76. income_df = pd.read_csv(self.csv_path, keep_default_na=False)
  77. # income_df = income_df.iloc[1:]
  78. # income_df['Credit'].replace(' ', '', regex=True, inplace=True)
  79. # income_df['Debit'].replace(' ', '', regex=True, inplace=True)
  80. income_df = income_df.loc[(income_df['Credit (suma)'] != '') & (income_df['Credit (suma)'] != '0.00')]
  81. # print(income_df['Credit (suma)'])
  82. income_df['Amount'] = income_df['Credit (suma)'].map(str).apply(dig_it)
  83. self._calculate_payment_attributes(income_df, mentor_names, day_slice=day_slice)
  84. def _calculate_payment_attributes(self, df, mentor_names, day_slice=(0, 2)):
  85. # df['Amount'] = df['Credit'].map(str).apply(dig_it).map(abs)
  86. df['Name'] = df['Tranzactii finalizate (detalii)'].apply(re_check_rncb)
  87. names = [name for name in df['Name'] if name != '']
  88. for name2 in names:
  89. index_ = name2.count(' ')
  90. # nname = name2 # ' '.join(name2.split()[:index_]).upper()
  91. # print(name2)
  92. for name in mentor_names:
  93. # index_ = name.count(' ')
  94. if len(' '.join(name.split()[:index_]).upper()) < 3:
  95. index_ = 2
  96. elif len(' '.join(name.split()[:index_]).upper()) < 2:
  97. index_ = 1
  98. if ' '.join(name2.split()[:index_]).upper() in name.upper():
  99. # print(name)
  100. for index, row in df.iterrows():
  101. if row['Name'] == name2:
  102. df.loc[index, 'Name'] = name
  103. df['Transaction details'] = df['Tranzactii finalizate (detalii)']
  104. df['day'] = df['Data finalizarii tranzactiei'].str.slice(*day_slice)
  105. unique_count = df['day'].nunique()
  106. self.doc_list = list(range(1, unique_count + 1))
  107. days = df['day'].unique().tolist()
  108. self.days = days
  109. trans = []
  110. cl_names = []
  111. obs = []
  112. counts = []
  113. for day in days:
  114. values = df.loc[df['day'] == day, 'Amount'].tolist()
  115. trans.append(values)
  116. self.trans_dict = {k: v for k, v in zip(days, trans)}
  117. for day in days:
  118. values = df.loc[df['day'] == day, 'Name'].tolist()
  119. for i in range(len(values)):
  120. if values[i] not in mentor_names:
  121. values[i] = ''
  122. cl_names.append(values)
  123. self.names_dict = {k: v for k, v in zip(days, cl_names)}
  124. # print(self.names_dict)
  125. for day in days:
  126. values = df.loc[df['day'] == day, 'Transaction details'].tolist()
  127. obs.append(values)
  128. self.obs_dict = {k: v for k, v in zip(days, obs)}
  129. for day in days:
  130. value_counts = df['day'].value_counts()
  131. count_of_value = value_counts[day]
  132. counts.append(count_of_value)
  133. self.counts = counts
  134. self.unique_count = unique_count
  135. def to_dict(self, kind: str, month_back: int, std_client: str, acc_symbol: int):
  136. kinds = ['TotalIncasari', 'TotalPlati']
  137. if kind not in kinds:
  138. raise TypeError(f'type not in {kinds}')
  139. else:
  140. data = {'AnLucru': date.today().year,
  141. 'LunaLucru': get_last_month(month_back),
  142. 'TotalDocumente': self.unique_count,
  143. 'documents': self.doc_list,
  144. 'AccountName': self.account_name,
  145. 'AccountSymbol': self.account_symbol,
  146. 'AccountNumber': self.account_number,
  147. 'AccountLocation': self.account_location,
  148. 'AccountAgencyLocation': self.account_agency,
  149. 'Currency': self.currency,
  150. 'days': self.days,
  151. kind: self.counts,
  152. 'incasari': self.counts,
  153. 'clients': self.names_dict,
  154. 'cods': self.fiscal_code_dict,
  155. 'amount': self.trans_dict,
  156. 'cont': acc_symbol,
  157. 'std_client': std_client,
  158. 'obs': self.obs_dict
  159. }
  160. return data