ソースを参照

HBV und Plan Export von Python-Projekte übernommen

robert 2 年 前
コミット
65ceda000b

+ 2 - 1
.gitignore

@@ -1,3 +1,4 @@
 save/
 __pycache__
-.~lock.*
+.~lock.*
+export/hbv/

BIN
config/gnupg/export.gpg


+ 6 - 0
config/gnupg/gnupg.txt

@@ -0,0 +1,6 @@
+C:\GnuPG\gpg.exe -r "BV_IFC; BMW Group <BV_IFC@softlab.de>" -o C:/Projekte/Reisacher/2007_v1/Publish/data/HB0307782021000108481024032021112656.dat.gpg -e C:/Projekte/Reisacher/2007_v1/Publish/data/HB0307782021000108481024032021112656.dat
+C:\GnuPG\gpg.exe -r "BV_IFC; BMW Group <BV_IFC@softlab.de>" -o C:/Projekte/Reisacher/2007_v1/Publish/data/MP0307782021000108481024032021112656.dat.gpg -e C:/Projekte/Reisacher/2007_v1/Publish/data/MP0307782021000108481024032021112656.dat
+
+C:\GnuPG\gpg.exe -r "BV_IFC; BMW Group <BV_IFC@softlab.de>" -o C:/Projekte/Reisacher/2007_v1/Publish/data/HB0307782021000108482024032021112700.dat.gpg -e C:/Projekte/Reisacher/2007_v1/Publish/data/HB0307782021000108482024032021112700.dat
+C:\GnuPG\gpg.exe -r "BV_IFC; BMW Group <BV_IFC@softlab.de>" -o C:/Projekte/Reisacher/2007_v1/Publish/data/MP0307782021000108482024032021112700.dat.gpg -e C:/Projekte/Reisacher/2007_v1/Publish/data/MP0307782021000108482024032021112700.dat
+

BIN
config/gnupg/pubring.gpg


BIN
config/gnupg/pubring.gpg~


BIN
config/gnupg/random_seed


+ 0 - 0
config/gnupg/secring.gpg


BIN
config/gnupg/trustdb.gpg


+ 8 - 0
config/hbv/hb_department.csv

@@ -0,0 +1,8 @@
+"department_id";"department_name";"bm_code";"BV_NUMMER";"FILIAL_NR"
+"10";"MM";"001443";"010335";"1"
+"30";"KRU";"001443";"010335";"3"
+"40";"ULM";"001443";"010335";"4"
+"50";"LL";"001443";"010335";"5"
+"55";"GZ";"001443";"010362";"1"
+"81";"AAM-MOT";"030778";"010848";"1"
+"82";"AAM-PKW";"030778";"010848";"1"

+ 14 - 0
config/hbv/hb_format.csv

@@ -0,0 +1,14 @@
+"column";"type";"length";"value";"order_by"
+"VAART_SATZ";"A";"1";"I";"1"
+"MAND_ID";"N";"2";"01";"2"
+"SATZART";"A";"2";"55";"3"
+"BV_NUMMER";"N";"6";"010848";"4"
+"FILIAL_NR";"N";"1";"1";"5"
+"FREMDFABRIKAT";"N";"1";"0";"6"
+"ZEILE";"N";"4";"0000";"7"
+"SPALTE";"N";"3";"000";"8"
+"MONAT";"N";"2";"00";"9"
+"JAHR";"N";"4";"2020";"10"
+"WERT";"G";"16";"0.00";"11"
+"MEDIUM";"N";"2";"03";"12"
+"ZEILENTRENNER";"H";"1";;"13"

+ 401 - 0
config/hbv/hb_translation.csv

@@ -0,0 +1,401 @@
+from;to;column_no;type
+1010;1010;21;2
+1020;1020;21;2
+1040;1040;21;2
+1060;1060;21;2
+2000;2000;1;1
+2000;2000;3;2
+2000;2000;4;3
+2010;2010;1;1
+2010;2010;3;2
+2010;2010;4;3
+2015;2015;1;1
+2015;2015;3;2
+2015;2015;4;3
+2020;2020;1;1
+2020;2020;3;2
+2020;2020;4;3
+2025;2025;1;1
+2025;2025;3;2
+2025;2025;4;3
+2030;2030;1;1
+2030;2030;3;2
+2030;2030;4;3
+2040;2040;1;1
+2040;2040;3;2
+2040;2040;4;3
+2050;2050;1;1
+2050;2050;3;2
+2050;2050;4;3
+2060;2060;1;1
+2060;2060;3;2
+2060;2060;4;3
+2070;2070;1;1
+2070;2070;3;2
+2070;2070;4;3
+2080;2080;1;1
+2080;2080;3;2
+2080;2080;4;3
+2090;2090;1;1
+2090;2090;3;2
+2090;2090;4;3
+2110;2110;1;1
+2110;2110;3;2
+2110;2110;4;3
+2120;2120;1;1
+2120;2120;3;2
+2120;2120;4;3
+2130;2130;1;1
+2130;2130;3;2
+2130;2130;4;3
+2140;2140;1;1
+2140;2140;3;2
+2140;2140;4;3
+2150;2150;1;1
+2150;2150;3;2
+2150;2150;4;3
+2170;2170;1;1
+2170;2170;3;2
+2170;2170;4;3
+2175;2260;3;2
+2180;2180;1;1
+2180;2180;3;2
+2180;2180;4;3
+2185;2185;1;1
+2185;2185;3;2
+2185;2185;4;3
+2190;2190;1;1
+2190;2190;3;2
+2190;2190;4;3
+2200;2200;1;1
+2200;2200;3;2
+2200;2200;4;3
+2220;2220;1;1
+2220;2220;3;2
+2220;2220;4;3
+2230;2230;3;2
+2230;2230;4;3
+2240;2240;3;2
+2240;2240;4;3
+2250;2250;1;1
+2250;2250;3;2
+2250;2250;4;3
+2260;2260;3;2
+2260;2260;4;3
+2320;2320;18;4
+2320;2320;20;2
+2330;2330;20;2
+2340;2340;20;2
+2350;2350;20;2
+2360;2360;20;2
+2370;2370;20;2
+2390;2390;18;4
+2390;2390;20;2
+2400;2400;20;2
+2410;2410;18;4
+2410;2410;20;2
+2420;2420;20;2
+2440;2440;20;2
+2450;2450;20;2
+2460;2460;20;2
+2470;2470;20;2
+2480;2480;20;2
+2490;2490;20;2
+2500;2500;20;2
+2510;2510;20;2
+3000;3000;1;1
+3000;3000;3;2
+3000;3000;4;3
+3001;3001;3;2
+3001;3001;4;3
+3020;3020;1;1
+3020;3020;3;2
+3020;3020;4;3
+3040;3040;1;1
+3040;3040;3;2
+3040;3040;4;3
+3060;3060;1;1
+3060;3060;3;2
+3060;3060;4;3
+3070;3070;1;1
+3070;3070;3;2
+3070;3070;4;3
+3080;3080;1;1
+3080;3080;3;2
+3080;3080;4;3
+3081;3081;3;2
+3081;3081;4;3
+3083;3083;1;1
+3083;3083;3;2
+3083;3083;4;3
+3084;3084;1;1
+3084;3084;3;2
+3084;3084;4;3
+3120;3120;1;1
+3120;3120;3;2
+3120;3120;4;3
+3130;3130;1;1
+3130;3130;3;2
+3130;3130;4;3
+3160;3160;1;1
+3160;3160;3;2
+3160;3160;4;3
+3180;3180;1;1
+3180;3180;3;2
+3180;3180;4;3
+3200;3200;1;1
+3200;3200;3;2
+3200;3200;4;3
+3220;3220;1;1
+3220;3220;3;2
+3220;3220;4;3
+3260;3260;1;1
+3260;3260;3;2
+3260;3260;4;3
+3270;3300;3;2
+3275;3300;3;2
+3280;3280;1;1
+3280;3280;3;2
+3280;3280;4;3
+3300;3300;3;2
+3300;3300;4;3
+3320;3320;1;1
+3320;3320;3;2
+3320;3320;4;3
+3340;3340;1;1
+3340;3340;3;2
+3340;3340;4;3
+3530;3530;18;4
+3530;3530;20;2
+3540;3540;20;2
+3550;3550;20;2
+3560;3560;20;2
+3570;3570;20;2
+3610;3610;18;4
+3610;3610;20;2
+3620;3620;20;2
+3630;3630;18;4
+3630;3630;20;2
+3640;3640;20;2
+3710;3710;20;2
+3720;3720;20;2
+3730;3730;20;2
+3740;3740;20;2
+3750;3750;20;2
+3760;3760;20;2
+3770;3770;20;2
+5010;5010;1;2
+5010;5010;2;3
+5015;5015;1;2
+5015;5015;2;3
+5020;5020;1;2
+5020;5020;2;3
+5030;5030;1;2
+5030;5030;2;3
+5040;5040;1;2
+5040;5040;2;3
+5050;5050;1;2
+5050;5050;2;3
+5060;5060;1;2
+5060;5060;2;3
+5080;5080;1;2
+5080;5080;2;3
+5100;5100;1;2
+5100;5100;2;3
+5110;5110;1;2
+5110;5110;2;3
+5120;5120;1;2
+5120;5120;2;3
+5130;5130;1;2
+5130;5130;2;3
+5150;5180;1;2
+5150;5180;2;3
+5160;5180;1;2
+5160;5180;2;3
+5165;5180;1;2
+5165;5180;2;3
+5170;5180;1;2
+5170;5180;2;3
+5180;5180;1;2
+5180;5180;2;3
+5190;5190;1;2
+5190;5190;2;3
+5200;5200;1;2
+5200;5200;2;3
+5210;5220;1;2
+5210;5220;2;3
+5220;5220;1;2
+5220;5220;2;3
+5230;5270;1;2
+5230;5270;2;3
+5240;5240;1;2
+5240;5240;2;3
+5250;5250;1;2
+5250;5250;2;3
+5260;5260;1;2
+5260;5260;2;3
+5270;5270;1;2
+5270;5270;2;3
+5280;5280;1;2
+5280;5280;2;3
+5290;5290;1;2
+5290;5290;2;3
+5310;5310;1;2
+5310;5310;2;3
+5360;5360;16;2
+5370;5370;16;2
+5390;5390;16;2
+5400;5400;14;4
+5400;5400;16;2
+5410;5410;14;4
+5410;5410;16;2
+5420;5420;16;2
+5440;5440;16;2
+5450;5450;16;2
+5460;5460;16;2
+5470;5470;16;2
+5480;5480;16;2
+5490;5490;16;2
+5500;5500;16;2
+5510;5510;16;2
+5520;5520;16;2
+6000;6000;1;1
+6000;6000;3;2
+6000;6000;4;3
+6010;6010;1;1
+6010;6010;3;2
+6010;6010;4;3
+6020;6020;3;2
+6030;6030;3;2
+6035;6035;1;1
+6035;6035;3;2
+6035;6035;4;3
+6036;6036;1;1
+6036;6036;3;2
+6036;6036;4;3
+6037;6037;3;2
+6038;6038;3;2
+6040;6040;1;1
+6040;6040;3;2
+6040;6040;4;3
+6050;6050;1;1
+6050;6050;3;2
+6050;6050;4;3
+6060;6060;3;2
+6070;6070;3;2
+6076;6076;1;1
+6076;6076;3;2
+6076;6076;4;3
+6077;6077;3;2
+6078;6078;3;2
+6090;6120;1;1
+6090;6090;3;2
+6090;6090;4;3
+6100;6120;1;1
+6100;6100;3;2
+6110;6120;1;1
+6110;6110;3;2
+6120;6120;1;1
+6130;6160;1;1
+6130;6130;3;2
+6130;6130;4;3
+6140;6160;1;1
+6140;6140;3;2
+6140;6140;4;3
+6150;6160;1;1
+6150;6150;3;2
+6150;6150;4;3
+6160;6160;1;1
+6170;6210;1;1
+6170;6170;3;2
+6170;6170;4;3
+6180;6210;1;1
+6180;6180;3;2
+6190;6210;1;1
+6190;6190;3;2
+6200;6210;1;1
+6200;6200;3;2
+6200;6200;4;3
+6210;6210;1;1
+6220;6220;3;2
+6220;6220;4;3
+6230;6230;3;2
+6230;6230;4;3
+6240;6240;3;2
+6240;6240;4;3
+6250;6250;3;2
+6250;6250;4;3
+6260;6260;3;2
+6260;6260;4;3
+6270;6270;3;2
+6270;6270;4;3
+6320;6320;18;2
+6325;6320;18;2
+6330;6330;18;2
+6350;6350;16;1
+6350;6350;18;2
+6360;6360;18;2
+6370;6370;18;2
+6380;6380;16;1
+6380;6380;18;2
+6390;6390;16;1
+6390;6390;18;2
+6400;6400;18;2
+6410;6410;18;2
+6420;6420;16;1
+6420;6420;18;2
+6430;6430;18;2
+6440;6440;18;2
+6450;6450;18;2
+6460;6460;18;2
+6470;6470;18;2
+6480;6480;18;2
+6490;6490;18;2
+6500;6500;18;2
+6510;6510;18;2
+6520;6520;18;2
+6530;6530;18;2
+7040;7040;3;2
+7050;7050;1;4
+7050;7050;3;2
+7060;7060;1;4
+7060;7060;3;2
+7070;7070;3;2
+7090;7090;3;2
+7100;7100;3;2
+7110;7110;3;2
+7120;7120;3;2
+7125;7120;3;2
+7130;7130;3;2
+7140;7140;3;2
+7150;7150;3;2
+7160;7160;3;2
+7170;7170;3;2
+7180;7180;3;2
+7190;7190;3;2
+7200;7200;3;2
+7210;7210;3;2
+7220;7220;3;2
+7230;7230;3;2
+7240;7240;3;2
+7250;7250;3;2
+7299;7250;3;2
+7260;7260;3;2
+7300;7300;3;2
+7310;7310;1;4
+7310;7310;3;2
+7320;7320;1;4
+7320;7320;3;2
+7330;7330;3;2
+7340;7340;3;2
+7350;7350;3;2
+7360;7360;3;2
+7370;7370;3;2
+7390;7390;3;2
+7400;7400;3;2
+7410;7410;3;2
+7420;7420;3;2
+7430;7430;3;2
+7440;7440;3;2
+7450;7450;3;2
+7460;7460;3;2

+ 396 - 0
config/hbv/hb_values.csv

@@ -0,0 +1,396 @@
+"FILIAL_NR";"ZEILE";"SPALTE";"MONAT";"JAHR";"WERT"
+"1";"1010";"21";NULL;"2020";"0.00"
+"1";"1020";"21";NULL;"2020";"0.00"
+"1";"1030";"21";NULL;"2020";"0.00"
+"1";"1040";"21";NULL;"2020";"0.00"
+"1";"1050";"21";NULL;"2020";"0.00"
+"1";"1060";"21";NULL;"2020";"0.00"
+"1";"2000";"1";"0";"2020";"30.00"
+"1";"2000";"3";"0";"2020";"1027756.00"
+"1";"2000";"4";"0";"2020";"1053450.00"
+"1";"2010";"1";"0";"2020";"365.00"
+"1";"2010";"3";"0";"2020";"10540654.00"
+"1";"2010";"4";"0";"2020";"11278500.00"
+"1";"2015";"1";"0";"2020";"64.00"
+"1";"2015";"3";"0";"2020";"2294857.00"
+"1";"2015";"4";"0";"2020";"2409600.00"
+"1";"2020";"1";"0";"2020";"120.00"
+"1";"2020";"3";"0";"2020";"5537308.00"
+"1";"2020";"4";"0";"2020";"5758800.00"
+"1";"2025";"1";"0";"2020";"60.00"
+"1";"2025";"3";"0";"2020";"3043981.00"
+"1";"2025";"4";"0";"2020";"3135300.00"
+"1";"2030";"1";"0";"2020";"108.00"
+"1";"2030";"3";"0";"2020";"6945882.00"
+"1";"2030";"4";"0";"2020";"7084800.00"
+"1";"2040";"1";"0";"2020";"18.00"
+"1";"2040";"3";"0";"2020";"1162748.00"
+"1";"2040";"4";"0";"2020";"1197630.00"
+"1";"2050";"1";"0";"2020";"14.00"
+"1";"2050";"3";"0";"2020";"1466836.00"
+"1";"2050";"4";"0";"2020";"1490100.00"
+"1";"2070";"1";NULL;"2020";"0.00"
+"1";"2070";"3";NULL;"2020";"0.00"
+"1";"2070";"4";NULL;"2020";"0.00"
+"1";"2080";"4";"0";"2020";"-3592531.00"
+"1";"2090";"1";"0";"2020";"95.00"
+"1";"2090";"3";"0";"2020";"3275757.00"
+"1";"2090";"4";"0";"2020";"3570575.00"
+"1";"2110";"1";"0";"2020";"360.00"
+"1";"2110";"3";"0";"2020";"8527326.00"
+"1";"2110";"4";"0";"2020";"8800200.00"
+"1";"2120";"1";"0";"2020";"0.00"
+"1";"2120";"3";"0";"2020";"0.00"
+"1";"2120";"4";"0";"2020";"0.00"
+"1";"2130";"1";"0";"2020";"32.00"
+"1";"2130";"3";"0";"2020";"1008157.00"
+"1";"2130";"4";"0";"2020";"1028320.00"
+"1";"2140";"1";NULL;"2020";"0.00"
+"1";"2140";"3";NULL;"2020";"0.00"
+"1";"2140";"4";"0";"2020";"-917889.00"
+"1";"2150";"1";"0";"2020";"50.00"
+"1";"2150";"3";"0";"2020";"1264120.00"
+"1";"2150";"4";"0";"2020";"1365250.00"
+"1";"2170";"1";NULL;"2020";"0.00"
+"1";"2170";"3";"0";"2020";"9600.00"
+"1";"2170";"4";"0";"2020";"0.00"
+"1";"2180";"1";"0";"2020";"1.00"
+"1";"2180";"3";"0";"2020";"30000.00"
+"1";"2180";"4";"0";"2020";"0.00"
+"1";"2185";"1";NULL;"2020";"0.00"
+"1";"2185";"3";"0";"2020";"0.00"
+"1";"2185";"4";"0";"2020";"0.00"
+"1";"2190";"1";"0";"2020";"0.00"
+"1";"2190";"3";"0";"2020";"0.00"
+"1";"2190";"4";"0";"2020";"0.00"
+"1";"2200";"1";"0";"2020";"185.00"
+"1";"2200";"3";"0";"2020";"2749333.00"
+"1";"2200";"4";"0";"2020";"2464105.00"
+"1";"2220";"1";"0";"2020";"0.00"
+"1";"2220";"3";"0";"2020";"0.00"
+"1";"2220";"4";"0";"2020";"0.00"
+"1";"2230";"1";NULL;"2020";"0.00"
+"1";"2230";"3";NULL;"2020";"0.00"
+"1";"2230";"4";NULL;"2020";"0.00"
+"1";"2240";"1";NULL;"2020";"0.00"
+"1";"2240";"3";NULL;"2020";"0.00"
+"1";"2240";"4";NULL;"2020";"0.00"
+"1";"2250";"3";"0";"2020";"0.00"
+"1";"2250";"4";"0";"2020";"0.00"
+"1";"2260";"3";"0";"2020";"2595000.00"
+"1";"2260";"4";"0";"2020";"2256000.00"
+"1";"2270";"1";"0";"2020";"1286.00"
+"1";"2270";"3";"0";"2020";"50451559.00"
+"1";"2270";"4";"0";"2020";"47393260.00"
+"1";"2320";"18";"0";"2020";"23.20"
+"1";"2320";"20";"0";"2020";"817174.00"
+"1";"2330";"20";"0";"2020";"6000.00"
+"1";"2340";"20";"0";"2020";"179770.00"
+"1";"2350";"20";"0";"2020";"6110.00"
+"1";"2360";"20";"0";"2020";"1800.00"
+"1";"2370";"20";NULL;"2020";"0.00"
+"1";"2390";"18";"0";"2020";"13.05"
+"1";"2390";"20";"0";"2020";"793967.00"
+"1";"2400";"18";"0";"2020";"23.20"
+"1";"2400";"20";"0";"2020";"0.00"
+"1";"2410";"18";"0";"2020";"0.00"
+"1";"2410";"20";"0";"2020";"38688.00"
+"1";"2420";"18";NULL;"2020";"0.00"
+"1";"2420";"20";"0";"2020";"305267.00"
+"1";"2430";"18";"0";"2020";"36.65"
+"1";"2440";"20";"0";"2020";"180000.00"
+"1";"2450";"20";"0";"2020";"150.00"
+"1";"2460";"20";"0";"2020";"112781.00"
+"1";"2470";"20";"0";"2020";"14619.00"
+"1";"2480";"20";"0";"2020";"93000.00"
+"1";"2490";"20";"0";"2020";"0.00"
+"1";"2500";"20";NULL;"2020";"0.00"
+"1";"2510";"20";NULL;"2020";"0.00"
+"1";"3000";"1";"0";"2020";"135.00"
+"1";"3000";"3";"0";"2020";"3826406.00"
+"1";"3000";"4";"0";"2020";"3673350.00"
+"1";"3001";"4";"0";"2020";"-106380.00"
+"1";"3020";"1";"0";"2020";"160.00"
+"1";"3020";"3";"0";"2020";"2916044.00"
+"1";"3020";"4";"0";"2020";"2653600.00"
+"1";"3040";"1";"0";"2020";"310.00"
+"1";"3040";"3";"0";"2020";"6704458.00"
+"1";"3040";"4";"0";"2020";"6241850.00"
+"1";"3060";"1";"0";"2020";"90.00"
+"1";"3060";"3";"0";"2020";"1819119.00"
+"1";"3060";"4";"0";"2020";"1755450.00"
+"1";"3080";"1";"0";"2020";"34.00"
+"1";"3080";"3";"0";"2020";"562850.00"
+"1";"3080";"4";"0";"2020";"543150.00"
+"1";"3081";"4";"0";"2020";"-23120.00"
+"1";"3083";"1";"0";"2020";"190.00"
+"1";"3083";"3";"0";"2020";"2102459.00"
+"1";"3083";"4";"0";"2020";"1923750.00"
+"1";"3084";"1";"0";"2020";"50.00"
+"1";"3084";"3";"0";"2020";"657397.00"
+"1";"3084";"4";"0";"2020";"573250.00"
+"1";"3120";"1";"0";"2020";"280.00"
+"1";"3120";"3";"0";"2020";"1994311.00"
+"1";"3120";"4";"0";"2020";"1822800.00"
+"1";"3130";"1";NULL;"2020";"0.00"
+"1";"3130";"3";"0";"2020";"0.00"
+"1";"3130";"4";"0";"2020";"0.00"
+"1";"3160";"1";"0";"2020";"60.00"
+"1";"3160";"3";"0";"2020";"817049.00"
+"1";"3160";"4";"0";"2020";"747600.00"
+"1";"3180";"1";"0";"2020";"0.00"
+"1";"3180";"3";"0";"2020";"0.00"
+"1";"3180";"4";"0";"2020";"0.00"
+"1";"3200";"1";"0";"2020";"107.00"
+"1";"3200";"3";"0";"2020";"668011.00"
+"1";"3200";"4";"0";"2020";"604550.00"
+"1";"3260";"1";"0";"2020";"170.00"
+"1";"3260";"3";"0";"2020";"1818056.00"
+"1";"3260";"4";"0";"2020";"1636250.00"
+"1";"3280";"1";"0";"2020";"30.00"
+"1";"3280";"3";"0";"2020";"223043.00"
+"1";"3280";"4";"0";"2020";"205200.00"
+"1";"3300";"1";NULL;"2020";"0.00"
+"1";"3300";"3";"0";"2020";"1648800.00"
+"1";"3300";"4";"0";"2020";"1359600.00"
+"1";"3320";"1";NULL;"2020";"0.00"
+"1";"3320";"3";"0";"2020";"0.00"
+"1";"3320";"4";"0";"2020";"0.00"
+"1";"3340";"1";NULL;"2020";"0.00"
+"1";"3340";"3";"0";"2020";"0.00"
+"1";"3340";"4";"0";"2020";"0.00"
+"1";"3530";"18";"0";"2020";"9.30"
+"1";"3530";"20";"0";"2020";"438318.00"
+"1";"3540";"20";"0";"2020";"3600.00"
+"1";"3550";"20";"0";"2020";"21240.00"
+"1";"3560";"20";"0";"2020";"42480.00"
+"1";"3570";"20";"0";"2020";"86000.00"
+"1";"3610";"18";"0";"2020";"5.90"
+"1";"3610";"20";"0";"2020";"234376.00"
+"1";"3620";"18";"0";"2020";"9.30"
+"1";"3620";"20";"0";"2020";"0.00"
+"1";"3630";"18";"0";"2020";"0.00"
+"1";"3630";"20";"0";"2020";"29016.00"
+"1";"3640";"20";"0";"2020";"137707.00"
+"1";"3650";"20";NULL;"2020";"0.00"
+"1";"3700";"18";"0";"2020";"15.50"
+"1";"3710";"20";"0";"2020";"742123.00"
+"1";"3720";"20";"0";"2020";"0.00"
+"1";"3730";"20";"0";"2020";"31770.00"
+"1";"3740";"20";"0";"2020";"2550.00"
+"1";"3750";"20";NULL;"2020";"0.00"
+"1";"3760";"20";"0";"2020";"0.00"
+"1";"3770";"20";"0";"2020";"88000.00"
+"1";"3780";"20";"0";"2020";"0.00"
+"1";"5010";"1";"0";"2020";"2387820.00"
+"1";"5010";"2";"0";"2020";"1528200.00"
+"1";"5015";"1";"0";"2020";"294480.00"
+"1";"5015";"2";"0";"2020";"197304.00"
+"1";"5020";"1";"0";"2020";"1296.00"
+"1";"5020";"2";"0";"2020";"1020.00"
+"1";"5030";"1";"0";"2020";"139536.00"
+"1";"5030";"2";"0";"2020";"122508.00"
+"1";"5040";"1";"0";"2020";"98640.00"
+"1";"5040";"2";"0";"2020";"80388.00"
+"1";"5050";"1";"0";"2020";"260580.00"
+"1";"5050";"2";"0";"2020";"224100.00"
+"1";"5060";"1";"0";"2020";"718620.00"
+"1";"5060";"2";"0";"2020";"674784.00"
+"1";"5080";"1";"0";"2020";"111240.00"
+"1";"5100";"1";"0";"2020";"119604.00"
+"1";"5100";"2";"0";"2020";"97476.00"
+"1";"5110";"1";"0";"2020";"90660.00"
+"1";"5110";"2";"0";"2020";"72624.00"
+"1";"5120";"1";"0";"2020";"995916.00"
+"1";"5120";"2";"0";"2020";"841548.00"
+"1";"5130";"1";"0";"2020";"0.00"
+"1";"5130";"2";"0";"2020";"-240000.00"
+"1";"5180";"1";"0";"2020";"412320.00"
+"1";"5180";"2";"0";"2020";"328896.00"
+"1";"5190";"1";"0";"2020";"109080.00"
+"1";"5190";"2";"0";"2020";"82872.00"
+"1";"5200";"1";"0";"2020";"47496.00"
+"1";"5200";"2";"0";"2020";"33240.00"
+"1";"5220";"1";"0";"2020";"9240.00"
+"1";"5220";"2";"0";"2020";"1728.00"
+"1";"5240";"1";"0";"2020";"1380.00"
+"1";"5240";"2";"0";"2020";"900.00"
+"1";"5250";"1";"0";"2020";"72408.00"
+"1";"5250";"2";"0";"2020";"45840.00"
+"1";"5260";"1";"0";"2020";"18720.00"
+"1";"5260";"2";"0";"2020";"15204.00"
+"1";"5270";"1";"0";"2020";"233460.00"
+"1";"5270";"2";"0";"2020";"165864.00"
+"1";"5280";"1";"0";"2020";"0.00"
+"1";"5280";"2";"0";"2020";"0.00"
+"1";"5290";"1";NULL;"2020";"0.00"
+"1";"5290";"2";NULL;"2020";"0.00"
+"1";"5310";"2";"0";"2020";"0.00"
+"1";"5360";"16";"0";"2020";"16710.00"
+"1";"5370";"16";NULL;"2020";"0.00"
+"1";"5390";"16";NULL;"2020";"0.00"
+"1";"5400";"14";"0";"2020";"0.00"
+"1";"5400";"16";"0";"2020";"24588.00"
+"1";"5410";"14";"0";"2020";"9.15"
+"1";"5410";"16";"0";"2020";"373756.00"
+"1";"5420";"16";"0";"2020";"81262.00"
+"1";"5430";"14";"0";"2020";"10.30"
+"1";"5430";"16";"0";"2020";"479606.00"
+"1";"5440";"16";"0";"2020";"36708.00"
+"1";"5450";"16";"0";"2020";"24467.00"
+"1";"5460";"16";"0";"2020";"2228.00"
+"1";"5470";"16";"0";"2020";"6760.00"
+"1";"5480";"16";"0";"2020";"2228.00"
+"1";"5490";"16";"0";"2020";"0.00"
+"1";"5500";"16";NULL;"2020";"0.00"
+"1";"5510";"16";NULL;"2020";"0.00"
+"1";"5520";"16";NULL;"2020";"0.00"
+"1";"6000";"3";"0";"2020";"0.00"
+"1";"6000";"4";"0";"2020";"0.00"
+"1";"6010";"3";"0";"2020";"1669803.00"
+"1";"6010";"4";"0";"2020";"1027927.00"
+"1";"6020";"3";"0";"2020";"314742.00"
+"1";"6020";"4";"0";"2020";"0.00"
+"1";"6030";"3";"0";"2020";"314742.00"
+"1";"6030";"4";"0";"2020";"0.00"
+"1";"6035";"3";"0";"2020";"0.00"
+"1";"6035";"4";"0";"2020";"0.00"
+"1";"6036";"3";"0";"2020";"249511.00"
+"1";"6036";"4";"0";"2020";"0.00"
+"1";"6037";"3";"0";"2020";"47030.00"
+"1";"6037";"4";"0";"2020";"0.00"
+"1";"6038";"3";"0";"2020";"47030.00"
+"1";"6038";"4";"0";"2020";"0.00"
+"1";"6040";"3";"0";"2020";"0.00"
+"1";"6040";"4";"0";"2020";"0.00"
+"1";"6050";"3";"0";"2020";"255583.00"
+"1";"6050";"4";"0";"2020";"193748.00"
+"1";"6060";"3";"0";"2020";"49051.00"
+"1";"6070";"3";"0";"2020";"302393.00"
+"1";"6076";"3";"0";"2020";"38191.00"
+"1";"6076";"4";"0";"2020";"0.00"
+"1";"6077";"3";"0";"2020";"7329.00"
+"1";"6077";"4";"0";"2020";"0.00"
+"1";"6078";"3";"0";"2020";"45185.00"
+"1";"6078";"4";"0";"2020";"0.00"
+"1";"6090";"3";"0";"2020";"473837.00"
+"1";"6090";"4";"0";"2020";"150837.00"
+"1";"6100";"3";"0";"2020";"45104.00"
+"1";"6110";"3";"0";"2020";"75877.00"
+"1";"6130";"3";"0";"2020";"0.00"
+"1";"6130";"4";"0";"2020";"54782.00"
+"1";"6140";"3";"0";"2020";"0.00"
+"1";"6150";"3";"0";"2020";"0.00"
+"1";"6170";"3";"0";"2020";"238500.00"
+"1";"6170";"4";"0";"2020";"88956.00"
+"1";"6180";"3";"0";"2020";"64020.00"
+"1";"6190";"3";"0";"2020";"11820.00"
+"1";"6200";"3";"0";"2020";"2220.00"
+"1";"6200";"4";"0";"2020";"1488.00"
+"1";"6220";"3";"0";"2020";"1322400.00"
+"1";"6220";"4";"0";"2020";"687648.00"
+"1";"6230";"3";"0";"2020";"0.00"
+"1";"6230";"4";"0";"2020";"0.00"
+"1";"6240";"3";"0";"2020";"522600.00"
+"1";"6240";"4";"0";"2020";"133680.00"
+"1";"6250";"3";NULL;"2020";"0.00"
+"1";"6250";"4";NULL;"2020";"0.00"
+"1";"6260";"3";NULL;"2020";"0.00"
+"1";"6260";"4";NULL;"2020";"0.00"
+"1";"6270";"3";"0";"2020";"471780.00"
+"1";"6270";"4";"0";"2020";"191196.00"
+"1";"6320";"18";"0";"2020";"177821.00"
+"1";"6330";"18";"0";"2020";"13118.00"
+"1";"6350";"16";"0";"2020";"2.00"
+"1";"6350";"18";"0";"2020";"18480.00"
+"1";"6360";"18";NULL;"2020";"0.00"
+"1";"6370";"18";NULL;"2020";"0.00"
+"1";"6380";"16";"0";"2020";"0.00"
+"1";"6380";"18";"0";"2020";"14508.00"
+"1";"6390";"16";"0";"2020";"28.80"
+"1";"6390";"18";"0";"2020";"1385569.00"
+"1";"6400";"18";"0";"2020";"275553.00"
+"1";"6410";"18";NULL;"2020";"0.00"
+"1";"6420";"16";"0";"2020";"30.80"
+"1";"6420";"18";"0";"2020";"1694110.00"
+"1";"6430";"18";"0";"2020";"58906.00"
+"1";"6440";"18";"0";"2020";"18602.00"
+"1";"6450";"18";"0";"2020";"50090.00"
+"1";"6460";"18";"0";"2020";"11645.00"
+"1";"6470";"18";"0";"2020";"31503.00"
+"1";"6480";"18";"0";"2020";"3725.00"
+"1";"6490";"18";"0";"2020";"47086.00"
+"1";"6500";"18";"0";"2020";"0.00"
+"1";"6510";"18";NULL;"2020";"0.00"
+"1";"6520";"18";NULL;"2020";"0.00"
+"1";"6530";"18";NULL;"2020";"0.00"
+"1";"7050";"3";"0";"2020";"0.00"
+"1";"7060";"3";"0";"2020";"383940.00"
+"1";"7070";"3";"0";"2020";"68500.00"
+"1";"7080";"3";"0";"2020";"452440.00"
+"1";"7090";"3";"0";"2020";"3400.00"
+"1";"7100";"3";"0";"2020";"0.00"
+"1";"7110";"3";"0";"2020";"48000.00"
+"1";"7120";"3";"0";"2020";"593600.00"
+"1";"7130";"3";"0";"2020";"0.00"
+"1";"7140";"3";"0";"2020";"49000.00"
+"1";"7150";"3";"0";"2020";"165000.00"
+"1";"7160";"3";"0";"2020";"4000.00"
+"1";"7170";"3";"0";"2020";"49000.00"
+"1";"7180";"3";"0";"2020";"6300.00"
+"1";"7190";"3";"0";"2020";"66000.00"
+"1";"7200";"3";"0";"2020";"120000.00"
+"1";"7210";"3";"0";"2020";"44366.00"
+"1";"7220";"3";"0";"2020";"17000.00"
+"1";"7230";"3";"0";"2020";"0.00"
+"1";"7240";"3";"0";"2020";"9000.00"
+"1";"7250";"3";"0";"2020";"19000.00"
+"1";"7260";"3";NULL;"2020";"0.00"
+"1";"7310";"3";"0";"2020";"0.00"
+"1";"7320";"3";NULL;"2020";"0.00"
+"1";"7330";"3";"0";"2020";"2105000.00"
+"1";"7340";"3";NULL;"2020";"0.00"
+"1";"7350";"3";NULL;"2020";"0.00"
+"1";"7360";"3";NULL;"2020";"0.00"
+"1";"7370";"3";NULL;"2020";"0.00"
+"1";"7400";"3";"0";"2020";"90000.00"
+"1";"7410";"3";"0";"2020";"-303550.00"
+"1";"7420";"3";"0";"2020";"125000.00"
+"1";"7430";"3";"0";"2020";"210000.00"
+"1";"7440";"3";"0";"2020";"28000.00"
+"1";"7450";"3";NULL;"2020";"0.00"
+"1";"7460";"3";NULL;"2020";"0.00"
+"1";"8030";"1";"0";"2020";"3695695.00"
+"1";"8040";"1";NULL;"2020";"0.00"
+"1";"8050";"1";NULL;"2020";"0.00"
+"1";"8060";"1";NULL;"2020";"0.00"
+"1";"8070";"1";NULL;"2020";"0.00"
+"1";"8080";"1";NULL;"2020";"0.00"
+"1";"8090";"1";"0";"2020";"0.00"
+"1";"8100";"1";NULL;"2020";"0.00"
+"1";"8110";"1";NULL;"2020";"0.00"
+"1";"8120";"1";NULL;"2020";"0.00"
+"1";"8140";"1";"0";"2020";"7800000.00"
+"1";"8150";"1";"0";"2020";"15925000.00"
+"1";"8160";"1";"0";"2020";"0.00"
+"1";"8170";"1";NULL;"2020";"0.00"
+"1";"8180";"1";NULL;"2020";"0.00"
+"1";"8190";"1";NULL;"2020";"0.00"
+"1";"8200";"1";NULL;"2020";"0.00"
+"1";"8210";"1";NULL;"2020";"0.00"
+"1";"8220";"1";NULL;"2020";"0.00"
+"1";"8230";"1";NULL;"2020";"0.00"
+"1";"8240";"1";"0";"2020";"-2761546.45"
+"1";"8250";"1";NULL;"2020";"0.00"
+"1";"8260";"1";NULL;"2020";"0.00"
+"1";"8280";"1";"0";"2020";"10442410.00"
+"1";"8300";"1";"0";"2020";"0.00"
+"1";"8310";"1";"0";"2020";"1217053.00"
+"1";"8320";"1";"0";"2020";"5518553.00"
+"1";"8330";"1";"0";"2020";"0.00"
+"1";"8340";"1";NULL;"2020";"0.00"
+"1";"8350";"1";NULL;"2020";"0.00"
+"1";"8360";"1";"0";"2020";"0.00"
+"1";"8370";"1";NULL;"2020";"0.00"
+"1";"8380";"1";NULL;"2020";"0.00"
+"1";"8390";"1";NULL;"2020";"0.00"

+ 2 - 0
config/hbv/mp_filename.csv

@@ -0,0 +1,2 @@
+"MP";"030778";"202100";"wert";"10";"date_format(now(),'%d%m%Y%H%i%S')"
+"MP";"030778";"202100";"010848";"10";"24032021152335"

+ 13 - 0
config/hbv/mp_format.csv

@@ -0,0 +1,13 @@
+"column";"type";"length";"value";"order_by"
+"VAART_SATZ";"A";"1";"I";"1"
+"MAND_ID";"N";"2";"01";"2"
+"SATZART";"A";"2";"40";"3"
+"BV_NUMMER";"N";"6";"010848";"4"
+"FILIAL_NR";"N";"1";"1";"5"
+"FREMDFABRIKAT";"N";"1";"0";"6"
+"JAHR";"N";"4";"2020";"7"
+"MONAT";"N";"2";"00";"8"
+"BEREICH";"N";"2";"00";"9"
+"MPRZ";"G";"6";0.00;"10"
+"MEDIUM";"N";"2";"03";"11"
+"ZEILENTRENNER";"H";"1";"";"12"

+ 61 - 0
config/hbv/mp_values.csv

@@ -0,0 +1,61 @@
+"FILIAL_NR";"JAHR";"BEREICH";"MONAT";"MPRZ"
+"1";"2020";"02";"1";"8.30"
+"1";"2020";"02";"2";"9.40"
+"1";"2020";"02";"3";"22.30"
+"1";"2020";"02";"4";"23.20"
+"1";"2020";"02";"5";"21.50"
+"1";"2020";"02";"6";"20.70"
+"1";"2020";"02";"7";"18.60"
+"1";"2020";"02";"8";"14.60"
+"1";"2020";"02";"9";"17.20"
+"1";"2020";"02";"10";"16.10"
+"1";"2020";"02";"11";"14.10"
+"1";"2020";"02";"12";"214.00"
+"1";"2020";"03";"1";"8.40"
+"1";"2020";"03";"2";"10.10"
+"1";"2020";"03";"3";"20.60"
+"1";"2020";"03";"4";"20.60"
+"1";"2020";"03";"5";"20.40"
+"1";"2020";"03";"6";"20.80"
+"1";"2020";"03";"7";"19.30"
+"1";"2020";"03";"8";"19.30"
+"1";"2020";"03";"9";"20.30"
+"1";"2020";"03";"10";"14.40"
+"1";"2020";"03";"11";"14.10"
+"1";"2020";"03";"12";"211.70"
+"1";"2020";"05";"1";"14.63"
+"1";"2020";"05";"2";"17.45"
+"1";"2020";"05";"3";"18.45"
+"1";"2020";"05";"4";"16.71"
+"1";"2020";"05";"5";"18.78"
+"1";"2020";"05";"6";"17.58"
+"1";"2020";"05";"7";"18.58"
+"1";"2020";"05";"8";"17.89"
+"1";"2020";"05";"9";"15.88"
+"1";"2020";"05";"10";"16.56"
+"1";"2020";"05";"11";"15.19"
+"1";"2020";"05";"12";"212.30"
+"1";"2020";"06";"1";"8.60"
+"1";"2020";"06";"2";"9.20"
+"1";"2020";"06";"3";"17.00"
+"1";"2020";"06";"4";"19.10"
+"1";"2020";"06";"5";"19.40"
+"1";"2020";"06";"6";"19.20"
+"1";"2020";"06";"7";"23.10"
+"1";"2020";"06";"8";"20.30"
+"1";"2020";"06";"9";"21.00"
+"1";"2020";"06";"10";"20.20"
+"1";"2020";"06";"11";"12.20"
+"1";"2020";"06";"12";"210.70"
+"1";"2020";"08";"1";"16.66"
+"1";"2020";"08";"2";"16.66"
+"1";"2020";"08";"3";"16.66"
+"1";"2020";"08";"4";"16.66"
+"1";"2020";"08";"5";"16.66"
+"1";"2020";"08";"6";"16.66"
+"1";"2020";"08";"7";"16.66"
+"1";"2020";"08";"8";"16.66"
+"1";"2020";"08";"9";"16.66"
+"1";"2020";"08";"10";"16.66"
+"1";"2020";"08";"11";"16.66"
+"1";"2020";"08";"12";"216.74"

+ 20 - 0
webservice/gnupg_encrypt.py

@@ -0,0 +1,20 @@
+import gnupg
+
+
+def encrypt(source_file):
+    base_dir = '/home/robert/projekte/python/planner/gnupg/'
+
+    gpg = gnupg.GPG(homedir=base_dir)
+    # gpg.import_keys(base_dir + 'export.gpg')
+    # public_keys = gpg.list_keys()
+    # print(public_keys)
+
+    with open(source_file, 'rb') as frh:
+        result = gpg.encrypt(frh, '942170BF95EA785E8D4A5C94D1839587F0E1C01C', output=source_file + '.gpg')
+        # 'BV_IFC; BMW Group <BV_IFC@softlab.de>'
+        print(result.stderr)
+        #  , verbose=True
+
+
+if __name__ == '__main__':
+    encrypt('/home/robert/projekte/python/planner/HBV/HB0014432021000103351024032021112656.dat')

+ 72 - 0
webservice/hbv_export.py

@@ -0,0 +1,72 @@
+import pandas as pd
+import numpy as np
+from datetime import datetime
+from gnupg_encrypt import encrypt
+import os
+
+
+base_dir = '/home/robert/projekte/python/planner/HBV/'
+hb_format = base_dir + 'hb_format.csv'
+hb_department = base_dir + 'hb_department.csv'
+hb_translation = base_dir + 'hb_translation.csv'
+plan_amount = base_dir + '../export/Planner_2022_V2_Stk.csv'
+plan_values = base_dir + '../export/Planner_2022_V2_Plan.csv'
+
+hb_ignored = base_dir + 'ignoriert.csv'
+
+current_year = '2022'
+current_date = datetime.now().strftime('%d%m%Y%H%M%S')
+# current_date = '24032021112656'
+
+
+def main():
+    # Übersetzungstabelle importieren
+    df_translation = pd.read_csv(hb_translation, decimal=',', sep=';', encoding='latin-1', converters={i: str for i in range(0, 200)})
+    # df_translation['column_no_join'] = np.where(df_translation['column_no'].isin(['1', '3', '4']), df_translation['column_no'], '0')
+    # Department-Zuordnung importieren
+    df_department = pd.read_csv(hb_department, decimal=',', sep=';', encoding='latin-1', converters={i: str for i in range(0, 200)})
+
+    # Planwerte importieren
+    values_converter = {i: str for i in range(0, 200)}
+    values_converter[4] = lambda x: np.float64(x.replace(',', '.') if x != '' else 0.0)
+    values_converter[5] = values_converter[4]
+    df_values = pd.read_csv(plan_values, decimal=',', sep=';', encoding='latin-1', converters=values_converter)   # encoding='latin-1',
+    df_values['Gesamt'] = df_values['Gesamt'] + df_values['Periode13']
+    df_values['type'] = '2'
+    df_values['type'] = np.where(df_values['Vstufe 1'].isin(['Materialaufwand']), '3', df_values['type'])
+    df_amount = pd.read_csv(plan_amount, decimal=',', sep=';', encoding='latin-1', converters=values_converter)   # , encoding='latin-1'
+    df_amount['type'] = '1'
+    df: pd.DataFrame = df_values.append(df_amount)
+
+    # Planwerte alle positiv
+    df['Minus1'] = np.where(df['Vstufe 1'].isin(['Umsatzerlöse', 'Verk. Stückzahlen']) | df['Zeile'].isin(['7410', '7440']), 1, -1)
+    df['Gesamt'] = df['Gesamt'] * df['Minus1']
+
+    # Planwerte übersetzen
+    df = df.merge(df_department, how='inner', left_on='Betrieb Nr', right_on='department_id')
+    df = df.merge(df_translation, how='left', left_on=['Zeile', 'type'], right_on=['from', 'type'])
+    # fehlende Übersetzung
+    df_ignored = df[(df['to'].isna()) & (df['Gesamt'] != 0)]
+    df_ignored.to_csv(hb_ignored, decimal=',', sep=';', encoding='latin-1', index=False)
+
+    # Planwerte formatieren und exportieren
+    rename_from = ['bm_code', 'BV_NUMMER', 'FILIAL_NR', 'to', 'column_no', 'Jahr', 'Gesamt']
+    rename_to = ['BM_CODE', 'BV_NUMMER', 'FILIAL_NR', 'ZEILE', 'SPALTE', 'JAHR', 'WERT']
+    df_valid = df[df['to'].notna()].rename(columns=dict(zip(rename_from, rename_to)))
+    df_valid['SPALTE'] = df_valid['SPALTE'].str.zfill(3)
+    group_by = ['BM_CODE', 'BV_NUMMER', 'FILIAL_NR']
+    df_valid = df_valid[rename_to].groupby(group_by)
+
+    for group in df_valid.groups:
+        g = dict(zip(group_by, group))
+        filename = base_dir + f"{current_year}/{g['BV_NUMMER']}_{g['FILIAL_NR']}/HB{g['BM_CODE']}{current_year}00{g['BV_NUMMER']}{g['FILIAL_NR']}0{current_date}.dat"
+        os.makedirs(os.path.dirname(filename), exist_ok=True)
+        df_group = df_valid.get_group(group).groupby(rename_to[:-1]).sum().reset_index()
+        with open(filename, 'w') as fwh:
+            for row in df_group.to_dict(orient='records'):
+                fwh.write("I0155{BV_NUMMER}{FILIAL_NR}0{ZEILE}{SPALTE}00{JAHR}{WERT:16.2f}03\n".format(**row))
+        encrypt(filename)
+
+
+if __name__ == '__main__':
+    main()

+ 92 - 0
webservice/plan_export.py

@@ -0,0 +1,92 @@
+import pandas as pd
+import numpy as np
+
+base_dir = '/home/robert/projekte/python/planner/export/'
+
+id_header = ['Ebene' + str(i) for i in range(1, 11)]
+values2_header = ['VJ', 'AJ', 'FC', 'Plan_ori', 'Plan_Prozent', 'Stk', 'VAK', 'BE_Prozent', 'Plan_VJ', 'Plan_Stk_VJ', 'Plan',
+                  'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez', 'Periode13']
+season_header = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
+info_header = ['text', 'costcenter', 'department']
+header = info_header + id_header + values2_header
+season_export_header = info_header + season_header
+
+source_header = ['department', 'text', 'costcenter', 'Ebene1', 'Plan', 'Periode13']
+export_header = ['Betrieb Nr', 'Zeile mit Bez', 'Bereich', 'Vstufe 1', 'Gesamt', 'Periode13']    # 'Version', 'Konto', 'Jahr']
+
+
+def expand(df, header, values_label):
+    for i, key in enumerate(header):
+        df[key] = df[values_label].str[i]
+    return df
+
+
+def apply_season(df):
+    df['Saison'] = df['Ebene1'].str.contains('Umsatzerlöse|Materialaufwand|Verkaufsabh. Kosten')
+    for i, key in enumerate(season_header):
+        df['temp'] = np.where((df['Saison']) & (df[key + '_2'] != 8.3333), df['Plan'] * df[key + '_2'] / 100, df['Plan'] / 12)
+        df[key] = np.where(df[key] == 0, df['temp'], df[key] * df['Minus1'])
+    df['Dez'] = df['Plan'] - df[season_header].sum(axis=1) + df['Dez']
+    return df
+
+
+def data_cleansing(filename):
+    df = pd.read_json(filename)
+    df['values2'] = df['values2'].apply(lambda v: list(v.items()))
+    df = df.explode('values2')
+    df['department'], df['values2'] = zip(*df['values2'])
+
+    df['id'] = df['id'].str.split(';')
+    df = expand(df, id_header, 'id')
+    df = expand(df, values2_header, 'values2')
+    return df
+
+
+def export_plan(version, target_year, amount_value):
+    df = data_cleansing(f'{base_dir}/{target_year}_{version}.json')
+    season = df[(df['level'] == 2) & (df['Ebene1'] == 'Umsatzerlöse')].copy()
+    season['Dez'] = (100 - season[season_header].sum(axis=1) + season['Dez']).round(4)
+    season[season_export_header].to_csv(f'{base_dir}/Planner_{target_year}_{version}_Saison.csv',
+                                        encoding='latin_1', sep=';', decimal=',', index=False)
+
+    df['Minus1'] = np.where(df['Ebene1'] != 'Umsatzerlöse', -1, 1)
+    df['Plan'] = df[amount_value] * df['Minus1']
+    if amount_value == 'Plan':
+        df['Periode13'] = df['Periode13'] * df['Minus1']
+    else:
+        df['Periode13'] = 0
+    plan = df[df['accounts'].apply(lambda a: len(a) > 0)]
+
+    plan = pd.merge(plan, season, how='left', on=['Ebene2', 'department'], suffixes=('', '_2'))
+    plan = apply_season(plan)
+    plan = plan[source_header + season_header].rename(columns=dict(zip(source_header, export_header)))
+
+    # Reisacher Spezialbedingungen
+    plan['Zeile'] = plan['Zeile mit Bez'].str.slice(stop=4)
+    plan['Zeile'] = np.where(plan['Zeile mit Bez'].isin(['BMW aus Leasingrücklauf BFS', 'BMW aus Leasingrücklauf Alphabet']),
+                             '3040', plan['Zeile'])
+    plan['Zeile'] = np.where(plan['Zeile mit Bez'].isin(['BMW an Wiederverkäufer BFS', 'BMW an Wiederverkäufer Alphabet']),
+                             '3120', plan['Zeile'])
+
+    desciption = pd.read_csv(f'{base_dir}/Planner_Zeilen_Bez.csv', sep=';', encoding='latin-1', dtype={0: str, 1: str})
+    plan = pd.merge(plan, desciption, how='left', on=['Zeile'], suffixes=['', '_3'])
+    plan['Zeile mit Bez'] = plan['Zeile mit Bez_3']
+    plan.drop(['Zeile mit Bez_3'], axis=1, inplace=True)
+
+    if amount_value == 'Stk':
+        plan = plan[plan['Vstufe 1'] == 'Umsatzerlöse']
+        plan['Vstufe 1'] = 'Verk. Stückzahlen'
+
+    plan['Version'] = version
+    plan['Konto'] = ''
+    plan['Jahr'] = target_year
+
+    plan.to_csv(f'{base_dir}/Planner_{target_year}_{version}_{amount_value}.csv', encoding='latin_1',
+                sep=';', decimal=',', index=False)
+
+
+if __name__ == '__main__':
+    # export_plan('V3', '2021', 'Plan')
+    # export_plan('V3', '2021', 'Stk')
+    export_plan('V2', '2022', 'Plan')
+    export_plan('V2', '2022', 'Stk')