rework skript, final version, added readme.md

This commit is contained in:
2025-08-12 15:29:52 +02:00
parent aac4168b47
commit 17fbf19656
16 changed files with 84 additions and 45 deletions

View File

@@ -35,12 +35,10 @@ class Company:
self.cleaned_data["name"] = data["Unternehmensname"]
for year in YEARS:
self.clean_complex(year, "vor")
self.clean_complex(year, "nach")
self.clean_simple(year, "Eigenkapital")
self.clean_simple(year, "Steuern")
def clean_simple(self, year: int, type: str) -> None:
"""Clean simple data. This means tax and capital."""
try:
@@ -52,43 +50,35 @@ class Company:
"""Get suffix for the simple cleaning process"""
return "ek" if type == "Eigenkapital" else "st"
def clean_complex(self, year: int, state: str) -> None:
"""Clean the complex data. This means earnings before/after tax."""
try:
if f"Gewinn/(Verlust) {state} Steuern EUR {year}" in self.data.keys() and self.data[f"Gewinn/(Verlust) {state} Steuern EUR {year}"] != '' and not self.cleaned_data.get(f"gn{year}") and self.cut_negative(state, int(self.data[f"Gewinn/(Verlust) {state} Steuern EUR {year}"])):
if f"Gewinn/(Verlust) {state} Steuern EUR {year}" in self.data.keys() and self.data[f"Gewinn/(Verlust) {state} Steuern EUR {year}"] != '' and not self.cleaned_data.get(f"gn{year}"):
self.cleaned_data[f"g{self.get_suffix(state)}{year}"] = int(self.data[f"Gewinn/(Verlust) {state} Steuern EUR {year}"])
elif f"Gewinn/Verlust {state} Steuern EUR {year}" in self.data.keys() and self.data[f"Gewinn/Verlust {state} Steuern EUR {year}"] != '' and not self.cleaned_data.get(f"gn{year}") and self.cut_negative(state, int(self.data[f"Gewinn/(Verlust) {state} Steuern EUR {year}"])):
elif f"Gewinn/Verlust {state} Steuern EUR {year}" in self.data.keys() and self.data[f"Gewinn/Verlust {state} Steuern EUR {year}"] != '' and not self.cleaned_data.get(f"gn{year}"):
self.cleaned_data[f"g{self.get_suffix(state)}{year}"] = int(self.data[f"Gewinn/Verlust {state} Steuern EUR {year}"])
else:
self.report.log.debug(f"{self.cleaned_data['name']}:g{self.get_suffix(state)}{year} empty value")
except ValueError:
self.report.log.debug(f"{self.cleaned_data['name']}: g{self.get_suffix(state)}{year} ValueError")
def cut_negative(self, state: str, gv: int) -> bool:
if state == "vor":
return False if gv < 0 else True
elif state == "nach":
return True
else:
raise Exception("IMPOSSIBLE STATE CN")
def get_suffix(self, state: str) -> str:
"""Get suffix for the complex cleaning process."""
return "n" if state == "nach" else "v"
def calculate_all_tax(self) -> None:
"""Calculate tax for all relevant years."""
for year in YEARS:
self.calculate_tax(year)
self.calculate_values(year)
def calculate_tax(self, year: int) -> None:
"""Calculate simple tax from provided values."""
def calculate_values(self, year: int) -> None:
"""Calculate missing values from provided values. GV - ST = GN"""
if not self.cleaned_data.get(f"st{year}") and self.cleaned_data.get(f"gv{year}") != None and self.cleaned_data.get(f"gn{year}") != None:
self.cleaned_data[f"st{year}"] = self.cleaned_data.get(f"gv{year}") - self.cleaned_data.get(f"gn{year}")
if not self.cleaned_data.get(f"gn{year}") and self.cleaned_data.get(f"gv{year}") != None and self.cleaned_data.get(f"st{year}") != None:
self.cleaned_data[f"gn{year}"] = self.cleaned_data.get(f"gv{year}") - self.cleaned_data.get(f"st{year}")
if not self.cleaned_data.get(f"gv{year}") and self.cleaned_data.get(f"gn{year}") != None and self.cleaned_data.get(f"st{year}") != None:
self.cleaned_data[f"gv{year}"] = self.cleaned_data.get(f"gn{year}") + self.cleaned_data.get(f"st{year}")
def reporter(self) -> None:
"""Simple class to report valid and invalid data to the main import class."""
@@ -97,19 +87,25 @@ class Company:
self.report.valid_data += 1
else:
self.report.invalid_data +=1
def calculate_data(self) -> None:
"""Calculate data relevant to the project."""
for year in YEARS:
if self.cleaned_data.get(f"st{year}") and self.cleaned_data.get(f"gv{year}") and self.cleaned_data.get(f"gn{year}") and self.cleaned_data.get(f"ek{year}"):
self.cleaned_data[f"nomtax{year}"] = self.cleaned_data.get(f"st{year}") / self.cleaned_data.get(f"gv{year}")
self.cleaned_data[f"realtax{year}"] = (self.cleaned_data.get(f"st{year}") + (INFLATION_RATES[year] * self.cleaned_data.get(f"gv{year}"))) / self.cleaned_data.get(f"gv{year}")
self.cleaned_data[f"realefftax{year}"] = (self.cleaned_data.get(f"st{year}") + (INFLATION_RATES[year] * self.cleaned_data.get(f"gv{year}")) + (INFLATION_RATES[year] * self.cleaned_data.get(f"ek{year}"))) / self.cleaned_data.get(f"gv{year}")
roenom = self.cleaned_data.get(f"gv{year}") / self.cleaned_data.get(f"ek{year}")
if roenom < 0 or roenom > 0.5:
continue # Skip outlier
self.cleaned_data[f"roenom{year}"] = roenom
self.cleaned_data[f"roereal{year}"] = self.cleaned_data.get(f"roenom{year}") - INFLATION_RATES[year]
self.cleaned_data[f"inflationloss{year}"] = self.cleaned_data.get(f"ek{year}") * INFLATION_RATES[year]
self.cleaned_data[f"roetaxed{year}"] = (self.cleaned_data.get(f"gv{year}") - self.cleaned_data.get(f"st{year}") - self.cleaned_data[f"inflationloss{year}"]) / self.cleaned_data.get(f"ek{year}")
self.cleaned_data[f"realefftax{year}"] = (self.cleaned_data.get(f"roereal{year}") - self.cleaned_data.get(f"roetaxed{year}")) / self.cleaned_data.get(f"roereal{year}")
self.cleaned_data[f"totalefftax{year}"] = (self.cleaned_data.get(f"roenom{year}") - self.cleaned_data.get(f"roetaxed{year}")) / self.cleaned_data.get(f"roereal{year}")
def write(self) -> None:
"""Write the current dataset to CSV"""
#if self.cleaned_data.get("realefftax2014"):
# raise Exception(self.cleaned_data)
self.writer.writerow(self.cleaned_data)
@@ -198,9 +194,12 @@ class dataimport:
fieldnames.append(f"gn{year}")
fieldnames.append(f"st{year}")
fieldnames.append(f"ek{year}")
fieldnames.append(f"nomtax{year}")
fieldnames.append(f"realtax{year}")
fieldnames.append(f"roenom{year}")
fieldnames.append(f"roereal{year}")
fieldnames.append(f"inflationloss{year}")
fieldnames.append(f"roetaxed{year}")
fieldnames.append(f"realefftax{year}")
fieldnames.append(f"totalefftax{year}")
return fieldnames
def comp_import(self, data: dict, writer) -> None:
@@ -212,7 +211,6 @@ class dataimport:
current.write()
parser = argparse.ArgumentParser(description='Import data from ORBIS', epilog='Copyright Denkena Consulting')
parser.add_argument('filename', nargs="+")
parser.add_argument('-l', '--logfile', default="log_importer", nargs="?")