plan_export.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from plan_values2 import VALUES2_HEADER
  2. import pandas as pd
  3. import numpy as np
  4. base_dir = "/home/robert/projekte/planner/export"
  5. id_header = ["Ebene" + str(i) for i in range(1, 11)]
  6. # values2_header = ['VJ', 'AJ', 'FC', 'Plan_ori', 'Plan_Prozent', 'Stk', 'VAK', 'BE_Prozent', 'Plan_VJ',
  7. # 'Plan_Stk_VJ', 'Plan', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt',
  8. # 'Nov', 'Dez', 'Periode13']
  9. season_header = ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]
  10. info_header = ["text", "costcenter", "department"]
  11. header = info_header + id_header + VALUES2_HEADER
  12. season_export_header = info_header + season_header
  13. source_header = ["department", "text", "costcenter", "Ebene1", "Plan", "Periode13"]
  14. export_header = [
  15. "Betrieb Nr",
  16. "Zeile mit Bez",
  17. "Bereich",
  18. "Vstufe 1",
  19. "Gesamt",
  20. "Periode13",
  21. ] # 'Version', 'Konto', 'Jahr']
  22. def expand(df, header, values_label):
  23. for i, key in enumerate(header):
  24. df[key] = df[values_label].str[i]
  25. return df
  26. def apply_season(df):
  27. df["Saison"] = df["Ebene1"].str.contains("Umsatzerlöse|Materialaufwand|Verkaufsabh. Kosten")
  28. df["saison_sum"] = df[season_header].sum(axis=1)
  29. for i, key in enumerate(season_header):
  30. df["temp"] = np.where(
  31. (df["Saison"]) & (df[key + "_2"] != 8.3333), df["Plan"] * df[key + "_2"] / 100, df["Plan"] / 12
  32. )
  33. df[key] = np.where(df["saison_sum"] == 0, df["temp"], df[key] * df["Minus1"])
  34. df["Dez"] = df["Plan"] - df[season_header].sum(axis=1) + df["Dez"]
  35. return df
  36. def data_cleansing(filename):
  37. df = pd.read_json(filename)
  38. df["values2"] = df["values2"].apply(lambda v: list(v.items()))
  39. df = df.explode("values2")
  40. df["department"], df["values2"] = zip(*df["values2"])
  41. df["id"] = df["id"].str.split(";")
  42. df = expand(df, id_header, "id")
  43. df = expand(df, VALUES2_HEADER, "values2")
  44. return df
  45. def export_plan(filename, version, target_year, amount_value):
  46. df = data_cleansing(f"{base_dir}/{filename}.json")
  47. season = df[(df["level"] == 2) & (df["Ebene1"] == "Umsatzerlöse")].copy()
  48. season["Dez"] = (100 - season[season_header].sum(axis=1) + season["Dez"]).round(4)
  49. season[season_export_header].to_csv(
  50. f"{base_dir}/Planner_{target_year}_{version}_Saison.csv", encoding="latin_1", sep=";", decimal=",", index=False
  51. )
  52. df["Minus1"] = np.where(df["Ebene1"] != "Umsatzerlöse", -1, 1)
  53. df["Plan"] = df[amount_value] * df["Minus1"]
  54. if amount_value == "Plan":
  55. df["Periode13"] = df["Periode13"] * df["Minus1"]
  56. else:
  57. df["Periode13"] = 0
  58. plan = df[df["planlevel"] == True]
  59. plan = pd.merge(plan, season, how="left", on=["Ebene2", "department"], suffixes=("", "_2"))
  60. plan = apply_season(plan)
  61. plan = plan[source_header + season_header].rename(columns=dict(zip(source_header, export_header)))
  62. # Reisacher Spezialbedingungen
  63. plan["Zeile"] = plan["Zeile mit Bez"].str.slice(stop=4)
  64. plan["Zeile"] = np.where(
  65. plan["Zeile mit Bez"].isin(["BMW aus Leasingrücklauf BFS", "BMW aus Leasingrücklauf Alphabet"]),
  66. "3040",
  67. plan["Zeile"],
  68. )
  69. plan["Zeile"] = np.where(
  70. plan["Zeile mit Bez"].isin(["BMW an Wiederverkäufer BFS", "BMW an Wiederverkäufer Alphabet"]),
  71. "3120",
  72. plan["Zeile"],
  73. )
  74. desciption = pd.read_csv(
  75. f"{base_dir}/../data/Planner_Zeilen_Bez.csv", sep=";", encoding="latin-1", dtype={0: str, 1: str}
  76. )
  77. plan = pd.merge(plan, desciption, how="left", on=["Zeile"], suffixes=["", "_3"])
  78. plan["Zeile mit Bez"] = plan["Zeile mit Bez_3"]
  79. plan.drop(["Zeile mit Bez_3"], axis=1, inplace=True)
  80. if amount_value == "Stk":
  81. plan = plan[plan["Vstufe 1"] == "Umsatzerlöse"]
  82. plan["Vstufe 1"] = "Verk. Stückzahlen"
  83. plan["Version"] = version
  84. plan["Konto"] = ""
  85. plan["Jahr"] = target_year
  86. plan.to_csv(
  87. f"{base_dir}/Planner_{target_year}_{version}_{amount_value}.csv",
  88. encoding="latin_1",
  89. sep=";",
  90. decimal=",",
  91. index=False,
  92. )
  93. if __name__ == "__main__":
  94. # export_plan('V3', '2021', 'Plan')
  95. # export_plan('V3', '2021', 'Stk')
  96. filename = "../save/2023_V1_20230214225753"
  97. filename = "../save/2024_V1_20240119104555"
  98. export_plan(filename, "V1", "2024", "Plan")
  99. export_plan(filename, "V1", "2024", "Stk")