skr51.py 12 KB

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