unicredit.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from .main import CsvToMt940, TypeId
  2. from datetime import datetime
  3. import pandas as pd
  4. import re
  5. import os
  6. class Unicredit(CsvToMt940):
  7. def __init__(self, filename, iban):
  8. super().__init__()
  9. self.filename = filename
  10. self.iban = iban
  11. self._info_df = pd.read_csv(self.filename, nrows=1, sep=';')
  12. # TO DO: pd parse error at some utilities
  13. self._trans_df = pd.read_csv(self.filename, skiprows=2, sep=';', keep_default_na=False)
  14. self._trans_df.to_csv('logged_bacx.csv', mode='a', sep=';', header=False) # not os.path.exists('logged_bacx.csv')
  15. self.transactions = map(self._statm_transactions, self._trans_df.values)
  16. self._ibans = {'RO23BACX0000001138725001': 'MZK', 'RO93BACX0000001138725002': 'MZK', 'RO50BACX0000001138725000': 'MZK',
  17. 'RO26BTRL01301202N63584XX': 'MZK', 'RO65BACX0000001144439000': 'ALP', 'RO44BTRL01301205G46199XX': 'GE'}
  18. if 'EUR' in self._info_df['Currency'][0]:
  19. self.iban = 'RO23BACX0000001138725001'
  20. # print(self._info_df[['Currency']])
  21. elif 'USD' in self._info_df['Currency'][0]:
  22. self.iban = 'RO93BACX0000001138725002'
  23. # else:
  24. # self.iban = iban
  25. # iban = 'RO50BACX0000001138725000'
  26. # st_nr = randint(100000000, 199999999)
  27. def convert(self):
  28. with open('unicredit_mt940-{}-{}-{}.txt'.format(self.st_date, self._ibans[self.iban], self.iban), 'w') as export:
  29. export.write(self._statm_header())
  30. for elem in self.transactions:
  31. export.write(elem)
  32. export.write(self._statm_footer())
  33. def _statm_header(self):
  34. self.o_bal = self.dig_it(self._info_df['Opening Balance'][0])
  35. if self.o_bal > 0:
  36. cd_mark = 'C'
  37. else:
  38. cd_mark = 'D'
  39. if re.search('.', self._info_df['Opening Balance'][0]):
  40. n = self._info_df['Opening Balance'][0].replace('.', '')
  41. else:
  42. n = self._info_df['Opening Balance'][0]
  43. tr_ref_nr = ':20:' + str(self._info_df['Account'][0]) + '\n'
  44. acc_id = ':25:' + self.iban + '\n'
  45. st_ref = ':28:' + str(self.st_nr) + '\n'
  46. in_op_balance = ':60F:' + cd_mark + self.st_date +\
  47. self._info_df['Currency'][0] + n + '\n'
  48. return tr_ref_nr + acc_id + st_ref + in_op_balance
  49. def _statm_transactions(self, elem):
  50. if self.dig_it(elem[1]) > 0:
  51. CD_mark = 'C'
  52. else:
  53. CD_mark = 'D'
  54. if re.search('-', elem[1]):
  55. elem[1] = elem[1].replace('-', '')
  56. if re.search('.', elem[1]):
  57. elem[1] = elem[1].replace('.', '')
  58. if re.search(TypeId.types, str(elem[14]), flags=re.RegexFlag.IGNORECASE):
  59. trans_type = TypeId.COMMISION + 'OPH0001138725000' # temp workarround for missing type on comm.
  60. else:
  61. trans_type = TypeId.TRANSFER
  62. tr = ':61:' + elem[3][-2:] + elem[3][3:-5] + elem[3][:2] + elem[3][3:-5] +\
  63. elem[3][:2] + CD_mark + elem[1] + trans_type + str(elem[-2]) +\
  64. elem[5] + '\n'
  65. inf = str(elem[14]) + elem[16] + '\n'
  66. more_inf = ':86:' + '+31' + elem[9] + '\n' + '+32' + elem[10] + '+33/' +\
  67. str(elem[-7]) + '\n'
  68. return tr + inf + more_inf
  69. def _statm_footer(self):
  70. c_bal = self.dig_it(self._info_df['Closing Balance'][0])
  71. if c_bal > 0:
  72. cd_mark = 'C'
  73. else:
  74. cd_mark = 'D'
  75. if re.search('.', self._info_df['Closing Balance'][0]):
  76. n = self._info_df['Closing Balance'][0].replace('.', '')
  77. else:
  78. n = self._info_df['Closing Balance'][0]
  79. fin_op_balance = ':62F:' + cd_mark + self.st_date + self._info_df['Currency'][0] + n
  80. return fin_op_balance