gcstruct.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. import pandas as pd
  2. import numpy as np
  3. import xml.etree.ElementTree as ET
  4. import json
  5. import csv
  6. import re
  7. import chevron
  8. from shutil import copyfile
  9. from bs4 import BeautifulSoup
  10. from functools import reduce
  11. from pathlib import Path
  12. def get_flat(node):
  13. result = [{
  14. 'id': node['id'],
  15. 'text': node['text'],
  16. 'children': [x['id'] for x in node['children']],
  17. 'children2': [],
  18. 'parents': node['parents'],
  19. 'accounts': node['accounts'],
  20. 'costcenter': '',
  21. 'level': node['level'],
  22. 'drilldown': node['level'] < 2, # (node['level'] != 2 and len(node['accounts']) == 0),
  23. 'form': node['form'],
  24. 'accountlevel': False,
  25. 'absolute': True,
  26. 'seasonal': True,
  27. 'status': "0",
  28. 'values': [],
  29. 'values2': {}
  30. }]
  31. for child in node['children']:
  32. result += get_flat(child)
  33. return result
  34. def get_parents_list(p_list):
  35. id = ';'.join(p_list) + ';' * (10 - len(p_list))
  36. if len(p_list) > 0:
  37. return [id] + get_parents_list(p_list[:-1])
  38. return [';' * 9]
  39. def structure_from_tree(node):
  40. result = []
  41. result.append(node['id'])
  42. for child in node['children']:
  43. result.extend(structure_from_tree(child))
  44. return result
  45. def xml_from_tree(xml_node, tree_node):
  46. for child in tree_node['children']:
  47. element = ET.SubElement(xml_node, 'Ebene')
  48. element.set("Name", child['text'])
  49. xml_from_tree(element, child)
  50. def split_it(text, index):
  51. try:
  52. return re.findall(r'([^;]+) - ([^;]*);;', text)[0][index]
  53. except Exception:
  54. return ''
  55. def last_layer(text):
  56. try:
  57. return re.findall(r'([^;]+);;', text)[0]
  58. except Exception:
  59. return ''
  60. def get_default_cols(i):
  61. return ['Ebene' + str(i) for i in range(i * 10 + 1, (i + 1) * 10 + 1)]
  62. def get_structure_exports(s):
  63. result = {
  64. 'files': {},
  65. 'format': {
  66. 'KontoFormat': '{0} - {1}',
  67. 'HerstellerkontoFormat': '{{Herstellerkonto_Nr}}',
  68. 'HerstellerBezeichnungFormat': '{{Herstellerkonto_Bez}}',
  69. 'NeueHerstellerkontenAnlegen': False
  70. }
  71. }
  72. export_files = ['ExportStk', 'ExportStrukturenStk', 'ExportAdjazenz', 'ExportUebersetzung', 'ExportUebersetzungStk', 'ExportHerstellerKontenrahmen']
  73. export_format = ['KontoFormat', 'HerstellerkontoFormat', 'HerstellerBezeichnungFormat', 'NeueHerstellerkontenAnlegen']
  74. for e in export_files:
  75. if s.find(e) is not None and s.find(e).text is not None and s.find(e).text[-4:] == '.csv':
  76. result['files'][e] = s.find(e).text
  77. for e in export_format:
  78. if s.find(e) is not None and s.find(e).text != '':
  79. result['format'][e] = s.find(e).text
  80. result['format']['NeueHerstellerkontenAnlegen'] = (result['format']['NeueHerstellerkontenAnlegen'] == 'true')
  81. return result
  82. class GCStruct():
  83. config = {
  84. 'path': 'c:/projekte/python/gcstruct',
  85. 'path2': 'c:/projekte/python/gcstruct',
  86. 'file': 'c:/projekte/python/gcstruct/config/config.xml',
  87. 'output': 'gcstruct.json',
  88. 'default': [],
  89. 'special': {},
  90. 'special2': {
  91. 'Planner': ['Kostenstelle', 'Ebene1', 'Ebene2'],
  92. 'Test': ['Ebene1', 'Ebene2']
  93. },
  94. 'columns': ['Konto_Nr', 'Konto_Bezeichnung', 'Konto_Art', 'Konto_KST', 'Konto_STK', 'Konto_1', 'Konto_2', 'Konto_3', 'Konto_4', 'Konto_5'],
  95. 'struct': {},
  96. 'export': {}
  97. }
  98. json_result = {'accounts': {}, 'tree': {}, 'flat': {}, 'struct_export': {}, 'skr51_vars': {}}
  99. structure_ids = []
  100. def __init__(self, struct_path):
  101. self.config['path'] = struct_path
  102. # self.config['path2'] = struct_path
  103. self.config['file'] = f"{self.config['path']}/config/gcstruct.xml"
  104. if not Path(self.config['file']).exists():
  105. self.config['file'] = f"{self.config['path']}/config/config.xml"
  106. cfg = ET.parse(self.config['file'])
  107. self.config['default'] = [s.find('Name').text for s in cfg.getroot().find('Strukturdefinitionen').findall('Struktur')]
  108. self.config['export'] = dict([(s.find('Name').text, get_structure_exports(s)) for s in cfg.getroot().find('Strukturdefinitionen').findall('Struktur')])
  109. struct = dict([(x, get_default_cols(i)) for (i, x) in enumerate(self.config['default'])])
  110. struct.update(self.config['special'])
  111. self.config['struct'] = struct
  112. # print(self.config['struct'])
  113. def export_header(self, filetype):
  114. return {
  115. 'ExportStk': [],
  116. 'ExportStrukturenStk': [],
  117. 'ExportAdjazenz': [],
  118. 'ExportUebersetzung': ['Konto_Nr_Hersteller', 'Konto_Nr_Split', 'Konto_Nr_Haendler', 'Info'],
  119. 'ExportUebersetzungStk': ['Konto_Nr_Hersteller', 'Konto_Nr_Split', 'Konto_Nr_Haendler', 'Info'],
  120. 'ExportHerstellerKontenrahmen': ['Konto_Nr', 'Konto_Bezeichnung', 'Case', 'Info']
  121. }[filetype]
  122. def accounts_from_csv(self, struct):
  123. max_rows = (len(self.config['default']) + 1) * 10
  124. with open(f"{self.config['path']}/Kontenrahmen/Kontenrahmen.csv", 'r', encoding='ansi') as f:
  125. csv_reader = csv.reader(f, delimiter=';')
  126. imported_csv = [row[:max_rows] for row in csv_reader]
  127. df = pd.DataFrame.from_records(np.array(imported_csv[1:], dtype='object'), columns=imported_csv[0]).fillna(value='')
  128. df = df.rename(columns={'Kostenstelle': 'Konto_KST', 'STK': 'Konto_STK'})
  129. for i, (s, cols) in enumerate(struct.items()):
  130. df[s] = reduce(lambda x, y: x + ";" + df[y], cols, '')
  131. df[s] = df[s].apply(lambda x: x[1:])
  132. df['LetzteEbene' + str(i + 1)] = df[s].apply(lambda x: last_layer(x))
  133. df['LetzteEbene' + str(i + 1) + '_Nr'] = df[s].apply(lambda x: split_it(x, 0))
  134. df['LetzteEbene' + str(i + 1) + '_Bez'] = df[s].apply(lambda x: split_it(x, 1))
  135. df['Herstellerkonto_Nr'] = df['LetzteEbene1_Nr']
  136. df['Herstellerkonto_Bez'] = df['LetzteEbene1_Bez']
  137. return df
  138. def tree_from_xml(self, struct, df):
  139. result = {}
  140. for (s, cols) in struct.items():
  141. try:
  142. tree = ET.parse(f"{self.config['path']}/Xml/{s}.xml")
  143. result[s] = self.get_tree_root(tree.getroot(), s)
  144. except FileNotFoundError:
  145. print('XML-Datei fehlt')
  146. used_entries = [x.split(";")[1:] for x in set(df[s].to_numpy())]
  147. print(used_entries)
  148. root = ET.Element('Ebene')
  149. root.set('Name', s)
  150. result[s] = self.get_tree_root(root, s)
  151. # self.json_result["tree"][s] = get_tree_from_accounts(cols, [])
  152. return result
  153. def get_structure_and_tree(self):
  154. df = self.accounts_from_csv(self.config['struct'])
  155. self.json_result['accounts'] = df.to_dict('records')
  156. self.structure_ids = df.melt(id_vars=['Konto_Nr'], value_vars=self.config['struct'].keys(), var_name='Struktur', value_name='id').groupby(by=['Struktur', 'id'])
  157. self.json_result['tree'] = self.tree_from_xml(self.config['struct'], df)
  158. for (s, cols) in self.config['struct'].items():
  159. self.json_result['flat'][s] = get_flat(self.json_result['tree'][s])
  160. for (s, entries) in self.json_result['flat'].items():
  161. cols = self.config['struct'][s]
  162. df_temp = pd.DataFrame([x['id'].split(';') for x in entries], columns=cols)
  163. self.json_result['struct_export'][s] = df_temp.to_dict(orient='records')
  164. # json.dump(self.json_result, open(f"{self.config['path2']}/{self.config['output']}", 'w'), indent=2)
  165. return df
  166. def get_accounts(self, structure, id):
  167. res = self.structure_ids.groups.get((structure, id))
  168. if res is None:
  169. return []
  170. return res.values
  171. # return [x['Konto_Nr'] for x in self.json_result['accounts'] if x[structure] == id]
  172. def export(self):
  173. for s in self.config['export'].keys():
  174. for (filetype, filename) in self.config['export'][s]['files'].items():
  175. with open(self.config['path2'] + '/' + filename, 'w') as fwh:
  176. fwh.write('Konto_Nr_Hersteller;Konto_Nr_Split;Konto_Nr_Haendler;Info\n')
  177. # 'Hersteller'Konto_Nr;Konto_Bezeichnung;Case;Info'
  178. for a in self.json_result['accounts']:
  179. if a['Herstellerkonto_Nr'] != '':
  180. account = chevron.render(self.config['export']['SKR51']['format']['HerstellerkontoFormat'], a)
  181. fwh.write(account + ';' + account + ';' + a['Konto_Nr'] + ';' + '\n') # a['Herstellerkonto_Bez']
  182. def get_tree(self, node, parents, structure):
  183. result = []
  184. for child in node:
  185. p = get_parents_list(parents)
  186. parents.append(child.attrib['Name'])
  187. id = ';'.join(parents) + ';' * (10 - len(parents))
  188. result.append({
  189. 'id': id,
  190. 'text': child.attrib['Name'],
  191. 'children': self.get_tree(child, parents, structure),
  192. 'parents': p,
  193. 'accounts': self.get_accounts(structure, id),
  194. 'level': len(parents),
  195. 'form': child.attrib.get('Split', '')
  196. })
  197. parents.pop()
  198. return result
  199. def get_tree_root(self, node, structure):
  200. id = ';' * 9
  201. return {
  202. 'id': id,
  203. 'text': node.attrib['Name'],
  204. 'children': self.get_tree(node, [], structure),
  205. 'parents': [],
  206. 'accounts': [],
  207. 'level': 0,
  208. 'form': ''
  209. }
  210. def post_structure_and_tree(self):
  211. json_post = json.load(open(f"{self.config['path']}/{self.config['output']}", 'r'))
  212. # Kontenrahmen.csv
  213. ebenen = ['Ebene' + str(i) for i in range(1, len(self.config['default']) * 10 + 1)]
  214. header = ';'.join(self.config['columns'] + ebenen)
  215. cols = self.config['columns'] + self.config['default']
  216. with open(self.config['path'] + '/Kontenrahmen/Kontenrahmen_out.csv', 'w', encoding='ansi') as f:
  217. f.write(header + '\n')
  218. for row in json_post['Kontenrahmen']:
  219. f.write(';'.join([row[e] for e in cols]) + '\n')
  220. # print(header)
  221. # xml und evtl. Struktur.csv
  222. for i, s in enumerate(self.config['default']):
  223. with open(f"{self.config['path']}/Strukturen/Kontenrahmen.csv/{s}_out.csv", 'w', encoding='ansi') as f:
  224. f.write(';'.join(['Ebene' + str(i * 10 + j) for j in range(1, 11)]) + '\n')
  225. rows = structure_from_tree({'id': ";" * 9, 'children': json_post[s]})
  226. f.write('\n'.join(rows))
  227. # with open(self.config['path'] + "/Strukturen/Kontenrahmen.csv/" + structure + "_2.csv", "w", encoding="ansi") as f:
  228. root = ET.Element('Ebene')
  229. root.set('Name', s)
  230. xml_from_tree(root, {'id': ";" * 9, 'children': json_post[s]})
  231. with open(f"{self.config['path']}/Xml/{s}_out.xml", 'w', encoding='utf-8') as f:
  232. f.write(BeautifulSoup(ET.tostring(root), 'xml').prettify())
  233. def skr51_translate(self):
  234. df = self.accounts_from_csv(self.config['struct'])
  235. translate = {'Konto_Nr': 'SKR51', 'Kostenstelle': 'KST', 'Absatzkanal': 'ABS', 'Kostenträger': 'KTR', 'Marke': 'MAR', 'Standort': 'STA'}
  236. df_translate = {}
  237. for i, (_, t_to) in enumerate(translate.items()):
  238. last = 'LetzteEbene' + str(i + 1)
  239. from_label = ['Konto_Nr', last, last + '_Nr', last + '_Bez', 'Ebene' + str(i * 10 + 1), 'Ebene' + str(i * 10 + 2)]
  240. to_label = [t_to, t_to + '_Ebene', t_to + '_Nr', t_to + '_Bez', 'Ebene1', 'Ebene2']
  241. df_translate[t_to] = df[df[last + '_Nr'] != ''][from_label].rename(columns=dict(zip(from_label, to_label)))
  242. # print(df_translate[t_to].head())
  243. df_source = pd.read_csv(f"{self.config['path']}/Export/Kontenrahmen_kombiniert.csv", decimal=',', sep=';', encoding='ansi', converters={i: str for i in range(0, 200)})
  244. for t_from, t_to in translate.items():
  245. if t_to == 'SKR51':
  246. df_source['SKR51'] = df_source['Konto_Nr']
  247. # print(df_translate[t_to].info())
  248. elif t_to == 'KTR':
  249. df_source['KTR'] = 'KTR_SC_' + df_source['Marke'] + '_' + df_source['Kostenträger']
  250. df_source['KTR'] = np.where(df_source['Ebene1_KST'] == '1-NW', 'KTR_NW_' + df_source['Marke'] + '_' + df_source['Kostenträger'], df_source[t_to])
  251. df_source['KTR'] = np.where(df_source['Ebene1_KST'] == '3-TZ', 'KTR_TZ_' + df_source['Kostenträger'], df_source[t_to])
  252. else:
  253. df_source[t_to] = df_source[t_from].apply(lambda x: t_to + '_' + x)
  254. df_source = df_source.merge(df_translate[t_to], how='left', on=[t_to], suffixes=(None, '_' + t_to))
  255. df_source[t_to + '_Nr'] = np.where(df_source[t_to + '_Nr'].isna(), df_source[t_from], df_source[t_to + '_Nr'])
  256. # df_all[df_all['Ebene1'] == ]
  257. # print(df_source.head())
  258. df_source['Konto_Nr_SKR51'] = df_source['MAR_Nr'] + '-' + df_source['STA_Nr'] + '-' + df_source['SKR51_Nr'] + '-' + df_source['KST_Nr'] + '-' + df_source['ABS_Nr'] + '-' + df_source['KTR_Nr']
  259. df_source['Konto_Nr_Händler'] = df_source['Marke'] + '-' + df_source['Standort'] + '-' + df_source['Konto_Nr'] + '-' + df_source['Kostenstelle'] + '-' + df_source['Absatzkanal'] + '-' + df_source['Kostenträger']
  260. df_source.to_csv(f"{self.config['path2']}/SKR51_Uebersetzung.csv", sep=';', encoding='ansi', index=False)
  261. from_label = ['MAR_Nr', 'STA_Nr', 'SKR51_Nr', 'KST_Nr', 'ABS_Nr', 'KTR_Nr', 'KTR_Ebene', 'Konto_Nr_Händler']
  262. to_label = ['Marke', 'Standort', 'Konto_Nr', 'Kostenstelle', 'Absatzkanal', 'Kostenträger', 'Kostenträger_Ebene', 'Konto_Nr_Händler']
  263. df_combined = df_source[from_label].rename(columns=dict(zip(from_label, to_label)))
  264. df_combined.to_csv(f"{self.config['path2']}/Kontenrahmen_kombiniert.csv", sep=';', encoding='ansi', index=False)
  265. def skr51_translate2(self):
  266. df = self.accounts_from_csv(self.config['struct'])
  267. df_list = []
  268. for i, s in enumerate(self.config['struct'].keys()):
  269. from_label = ['Konto_Nr', 'Ebene' + str(i * 10 + 1), 'Ebene' + str(i * 10 + 2), 'Ebene' + str(i * 10 + 3)]
  270. to_label = ['Konto_Nr', 'key', 'value', 'value2']
  271. df_temp = df[from_label].rename(columns=dict(zip(from_label, to_label)))
  272. df_temp['key'] = '{' + s + '/' + df_temp['key'] + '}'
  273. df_list.append(df_temp[df_temp['value'] != ''])
  274. df_translate = pd.concat(df_list)
  275. # df_translate.to_csv(f"{self.config['path2']}/SKR51_Variablen.csv", sep=';', encoding='ansi', index=False)
  276. df_source = pd.read_csv(f"{self.config['path']}/Export/Kontenrahmen_kombiniert.csv", decimal=',', sep=';', encoding='ansi', converters={i: str for i in range(0, 200)})
  277. # df_kst = pd.DataFrame([str(x) for x in range(10)])
  278. # df_source['key'] = 0
  279. # df_kst['key'] = 0
  280. # df_source = df_source.merge(df_kst, how='left', on='key')
  281. # df_source.drop('key', 1, inplace=True)
  282. df_source['Konto_Nr'] = np.where(df_source['Konto_Nr'].str.contains(r'^[4578]'), df_source['Konto_Nr'] + '_' + df_source['Kostenstelle'].str.slice(stop=1), df_source['Konto_Nr'])
  283. df_source['Konto_Nr'] = np.where(df_source['Konto_Nr'].str.contains(r'^5\d+_4'), df_source['Konto_Nr'] + df_source['Kostenstelle'].str.slice(start=1, stop=2), df_source['Konto_Nr'])
  284. df_source = df_source.merge(df, how='left', on=['Konto_Nr'])
  285. rows = df_source.shape[0]
  286. df_source['value'] = ''
  287. cols = get_default_cols(0)
  288. translate = {'Kostenstelle': 'KST', 'Absatzkanal': 'ABS', 'Kostenträger': 'KTR', 'Marke': 'MAR', 'Standort': 'STA', 'Konto_Nr': 'Konto_Nr'}
  289. for t_from, t_to in translate.items():
  290. if t_from != 'Konto_Nr':
  291. df_source[t_to] = t_to + '_' + df_source[t_from]
  292. for e in cols:
  293. df_source = df_source.merge(df_translate, how='left', left_on=[t_to, e], right_on=['Konto_Nr', 'key'], suffixes=(None, '_' + t_to + '_' + e))
  294. df_source[e] = np.where(df_source['value_' + t_to + '_' + e].notna(), df_source['value_' + t_to + '_' + e], df_source[e])
  295. if df_source.shape[0] > rows:
  296. print(t_to + '_' + e + ': ' + str(df_source.shape[0]))
  297. # df_source[t_to + '_Nr'] = np.where(df_source[t_to + '_Nr'].isna(), df_source[t_from], df_source[t_to + '_Nr'])
  298. for e in cols:
  299. df_source[e] = np.where(df_source[e].str.startswith('{'), df_source[e].str.extract(r'\/(.*)}', expand=False) + ' falsch', df_source[e]) # df_source[e].str.extract(r'/(.*)}') +
  300. df_source[e] = np.where(df_source[e] == '[KTR]', df_source['Kostenträger_Ebene'], df_source[e])
  301. # df_all[df_all['Ebene1'] == ]
  302. # print(df_source.head())
  303. df_source['Konto_neu'] = df_source['Marke'] + '-' + df_source['Standort'] + '-' + df_source['Konto_Nr'] + '-' + df_source['Kostenstelle'] + '-' + df_source['Absatzkanal'] + '-' + df_source['Kostenträger'] + ' - ' + df_source['Konto_Bezeichnung']
  304. df_source['Ebene1_empty'] = df_source['Ebene1'].isna() # , df_source['Ebene1'].map(lambda x: x == ''))
  305. df_source['Konto_neu'] = np.where(df_source['Ebene1_empty'], 'keine Zuordnung', df_source['Konto_neu'])
  306. df_source['Ebene1'] = np.where(df_source['Ebene1_empty'], 'keine Zuordnung', df_source['Ebene1'])
  307. df_source['Konto_Gruppe'] = df_source['Konto_Nr'] + ' - ' + df_source['Konto_Bezeichnung']
  308. df_source['Konto_Gruppe'] = np.where(df_source['Ebene1_empty'], 'keine Zuordnung', df_source['Konto_Gruppe'])
  309. df_amount = df_source[df_source['Ebene1'] == 'Umsatzerlöse'].reset_index()
  310. df_amount['Ebene1'] = 'verkaufte Stückzahlen'
  311. df_amount['Konto_neu'] = 'STK ' + df_amount['Konto_neu']
  312. df_amount['Konto_Nr_Händler'] = df_amount['Konto_Nr_Händler'] + '_STK'
  313. df_source = pd.concat([df_source, df_amount])
  314. df_source = df_source[['Konto_neu', 'Konto_Nr_Händler', 'Konto_Bezeichnung', 'Konto_Art', 'Konto_KST', 'Konto_STK', 'Konto_1', 'Konto_2', 'Konto_3', 'Konto_4', 'Konto_5', 'Ebene1', 'Ebene2', 'Ebene3', 'Ebene4', 'Ebene5', 'Ebene6', 'Ebene7', 'Ebene8', 'Ebene9', 'Ebene10', 'Konto_Gruppe']]
  315. from_label = cols
  316. to_label = get_default_cols(9)
  317. df_source = df_source.rename(columns=dict(zip(from_label, to_label)))
  318. # 'Marke', 'Standort', 'Konto_Nr', 'Kostenstelle', 'Absatzkanal', 'Kostenträger',
  319. df_source.to_csv(f"{self.config['path2']}/SKR51_Uebersetzung.csv", sep=';', encoding='ansi', index=False)
  320. # df_source['Konto_Nr_SKR51'] = df_source['MAR_Nr'] + '-' + df_source['STA_Nr'] + '-' + df_source['SKR51_Nr'] + '-' + df_source['KST_Nr'] + '-' + df_source['ABS_Nr'] + '-' + df_source['KTR_Nr']
  321. # from_label = ['MAR_Nr', 'STA_Nr', 'SKR51_Nr', 'KST_Nr', 'ABS_Nr', 'KTR_Nr', 'KTR_Ebene', 'Konto_Nr_Händler']
  322. # to_label = ['Marke', 'Standort', 'Konto_Nr', 'Kostenstelle', 'Absatzkanal', 'Kostenträger', 'Kostenträger_Ebene', 'Konto_Nr_Händler']
  323. # df_combined = df_source[from_label].rename(columns=dict(zip(from_label, to_label)))
  324. # df_combined.to_csv(f"{self.config['path2']}/Kontenrahmen_kombiniert.csv", sep=';', encoding='ansi', index=False)
  325. def skr51_vars(self):
  326. self.get_structure_and_tree()
  327. cols = get_default_cols(0)
  328. df_temp = pd.read_csv(f"{self.config['path']}/Export/Kostentraeger.csv", decimal=',', sep=';', encoding='ansi', converters={i: str for i in range(0, 200)})
  329. df_temp['value'] = df_temp['Ebene33']
  330. df_temp['key'] = '[KTR]'
  331. df_temp = df_temp[df_temp['value'].str.contains(' - ')]
  332. df_list = [df_temp[['key', 'value']]]
  333. for (s, entries) in self.json_result['flat'].items():
  334. df = pd.DataFrame([x['id'].split(';') for x in entries], columns=cols)
  335. df['key'] = df[cols[0]].apply(lambda x: '{' + s + '/' + x + '}')
  336. df['value'] = df[cols[1]]
  337. df_list.append(df[['key', 'value']])
  338. df = pd.concat(df_list)
  339. df_vars = df[df['value'] != '']
  340. # df_vars.to_csv(f"{self.config['path2']}/SKR51_Variablen2.csv", sep=';', encoding='ansi', index=False)
  341. df_main = pd.DataFrame([x['id'].split(';') for x in self.json_result['flat']['SKR51']], columns=cols)
  342. df_main['value'] = ''
  343. for c in cols:
  344. df_main = df_main.merge(df_vars, how='left', left_on=c, right_on='key', suffixes=(None, '_' + c))
  345. df_main[c] = np.where(df_main['value_' + c].isna(), df_main[c], df_main['value_' + c])
  346. df_amount = df_main[df_main['Ebene1'] == 'Umsatzerlöse'].reset_index()
  347. df_amount['Ebene1'] = 'verkaufte Stückzahlen'
  348. df_main = pd.concat([df_main, df_amount])
  349. from_label = cols
  350. to_label = get_default_cols(9)
  351. df_main = df_main.rename(columns=dict(zip(from_label, to_label)))
  352. df_main[to_label].to_csv(f"{self.config['path2']}/SKR51_Struktur.csv", sep=';', encoding='ansi', index_label='Sortierung')
  353. def luchtenberg():
  354. # base_path = 'P:/SKR51_GCStruct/'
  355. base_path = 'V:/Kunden/Luchtenberg/1 Umstellung SKR51/'
  356. struct = GCStruct(base_path + 'GCStruct_Aufbereitung')
  357. struct.skr51_translate()
  358. copyfile('c:/Projekte/Python/Gcstruct/Kontenrahmen_kombiniert.csv', base_path + 'GCStruct_Modell/Export/Kontenrahmen_kombiniert.csv')
  359. struct2 = GCStruct(base_path + 'GCStruct_Modell')
  360. struct2.skr51_translate2()
  361. struct2.skr51_vars()
  362. def dresen():
  363. struct = GCStruct('c:/projekte/GCHRStruct_Hyundai_Export')
  364. struct.get_structure_and_tree()
  365. struct.export()
  366. if __name__ == '__main__':
  367. # struct = GCStruct('c:/projekte/gcstruct_dresen')
  368. # struct = GCStruct('c:/projekte/python/gcstruct')
  369. # struct = GCStruct('c:/projekte/python/gcstruct_reisacher_planung')
  370. # struct = GCStruct('X:/Robert/Planung Reisacher/GCStruct_neue_Struktur_Planung')
  371. # print(struct.config['struct'])
  372. # struct.post_structure_and_tree()
  373. luchtenberg()
  374. # dresen()