csv_accounts.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import pandas as pd
  2. import numpy as np
  3. from re import match
  4. import json
  5. import plac
  6. from pathlib import Path
  7. @plac.pos('period', '', type=str)
  8. def actuals(period):
  9. base_dir = Path(__file__).absolute().parent.parent
  10. print(base_dir)
  11. df1 = pd.read_csv(base_dir / 'data/Belege_Planung_Ist_FC_AHR.csv', sep=';', decimal=',',
  12. dtype={0: str, 1: str, 2: str, 3: float})
  13. df2 = pd.read_csv(base_dir / 'data/Belege_Planung_Ist_FC_AHA.csv', sep=';', decimal=',',
  14. dtype={0: str, 1: str, 2: str, 3: float})
  15. df12 = pd.concat([df1, df2])
  16. df3 = pd.read_csv(base_dir / 'data/NW_GW_Stk_Planung_AHR.csv', sep=';', decimal=',',
  17. dtype={0: str, 1: str, 2: str, 3: float})
  18. df4 = pd.read_csv(base_dir / 'data/NW_GW_Stk_Planung_AHA.csv', sep=';', decimal=',',
  19. dtype={0: str, 1: str, 2: str, 3: float})
  20. df34 = pd.concat([df3, df4])
  21. df = pd.merge(df12, df34, how='left', on=['Bookkeep_Period', 'Betrieb_Nr', 'Konto_Nr'])
  22. # df = pd.read_csv('Planung/Belege_Planung_Ist_FC_Dresen.csv', sep=';', decimal=',',
  23. # dtype={0: str, 1: str, 2: str, 3: str, 4: str, 5: float, 6: float})
  24. df['Jahr'] = df['Bookkeep_Period'].apply(lambda x: x[:4])
  25. current_year = period[:4]
  26. prev_year = str(int(current_year) - 1)
  27. next_year = str(int(current_year) + 1)
  28. month_no = int(period[4:])
  29. # df = df[df['Bookkeep_Period'] <= period]
  30. df['PY'] = np.where(df['Jahr'] == prev_year, df['Betrag'], 0)
  31. df['PYQ'] = np.where(df['Jahr'] == prev_year, df['Menge'], 0)
  32. df['CY'] = np.where(df['Jahr'] == current_year, df['Betrag'], 0)
  33. df['CYQ'] = np.where(df['Jahr'] == current_year, df['Menge'], 0)
  34. df['YTD'] = np.where(df['Bookkeep_Period'] <= period, df['CY'], 0)
  35. df['YTDQ'] = np.where(df['Bookkeep_Period'] <= period, df['CYQ'], 0)
  36. df['FC'] = df['YTD'] * 12 / month_no
  37. df['FCQ'] = df['YTDQ'] * 12 / month_no
  38. df.drop(columns=['Menge', 'Betrag'], inplace=True)
  39. # df2 = pd.pivot_table(df, values='Betrag', index=['Konto Nr', 'Betrieb Nr'], columns=['Jahr'], aggfunc=np.sum, fill_value=0.0)
  40. df = df.groupby(['Konto_Nr', 'Betrieb_Nr']).sum()
  41. print(df.head())
  42. res = {}
  43. for (acct, dept), values in df.to_dict(orient='index').items():
  44. if acct not in res:
  45. res[acct] = {}
  46. res[acct][dept] = [round(v, 2) for v in values.values()]
  47. data = {'values': res}
  48. json.dump(data, open(base_dir / f'export/accounts_{next_year}.json', 'w'), indent=2)
  49. @plac.pos('year', '', type=str)
  50. def planning_prev(year):
  51. base_dir = Path.cwd().parent
  52. print(base_dir)
  53. df1 = pd.read_csv(base_dir / 'data/Planner_2022_V1_Plan.csv',
  54. sep=';', decimal=',', encoding='latin-1', dtype={'Betrieb Nr': str, 'Bereich': str, 'Zeile': str})
  55. df1['Wert'] = df1['Gesamt']
  56. df1 = df1[['Jahr', 'Betrieb Nr', 'Vstufe 1', 'Bereich', 'Zeile', 'Konto', 'Version', 'Wert']]
  57. df2 = pd.read_csv(base_dir / 'data/Planner_2022_V1_Stk.csv',
  58. sep=';', decimal=',', encoding='latin-1', dtype={'Betrieb Nr': str, 'Bereich': str, 'Zeile': str})
  59. df2['Menge'] = df2['Gesamt']
  60. df2['Vstufe 1'] = 'Umsatzerlöse'
  61. df2 = df2[['Jahr', 'Betrieb Nr', 'Vstufe 1', 'Bereich', 'Zeile', 'Konto', 'Version', 'Menge']]
  62. df = pd.merge(df1, df2, how='left', on=['Jahr', 'Betrieb Nr', 'Vstufe 1', 'Bereich', 'Zeile', 'Konto', 'Version'])
  63. df['Menge'] = df['Menge'].fillna(0)
  64. df['Wert'] = df['Wert'].fillna(0)
  65. df['Wert'] = np.where(df['Vstufe 1'] == 'Umsatzerlöse', df['Wert'], df['Wert'] * -1)
  66. df['Bereich'] = df['Bereich'].fillna('NA').replace('VW (inkl. GF)', '?')
  67. df['regex'] = df['Vstufe 1'] + ";" + df['Bereich'] + ";.*" + df['Zeile'] + ' - [^;]*;;'
  68. df = df[df['Wert'] != 0]
  69. gcstruct = json.load(open(base_dir / 'export/gcstruct.json', 'r'))
  70. structure_ids = [s['id'] for s in gcstruct['flat']['Struktur_FB']]
  71. df['id'] = df['regex'].apply(lambda x: (list(filter(lambda y: match(x, y), structure_ids)) + [''])[0])
  72. df = df[df['id'] != '']
  73. res = {}
  74. for item in df.to_dict(orient='records'):
  75. if item['id'] not in res:
  76. res[item['id']] = {}
  77. res[item['id']][item['Betrieb Nr']] = [item['Wert'], item['Menge']]
  78. data = {'values': res}
  79. json.dump(data, open(base_dir / 'export/planning_2023.json', 'w'), indent=2)
  80. def planning_new(filename):
  81. with open('planner/export/' + filename, 'r') as frh:
  82. structure = json.load(frh)
  83. year = str(int(filename[:4]) + 1)
  84. result = {}
  85. for s in structure:
  86. if len(s['accounts']) == 0:
  87. continue
  88. result[s['id']] = dict([(k, [v[10], v[5]]) for k, v in s['values2'].items()])
  89. with open(f"planner/export/planning_{year}.json", 'w') as fwh:
  90. json.dump({'values': result}, fwh, indent=2)
  91. if __name__ == '__main__':
  92. actuals('202210')
  93. planning_prev('2022')
  94. # plac.call(actuals)
  95. # planning_new('2022_V2_20220407150009.json')