hbv-export.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import pandas as pd
  2. import numpy as np
  3. from datetime import datetime
  4. base_dir = '/home/robert/projekte/python/planner/HBV/'
  5. hb_format = base_dir + 'hb_format.csv'
  6. hb_department = base_dir + 'hb_department.csv'
  7. hb_translation = base_dir + 'hb_translation.csv'
  8. plan_amount = base_dir + '../export/Planner_2021_V3_Stk.csv'
  9. plan_values = base_dir + '../export/Planner_2021_V3_Plan.csv'
  10. hb_ignored = base_dir + 'ignoriert.csv'
  11. current_year = '2021'
  12. current_date = datetime.now().strftime('%d%m%Y%H%M%S')
  13. current_date = '24032021112656'
  14. def main():
  15. # hb-format importieren
  16. # df_format = pd.read_csv(hb_format, decimal=',', sep=';', encoding='latin-1', converters={i: str for i in range(0, 200)})
  17. # row_format = df_format.head().to_dict(orient='records')
  18. # hp-translation importieren
  19. df_translation = pd.read_csv(hb_translation, decimal=',', sep=';', encoding='latin-1', converters={i: str for i in range(0, 200)})
  20. df_translation['column_no_join'] = np.where(df_translation['column_no'].isin(['1', '3', '4']), df_translation['column_no'], '0')
  21. # hb-department importieren
  22. df_department = pd.read_csv(hb_department, decimal=',', sep=';', encoding='latin-1', converters={i: str for i in range(0, 200)})
  23. # Planwerte importieren
  24. values_converter = {i: str for i in range(0, 200)}
  25. values_converter[4] = lambda x: np.float64(x.replace(',', '.'))
  26. df_values = pd.read_csv(plan_values, decimal=',', sep=';', encoding='latin-1', converters=values_converter)
  27. df_values['type'] = '2'
  28. df_amount = pd.read_csv(plan_amount, decimal=',', sep=';', encoding='latin-1', converters=values_converter)
  29. df_amount['type'] = '1'
  30. df: pd.DataFrame = df_values.append(df_amount)
  31. df['column_no'] = np.where(df['Vstufe 1'].str.contains('Umsatz'), '3', '0')
  32. df['column_no'] = np.where(df['Vstufe 1'].isin(['Materialaufwand']), '4', df['column_no'])
  33. df['column_no'] = np.where(df['type'].isin(['1']), '1', df['column_no'])
  34. # Planwerte übersetzen
  35. df = df.merge(df_department, how='inner', left_on='Betrieb Nr', right_on='department_id')
  36. df = df.merge(df_translation, how='left', left_on=['Zeile', 'column_no'], right_on=['from', 'column_no_join'])
  37. # df['column_no_x'] = np.where(df['column_no_x'].isna(), df['column_no_y'], df['column_no_x'])
  38. # print(df['column_no_x'].unique())
  39. # fehlende Übersetzung
  40. df_ignored = df[(df['to'].isna()) & (df['Gesamt'] != 0)]
  41. df_ignored.to_csv(hb_ignored, decimal=',', sep=';', encoding='latin-1', index=False)
  42. # Planwerte formatieren und exportieren
  43. rename_from = ['bm_code', 'BV_NUMMER', 'FILIAL_NR', 'to', 'column_no_y', 'Jahr', 'Gesamt']
  44. rename_to = ['BM_CODE', 'BV_NUMMER', 'FILIAL_NR', 'ZEILE', 'SPALTE', 'JAHR', 'WERT']
  45. df_valid = df[df['to'].notna()].rename(columns=dict(zip(rename_from, rename_to)))
  46. df_valid['SPALTE'] = df_valid['SPALTE'].str.zfill(3)
  47. group_by = ['BM_CODE', 'BV_NUMMER', 'FILIAL_NR']
  48. df_valid = df_valid[rename_to].groupby(group_by)
  49. # season_from = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
  50. # season_to = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
  51. # df_valid = df_valid.rename(columns=dict(zip(season_from, season_to)))
  52. # df_valid = df_valid.melt(id_vars=['BV_NUMMER', 'FILIAL_NR', 'ZEILE', 'SPALTE'], value_vars=season_to,
  53. # var_name='MONAT', value_name='WERT')
  54. for group in df_valid.groups:
  55. g = dict(zip(group_by, group))
  56. filename = base_dir + f"HB{g['BM_CODE']}{current_year}00{g['BV_NUMMER']}{g['FILIAL_NR']}0{current_date}.dat"
  57. print(filename)
  58. df_group = df_valid.get_group(group).groupby(rename_to[:-1]).sum().reset_index()
  59. with open(filename, 'w') as fwh:
  60. for row in df_group.to_dict(orient='records'):
  61. fwh.write("I0155{BV_NUMMER}{FILIAL_NR}0{ZEILE}{SPALTE}00{JAHR}{WERT:16.2f}03\n".format(**row))
  62. if __name__ == '__main__':
  63. main()