skr51.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. import pandas as pd
  2. from pathlib import Path
  3. from flask import Flask
  4. currentDirectory = Path('P:\\SKR51_Dennis_Sebastian')
  5. # filter = {
  6. # 'Marke': "00-09",
  7. # 'Standort': "00-09",
  8. # 'Kostenstelle': "00-05;10-20;50-99",
  9. # 'Absatzkanal': "00;10-16;20-26;30-36;40-46;50-56;60-66;90-96;99",
  10. # 'Kostentraeger': "00-56;60-68;70-76;80-85"
  11. # }
  12. # matrix = [
  13. # {
  14. # 'Kontonummer' : '0200',
  15. # 'Kontobezeichnung' : 'Technische Anlagen und Maschinen',
  16. # 'Kostenstelle' : '40-49;50-70;74;75-89',
  17. # 'Absatzkanal' : '',
  18. # 'Kostentraeger' : '70-79;80-99'
  19. # }
  20. # ]
  21. # buchungssalden = [
  22. # {
  23. # 'Kontonummer': "0200",
  24. # 'Marke': '01',
  25. # 'Standort': '01',
  26. # 'Kostenstelle' : '50',
  27. # 'Absatzkanal' : '00',
  28. # 'Kostentraeger' : '70',
  29. # 'saldo': 1005.68
  30. # },
  31. # {
  32. # 'Kontonummer': "0200",
  33. # 'Marke': '01',
  34. # 'Standort': '01',
  35. # 'Kostenstelle' : '20',
  36. # 'Absatzkanal' : '00',
  37. # 'Kostentraeger' : '70',
  38. # 'saldo': 1005.68
  39. # },
  40. # {
  41. # 'Kontonummer': "0201",
  42. # 'Marke': '01',
  43. # 'Standort': '01',
  44. # 'Kostenstelle' : '20',
  45. # 'Absatzkanal' : '00',
  46. # 'Kostentraeger' : '70',
  47. # 'saldo': 1005.68
  48. # }
  49. # ]
  50. # kst_liste = ["00", "10", "11", "12"... ]
  51. app = Flask(__name__)
  52. @app.route('/cast-translation', methods=['POST', 'GET'])
  53. def cast_translation():
  54. df = pd.read_csv(str(currentDirectory) + '/' + "Uebersetzung.csv", sep='\t', dtype={0: str, 1: str, 2: str, 3: str, 4: str, 5: str}, decimal=',')
  55. return df.to_json(indent=2, orient='records')
  56. @app.route('/cast-matrix', methods=['POST', 'GET'])
  57. def cast_matrix():
  58. df = pd.read_csv(str(currentDirectory) + '/' + "Plausibilitaetsmatrix.csv", sep='\t', dtype={0: str})
  59. return df.to_json(indent=2, orient='records')
  60. @app.route('/cast-filter', methods=['POST', 'GET'])
  61. def cast_filter():
  62. df = pd.read_csv(str(currentDirectory) + '/' + "SKR51_Kostenrechnungsmerkmale.csv", sep='\t', quotechar='"')
  63. return df.to_json(indent=2, orient='records')
  64. def crea_list(liste):
  65. if liste == "":
  66. return [str(i).zfill(2) for i in range(0, 100)]
  67. result_list = []
  68. for x in liste.split(';'):
  69. if "-" in x:
  70. result_list += [str(i).zfill(2) for i in range(int(x.split("-")[0]), int(x.split("-")[1]) + 1)]
  71. else:
  72. result_list.append(x)
  73. return result_list
  74. def check_konto(konto):
  75. for f in filter_csv.values:
  76. if konto[f[0]] not in f[2]:
  77. return False
  78. try:
  79. matrix_konto = matrix_csv[matrix_csv['Kontonummer'] == konto['Kontonummer']].to_dict('records')[0]
  80. for (k, current) in matrix_konto.items():
  81. if k != "Bezeichnung" and not pd.isna(current) and konto[k] not in crea_list(current):
  82. return False
  83. except IndexError:
  84. pass
  85. return True
  86. def format_konto(konto):
  87. return f"{konto['Kontonummer']}-{konto['Marke']}-{konto['Standort']}-{konto['Kostenstelle']}-{konto['Absatzkanal']}-{konto['Kostentraeger']}"
  88. def check_buchungssalden(salden):
  89. return [format_konto(x) + ": " + str(check_konto(x)) for x in salden]
  90. def format_konto_neu(konto):
  91. return f"{konto['Kontonummer_neu']}-{konto['Marke_neu']}-{konto['Standort_neu']}-{konto['Kostenstelle_neu']}-{konto['Absatzkanal_neu']}-{konto['Kostentraeger_neu']}"
  92. def check_Kontonummer(konto):
  93. try:
  94. matrix_konto = matrix_csv[matrix_csv['Kontonummer'] == konto['Kontonummer']].to_dict('records')[0]
  95. if not pd.isna(matrix_konto['Kontonummer']) and konto['Kontonummer'] not in crea_list(matrix_konto['Kontonummer']):
  96. return False
  97. except IndexError:
  98. pass
  99. return True
  100. def check_marke(konto):
  101. if konto[filter_csv.values[0][0]] not in filter_csv.values[0][2]:
  102. return False
  103. return True
  104. def check_Standort(konto):
  105. if konto[filter_csv.values[1][0]] not in filter_csv.values[1][2]:
  106. return False
  107. return True
  108. def check_Kostenstelle(konto):
  109. if konto[filter_csv.values[2][0]] not in filter_csv.values[2][2]:
  110. return False
  111. try:
  112. matrix_konto = matrix_csv[matrix_csv['Kontonummer'] == konto['Kontonummer']].to_dict('records')[0]
  113. if not pd.isna(matrix_konto['Kostenstelle']) and konto['Kostenstelle'] not in crea_list(matrix_konto['Kostenstelle']):
  114. return False
  115. except IndexError:
  116. pass
  117. return True
  118. def check_Absatzkanal(konto):
  119. if konto[filter_csv.values[3][0]] not in filter_csv.values[3][2]:
  120. return False
  121. try:
  122. matrix_konto = matrix_csv[matrix_csv['Kontonummer'] == konto['Kontonummer']].to_dict('records')[0]
  123. if not pd.isna(matrix_konto['Absatzkanal']) and konto['Absatzkanal'] not in crea_list(matrix_konto['Absatzkanal']):
  124. return False
  125. except IndexError:
  126. pass
  127. return True
  128. def check_Kostentraeger(konto):
  129. if konto[filter_csv.values[4][0]] not in filter_csv.values[4][2]:
  130. return False
  131. try:
  132. matrix_konto = matrix_csv[matrix_csv['Kontonummer'] == konto['Kontonummer']].to_dict('records')[0]
  133. if not pd.isna(matrix_konto['Kostentraeger']) and konto['Kostentraeger'] not in crea_list(matrix_konto['Kostentraeger']):
  134. return False
  135. except IndexError:
  136. pass
  137. return True
  138. def add_validation(salden):
  139. kontonummer_valid = []
  140. marke_valid = []
  141. standort_valid = []
  142. kostenstelle_valid = []
  143. absatzkanal_valid = []
  144. kostentraeger_valid = []
  145. konto_name = []
  146. konto_valid = []
  147. for x in salden:
  148. kontonummer_valid.append(check_Kontonummer(x))
  149. marke_valid.append(check_marke(x))
  150. standort_valid.append(check_Standort(x))
  151. kostenstelle_valid.append(check_Kostenstelle(x))
  152. absatzkanal_valid.append(check_Absatzkanal(x))
  153. kostentraeger_valid.append(check_Kostentraeger(x))
  154. konto_name.append(format_konto(x))
  155. konto_valid.append(str(check_konto(x)))
  156. df = pd.DataFrame(salden)
  157. df.insert(1, 'Kontonummer_valid', kontonummer_valid, True)
  158. df.insert(3, 'Marke_valid', marke_valid, True)
  159. df.insert(5, 'Standort_valid', standort_valid, True)
  160. df.insert(7, 'Kostenstelle_valid', kostenstelle_valid, True)
  161. df.insert(9, 'Absatzkanal_valid', absatzkanal_valid, True)
  162. df.insert(11, 'Kostentraeger_valid', kostentraeger_valid, True)
  163. df.insert(12, 'Konto', konto_name, True)
  164. df.insert(13, 'Konto_valid', konto_valid, True)
  165. return df
  166. def uebersetzung(salden):
  167. Kontonummer_neu = []
  168. Marke_neu = []
  169. Standort_neu = []
  170. Kostenstelle_neu = []
  171. Absatzkanal_neu = []
  172. Kostentraeger_neu = []
  173. Konto_neu = []
  174. valid_salden = add_validation(salden)
  175. for index, row in valid_salden.iterrows():
  176. if not row['Marke_valid']:
  177. for i, r in uebersetzung_csv.iterrows():
  178. if r['Kontonummer'] == row['Kontonummer'] and row['Marke'] in crea_list(r['Marke']):
  179. Marke_neu.append(r['Marke_neu'])
  180. if len(Marke_neu) == index:
  181. Marke_neu.append('')
  182. if not row['Standort_valid']:
  183. for i, r in uebersetzung_csv.iterrows():
  184. if r['Kontonummer'] == row['Kontonummer'] and row['Standort'] in crea_list(r['Standort']):
  185. Standort_neu.append(r['Standort_neu'])
  186. if len(Standort_neu) == index:
  187. Standort_neu.append('')
  188. if not row['Kostenstelle_valid']:
  189. for i, r in uebersetzung_csv.iterrows():
  190. if r['Kontonummer'] == row['Kontonummer'] and row['Kostenstelle'] in crea_list(r['Kostenstelle']):
  191. Kostenstelle_neu.append(r['Kostenstelle_neu'])
  192. if len(Kostenstelle_neu) == index:
  193. Kostenstelle_neu.append('')
  194. if not row['Absatzkanal_valid']:
  195. for i, r in uebersetzung_csv.iterrows():
  196. if r['Kontonummer'] == row['Kontonummer'] and row['Absatzkanal'] in crea_list(r['Absatzkanal']):
  197. Absatzkanal_neu.append(r['Absatzkanal_neu'])
  198. if len(Absatzkanal_neu) == index:
  199. Absatzkanal_neu.append('')
  200. if not row['Kostentraeger_valid']:
  201. for i, r in uebersetzung_csv.iterrows():
  202. if r['Kontonummer'] == row['Kontonummer'] and row['Kostentraeger'] in crea_list(r['Kostentraeger']):
  203. Kostentraeger_neu.append(r['Kostentraeger_neu'])
  204. if len(Kostentraeger_neu) == index:
  205. Kostentraeger_neu.append('')
  206. Kontonummer_neu.append(row['Kontonummer'])
  207. if not row['Konto_valid']:
  208. new = f"{Kontonummer_neu[index]}"
  209. if not row['Marke_valid']:
  210. new += f"-{Marke_neu[index]}"
  211. else:
  212. new += f"-{row['Marke']}"
  213. if not row['Standort_valid']:
  214. new += f"-{Standort_neu[index]}"
  215. else:
  216. new += f"-{row['Standort']}"
  217. if not row['Kostenstelle_valid']:
  218. new += f"-{Kostenstelle_neu[index]}"
  219. else:
  220. new += f"-{row['Kostenstelle']}"
  221. if not row['Absatzkanal_valid']:
  222. new += f"-{Absatzkanal_neu[index]}"
  223. else:
  224. new += f"-{row['Absatzkanal']}"
  225. if not row['Kostentraeger_valid']:
  226. new += f"-{Kostentraeger_neu[index]}"
  227. else:
  228. new += f"-{row['Kostentraeger']}"
  229. Konto_neu.append(new)
  230. # Konto_neu.append(f"{Kontonummer_neu[index]}-{Marke_neu[index]}-{Standort_neu[index]}-{Kostenstelle_neu[index]}-{Absatzkanal_neu[index]}-{Kostentraeger_neu[index]}")
  231. else:
  232. Konto_neu.append(row['Konto'])
  233. # if row['Kontonummer_valid'] == 'true' and row['Marke_valid'] == 'true' and row['Standort_valid'] == 'true' and row['Kostenstelle_valid'] == 'true' and row['Absatzkanal_valid'] == 'true' and row['Kostentraeger_valid'] == 'true' and row['Kostentraeger_valid'] == 'true':
  234. # row['Konto_valid'] = 'true'
  235. valid_salden.insert(2, 'Kontonummer_neu', Kontonummer_neu, True)
  236. valid_salden.insert(5, 'Marke_neu', Marke_neu, True)
  237. valid_salden.insert(8, 'Standort_neu', Standort_neu, True)
  238. valid_salden.insert(11, 'Kostenstelle_neu', Kostenstelle_neu, True)
  239. valid_salden.insert(14, 'Absatzkanal_neu', Absatzkanal_neu, True)
  240. valid_salden.insert(17, 'Kostentraeger_neu', Kostentraeger_neu, True)
  241. valid_salden.insert(20, 'Konto_neu', Konto_neu, True)
  242. return valid_salden
  243. def konto_alt_neu(salden):
  244. dat = uebersetzung(salden)
  245. konto_alt = dat['Konto']
  246. konto_neu = dat['Konto_neu']
  247. d = {'Konto': konto_alt, 'Konto_neu': konto_neu}
  248. df = pd.DataFrame(data=d)
  249. return df
  250. # filter_liste = [(k, crea_list(v)) for (k, v) in filter.items()]
  251. # print(filter_liste)
  252. filter_csv = pd.read_csv(str(currentDirectory) + '/' + "SKR51_Kostenrechnungsmerkmale.csv", sep='\t', quotechar='"')
  253. filter_csv['Filter_Liste'] = filter_csv['Filter'].apply(crea_list)
  254. print(filter_csv)
  255. # print(filter_csv.values[0][0])
  256. matrix_csv = pd.read_csv(str(currentDirectory) + '/' + "Plausibilitaetsmatrix.csv", sep='\t', dtype={0: str})
  257. # print(matrix_csv.head())
  258. export_csv = pd.read_csv(str(currentDirectory) + '/' + "SKR51_Export.csv", sep=';', dtype={0: str, 1: str, 2: str, 3: str, 4: str, 5: str}, decimal=',')
  259. print(export_csv.head())
  260. uebersetzung_csv = pd.read_csv(str(currentDirectory) + '/' + "Uebersetzung.csv", sep='\t', dtype={0: str, 1: str, 2: str, 3: str, 4: str, 5: str}, decimal=',')
  261. print(uebersetzung_csv.head())
  262. print(uebersetzung(export_csv.to_dict('records')[:5]))
  263. print(konto_alt_neu(export_csv.to_dict('records')[:5]))
  264. @app.route('/skr51_export', methods=['POST', 'GET'])
  265. def skr51_export():
  266. df = uebersetzung(export_csv.to_dict('records')[:5])
  267. return df.to_json(indent=2, orient='records')
  268. @app.route('/konto_update', methods=['POST', 'GET'])
  269. def Konto_Update():
  270. df = konto_alt_neu(export_csv.to_dict('records')[:5])
  271. return df.to_json(indent=2, orient='records')
  272. # print(dict_list)
  273. # print(check_konto(buchungssalden[0]))
  274. # print(check_buchungssalden(export_csv.to_dict('records')[:5]))
  275. # print(add_validation(export_csv.to_dict('records')[:5]))