transilvania.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from .main import CsvToMt940, TypeId
  2. from datetime import date, datetime
  3. import pandas as pd
  4. import re
  5. class Transi(CsvToMt940):
  6. def __init__(self, filename, iban):
  7. super().__init__()
  8. self.filename = filename
  9. self.iban = iban
  10. self._info_df = pd.read_csv(self.filename, nrows=5, skiprows=5)
  11. self._trans_df = pd.read_csv(self.filename, skiprows=16, keep_default_na=False).astype({'Sold contabil': 'object'})
  12. self._trans_df.to_csv('logged_btrl.csv', mode='a', header=False) # not os.path.exists('logged_bacx.csv')
  13. self.iban = self._info_df['Criterii de cautare'][0][:-4]
  14. self.transactions = map(self._statm_transactions, self._trans_df.values)
  15. self._ibans = {'RO23BACX0000001138725001': 'MZK', 'RO93BACX0000001138725002': 'MZK', 'RO50BACX0000001138725000': 'MZK',
  16. 'RO26BTRL01301202N63584XX': 'MZK', 'RO65BACX0000001144439000': 'ALP', 'RO44BTRL01301205G46199XX': 'GE'}
  17. def _isdebit(self, value):
  18. try:
  19. self.dig_it(value)
  20. return True
  21. except ValueError:
  22. return False
  23. def convert(self):
  24. with open('transi_mt940-{}-{}-{}.txt'.format(self.st_date, self._ibans[self.iban], self.iban), 'w') as export:
  25. export.write(self._statm_header())
  26. for elem in self.transactions:
  27. export.write(elem)
  28. export.write(self._statm_footer())
  29. def _statm_header(self):
  30. self.o_bal = self.dig_it(str(self._trans_df['Sold contabil'][0]))
  31. if self.o_bal > 0:
  32. cd_mark = 'C'
  33. else:
  34. cd_mark = 'D'
  35. if re.search(',|.', str(self._trans_df['Sold contabil'][0])):
  36. n = str(self._trans_df['Sold contabil'][0]).replace(',', '').replace('.', ',')
  37. else:
  38. n = str(self._trans_df['Sold contabil'][0])
  39. tr_ref_nr = ':20:' + str(self._info_df['Criterii de cautare'][0]) + '\n'
  40. acc_id = ':25:' + self.iban + '\n'
  41. st_ref = ':28:' + str(self.st_nr) + '\n'
  42. in_op_balance = ':60F:' + cd_mark + self.st_date +\
  43. self._info_df['Criterii de cautare'][0][-3:] + n + '\n'
  44. return tr_ref_nr + acc_id + st_ref + in_op_balance
  45. def _statm_transactions(self, elem):
  46. if self._isdebit(str(elem[4])) is False:
  47. CD_mark = 'C'
  48. else:
  49. CD_mark = 'D'
  50. if re.search('-', str(elem[4])):
  51. elem[4] = str(elem[4]).replace('-', '')
  52. if re.search(',|.', str(elem[4])):
  53. elem[4] = str(elem[4]).replace(',', '').replace('.', ',')
  54. if re.search(',|.', str(elem[5])):
  55. elem[5] = str(elem[5]).replace(',', '').replace('.', ',')
  56. if re.search(TypeId.types, elem[2], flags=re.RegexFlag.IGNORECASE):
  57. trans_type = TypeId.COMMISION
  58. else:
  59. trans_type = TypeId.TRANSFER
  60. if self._isdebit(elem[4]):
  61. tr = ':61:' + elem[0][2:4] + elem[0][5:7] + elem[0][8:10] + elem[0][5:7] +\
  62. elem[0][8:10] + CD_mark + elem[4] + trans_type + str(elem[3]) + '\n'
  63. inf = elem[2] + '\n'
  64. more_inf = ':86:' + '+31' + ''.join(elem[2].split(sep=';')[-2:-1]) +\
  65. '\n' + '+32' + ''.join(elem[2].split(sep=';')[-3:-2]) + '+33/' + '\n'
  66. return tr + inf + more_inf
  67. else:
  68. tr = ':61:' + elem[0][2:4] + elem[0][5:7] + elem[0][8:10] + elem[0][5:7] +\
  69. elem[0][8:10] + CD_mark + elem[5] + trans_type + str(elem[3]) + '\n'
  70. inf = elem[2] + '\n'
  71. more_inf = ':86:' + '+31' + ''.join(elem[2].split(sep=';')[-2:-1]) +\
  72. '\n' + '+32' + ''.join(elem[2].split(sep=';')[-3:-2]) + '+33/' + '\n'
  73. return tr + inf + more_inf
  74. def _statm_footer(self):
  75. c_bal = self.dig_it(str(self._trans_df['Sold contabil']
  76. [len(self._trans_df) - 1]))
  77. if c_bal > 0:
  78. cd_mark = 'C'
  79. else:
  80. cd_mark = 'D'
  81. if re.search(',|.', str(self._trans_df['Sold contabil']
  82. [len(self._trans_df) - 1])):
  83. n = str(self._trans_df['Sold contabil']\
  84. [len(self._trans_df) - 1]).replace(',', '').replace('.', ',')
  85. else:
  86. n = str(self._trans_df['Sold contabil'][len(self._trans_df) - 1])
  87. fin_op_balance = ':62F:' + cd_mark + self.st_date +\
  88. self._info_df['Criterii de cautare'][0][-3:] + n
  89. return fin_op_balance