From 2458ad98ff15f8ffc2682ede0eb9c873c6539886 Mon Sep 17 00:00:00 2001 From: TrisNol Date: Fri, 3 Nov 2023 11:35:45 +0100 Subject: [PATCH] checkpoint: Refactoring data-extraction from unternehmensregister to handle v1 and v3 --- .../apps/find_missing_companies.py | 44 +- .../transform/__init__.py | 0 .../unternehmensregister/transform/common.py | 0 .../unternehmensregister/transform/main.py | 81 + .../transform/v1/__init__.py | 0 .../unternehmensregister/transform/v1/v1.py | 569 ++++ .../transform/v3/__init__.py | 0 .../xjustiz_0040_cl_rollenbezeichnung_3_3.xsd | 2714 +++++++++++++++++ .../transform/v3/role_mapper.py | 34 + .../{transform.py => transform/v3/v3.py} | 288 +- tmp/transformation.ipynb | 1121 ++++++- 11 files changed, 4671 insertions(+), 180 deletions(-) create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/__init__.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/common.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/main.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/__init__.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/v1.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/__init__.py create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/assets/xjustiz_0040_cl_rollenbezeichnung_3_3.xsd create mode 100644 src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/role_mapper.py rename src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/{transform.py => transform/v3/v3.py} (69%) diff --git a/src/aki_prj23_transparenzregister/apps/find_missing_companies.py b/src/aki_prj23_transparenzregister/apps/find_missing_companies.py index c8aa78b..f8a7b5b 100644 --- a/src/aki_prj23_transparenzregister/apps/find_missing_companies.py +++ b/src/aki_prj23_transparenzregister/apps/find_missing_companies.py @@ -24,8 +24,8 @@ from aki_prj23_transparenzregister.utils.sql import entities from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister import ( extract, load, - transform, ) +from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform import main as transform if __name__ == "__main__": parser = argparse.ArgumentParser( @@ -43,8 +43,8 @@ if __name__ == "__main__": parsed = parser.parse_args(sys.argv[1:]) configer_logger(namespace=parsed) config = parsed.config - session = connector.get_session(get_config_provider(config)) - missing_companies = session.query(entities.MissingCompany).all() + # session = connector.get_session(get_config_provider(config)) + # missing_companies = session.query(entities.MissingCompany).all() counter = 0 # # Scrape data from unternehmensregister @@ -63,22 +63,24 @@ if __name__ == "__main__": for file in tqdm(glob.glob1(json_dir, "*.json")): path = os.path.join(json_dir, file) with open(path, encoding="utf-8") as file_object: - try: - company = transform.map_unternehmensregister_json( - json.loads(file_object.read()) + # try: + print(path) + company = transform.map_unternehmensregister_json( + json.loads(file_object.read()) + ) + + name = "".join(e for e in company.name if e.isalnum())[:50] + + with open( + f"{output_path}/{name}.json", + "w+", + encoding="utf-8", + ) as export_file: + json.dump( + dataclasses.asdict(company), export_file, ensure_ascii=False ) - - name = "".join(e for e in company.name if e.isalnum())[:50] - - with open( - f"{output_path}/{name}.json", - "w+", - encoding="utf-8", - ) as export_file: - json.dump( - dataclasses.asdict(company), export_file, ensure_ascii=False - ) - except Exception as e: - logger.error(e) - logger.error(f"Error in processing {path}") - sys.exit(1) \ No newline at end of file + # except Exception as e: + # logger.error(e.with_traceback()) + # logger.error(e) + # logger.error(f"Error in processing {path}") + # sys.exit(1) \ No newline at end of file diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/__init__.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/common.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/common.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/main.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/main.py new file mode 100644 index 0000000..717c4d1 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/main.py @@ -0,0 +1,81 @@ +"""Transform raw Unternehmensregister export (*.xml) to processed .json files for loading.""" +import dataclasses +import glob +import json +import os +import re +import sys + +import xmltodict +from tqdm import tqdm + +from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1 import v1 +from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3 import v3 +from aki_prj23_transparenzregister.models.company import Company + +def transform_xml_to_json(source_dir: str, target_dir: str) -> None: + """Convert all xml files in a directory to json files. + + Args: + source_dir (str): Directory hosting the xml files + target_dir (str): Target directory to move json files to + """ + for source_path in [ + os.path.normpath(i) for i in glob.glob(source_dir + "**/*.xml", recursive=True) + ]: + target_path = os.path.join( + target_dir, source_path.split(os.sep)[-1].replace(".xml", ".json") + ) + + with open(source_path, encoding="utf-8") as source_file: + # deepcode ignore HandleUnicode: Weird XML format no other solution + data = xmltodict.parse(source_file.read().encode()) + with open(target_path, "w", encoding="utf-8") as json_file: + json_file.write(json.dumps(data)) + +def determine_version(data: dict): + if "XJustiz_Daten" in data: + return v1 + elif "tns:nachrichtenkopf" in data[list(data.keys())[0]]: + return v3 + raise ValueError("Could not determine Unternehmensregister version.") + +def map_unternehmensregister_json(data: dict) -> Company: + """Processes the Unternehmensregister structured export to a Company by using several helper methods. + + Args: + data (dict): Data export + + Returns: + Company: Transformed data + """ + version = determine_version(data) + return version.map_unternehmensregister_json(data) + + +if __name__ == "__main__": + from loguru import logger + + base_path = "./Jupyter/API-tests/Unternehmensregister/data/Unternehmensregister" + for file in tqdm(glob.glob1(f"{base_path}/export", "*.json")): + path = os.path.join(f"{base_path}/export", file) + with open(path, encoding="utf-8") as file_object: + try: + company: Company = map_unternehmensregister_json( + json.loads(file_object.read()) + ) + + name = "".join(e for e in company.name if e.isalnum())[:50] + + with open( + f"{base_path}/transformed/{name}.json", + "w+", + encoding="utf-8", + ) as export_file: + json.dump( + dataclasses.asdict(company), export_file, ensure_ascii=False + ) + except Exception as e: + logger.error(e) + logger.error(f"Error in processing {path}") + sys.exit(1) diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/__init__.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/v1.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/v1.py new file mode 100644 index 0000000..95405cb --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v1/v1.py @@ -0,0 +1,569 @@ +"""Transform raw Unternehmensregister export (*.xml) to processed .json files for loading.""" +import dataclasses +import glob +import json +import os +import re +import sys + +import xmltodict +from tqdm import tqdm + +from aki_prj23_transparenzregister.models.company import ( + Capital, + CapitalTypeEnum, + Company, + CompanyID, + CompanyRelationship, + CompanyRelationshipEnum, + CompanyToCompanyRelationship, + CompanyTypeEnum, + CurrencyEnum, + DistrictCourt, + Location, + PersonName, + PersonToCompanyRelationship, + RelationshipRoleEnum, +) +from aki_prj23_transparenzregister.utils.string_tools import ( + remove_traling_and_leading_quotes, + transform_date_to_iso, +) + + +def parse_date_of_birth(data: dict) -> str | None: + """Retreives the date of birth from a stakeholder entry if possible. + + Args: + data (dict): Stakeholder data + + Returns: + str | None: date of birth or None if not found + """ + if "Geburt" in (base := data["Beteiligter"]["Natuerliche_Person"]): + base = base["Geburt"]["Geburtsdatum"] + if isinstance(base, str): + return base + return None + + +def parse_stakeholder(data: dict) -> CompanyRelationship | None: + """Extract the company stakeholder/relation from a single "Beteiligung". + + Args: + data (dict): Data export + + Returns: + CompanyRelationship | None: Relationship if it could be processed + """ + if "Natuerliche_Person" in data["Beteiligter"]: + # It's a Company serving as a "Kommanditist" or similar + if data["Beteiligter"]["Natuerliche_Person"]["Voller_Name"]["Vorname"] is None: + return CompanyToCompanyRelationship( + **{ # type: ignore + "name": remove_traling_and_leading_quotes( + data["Beteiligter"]["Natuerliche_Person"]["Voller_Name"][ + "Nachname" + ] + ), + "location": Location( + **{ + "city": data["Beteiligter"]["Natuerliche_Person"][ + "Anschrift" + ][-1]["Ort"] + if isinstance( + data["Beteiligter"]["Natuerliche_Person"]["Anschrift"], + list, + ) + else data["Beteiligter"]["Natuerliche_Person"]["Anschrift"][ + "Ort" + ] + } + ), + "role": RelationshipRoleEnum( + data["Rolle"]["Rollenbezeichnung"]["content"] + ), + "type": CompanyRelationshipEnum.COMPANY, + } + ) + return PersonToCompanyRelationship( + **{ # type: ignore + "name": PersonName( + **{ + "firstname": data["Beteiligter"]["Natuerliche_Person"][ + "Voller_Name" + ]["Vorname"], + "lastname": data["Beteiligter"]["Natuerliche_Person"][ + "Voller_Name" + ]["Nachname"], + } + ), + "date_of_birth": parse_date_of_birth(data), + "location": Location( + **{ + "city": data["Beteiligter"]["Natuerliche_Person"]["Anschrift"][ + -1 + ]["Ort"] + if isinstance( + data["Beteiligter"]["Natuerliche_Person"]["Anschrift"], list + ) + else data["Beteiligter"]["Natuerliche_Person"]["Anschrift"][ + "Ort" + ] + } + ), + "role": RelationshipRoleEnum( + data["Rolle"]["Rollenbezeichnung"]["content"] + ), + "type": CompanyRelationshipEnum.PERSON, + } + ) + if "Organisation" in data["Beteiligter"]: + return CompanyToCompanyRelationship( + **{ # type: ignore + "role": RelationshipRoleEnum( + data["Rolle"]["Rollenbezeichnung"]["content"] + ), + "name": remove_traling_and_leading_quotes( + data["Beteiligter"]["Organisation"]["Bezeichnung"][ + "Bezeichnung_Aktuell" + ] + ), + "location": Location( + **{ + "city": data["Beteiligter"]["Organisation"]["Anschrift"]["Ort"], + "street": data["Beteiligter"]["Organisation"]["Anschrift"][ + "Strasse" + ] + if "Strasse" in data["Beteiligter"]["Organisation"]["Anschrift"] + else None, + "house_number": data["Beteiligter"]["Organisation"][ + "Anschrift" + ]["Hausnummer"] + if "Hausnummer" + in data["Beteiligter"]["Organisation"]["Anschrift"] + else None, + "zip_code": data["Beteiligter"]["Organisation"]["Anschrift"][ + "Postleitzahl" + ] + if "Postleitzahl" + in data["Beteiligter"]["Organisation"]["Anschrift"] + else None, + } + ), + "type": CompanyRelationshipEnum.COMPANY, + } + ) + return None + + +def normalize_street(street: str) -> str: + """Normalize street names by extending them to `Straße` or `straße`. + + Args: + street (str): Name of street + + Returns: + str: Normalized street name + """ + if street is None: + return None + regex = r"(Str\.|Strasse)" + street = re.sub(regex, "Straße", street) + regex = r"(str\.|strasse)" + street = re.sub(regex, "straße", street) + return street.strip() + + +def loc_from_beteiligung(data: dict) -> Location: + """Extract the company location from the first relationship in the export. + + Args: + data (dict): Data export + + Returns: + Location: location + """ + base = data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"]["Beteiligung"][0][ + "Beteiligter" + ]["Organisation"]["Anschrift"] + + house_number = None + street = None + if "Strasse" in base: + regex = r".(\d+)$" + hits = re.findall(regex, base["Strasse"]) + if len(hits) == 1: + house_number = hits[0] + street = base["Strasse"][: (-1 * len(house_number))] + if "Hausnummer" in base: + house_number = house_number + base["Hausnummer"] + else: + if "Hausnummer" in base: + house_number = base["Hausnummer"] + street = base["Strasse"] + return Location( + **{ + "city": base["Ort"], + "zip_code": base["Postleitzahl"], + "street": normalize_street(street), # type: ignore + "house_number": house_number, + } + ) + + +def name_from_beteiligung(data: dict) -> str: + """Extract the Company name from an Unternehmensregister export by using the first relationship found. + + Args: + data (dict): Data export + + Returns: + str: Company name + """ + name = data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"]["Beteiligung"][0][ + "Beteiligter" + ]["Organisation"]["Bezeichnung"]["Bezeichnung_Aktuell"] + return remove_traling_and_leading_quotes(name) + + +def map_rechtsform(company_name: str, data: dict) -> CompanyTypeEnum | None: + """Extracts the company type from a given Unternehmensregister export. + + Args: + company_name (str): Name of the company as a fallback solution + data (dict): Data export + + Returns: + CompanyTypeEnum | None: Company type if found + """ + try: + return CompanyTypeEnum( + data["XJustiz_Daten"]["Fachdaten_Register"]["Basisdaten_Register"][ + "Rechtstraeger" + ]["Rechtsform"]["content"] + ) + except KeyError: + if ( + company_name.endswith("GmbH") + or company_name.endswith("UG") + or company_name.endswith("UG (haftungsbeschränkt)") + ): + return CompanyTypeEnum("Gesellschaft mit beschränkter Haftung") + if company_name.endswith("SE"): + return CompanyTypeEnum("Europäische Aktiengesellschaft (SE)") + if company_name.endswith("KG"): + return CompanyTypeEnum("Kommanditgesellschaft") + return None + + +def map_capital(data: dict, company_type: CompanyTypeEnum) -> Capital | None: + """Extracts the company capital from the given Unternehmensregister export. + + Args: + data (dict): Data export + company_type (CompanyTypeEnum): Type of company (e.g., 'Gesellschaft mit beschränkter Haftung') + + Returns: + Capital | None: Company Capital if found + """ + # Early return + if "Zusatzangaben" not in data["XJustiz_Daten"]["Fachdaten_Register"]: + return None + capital: dict = {"Zahl": 0.0, "Waehrung": ""} + if company_type == CompanyTypeEnum.KG: + capital_type = "Hafteinlage" + base = data["XJustiz_Daten"]["Fachdaten_Register"]["Zusatzangaben"][ + "Personengesellschaft" + ]["Zusatz_KG"]["Daten_Kommanditist"] + if isinstance(base, list): + for entry in base: + # TODO link to persons using Ref_Rollennummer then extract ["Hafteinlage"] as below + capital["Zahl"] = capital["Zahl"] + float(entry["Hafteinlage"]["Zahl"]) + capital["Waehrung"] = entry["Hafteinlage"]["Waehrung"] + elif isinstance(base, dict): + capital = base["Hafteinlage"] + elif company_type in [ + CompanyTypeEnum.GMBH, + CompanyTypeEnum.SE, + CompanyTypeEnum.AG, + CompanyTypeEnum.KGaA, + CompanyTypeEnum.AUSLAENDISCHE_RECHTSFORM, + CompanyTypeEnum.OHG, + ]: + if ( + "Kapitalgesellschaft" + not in data["XJustiz_Daten"]["Fachdaten_Register"]["Zusatzangaben"] + ): + base = data["XJustiz_Daten"]["Fachdaten_Register"]["Zusatzangaben"][ + "Personengesellschaft" + ] + else: + base = data["XJustiz_Daten"]["Fachdaten_Register"]["Zusatzangaben"][ + "Kapitalgesellschaft" + ] + if "Zusatz_GmbH" in base: + capital_type = "Stammkapital" + capital = base["Zusatz_GmbH"]["Stammkapital"] + elif "Zusatz_Aktiengesellschaft" in base: + capital_type = "Grundkapital" + capital = base["Zusatz_Aktiengesellschaft"]["Grundkapital"]["Hoehe"] + elif company_type in [ + CompanyTypeEnum.EINZELKAUFMANN, + CompanyTypeEnum.EG, + CompanyTypeEnum.PARTNERSCHAFT, + CompanyTypeEnum.PARTNERGESELLSCHAFT, + CompanyTypeEnum.PARTNERSCHAFTSGESELLSCHAFT, + None, + ]: + return None + # Catch entries having the dict but with null values + if not all(capital.values()): + return None + return Capital( + **{ # type: ignore + "value": float(capital["Zahl"]), + "currency": CurrencyEnum(capital["Waehrung"]), + "type": CapitalTypeEnum(capital_type), + } + ) + + +def map_business_purpose(data: dict) -> str | None: + """Extracts the "Geschäftszweck" from a given Unternehmensregister export. + + Args: + data (dict): Data export + + Returns: + str | None: Business purpose if found + """ + try: + return data["XJustiz_Daten"]["Fachdaten_Register"]["Basisdaten_Register"][ + "Gegenstand_oder_Geschaeftszweck" + ] + except KeyError: + return None + + +def extract_date_from_string(value: str) -> str | None: + """Extract a date in ISO format from the given string if possible. + + Args: + value (str): Input text + + Returns: + str | None: Date in ISO format, None if not found + """ + date_regex = [ # type: ignore + {"regex": r"\d{1,2}\.\d{1,2}\.\d{4}", "mapper": transform_date_to_iso}, + {"regex": r"\d{4}-\d{1,2}-\d{1,2}", "mapper": None}, + ] + results = [] + for regex in date_regex: + result = re.findall(regex["regex"], value) # type: ignore + if len(result) == 1: + relevant_data = result[0] + if regex["mapper"] is not None: # type: ignore + results.append(regex["mapper"](relevant_data)) # type: ignore + else: + results.append(relevant_data) + if len(results) != 1: + return None + return results[0] + + +def map_founding_date(data: dict) -> str | None: + """Extracts the founding date from a given Unternehmensregister export. + + Args: + data (dict): Data export + + Returns: + str | None: Founding date if found + """ + text = str(data) + entry_date = re.findall( + r".Tag der ersten Eintragung:(\\n| )?(\d{1,2}\.\d{1,2}\.\d{2,4})", text + ) + if len(entry_date) == 1: + return transform_date_to_iso(entry_date[0][1]) + + entry_date = re.findall( + r".Gesellschaftsvertrag vom (\d{1,2}\.\d{1,2}\.\d{2,4})", text + ) + if len(entry_date) == 1: + return transform_date_to_iso(entry_date[0]) + if ( + "Gruendungsmetadaten" + in data["XJustiz_Daten"]["Fachdaten_Register"]["Basisdaten_Register"] + ): + return extract_date_from_string( + data["XJustiz_Daten"]["Fachdaten_Register"]["Basisdaten_Register"][ + "Gruendungsmetadaten" + ]["Gruendungsdatum"] + ) + # No reliable answer + return None + + +def map_company_id(data: dict) -> CompanyID: + """Retrieve Company ID from export. + + Args: + data (dict): Data export + + Returns: + CompanyID: ID of the company + """ + return CompanyID( + **{ + "hr_number": data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Instanzdaten" + ]["Aktenzeichen"], + "district_court": DistrictCourt( + **{ + "name": data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"]["Organisation"]["Bezeichnung"][ + "Bezeichnung_Aktuell" + ] + if "Organisation" + in data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"] + else data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"]["Natuerliche_Person"]["Voller_Name"][ + "Nachname" + ], + "city": data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"]["Organisation"]["Sitz"]["Ort"] + if "Organisation" + in data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"] + else data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"][ + "Beteiligung" + ][1]["Beteiligter"]["Natuerliche_Person"]["Anschrift"]["Ort"], + } + ), + } + ) + + +def map_last_update(data: dict) -> str: + """Extract last update date from export. + + Args: + data (dict): Unternehmensregister export + + Returns: + str: Last update date + """ + return data["XJustiz_Daten"]["Fachdaten_Register"]["Auszug"]["letzte_Eintragung"] + + +def map_co_relation(data: dict) -> dict: + """Search for and map the c/o relation from location.street if possible. + + Args: + data (dict): Company dict + + Returns: + dict: Modified Company dict + """ + street = data["location"].street + if street is None: + return data + parts = street.split(",") + co_company = None + co_company_index = None + for index, part in enumerate(parts): + trimmed_part = part.strip() + result = re.findall(r"^c\/o(.*)$", trimmed_part) + if len(result) == 1: + co_company = result[0].strip() + co_company_index = index + if co_company_index is not None: + del parts[co_company_index] + street = "".join(parts).strip() + data["location"].street = street + + if co_company is not None and co_company != "": + relation = CompanyToCompanyRelationship( + RelationshipRoleEnum.CARE_OF, # type: ignore + Location( + data["location"].city, + street, + data["location"].house_number, + data["location"].zip_code, + ), + CompanyRelationshipEnum.COMPANY, # type: ignore + co_company, + ) + data["relationships"].append(relation) + return data + + +def map_unternehmensregister_json(data: dict) -> Company: + """Processes the Unternehmensregister structured export to a Company by using several helper methods. + + Args: + data (dict): Data export + + Returns: + Company: Transformed data + """ + result: dict = {"relationships": []} + + # TODO Refactor mapping - this is a nightmare... + result["id"] = map_company_id(data) + result["name"] = name_from_beteiligung(data) + + result["location"] = loc_from_beteiligung(data) + result["last_update"] = map_last_update(data) + + result["company_type"] = map_rechtsform(result["name"], data) + result["capital"] = map_capital(data, result["company_type"]) + result["business_purpose"] = map_business_purpose(data) + result["founding_date"] = map_founding_date(data) + + for i in range( + 2, len(data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"]["Beteiligung"]) + ): + people = parse_stakeholder( + data["XJustiz_Daten"]["Grunddaten"]["Verfahrensdaten"]["Beteiligung"][i] + ) + result["relationships"].append(people) + result = map_co_relation(result) + return Company(**result) + + +if __name__ == "__main__": + from loguru import logger + + base_path = "./Jupyter/API-tests/Unternehmensregister/data/Unternehmensregister" + for file in tqdm(glob.glob1(f"{base_path}/export", "*.json")): + path = os.path.join(f"{base_path}/export", file) + with open(path, encoding="utf-8") as file_object: + try: + company: Company = map_unternehmensregister_json( + json.loads(file_object.read()) + ) + + name = "".join(e for e in company.name if e.isalnum())[:50] + + with open( + f"{base_path}/transformed/{name}.json", + "w+", + encoding="utf-8", + ) as export_file: + json.dump( + dataclasses.asdict(company), export_file, ensure_ascii=False + ) + except Exception as e: + logger.error(e) + logger.error(f"Error in processing {path}") + sys.exit(1) \ No newline at end of file diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/__init__.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/assets/xjustiz_0040_cl_rollenbezeichnung_3_3.xsd b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/assets/xjustiz_0040_cl_rollenbezeichnung_3_3.xsd new file mode 100644 index 0000000..429985d --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/assets/xjustiz_0040_cl_rollenbezeichnung_3_3.xsd @@ -0,0 +1,2714 @@ + + + + + + Strukturierte Fachdaten für die Kommunikation im elektronischen Rechtsverkehr + XJustiz + xjustiz + urn:xoev-de:blk-ag-it-standards:standard:xjustiz + XJustiz ist der bundesweit einheitliche Standard für den Austausch strukturierter elektronischer Informationen mit der Justiz. + + + 3.3.1 + XJustiz beschreibt ein standardisiertes Datenaustauschformat für die elektronische Kommunikation innerhalb und mit der Justizverwaltung. + 1.7.1 + 2.3.0 + 3.0.1 + 19.0 SP3 + MagicDraw + + + + + + + + + GDS.Rollenbezeichnung + GDS.Rollenbezeichnung + gds.rollenbezeichnung + urn:xoev-de:xjustiz:codeliste:gds.rollenbezeichnung + Codeliste der verschiedenen Rollenbezeichnungen. + BLK-AG IT-Standards in der Justiz + AG IT-Standards + + + 3.3 + 1.1 + + + + Schlüssel + string + true + required + true + + + Wert + string + false + required + false + + + Aufgeführte Fachmodule nutzen ausschließlich die für sie gekennzeichneten Werte + string + false + optional + false + + + code + + + + + + + + + + + + + + + + + GDS.Rollenbezeichnung + GDS.Rollenbezeichnung + gds.rollenbezeichnung + urn:xoev-de:xjustiz:codeliste:gds.rollenbezeichnung + Codeliste der verschiedenen Rollenbezeichnungen. + BLK-AG IT-Standards in der Justiz + AG IT-Standards + + + 3.3 + 1.1 + + + + Schlüssel + string + true + required + true + + + Wert + string + false + required + false + + + Aufgeführte Fachmodule nutzen ausschließlich die für sie gekennzeichneten Werte + string + false + optional + false + + + + + + + + + Abwesenheitspfleger(in) + INSO + + + + + + + Aliasidentität + STRAF + + + + + + + Angehörige(r) + STRAF + + + + + + + Angeklagte(r) + STRAF + + + + + + + Angeschuldigte(r) + STRAF + + + + + + + Annehmende(r) + + + + + + + Anschlussberufungsbeklagte(r) + + + + + + + Anschlussberufungskläger(in) + + + + + + + Anschlussbeschwerdeführer(in) + + + + + + + Anschlussbeschwerdegegner(in) + + + + + + + Anschlussrechtsbeschwerdeführer(in) + + + + + + + Anschlussrechtsbeschwerdegegner(in) + + + + + + + Anschlussrevisionsbeklagte(r) + + + + + + + Anschlussrevisionskläger(in) + + + + + + + Antragsgegner(in) + INSO,VAG,ZSSR,STRAF + + + + + + + Antragsteller(in) + INSO,VAG,ZSSR,STRAF + + + + + + + Anzeigeerstatter(in) + STRAF + + + + + + + Anzunehmende(r) + + + + + + + Arrestgläubiger(in) + + + + + + + Arrestschuldner(in) + + + + + + + Aufsichtsbehörde + + + + + + + Ausschlagende(r) + + + + + + + Beamter (Beamtin) + + + + + + + Behörde + INSO,STRAF + + + + + + + Beigeladene(r) + + + + + + + Beistand + INSO,STRAF + + + + + + + Bekannte(r) + + + + + + + Beklagte(r) + STRAF + + + + + + + Berufungsbeklagte(r) + + + + + + + Berufungskläger(in) + + + + + + + Beschuldigte(r) + STRAF + + + + + + + Beschwerdeführer(in) + STRAF + + + + + + + Beschwerdegegner(in) + STRAF + + + + + + + Besucher(in) + + + + + + + Betreibende(r) Gläubige(r) + + + + + + + Betreuer(in) + INSO,STRAF + + + + + + + Betreute(r) + INSO,STRAF + + + + + + + Betreuungsbehörde + + + + + + + Betroffene(r) + EHUG,STRAF + + + + + + + Bevollmächtigte(r) + EHUG,INSO + + + + + + + Bewährungshelfer(in) + STRAF + + + + + + + Beweisanwalt (-anwältin) + + + + + + + Bruder (Schwester) + + + + + + + Bundeswehrdisziplinaranwalt (-anwältin) + + + + + + + Bußgeldempfänger(in) + STRAF + + + + + + + Cousin(e) + + + + + + + Dienstvorgesetzte(r) + + + + + + + director + INSO + + + + + + + Dolmetscher(in) + STRAF + + + + + + + Dritte(r) + + + + + + + Drittschuldner(in) + INSO,STRAF + + + + + + + Drittwiderbeklagte(r) + + + + + + + Drittwiderkläger(in) + + + + + + + Ehemann (Ehefrau) + + + + + + + Eigentümer(in) + + + + + + + Eingetragene(r) Lebenspartner(in) + STRAF + + + + + + + Einleitungsbehörde + STRAF + + + + + + + Eltern + INSO + + + + + + + Elternteil + INSO + + + + + + + Enkel(in) + + + + + + + Erbe (Erbin) + INSO + + + + + + + Erbe (Erbin) (ausschlagend) + + + + + + + Erbe (Erbin) (vorverstorben) + + + + + + + Erblasser(in) + INSO + + + + + + + Ergänzungspfleger(in) + INSO,STRAF + + + + + + + Erinnerungsführer(in) + INSO + + + + + + + Erinnerungsgegner(in) + INSO + + + + + + + Ersatzbetreuer(in) + INSO + + + + + + + Ersteher(in) + + + + + + + Erwerber(in) + + + + + + + Erziehungsberechtigte(r) + INSO,STRAF + + + + + + + Frühere(r) Ehegatte (Ehegattin) + + + + + + + Frühere(r) Beklagte(r) + + + + + + + Frühere(r) Beteiligte(r) + + + + + + + Frühere(r) Gläubiger(in) + + + + + + + Frühere(r) Kläger(in) + + + + + + + Frühere(r) Soldat(in) + + + + + + + Gegenvormund + + + + + + + Generalbundesanwalt (-anwältin) + STRAF + + + + + + + Gericht + STRAF + + + + + + + Gerichtsvollzieher(in) + ZPO,STRAF + + + + + + + Geschädigte(r) + STRAF + + + + + + + Geschäftsführende(r) Gesellschafter(in) + INSO,STRAF + + + + + + + Geschäftsführer(in) + INSO,STRAF + + + + + + + Gesetzliche(r) Erbe (Erbin) + + + + + + + Gesetzliche(r) Vertreter(in) + EHUG,INSO,ZSSR,STRAF + + + + + + + Gläubiger(in) + EZOLL,INSO,ZPO + + + + + + + Großeltern + + + + + + + Großvater (Großmutter) + + + + + + + Hauptbevollmächtigte(r) + EHUG,INSO + + + + + + + Hoferbe (Hoferbin) + + + + + + + Inhaber(in) der Firma + + + + + + + Insolvenzverwalter(in) + INSO,STRAF + + + + + + + Jugendamt + + + + + + + Kammer + + + + + + + Kammermitglied + + + + + + + Kind + + + + + + + Kläger(in) + STRAF + + + + + + + Kontrollbetreuer(in) + + + + + + + Korrespondenzanwalt (-anwältin) + + + + + + + Kostenschuldner(in) + STRAF + + + + + + + Landwirtschaftsrichter(in) + + + + + + + Lebenspartner(in) + + + + + + + Liquidator(in) + INSO + + + + + + + Minderjährige(r) + + + + + + + Mitvormund + + + + + + + Mündel + + + + + + + Nachbesserungsgläubiger(in) + + + + + + + Nachlasspfleger(in) + INSO + + + + + + + Nachlassverwalter(in) + INSO + + + + + + + Nebenkläger(in) + STRAF + + + + + + + Neffe (Nichte) + + + + + + + Nicht verwandt + + + + + + + Onkel (Tante) + + + + + + + Opfer + STRAF + + + + + + + Pächter(in) + + + + + + + Pflegeeltern + + + + + + + Pfleger(in) + INSO + + + + + + + Pfleger(in) für das Sammelvermögen + + + + + + + Pfleger(in) für die Leibesfrucht + + + + + + + Pflegevater (Pflegemutter) des Mündels + + + + + + + Pflegling + + + + + + + Pflichtverteidiger(in) + STRAF + + + + + + + Polizei + STRAF + + + + + + + Privatbeklagte(r) + + + + + + + Privatkläger(in) + + + + + + + Prozessbevollmächtigte(r) + EHUG,INSO,ZSSR,STRAF + + + + + + + Prozesskostenhilfe-Anwalt (-Anwältin) + INSO + + + + + + + Prozesskostenhilfe-Korrespondenzanwalt (-anwältin) + INSO + + + + + + + Rechtsanwalt (-anwältin) + INSO,STRAF + + + + + + + Rechtsbeistand + INSO,STRAF + + + + + + + Rechtsbeschwerdeführer(in) + + + + + + + Rechtsbeschwerdegegner(in) + + + + + + + Revisionsbeklagte(r) + + + + + + + Revisionskläger(in) + + + + + + + Sachbearbeiter(in) + INSO + + + + + + + Sachverständige(r) + INSO,STRAF + + + + + + + Schuldner(in) + EZOLL,INSO,VSTR,ZPO + + + + + + + Schwager (Schwägerin) + + + + + + + Schwiegersohn (Schwiegertochter) + + + + + + + Schwiegervater (Schwiegermutter) + + + + + + + Sohn (Tochter) + + + + + + + Soldat(in) + + + + + + + Sonstige(r) Beteiligte(r) + + + + + + + Sonstige(r) Vertreter(in) + EHUG,INSO + + + + + + + Staatsanwaltschaft + STRAF + + + + + + + Stiefeltern + + + + + + + Stiefvater (Stiefmutter) + + + + + + + Streithelfer(in) Beklagte(r) + + + + + + + Streithelfer(in) Kläger(in) + + + + + + + Streitverkündete(r) Beklagte(r) + + + + + + + Streitverkündete(r) Kläger(in) + + + + + + + Terminsbevollmächtigte(r) + + + + + + + Testamentsvollstrecker(in) + + + + + + + Testator(in) + + + + + + + Übernehmer(in) + + + + + + + Unterbevollmächtigte(r) + EHUG,INSO + + + + + + + Ur-Enkel(in) + + + + + + + Vater (Mutter) + INSO + + + + + + + Veräußerer (Veräußerin) + + + + + + + Verfahrensbevollmächtigte(r) + EHUG,INSO + + + + + + + Verfahrenskostenhilfe-Anwalt(-Anwältin) + INSO + + + + + + + Verfahrenskostenhilfe-Korrespondenzanwalt (-anwältin) + INSO + + + + + + + Verfahrenspfleger(in) + INSO + + + + + + + Verfahrensvertreter(in) (§787 ZPO) + EHUG,INSO + + + + + + + Verfügungsbeklagte(r) + + + + + + + Verfügungskläger(in) + + + + + + + Verkehrsanwalt (-anwältin) + + + + + + + Verlobte(r) + + + + + + + Vermächtnisnehmer(in) + + + + + + + Vermieter(in) + + + + + + + Verpächter(in) + + + + + + + Versorgungsträger(in) + VAG + + + + + + + Verteidiger(in) + + + + + + + Vertreter(in) der Interessen des Ausgleichsfonds + + + + + + + Vertreter(in) der Staatskasse + + + + + + + Vertreter(in) des Bundesinteresses beim Bundesverwaltungsgericht + + + + + + + Vertreter(in) des öffentlichen Interesses + + + + + + + Verurteilte(r) + STRAF + + + + + + + Verwalter(in) der Wohnungseigentümergemeinschaft + INSO + + + + + + + Verwaltungsbehörde + STRAF + + + + + + + Vollstreckungsgläubiger(in) + INSO + + + + + + + Vollstreckungsschuldner(in) + INSO + + + + + + + Vorläufige(r) Betreuer(in) + INSO + + + + + + + Vormund + INSO + + + + + + + Vorstand + INSO + + + + + + + Vorsorgebevollmächtigte(r) + + + + + + + Wahlverteidiger(in) + STRAF + + + + + + + Widerbeklagte(r) + + + + + + + Widerkläger(in) + + + + + + + Wiederaufnahmebeklagte(r) + + + + + + + Wiederaufnahmekläger(in) + + + + + + + Zahlungs- und Auflagenempfänger(in) + + + + + + + Zeuge (Zeugin) + INSO,STRAF + + + + + + + Zeugenbeistand + + + + + + + Zulassungsantragsgegner(in) + + + + + + + Zulassungsantragsteller(in) + + + + + + + Zustellungsbevollmächtigte(r) + EHUG,INSO,STRAF + + + + + + + Zustellungsvertreter(in) (§6 ZVG) + EHUG + + + + + + + Notar(in) + + + + + + + Auskunftsempfänger(in) + + + + + + + Melder(in) + + + + + + + Verwahrstelle + + + + + + + Aussteller(in) + + + + + + + Berechtigte(r) + + + + + + + Berechtigte(r) an einem Recht + + + + + + + Einreicher(in) + + + + + + + Erbbauberechtigte(r) + + + + + + + Finanzamt + + + + + + + Grundbuchvertreter(in) + + + + + + + Insolvenzgericht + + + + + + + Mitteilungsempfänger(in) + + + + + + + Nacherbe (Nacherbin) + + + + + + + Rechnungsempfänger(in) + + + + + + + Veranlasser(in) + + + + + + + Versteigerungsabteilung + + + + + + + Vertretungsberechtigte(r) + EHUG + + + + + + + Zweitschuldner(in) + INSO + + + + + + + Vertreter(in) + EHUG,INSO + + + + + + + Arbeitgeber(in) + EZOLL,ZPO + + + + + + + RV-Träger(in) + EZOLL,ZPO + + + + + + + Vollstreckungsstelle + EZOLL + + + + + + + Abkömmling + + + + + + + Kreditnehmer(in) + + + + + + + Neu vorzutragende(r) Eigentümer(in) + + + + + + + Notariatsverwalter(in) + + + + + + + Notarvertreter(in) + + + + + + + Partei kraft Amtes + INSO + + + + + + + Sequester + INSO + + + + + + + Treuhänder(in) + INSO + + + + + + + Zustimmende(r) + + + + + + + Gläubigervertreter(in) + INSO + + + + + + + Schuldnervertreter(in) + + + + + + + Zahlungsempfänger(in) + + + + + + + Anteilsinhaber(in) + INSO + + + + + + + Antragsteller(in) -Eröffnung + INSO + + + + + + + Debitor(in) + INSO + + + + + + + Gesellschafter(in) + INSO + + + + + + + Handlungsbevollmächtigte(r) + INSO + + + + + + + Mitglied einer Gesamt-Anteilsinhaberschaft + INSO + + + + + + + Mitglied einer Gläubigergemeinschaft + INSO + + + + + + + Mitreeder(in) + INSO + + + + + + + Partner(in) + INSO + + + + + + + Persönlich haftende(r) Gesellschafter(in) + INSO + + + + + + + Prozesspfleger(in) + + + + + + + Sachwalter(in) + INSO + + + + + + + Treuhänder(in) (Wohlverhaltensperiode) + INSO + + + + + + + Vermögensträger(in) + INSO + + + + + + + Vorläufige(r) Insolvenzverwalter(in) + INSO + + + + + + + Vorläufige(r) Treuhänder(in) + INSO + + + + + + + Sondersachwalter(in) + INSO + + + + + + + Sonderinsolvenzverwalter(in) + INSO + + + + + + + Vorläufige(r) Sachwalter(in) + INSO + + + + + + + Abwickler(in) + INSO + + + + + + + Übernehmender Rechtsträger + + + + + + + Aufsichtsrat (-rätin) + + + + + + + Besondere(r) Vertreter(in) nach § 30 BGB + EHUG + + + + + + + Betriebsleiter(in) + + + + + + + Empfangsberechtigte(r) + + + + + + + Geschäftsführende(r) Direktor(in) + + + + + + + Geschäftsleiter(in) + + + + + + + Gründer(in) + + + + + + + Gründungsprüfer(in) + + + + + + + Hauptniederlassung + + + + + + + Inhaber(in) + + + + + + + Kommanditist(in) + INSO + + + + + + + Konkursverwalter(in) + + + + + + + Mitglied des Leitungsorgans + + + + + + + Mitglied EWIV + + + + + + + Nachgründungsprüfer(in) + + + + + + + Nachtragsabwickler(in) + + + + + + + Nachtragsliquidator(in) + INSO + + + + + + + Notgeschäftsführer(in) + INSO + + + + + + + Notliquidator(in) + INSO + + + + + + + Notvorstand + INSO + + + + + + + Prokurist(in) + + + + + + + Rechtsträger(in) + + + + + + + Registergericht + + + + + + + Sacheinlagenprüfer(in) + + + + + + + Ständige(r) Vertreter(in) für die Zweigniederlassung + INSO + + + + + + + Übertragender Rechtsträger + + + + + + + Vergleichsverwalter(in) + + + + + + + Verwaltungsrat (-rätin) + + + + + + + Vorstandsvorsitzende(r) + + + + + + + Zweigniederlassung + + + + + + + Vertreter(in) des Klägers/der Klägerin + + + + + + + Vertreter(in) des/der Beklagten + + + + + + + Bewährungshilfe + STRAF + + + + + + + Gerichtshilfe + STRAF + + + + + + + Justizvollzug + STRAF + + + + + + + Pseudoname + STRAF + + + + + + + Gesetzliche(r) Vertreter(in) des Gläubigers/der Gläubigerin + + + + + + + Gesetzliche(r) Vertreter(in) des Schuldners/der Schuldnerin + + + + + + + Bevollmächtigte(r) des Gläubigers/der Gläubigerin + + + + + + + Bevollmächtigte(r) des Schuldners/der Schuldnerin + + + + + + + Fahrzeughalter(in) + STRAF + + + + + + + Frühere(r) Lebenspartner(in) + + + + + + + Sicherungsverwalter(in) + + + + + + + Zwangsverwalter(in) + + + + + + + Mieter(in) + + + + + + + Bürge (Bürgin) + + + + + + + Meistbietende(r) + + + + + + + Abschlussprüfer(in) + + + + + + + Antragstellervertreter(in) + + + + + + + Aufsichtsratsvorsitzende(r) + + + + + + + Berufskammer + + + + + + + Betroffenenvertreter(in) + + + + + + + Bürgermeister(in) + + + + + + + Eingliederungsbeteiligte(r) + + + + + + + Formwechselnder Rechtsträger + + + + + + + Gewerbeamt + + + + + + + Inhaber(in) (nicht eingetragen) + + + + + + + Kostenempfänger(in) + + + + + + + Nachlassgericht + + + + + + + Sonderprüfer(in) + + + + + + + Sonstige(r) gerichtlich bestellte(r) Vertreter(in) + + + + + + + Sonstige(r) gesetzliche(r) Vertreter(in) BGB + + + + + + + Sonstige(r) organschaftliche(r) Vertreter(in) HRB + + + + + + + Standardkostenschuldner(in) + + + + + + + Übernahmeschuldner(in) + + + + + + + Unternehmensvertragsbeteiligte(r) + + + + + + + Vertreter(in) des persönlich haftenden Gesellschafters + + + + + + + Werkleiter(in) + + + + + + + Mehrfachsitz + + + + + + + Mitglied VR + + + + + + + Mitglied e. BGB-Gesellschaft als Abwicklerin + + + + + + + Mitglied e. BGB-Gesellschaft als ges. Vertreterin + + + + + + + Mitglied e. BGB-Gesellschaft als Kommanditistin + + + + + + + Mitglied e. BGB-Gesellschaft als Liquidatorin + + + + + + + Mitglied e. BGB-Gesellschaft als Mitglied e. EWIV + + + + + + + Mitglied e. BGB-Gesellschaft als phG + + + + + + + Mitglied e. Erbengemeinschaft als ges. Vertreterin + + + + + + + Mitglied e. Erbengemeinschaft als Inhaberin + + + + + + + Mitglied e. Erbengemeinschaft als Kommanditistin + + + + + + + Mitglied e. Erbengemeinschaft als Mitglied e. EWIV + + + + + + + Nebensitz + + + + + + + Gesamthandsgemeinschaft + + + + + + + Mitglied einer Gesamthandsgemeinschaft + + + + + + + Leitungsperson i.S.v. § 30 Abs. 1 Nr. 1 bis 5 OWiG + + + + + + + Einziehungsbeteiligter + STRAF + + + + + + + Antragsgegnervertreter(in) + + + + + + + Verbraucher(in) + + + + + + + Vielmelder(in) + + + + + + + Vollmachtgeber(in) + + + + + + + Nebenbeteiligte(r) § 444 StPO + STRAF + + + + + + + Verfallsbeteiligte(r) § 442 StPO a.F. + STRAF + + + + + + + Verfolgte(r) § 34 IRG + STRAF + + + + + + + Rechtsnachfolger(in) + STRAF + + + + + + + Statuswechselnde(r) Rechtsträger(in) + + + + + + + Haftangehörige + STRAF + + + + + + diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/role_mapper.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/role_mapper.py new file mode 100644 index 0000000..81a24a8 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/role_mapper.py @@ -0,0 +1,34 @@ +import os +import xmltodict + +from pathlib import Path +from aki_prj23_transparenzregister.models.company import RelationshipRoleEnum + + +class RoleMapper: + singleton = None + def __init__(self): + # TODO Automated file retrieval + base_path = os.path.dirname(Path(__file__)) + path = os.path.join(base_path, "assets", "xjustiz_0040_cl_rollenbezeichnung_3_3.xsd") + with open(path, encoding="utf-8") as file: + content = file.read() + data = xmltodict.parse(content) + + mapping = {} + for entry in data["xs:schema"]["xs:simpleType"]["xs:restriction"]["xs:enumeration"]: + mapping[entry['@value']] = entry['xs:annotation']['xs:appinfo']['wert'] + self.dictionary = mapping + + @staticmethod + def mapper(): + if RoleMapper.singleton is None: + RoleMapper.singleton = RoleMapper() + return RoleMapper.singleton + + def get(self, key: str) -> RelationshipRoleEnum: + return RelationshipRoleEnum(self.dictionary[key]) + +if __name__ == '__main__': + mapper = RoleMapper() + print(mapper.get("201")) \ No newline at end of file diff --git a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform.py b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/v3.py similarity index 69% rename from src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform.py rename to src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/v3.py index 2e64e3c..61c9371 100644 --- a/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform.py +++ b/src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/transform/v3/v3.py @@ -30,28 +30,9 @@ from aki_prj23_transparenzregister.utils.string_tools import ( transform_date_to_iso, ) - -def transform_xml_to_json(source_dir: str, target_dir: str) -> None: - """Convert all xml files in a directory to json files. - - Args: - source_dir (str): Directory hosting the xml files - target_dir (str): Target directory to move json files to - """ - if not os.path.exists(target_dir): - os.makedirs(target_dir) - for source_path in [ - os.path.normpath(i) for i in glob.glob(source_dir + "**/*.xml", recursive=True) - ]: - target_path = os.path.join( - target_dir, source_path.split(os.sep)[-1].replace(".xml", ".json") - ) - - with open(source_path, encoding="utf-8") as source_file: - # deepcode ignore HandleUnicode: Weird XML format no other solution - data = xmltodict.parse(source_file.read().encode()) - with open(target_path, "w", encoding="utf-8") as json_file: - json_file.write(json.dumps(data)) +from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.role_mapper import ( + RoleMapper, +) def parse_date_of_birth(data: dict) -> str | None: @@ -63,22 +44,20 @@ def parse_date_of_birth(data: dict) -> str | None: Returns: str | None: date of birth or None if not found """ - if "tns:geburt" in (base := data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"]): + if "tns:geburt" in ( + base := data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ] + ): base = base["tns:geburt"]["tns:geburtsdatum"] if isinstance(base, str): return base return None + def map_role_id_to_enum(role_id: str) -> RelationshipRoleEnum: - match role_id: - case "086": - return RelationshipRoleEnum.GESCHAEFTSFUEHRER - case "285": - return RelationshipRoleEnum.PROKURIST - case "194": - return RelationshipRoleEnum.VORSTAND - case _: - raise KeyError(f'Uknown role_id: {role_id}') + mapper = RoleMapper.mapper() + return mapper.get(role_id) def parse_stakeholder(data: dict) -> CompanyRelationship | None: @@ -92,100 +71,120 @@ def parse_stakeholder(data: dict) -> CompanyRelationship | None: """ if "tns:natuerlichePerson" in data["tns:beteiligter"]["tns:auswahl_beteiligter"]: # It's a Company serving as a "Kommanditist" or similar - # if data["Beteiligter"]["Natuerliche_Person"]["Voller_Name"]["Vorname"] is None: - # return CompanyToCompanyRelationship( - # **{ # type: ignore - # "name": remove_traling_and_leading_quotes( - # data["Beteiligter"]["Natuerliche_Person"]["Voller_Name"][ - # "Nachname" - # ] - # ), - # "location": Location( - # **{ - # "city": data["Beteiligter"]["Natuerliche_Person"][ - # "Anschrift" - # ][-1]["Ort"] - # if isinstance( - # data["Beteiligter"]["Natuerliche_Person"]["Anschrift"], - # list, - # ) - # else data["Beteiligter"]["Natuerliche_Person"]["Anschrift"][ - # "Ort" - # ] - # } - # ), - # "role": RelationshipRoleEnum( - # data["Rolle"]["Rollenbezeichnung"]["content"] - # ), - # "type": CompanyRelationshipEnum.COMPANY, - # } - # ) + if ( + "tns:vorname" + not in data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:vollerName"] + ): + return CompanyToCompanyRelationship( + **{ # type: ignore + "name": remove_traling_and_leading_quotes( + data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:vollerName"]["tns:nachname"] + ), + "location": Location( + **{ + "city": data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"][-1]["tns:ort"] + if isinstance( + data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"], + list, + ) + else data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"]["tns:ort"] + } + ), + "role": map_role_id_to_enum( + data["tns:rolle"]["tns:rollenbezeichnung"]["code"] + ), + "type": CompanyRelationshipEnum.COMPANY, + } + ) return PersonToCompanyRelationship( **{ # type: ignore "name": PersonName( **{ - "firstname": data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"][ - "tns:vollerName" - ]["tns:vorname"], - "lastname": data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"][ - "tns:vollerName" - ]["tns:nachname"], + "firstname": data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:vollerName"]["tns:vorname"], + "lastname": data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:vollerName"]["tns:nachname"], } ), "date_of_birth": parse_date_of_birth(data), "location": Location( **{ - "city": data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"]["tns:anschrift"][ - -1 - ]["tns:ort"] + "city": data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"][-1]["tns:ort"] if isinstance( - data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"]["tns:anschrift"], list + data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"], + list, ) - else data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:natuerlichePerson"]["tns:anschrift"][ - "tns:ort" - ] + else data["tns:beteiligter"]["tns:auswahl_beteiligter"][ + "tns:natuerlichePerson" + ]["tns:anschrift"]["tns:ort"] } ), - # TODO get role via ID "role": map_role_id_to_enum( data["tns:rolle"]["tns:rollenbezeichnung"]["code"] ), "type": CompanyRelationshipEnum.PERSON, } ) - if "Organisation" in data["Beteiligter"]: + if "tns:organisation" in data["tns:beteiligter"]["tns:auswahl_beteiligter"]: + base = data["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:organisation"] + + location = None + if "tns:anschrift" in base: + location = Location( + **{ + "city": base["tns:anschrift"]["tns:ort"], + "street": base["tns:anschrift"]["tns:strasse"] + if "tns:strasse" in base["tns:anschrift"] + else None, + "house_number": base["tns:anschrift"]["tns:hausnummer"] + if "tns:hausnummer" in base["tns:anschrift"] + else None, + "zip_code": base["tns:anschrift"]["tns:postleitzahl"] + if "tns:potsleitzahl" in base["tns:anschrift"] + else None, + } + ) + else: + location = Location( + **{ + "city": base["tns:sitz"]["tns:ort"], + "street": base["tns:sitz"]["tns:strasse"] + if "tns:strasse" in base["tns:sitz"] + else None, + "house_number": base["tns:sitz"]["tns:hausnummer"] + if "tns:hausnummer" in base["tns:sitz"] + else None, + "zip_code": base["tns:sitz"]["tns:postleitzahl"] + if "tns:potsleitzahl" in base["tns:sitz"] + else None, + } + ) + return CompanyToCompanyRelationship( **{ # type: ignore - "role": RelationshipRoleEnum( - data["Rolle"]["Rollenbezeichnung"]["content"] + "role": map_role_id_to_enum( + data["tns:rolle"]["tns:rollenbezeichnung"]["code"] ), "name": remove_traling_and_leading_quotes( - data["Beteiligter"]["Organisation"]["Bezeichnung"][ - "Bezeichnung_Aktuell" - ] - ), - "location": Location( - **{ - "city": data["Beteiligter"]["Organisation"]["Anschrift"]["Ort"], - "street": data["Beteiligter"]["Organisation"]["Anschrift"][ - "Strasse" - ] - if "Strasse" in data["Beteiligter"]["Organisation"]["Anschrift"] - else None, - "house_number": data["Beteiligter"]["Organisation"][ - "Anschrift" - ]["Hausnummer"] - if "Hausnummer" - in data["Beteiligter"]["Organisation"]["Anschrift"] - else None, - "zip_code": data["Beteiligter"]["Organisation"]["Anschrift"][ - "Postleitzahl" - ] - if "Postleitzahl" - in data["Beteiligter"]["Organisation"]["Anschrift"] - else None, - } + base["tns:bezeichnung"]["tns:bezeichnung.aktuell"] ), + "location": location, "type": CompanyRelationshipEnum.COMPANY, } ) @@ -227,10 +226,16 @@ def loc_from_beteiligung(data: dict) -> Location: "tns:beteiligter", "tns:auswahl_beteiligter", "tns:organisation", - "tns:anschrift" + # "tns:anschrift", ] base = traversal(data, base_path) + if "tns:anschrift" in base: + base = base["tns:anschrift"] + else: + base = base["tns:sitz"] + if isinstance(base, list): + base = base[0] house_number = None street = None if "tns:strasse" in base: @@ -273,7 +278,7 @@ def name_from_beteiligung(data: dict) -> str: "tns:auswahl_beteiligter", "tns:organisation", "tns:bezeichnung", - "tns:bezeichnung.aktuell" + "tns:bezeichnung.aktuell", ] name = traversal(data, path) return remove_traling_and_leading_quotes(name) @@ -296,11 +301,9 @@ def map_rechtsform(company_name: str, data: dict) -> CompanyTypeEnum | None: "tns:rechtstraeger", "tns:angabenZurRechtsform", "tns:rechtsform", - "code" + "code", ] - return CompanyTypeEnum( - traversal(data, path) - ) + return CompanyTypeEnum(traversal(data, path)) except Exception: if ( company_name.endswith("GmbH") @@ -328,8 +331,8 @@ def map_capital(data: dict, company_type: CompanyTypeEnum) -> Capital | None: # Early return if "tns:auswahl_zusatzangaben" not in data["tns:fachdatenRegister"]: return None - capital: dict = {"Zahl": 0.0, "Waehrung": ""} - if company_type == CompanyTypeEnum.KG: + capital: dict = {"tns:zahl": 0.0, "tns:waehrung": {"code": None}} + if company_type == CompanyTypeEnum.KG and "tns:personengesellschaft" in data["tns:fachdatenRegister"]["tns:auswahl_zusatzangaben"]: capital_type = "Hafteinlage" base = data["tns:fachdatenRegister"]["tns:auswahl_zusatzangaben"][ "tns:personengesellschaft" @@ -337,10 +340,14 @@ def map_capital(data: dict, company_type: CompanyTypeEnum) -> Capital | None: if isinstance(base, list): for entry in base: # TODO link to persons using Ref_Rollennummer then extract ["Hafteinlage"] as below - capital["Zahl"] = capital["Zahl"] + float(entry["Hafteinlage"]["Zahl"]) - capital["Waehrung"] = entry["Hafteinlage"]["Waehrung"] + capital["tns:zahl"] = capital["tns:zahl"] + float( + entry["tns:hafteinlage"]["tns:zahl"] + ) + capital["tns:waehrung"]["code"] = entry["tns:hafteinlage"][ + "tns:waehrung" + ]["code"] elif isinstance(base, dict): - capital = base["Hafteinlage"] + capital = base["tns:hafteinlage"] elif company_type in [ CompanyTypeEnum.GMBH, CompanyTypeEnum.SE, @@ -365,7 +372,9 @@ def map_capital(data: dict, company_type: CompanyTypeEnum) -> Capital | None: capital = base["tns:zusatzGmbH"]["tns:stammkapital"] elif "tns:zusatzAktiengesellschaft" in base: capital_type = "Grundkapital" - capital = base["tns:zusatzAktiengesellschaft"]["tns:grundkapital"]["tns:hoehe"] + capital = base["tns:zusatzAktiengesellschaft"]["tns:grundkapital"][ + "tns:hoehe" + ] elif company_type in [ CompanyTypeEnum.EINZELKAUFMANN, CompanyTypeEnum.EG, @@ -397,11 +406,7 @@ def map_business_purpose(data: dict) -> str | None: str | None: Business purpose if found """ try: - path = [ - "tns:fachdatenRegister", - "tns:basisdatenRegister", - "tns:gegenstand" - ] + path = ["tns:fachdatenRegister", "tns:basisdatenRegister", "tns:gegenstand"] return traversal(data, path) except KeyError: return None @@ -455,20 +460,18 @@ def map_founding_date(data: dict) -> str | None: ) if len(entry_date) == 1: return transform_date_to_iso(entry_date[0]) - if ( - "tns:satzungsdatum" - in data["tns:fachdatenRegister"]["tns:basisdatenRegister"] - ): + if "tns:satzungsdatum" in data["tns:fachdatenRegister"]["tns:basisdatenRegister"]: path = [ "tns:fachdatenRegister", "tns:basisdatenRegister", "tns:satzungsdatum", - "tns:aktuellesSatzungsdatum" + "tns:aktuellesSatzungsdatum", ] return traversal(data, path) # No reliable answer return None + def traversal(data: dict, path: list[str | int]) -> any: current = data for key in path: @@ -484,15 +487,14 @@ def map_hr_number(data: dict) -> str: "tns:aktenzeichen" ]["tns:auswahl_aktenzeichen"] if "tns:aktenzeichen.strukturiert" in base: - hr_prefix = base["tns:aktenzeichen.strukturiert"]["tns:register"][ - "code" - ] + hr_prefix = base["tns:aktenzeichen.strukturiert"]["tns:register"]["code"] hr_number = base["tns:aktenzeichen.strukturiert"]["tns:laufendeNummer"] return f"{hr_prefix} {hr_number}" elif "tns:aktenzeichen.freitext" in base: return base["tns:aktenzeichen.freitext"] return hr_full + def map_district_court(data: dict) -> DistrictCourt: base_path = [ "tns:grunddaten", @@ -501,17 +503,11 @@ def map_district_court(data: dict) -> DistrictCourt: 1, "tns:beteiligter", "tns:auswahl_beteiligter", - "tns:organisation" - ] - path = [*base_path, - "tns:bezeichnung", - "tns:bezeichnung.aktuell" + "tns:organisation", ] + path = [*base_path, "tns:bezeichnung", "tns:bezeichnung.aktuell"] name = traversal(data, path) - path = [*base_path, - "tns:anschrift", - "tns:ort" - ] + path = [*base_path, "tns:anschrift", "tns:ort"] city = traversal(data, path) return DistrictCourt(name=name, city=city) @@ -525,12 +521,14 @@ def map_company_id(data: dict) -> CompanyID: Returns: CompanyID: ID of the company """ - return CompanyID( - **{ - "hr_number": map_hr_number(data), - "district_court": map_district_court(data) - } - ) + try: + return CompanyID( + **{"hr_number": map_hr_number(data), "district_court": map_district_court(data)} + ) + except KeyError: + hr_number = data["tns:grunddaten"]["tns:verfahrensdaten"]["tns:beteiligung"][0]["tns:beteiligter"]["tns:auswahl_beteiligter"]["tns:organisation"]["tns:registereintragung"]["tns:registernummer"] + district_court = map_district_court(data) + return CompanyID(hr_number=hr_number, district_court=district_court) def map_last_update(data: dict) -> str: @@ -542,11 +540,7 @@ def map_last_update(data: dict) -> str: Returns: str: Last update date """ - path = [ - "tns:fachdatenRegister", - "tns:auszug", - "tns:letzteEintragung" - ] + path = ["tns:fachdatenRegister", "tns:auszug", "tns:letzteEintragung"] return traversal(data, path) diff --git a/tmp/transformation.ipynb b/tmp/transformation.ipynb index 9a560bb..62b0277 100644 --- a/tmp/transformation.ipynb +++ b/tmp/transformation.ipynb @@ -2,7 +2,1112 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id: 001\n", + "value: Abwesenheitspfleger(in)\n", + "id: 002\n", + "value: Aliasidentität\n", + "id: 003\n", + "value: Angehörige(r)\n", + "id: 004\n", + "value: Angeklagte(r)\n", + "id: 005\n", + "value: Angeschuldigte(r)\n", + "id: 006\n", + "value: Annehmende(r)\n", + "id: 007\n", + "value: Anschlussberufungsbeklagte(r)\n", + "id: 008\n", + "value: Anschlussberufungskläger(in)\n", + "id: 009\n", + "value: Anschlussbeschwerdeführer(in)\n", + "id: 010\n", + "value: Anschlussbeschwerdegegner(in)\n", + "id: 011\n", + "value: Anschlussrechtsbeschwerdeführer(in)\n", + "id: 012\n", + "value: Anschlussrechtsbeschwerdegegner(in)\n", + "id: 013\n", + "value: Anschlussrevisionsbeklagte(r)\n", + "id: 014\n", + "value: Anschlussrevisionskläger(in)\n", + "id: 015\n", + "value: Antragsgegner(in)\n", + "id: 016\n", + "value: Antragsteller(in)\n", + "id: 017\n", + "value: Anzeigeerstatter(in)\n", + "id: 018\n", + "value: Anzunehmende(r)\n", + "id: 019\n", + "value: Arrestgläubiger(in)\n", + "id: 020\n", + "value: Arrestschuldner(in)\n", + "id: 021\n", + "value: Aufsichtsbehörde\n", + "id: 022\n", + "value: Ausschlagende(r)\n", + "id: 023\n", + "value: Beamter (Beamtin)\n", + "id: 024\n", + "value: Behörde\n", + "id: 025\n", + "value: Beigeladene(r)\n", + "id: 026\n", + "value: Beistand\n", + "id: 027\n", + "value: Bekannte(r)\n", + "id: 028\n", + "value: Beklagte(r)\n", + "id: 029\n", + "value: Berufungsbeklagte(r)\n", + "id: 030\n", + "value: Berufungskläger(in)\n", + "id: 031\n", + "value: Beschuldigte(r)\n", + "id: 032\n", + "value: Beschwerdeführer(in)\n", + "id: 033\n", + "value: Beschwerdegegner(in)\n", + "id: 034\n", + "value: Besucher(in)\n", + "id: 036\n", + "value: Betreibende(r) Gläubige(r)\n", + "id: 037\n", + "value: Betreuer(in)\n", + "id: 038\n", + "value: Betreute(r)\n", + "id: 039\n", + "value: Betreuungsbehörde\n", + "id: 040\n", + "value: Betroffene(r)\n", + "id: 041\n", + "value: Bevollmächtigte(r)\n", + "id: 042\n", + "value: Bewährungshelfer(in)\n", + "id: 043\n", + "value: Beweisanwalt (-anwältin)\n", + "id: 044\n", + "value: Bruder (Schwester)\n", + "id: 045\n", + "value: Bundeswehrdisziplinaranwalt (-anwältin)\n", + "id: 046\n", + "value: Bußgeldempfänger(in)\n", + "id: 047\n", + "value: Cousin(e)\n", + "id: 048\n", + "value: Dienstvorgesetzte(r)\n", + "id: 049\n", + "value: director\n", + "id: 050\n", + "value: Dolmetscher(in)\n", + "id: 051\n", + "value: Dritte(r)\n", + "id: 052\n", + "value: Drittschuldner(in)\n", + "id: 053\n", + "value: Drittwiderbeklagte(r)\n", + "id: 054\n", + "value: Drittwiderkläger(in)\n", + "id: 056\n", + "value: Ehemann (Ehefrau)\n", + "id: 057\n", + "value: Eigentümer(in)\n", + "id: 058\n", + "value: Eingetragene(r) Lebenspartner(in)\n", + "id: 059\n", + "value: Einleitungsbehörde\n", + "id: 060\n", + "value: Eltern\n", + "id: 061\n", + "value: Elternteil\n", + "id: 062\n", + "value: Enkel(in)\n", + "id: 063\n", + "value: Erbe (Erbin)\n", + "id: 064\n", + "value: Erbe (Erbin) (ausschlagend)\n", + "id: 065\n", + "value: Erbe (Erbin) (vorverstorben)\n", + "id: 066\n", + "value: Erblasser(in)\n", + "id: 067\n", + "value: Ergänzungspfleger(in)\n", + "id: 068\n", + "value: Erinnerungsführer(in)\n", + "id: 069\n", + "value: Erinnerungsgegner(in)\n", + "id: 070\n", + "value: Ersatzbetreuer(in)\n", + "id: 071\n", + "value: Ersteher(in)\n", + "id: 072\n", + "value: Erwerber(in)\n", + "id: 073\n", + "value: Erziehungsberechtigte(r)\n", + "id: 074\n", + "value: Frühere(r) Ehegatte (Ehegattin)\n", + "id: 075\n", + "value: Frühere(r) Beklagte(r)\n", + "id: 076\n", + "value: Frühere(r) Beteiligte(r)\n", + "id: 077\n", + "value: Frühere(r) Gläubiger(in)\n", + "id: 078\n", + "value: Frühere(r) Kläger(in)\n", + "id: 079\n", + "value: Frühere(r) Soldat(in)\n", + "id: 080\n", + "value: Gegenvormund\n", + "id: 081\n", + "value: Generalbundesanwalt (-anwältin)\n", + "id: 082\n", + "value: Gericht\n", + "id: 083\n", + "value: Gerichtsvollzieher(in)\n", + "id: 084\n", + "value: Geschädigte(r)\n", + "id: 085\n", + "value: Geschäftsführende(r) Gesellschafter(in)\n", + "id: 086\n", + "value: Geschäftsführer(in)\n", + "id: 087\n", + "value: Gesetzliche(r) Erbe (Erbin)\n", + "id: 088\n", + "value: Gesetzliche(r) Vertreter(in)\n", + "id: 089\n", + "value: Gläubiger(in)\n", + "id: 090\n", + "value: Großeltern\n", + "id: 092\n", + "value: Großvater (Großmutter)\n", + "id: 093\n", + "value: Hauptbevollmächtigte(r)\n", + "id: 094\n", + "value: Hoferbe (Hoferbin)\n", + "id: 095\n", + "value: Inhaber(in) der Firma\n", + "id: 096\n", + "value: Insolvenzverwalter(in)\n", + "id: 097\n", + "value: Jugendamt\n", + "id: 098\n", + "value: Kammer\n", + "id: 099\n", + "value: Kammermitglied\n", + "id: 100\n", + "value: Kind\n", + "id: 101\n", + "value: Kläger(in)\n", + "id: 102\n", + "value: Kontrollbetreuer(in)\n", + "id: 103\n", + "value: Korrespondenzanwalt (-anwältin)\n", + "id: 104\n", + "value: Kostenschuldner(in)\n", + "id: 105\n", + "value: Landwirtschaftsrichter(in)\n", + "id: 106\n", + "value: Lebenspartner(in)\n", + "id: 107\n", + "value: Liquidator(in)\n", + "id: 108\n", + "value: Minderjährige(r)\n", + "id: 109\n", + "value: Mitvormund\n", + "id: 110\n", + "value: Mündel\n", + "id: 112\n", + "value: Nachbesserungsgläubiger(in)\n", + "id: 113\n", + "value: Nachlasspfleger(in)\n", + "id: 114\n", + "value: Nachlassverwalter(in)\n", + "id: 115\n", + "value: Nebenkläger(in)\n", + "id: 116\n", + "value: Neffe (Nichte)\n", + "id: 117\n", + "value: Nicht verwandt\n", + "id: 118\n", + "value: Onkel (Tante)\n", + "id: 119\n", + "value: Opfer\n", + "id: 120\n", + "value: Pächter(in)\n", + "id: 121\n", + "value: Pflegeeltern\n", + "id: 123\n", + "value: Pfleger(in)\n", + "id: 124\n", + "value: Pfleger(in) für das Sammelvermögen\n", + "id: 125\n", + "value: Pfleger(in) für die Leibesfrucht\n", + "id: 126\n", + "value: Pflegevater (Pflegemutter) des Mündels\n", + "id: 127\n", + "value: Pflegling\n", + "id: 128\n", + "value: Pflichtverteidiger(in)\n", + "id: 129\n", + "value: Polizei\n", + "id: 130\n", + "value: Privatbeklagte(r)\n", + "id: 131\n", + "value: Privatkläger(in)\n", + "id: 132\n", + "value: Prozessbevollmächtigte(r)\n", + "id: 133\n", + "value: Prozesskostenhilfe-Anwalt (-Anwältin)\n", + "id: 134\n", + "value: Prozesskostenhilfe-Korrespondenzanwalt (-anwältin)\n", + "id: 135\n", + "value: Rechtsanwalt (-anwältin)\n", + "id: 136\n", + "value: Rechtsbeistand\n", + "id: 137\n", + "value: Rechtsbeschwerdeführer(in)\n", + "id: 138\n", + "value: Rechtsbeschwerdegegner(in)\n", + "id: 139\n", + "value: Revisionsbeklagte(r)\n", + "id: 140\n", + "value: Revisionskläger(in)\n", + "id: 141\n", + "value: Sachbearbeiter(in)\n", + "id: 142\n", + "value: Sachverständige(r)\n", + "id: 143\n", + "value: Schuldner(in)\n", + "id: 144\n", + "value: Schwager (Schwägerin)\n", + "id: 146\n", + "value: Schwiegersohn (Schwiegertochter)\n", + "id: 148\n", + "value: Schwiegervater (Schwiegermutter)\n", + "id: 149\n", + "value: Sohn (Tochter)\n", + "id: 150\n", + "value: Soldat(in)\n", + "id: 151\n", + "value: Sonstige(r) Beteiligte(r)\n", + "id: 152\n", + "value: Sonstige(r) Vertreter(in)\n", + "id: 153\n", + "value: Staatsanwaltschaft\n", + "id: 154\n", + "value: Stiefeltern\n", + "id: 156\n", + "value: Stiefvater (Stiefmutter)\n", + "id: 157\n", + "value: Streithelfer(in) Beklagte(r)\n", + "id: 158\n", + "value: Streithelfer(in) Kläger(in)\n", + "id: 159\n", + "value: Streitverkündete(r) Beklagte(r)\n", + "id: 160\n", + "value: Streitverkündete(r) Kläger(in)\n", + "id: 161\n", + "value: Terminsbevollmächtigte(r)\n", + "id: 162\n", + "value: Testamentsvollstrecker(in)\n", + "id: 163\n", + "value: Testator(in)\n", + "id: 164\n", + "value: Übernehmer(in)\n", + "id: 165\n", + "value: Unterbevollmächtigte(r)\n", + "id: 166\n", + "value: Ur-Enkel(in)\n", + "id: 167\n", + "value: Vater (Mutter)\n", + "id: 168\n", + "value: Veräußerer (Veräußerin)\n", + "id: 169\n", + "value: Verfahrensbevollmächtigte(r)\n", + "id: 170\n", + "value: Verfahrenskostenhilfe-Anwalt(-Anwältin)\n", + "id: 171\n", + "value: Verfahrenskostenhilfe-Korrespondenzanwalt (-anwältin)\n", + "id: 172\n", + "value: Verfahrenspfleger(in)\n", + "id: 173\n", + "value: Verfahrensvertreter(in) (§787 ZPO)\n", + "id: 174\n", + "value: Verfügungsbeklagte(r)\n", + "id: 175\n", + "value: Verfügungskläger(in)\n", + "id: 176\n", + "value: Verkehrsanwalt (-anwältin)\n", + "id: 177\n", + "value: Verlobte(r)\n", + "id: 178\n", + "value: Vermächtnisnehmer(in)\n", + "id: 179\n", + "value: Vermieter(in)\n", + "id: 180\n", + "value: Verpächter(in)\n", + "id: 181\n", + "value: Versorgungsträger(in)\n", + "id: 182\n", + "value: Verteidiger(in)\n", + "id: 183\n", + "value: Vertreter(in) der Interessen des Ausgleichsfonds\n", + "id: 184\n", + "value: Vertreter(in) der Staatskasse\n", + "id: 185\n", + "value: Vertreter(in) des Bundesinteresses beim Bundesverwaltungsgericht\n", + "id: 186\n", + "value: Vertreter(in) des öffentlichen Interesses\n", + "id: 187\n", + "value: Verurteilte(r)\n", + "id: 188\n", + "value: Verwalter(in) der Wohnungseigentümergemeinschaft\n", + "id: 189\n", + "value: Verwaltungsbehörde\n", + "id: 190\n", + "value: Vollstreckungsgläubiger(in)\n", + "id: 191\n", + "value: Vollstreckungsschuldner(in)\n", + "id: 192\n", + "value: Vorläufige(r) Betreuer(in)\n", + "id: 193\n", + "value: Vormund\n", + "id: 194\n", + "value: Vorstand\n", + "id: 195\n", + "value: Vorsorgebevollmächtigte(r)\n", + "id: 196\n", + "value: Wahlverteidiger(in)\n", + "id: 197\n", + "value: Widerbeklagte(r)\n", + "id: 198\n", + "value: Widerkläger(in)\n", + "id: 199\n", + "value: Wiederaufnahmebeklagte(r)\n", + "id: 200\n", + "value: Wiederaufnahmekläger(in)\n", + "id: 201\n", + "value: Zahlungs- und Auflagenempfänger(in)\n", + "id: 202\n", + "value: Zeuge (Zeugin)\n", + "id: 203\n", + "value: Zeugenbeistand\n", + "id: 204\n", + "value: Zulassungsantragsgegner(in)\n", + "id: 205\n", + "value: Zulassungsantragsteller(in)\n", + "id: 206\n", + "value: Zustellungsbevollmächtigte(r)\n", + "id: 207\n", + "value: Zustellungsvertreter(in) (§6 ZVG)\n", + "id: 208\n", + "value: Notar(in)\n", + "id: 209\n", + "value: Auskunftsempfänger(in)\n", + "id: 210\n", + "value: Melder(in)\n", + "id: 211\n", + "value: Verwahrstelle\n", + "id: 212\n", + "value: Aussteller(in)\n", + "id: 213\n", + "value: Berechtigte(r)\n", + "id: 214\n", + "value: Berechtigte(r) an einem Recht\n", + "id: 215\n", + "value: Einreicher(in)\n", + "id: 216\n", + "value: Erbbauberechtigte(r)\n", + "id: 217\n", + "value: Finanzamt\n", + "id: 218\n", + "value: Grundbuchvertreter(in)\n", + "id: 219\n", + "value: Insolvenzgericht\n", + "id: 220\n", + "value: Mitteilungsempfänger(in)\n", + "id: 221\n", + "value: Nacherbe (Nacherbin)\n", + "id: 222\n", + "value: Rechnungsempfänger(in)\n", + "id: 223\n", + "value: Veranlasser(in)\n", + "id: 224\n", + "value: Versteigerungsabteilung\n", + "id: 225\n", + "value: Vertretungsberechtigte(r)\n", + "id: 226\n", + "value: Zweitschuldner(in)\n", + "id: 227\n", + "value: Vertreter(in)\n", + "id: 228\n", + "value: Arbeitgeber(in)\n", + "id: 229\n", + "value: RV-Träger(in)\n", + "id: 230\n", + "value: Vollstreckungsstelle\n", + "id: 231\n", + "value: Abkömmling\n", + "id: 232\n", + "value: Kreditnehmer(in)\n", + "id: 233\n", + "value: Neu vorzutragende(r) Eigentümer(in)\n", + "id: 234\n", + "value: Notariatsverwalter(in)\n", + "id: 235\n", + "value: Notarvertreter(in)\n", + "id: 236\n", + "value: Partei kraft Amtes\n", + "id: 237\n", + "value: Sequester\n", + "id: 238\n", + "value: Treuhänder(in)\n", + "id: 239\n", + "value: Zustimmende(r)\n", + "id: 240\n", + "value: Gläubigervertreter(in)\n", + "id: 241\n", + "value: Schuldnervertreter(in)\n", + "id: 242\n", + "value: Zahlungsempfänger(in)\n", + "id: 243\n", + "value: Anteilsinhaber(in)\n", + "id: 244\n", + "value: Antragsteller(in) -Eröffnung\n", + "id: 245\n", + "value: Debitor(in)\n", + "id: 246\n", + "value: Gesellschafter(in)\n", + "id: 247\n", + "value: Handlungsbevollmächtigte(r)\n", + "id: 248\n", + "value: Mitglied einer Gesamt-Anteilsinhaberschaft\n", + "id: 249\n", + "value: Mitglied einer Gläubigergemeinschaft\n", + "id: 250\n", + "value: Mitreeder(in)\n", + "id: 251\n", + "value: Partner(in)\n", + "id: 252\n", + "value: Persönlich haftende(r) Gesellschafter(in)\n", + "id: 253\n", + "value: Prozesspfleger(in)\n", + "id: 254\n", + "value: Sachwalter(in)\n", + "id: 255\n", + "value: Treuhänder(in) (Wohlverhaltensperiode)\n", + "id: 256\n", + "value: Vermögensträger(in)\n", + "id: 257\n", + "value: Vorläufige(r) Insolvenzverwalter(in)\n", + "id: 258\n", + "value: Vorläufige(r) Treuhänder(in)\n", + "id: 259\n", + "value: Sondersachwalter(in)\n", + "id: 260\n", + "value: Sonderinsolvenzverwalter(in)\n", + "id: 261\n", + "value: Vorläufige(r) Sachwalter(in)\n", + "id: 262\n", + "value: Abwickler(in)\n", + "id: 263\n", + "value: Übernehmender Rechtsträger\n", + "id: 264\n", + "value: Aufsichtsrat (-rätin)\n", + "id: 265\n", + "value: Besondere(r) Vertreter(in) nach § 30 BGB\n", + "id: 266\n", + "value: Betriebsleiter(in)\n", + "id: 267\n", + "value: Empfangsberechtigte(r)\n", + "id: 268\n", + "value: Geschäftsführende(r) Direktor(in)\n", + "id: 269\n", + "value: Geschäftsleiter(in)\n", + "id: 271\n", + "value: Gründer(in)\n", + "id: 272\n", + "value: Gründungsprüfer(in)\n", + "id: 273\n", + "value: Hauptniederlassung\n", + "id: 274\n", + "value: Inhaber(in)\n", + "id: 275\n", + "value: Kommanditist(in)\n", + "id: 276\n", + "value: Konkursverwalter(in)\n", + "id: 277\n", + "value: Mitglied des Leitungsorgans\n", + "id: 278\n", + "value: Mitglied EWIV\n", + "id: 279\n", + "value: Nachgründungsprüfer(in)\n", + "id: 280\n", + "value: Nachtragsabwickler(in)\n", + "id: 281\n", + "value: Nachtragsliquidator(in)\n", + "id: 282\n", + "value: Notgeschäftsführer(in)\n", + "id: 283\n", + "value: Notliquidator(in)\n", + "id: 284\n", + "value: Notvorstand\n", + "id: 285\n", + "value: Prokurist(in)\n", + "id: 287\n", + "value: Rechtsträger(in)\n", + "id: 288\n", + "value: Registergericht\n", + "id: 289\n", + "value: Sacheinlagenprüfer(in)\n", + "id: 290\n", + "value: Ständige(r) Vertreter(in) für die Zweigniederlassung\n", + "id: 291\n", + "value: Übertragender Rechtsträger\n", + "id: 292\n", + "value: Vergleichsverwalter(in)\n", + "id: 293\n", + "value: Verwaltungsrat (-rätin)\n", + "id: 294\n", + "value: Vorstandsvorsitzende(r)\n", + "id: 295\n", + "value: Zweigniederlassung\n", + "id: 296\n", + "value: Vertreter(in) des Klägers/der Klägerin\n", + "id: 297\n", + "value: Vertreter(in) des/der Beklagten\n", + "id: 298\n", + "value: Bewährungshilfe\n", + "id: 299\n", + "value: Gerichtshilfe\n", + "id: 300\n", + "value: Justizvollzug\n", + "id: 301\n", + "value: Pseudoname\n", + "id: 302\n", + "value: Gesetzliche(r) Vertreter(in) des Gläubigers/der Gläubigerin\n", + "id: 303\n", + "value: Gesetzliche(r) Vertreter(in) des Schuldners/der Schuldnerin\n", + "id: 304\n", + "value: Bevollmächtigte(r) des Gläubigers/der Gläubigerin\n", + "id: 305\n", + "value: Bevollmächtigte(r) des Schuldners/der Schuldnerin\n", + "id: 306\n", + "value: Fahrzeughalter(in)\n", + "id: 307\n", + "value: Frühere(r) Lebenspartner(in)\n", + "id: 308\n", + "value: Sicherungsverwalter(in)\n", + "id: 309\n", + "value: Zwangsverwalter(in)\n", + "id: 310\n", + "value: Mieter(in)\n", + "id: 311\n", + "value: Bürge (Bürgin)\n", + "id: 312\n", + "value: Meistbietende(r)\n", + "id: 313\n", + "value: Abschlussprüfer(in)\n", + "id: 314\n", + "value: Antragstellervertreter(in)\n", + "id: 315\n", + "value: Aufsichtsratsvorsitzende(r)\n", + "id: 316\n", + "value: Berufskammer\n", + "id: 317\n", + "value: Betroffenenvertreter(in)\n", + "id: 318\n", + "value: Bürgermeister(in)\n", + "id: 319\n", + "value: Eingliederungsbeteiligte(r)\n", + "id: 320\n", + "value: Formwechselnder Rechtsträger\n", + "id: 321\n", + "value: Gewerbeamt\n", + "id: 322\n", + "value: Inhaber(in) (nicht eingetragen)\n", + "id: 323\n", + "value: Kostenempfänger(in)\n", + "id: 324\n", + "value: Nachlassgericht\n", + "id: 325\n", + "value: Sonderprüfer(in)\n", + "id: 326\n", + "value: Sonstige(r) gerichtlich bestellte(r) Vertreter(in)\n", + "id: 327\n", + "value: Sonstige(r) gesetzliche(r) Vertreter(in) BGB\n", + "id: 328\n", + "value: Sonstige(r) organschaftliche(r) Vertreter(in) HRB\n", + "id: 329\n", + "value: Standardkostenschuldner(in)\n", + "id: 330\n", + "value: Übernahmeschuldner(in)\n", + "id: 331\n", + "value: Unternehmensvertragsbeteiligte(r)\n", + "id: 332\n", + "value: Vertreter(in) des persönlich haftenden Gesellschafters\n", + "id: 333\n", + "value: Werkleiter(in)\n", + "id: 334\n", + "value: Mehrfachsitz\n", + "id: 335\n", + "value: Mitglied VR\n", + "id: 336\n", + "value: Mitglied e. BGB-Gesellschaft als Abwicklerin\n", + "id: 337\n", + "value: Mitglied e. BGB-Gesellschaft als ges. Vertreterin\n", + "id: 338\n", + "value: Mitglied e. BGB-Gesellschaft als Kommanditistin\n", + "id: 339\n", + "value: Mitglied e. BGB-Gesellschaft als Liquidatorin\n", + "id: 340\n", + "value: Mitglied e. BGB-Gesellschaft als Mitglied e. EWIV\n", + "id: 341\n", + "value: Mitglied e. BGB-Gesellschaft als phG\n", + "id: 342\n", + "value: Mitglied e. Erbengemeinschaft als ges. Vertreterin\n", + "id: 343\n", + "value: Mitglied e. Erbengemeinschaft als Inhaberin\n", + "id: 344\n", + "value: Mitglied e. Erbengemeinschaft als Kommanditistin\n", + "id: 345\n", + "value: Mitglied e. Erbengemeinschaft als Mitglied e. EWIV\n", + "id: 346\n", + "value: Nebensitz\n", + "id: 347\n", + "value: Gesamthandsgemeinschaft\n", + "id: 348\n", + "value: Mitglied einer Gesamthandsgemeinschaft\n", + "id: 349\n", + "value: Leitungsperson i.S.v. § 30 Abs. 1 Nr. 1 bis 5 OWiG\n", + "id: 350\n", + "value: Einziehungsbeteiligter\n", + "id: 351\n", + "value: Antragsgegnervertreter(in)\n", + "id: 352\n", + "value: Verbraucher(in)\n", + "id: 353\n", + "value: Vielmelder(in)\n", + "id: 354\n", + "value: Vollmachtgeber(in)\n", + "id: 355\n", + "value: Nebenbeteiligte(r) § 444 StPO\n", + "id: 356\n", + "value: Verfallsbeteiligte(r) § 442 StPO a.F.\n", + "id: 357\n", + "value: Verfolgte(r) § 34 IRG\n", + "id: 358\n", + "value: Rechtsnachfolger(in)\n", + "id: 359\n", + "value: Statuswechselnde(r) Rechtsträger(in)\n", + "id: 360\n", + "value: Haftangehörige\n" + ] + }, + { + "data": { + "text/plain": [ + "{'001': 'Abwesenheitspfleger(in)',\n", + " '002': 'Aliasidentität',\n", + " '003': 'Angehörige(r)',\n", + " '004': 'Angeklagte(r)',\n", + " '005': 'Angeschuldigte(r)',\n", + " '006': 'Annehmende(r)',\n", + " '007': 'Anschlussberufungsbeklagte(r)',\n", + " '008': 'Anschlussberufungskläger(in)',\n", + " '009': 'Anschlussbeschwerdeführer(in)',\n", + " '010': 'Anschlussbeschwerdegegner(in)',\n", + " '011': 'Anschlussrechtsbeschwerdeführer(in)',\n", + " '012': 'Anschlussrechtsbeschwerdegegner(in)',\n", + " '013': 'Anschlussrevisionsbeklagte(r)',\n", + " '014': 'Anschlussrevisionskläger(in)',\n", + " '015': 'Antragsgegner(in)',\n", + " '016': 'Antragsteller(in)',\n", + " '017': 'Anzeigeerstatter(in)',\n", + " '018': 'Anzunehmende(r)',\n", + " '019': 'Arrestgläubiger(in)',\n", + " '020': 'Arrestschuldner(in)',\n", + " '021': 'Aufsichtsbehörde',\n", + " '022': 'Ausschlagende(r)',\n", + " '023': 'Beamter (Beamtin)',\n", + " '024': 'Behörde',\n", + " '025': 'Beigeladene(r)',\n", + " '026': 'Beistand',\n", + " '027': 'Bekannte(r)',\n", + " '028': 'Beklagte(r)',\n", + " '029': 'Berufungsbeklagte(r)',\n", + " '030': 'Berufungskläger(in)',\n", + " '031': 'Beschuldigte(r)',\n", + " '032': 'Beschwerdeführer(in)',\n", + " '033': 'Beschwerdegegner(in)',\n", + " '034': 'Besucher(in)',\n", + " '036': 'Betreibende(r) Gläubige(r)',\n", + " '037': 'Betreuer(in)',\n", + " '038': 'Betreute(r)',\n", + " '039': 'Betreuungsbehörde',\n", + " '040': 'Betroffene(r)',\n", + " '041': 'Bevollmächtigte(r)',\n", + " '042': 'Bewährungshelfer(in)',\n", + " '043': 'Beweisanwalt (-anwältin)',\n", + " '044': 'Bruder (Schwester)',\n", + " '045': 'Bundeswehrdisziplinaranwalt (-anwältin)',\n", + " '046': 'Bußgeldempfänger(in)',\n", + " '047': 'Cousin(e)',\n", + " '048': 'Dienstvorgesetzte(r)',\n", + " '049': 'director',\n", + " '050': 'Dolmetscher(in)',\n", + " '051': 'Dritte(r)',\n", + " '052': 'Drittschuldner(in)',\n", + " '053': 'Drittwiderbeklagte(r)',\n", + " '054': 'Drittwiderkläger(in)',\n", + " '056': 'Ehemann (Ehefrau)',\n", + " '057': 'Eigentümer(in)',\n", + " '058': 'Eingetragene(r) Lebenspartner(in)',\n", + " '059': 'Einleitungsbehörde',\n", + " '060': 'Eltern',\n", + " '061': 'Elternteil',\n", + " '062': 'Enkel(in)',\n", + " '063': 'Erbe (Erbin)',\n", + " '064': 'Erbe (Erbin) (ausschlagend)',\n", + " '065': 'Erbe (Erbin) (vorverstorben)',\n", + " '066': 'Erblasser(in)',\n", + " '067': 'Ergänzungspfleger(in)',\n", + " '068': 'Erinnerungsführer(in)',\n", + " '069': 'Erinnerungsgegner(in)',\n", + " '070': 'Ersatzbetreuer(in)',\n", + " '071': 'Ersteher(in)',\n", + " '072': 'Erwerber(in)',\n", + " '073': 'Erziehungsberechtigte(r)',\n", + " '074': 'Frühere(r) Ehegatte (Ehegattin)',\n", + " '075': 'Frühere(r) Beklagte(r)',\n", + " '076': 'Frühere(r) Beteiligte(r)',\n", + " '077': 'Frühere(r) Gläubiger(in)',\n", + " '078': 'Frühere(r) Kläger(in)',\n", + " '079': 'Frühere(r) Soldat(in)',\n", + " '080': 'Gegenvormund',\n", + " '081': 'Generalbundesanwalt (-anwältin)',\n", + " '082': 'Gericht',\n", + " '083': 'Gerichtsvollzieher(in)',\n", + " '084': 'Geschädigte(r)',\n", + " '085': 'Geschäftsführende(r) Gesellschafter(in)',\n", + " '086': 'Geschäftsführer(in)',\n", + " '087': 'Gesetzliche(r) Erbe (Erbin)',\n", + " '088': 'Gesetzliche(r) Vertreter(in)',\n", + " '089': 'Gläubiger(in)',\n", + " '090': 'Großeltern',\n", + " '092': 'Großvater (Großmutter)',\n", + " '093': 'Hauptbevollmächtigte(r)',\n", + " '094': 'Hoferbe (Hoferbin)',\n", + " '095': 'Inhaber(in) der Firma',\n", + " '096': 'Insolvenzverwalter(in)',\n", + " '097': 'Jugendamt',\n", + " '098': 'Kammer',\n", + " '099': 'Kammermitglied',\n", + " '100': 'Kind',\n", + " '101': 'Kläger(in)',\n", + " '102': 'Kontrollbetreuer(in)',\n", + " '103': 'Korrespondenzanwalt (-anwältin)',\n", + " '104': 'Kostenschuldner(in)',\n", + " '105': 'Landwirtschaftsrichter(in)',\n", + " '106': 'Lebenspartner(in)',\n", + " '107': 'Liquidator(in)',\n", + " '108': 'Minderjährige(r)',\n", + " '109': 'Mitvormund',\n", + " '110': 'Mündel',\n", + " '112': 'Nachbesserungsgläubiger(in)',\n", + " '113': 'Nachlasspfleger(in)',\n", + " '114': 'Nachlassverwalter(in)',\n", + " '115': 'Nebenkläger(in)',\n", + " '116': 'Neffe (Nichte)',\n", + " '117': 'Nicht verwandt',\n", + " '118': 'Onkel (Tante)',\n", + " '119': 'Opfer',\n", + " '120': 'Pächter(in)',\n", + " '121': 'Pflegeeltern',\n", + " '123': 'Pfleger(in)',\n", + " '124': 'Pfleger(in) für das Sammelvermögen',\n", + " '125': 'Pfleger(in) für die Leibesfrucht',\n", + " '126': 'Pflegevater (Pflegemutter) des Mündels',\n", + " '127': 'Pflegling',\n", + " '128': 'Pflichtverteidiger(in)',\n", + " '129': 'Polizei',\n", + " '130': 'Privatbeklagte(r)',\n", + " '131': 'Privatkläger(in)',\n", + " '132': 'Prozessbevollmächtigte(r)',\n", + " '133': 'Prozesskostenhilfe-Anwalt (-Anwältin)',\n", + " '134': 'Prozesskostenhilfe-Korrespondenzanwalt (-anwältin)',\n", + " '135': 'Rechtsanwalt (-anwältin)',\n", + " '136': 'Rechtsbeistand',\n", + " '137': 'Rechtsbeschwerdeführer(in)',\n", + " '138': 'Rechtsbeschwerdegegner(in)',\n", + " '139': 'Revisionsbeklagte(r)',\n", + " '140': 'Revisionskläger(in)',\n", + " '141': 'Sachbearbeiter(in)',\n", + " '142': 'Sachverständige(r)',\n", + " '143': 'Schuldner(in)',\n", + " '144': 'Schwager (Schwägerin)',\n", + " '146': 'Schwiegersohn (Schwiegertochter)',\n", + " '148': 'Schwiegervater (Schwiegermutter)',\n", + " '149': 'Sohn (Tochter)',\n", + " '150': 'Soldat(in)',\n", + " '151': 'Sonstige(r) Beteiligte(r)',\n", + " '152': 'Sonstige(r) Vertreter(in)',\n", + " '153': 'Staatsanwaltschaft',\n", + " '154': 'Stiefeltern',\n", + " '156': 'Stiefvater (Stiefmutter)',\n", + " '157': 'Streithelfer(in) Beklagte(r)',\n", + " '158': 'Streithelfer(in) Kläger(in)',\n", + " '159': 'Streitverkündete(r) Beklagte(r)',\n", + " '160': 'Streitverkündete(r) Kläger(in)',\n", + " '161': 'Terminsbevollmächtigte(r)',\n", + " '162': 'Testamentsvollstrecker(in)',\n", + " '163': 'Testator(in)',\n", + " '164': 'Übernehmer(in)',\n", + " '165': 'Unterbevollmächtigte(r)',\n", + " '166': 'Ur-Enkel(in)',\n", + " '167': 'Vater (Mutter)',\n", + " '168': 'Veräußerer (Veräußerin)',\n", + " '169': 'Verfahrensbevollmächtigte(r)',\n", + " '170': 'Verfahrenskostenhilfe-Anwalt(-Anwältin)',\n", + " '171': 'Verfahrenskostenhilfe-Korrespondenzanwalt (-anwältin)',\n", + " '172': 'Verfahrenspfleger(in)',\n", + " '173': 'Verfahrensvertreter(in) (§787 ZPO)',\n", + " '174': 'Verfügungsbeklagte(r)',\n", + " '175': 'Verfügungskläger(in)',\n", + " '176': 'Verkehrsanwalt (-anwältin)',\n", + " '177': 'Verlobte(r)',\n", + " '178': 'Vermächtnisnehmer(in)',\n", + " '179': 'Vermieter(in)',\n", + " '180': 'Verpächter(in)',\n", + " '181': 'Versorgungsträger(in)',\n", + " '182': 'Verteidiger(in)',\n", + " '183': 'Vertreter(in) der Interessen des Ausgleichsfonds',\n", + " '184': 'Vertreter(in) der Staatskasse',\n", + " '185': 'Vertreter(in) des Bundesinteresses beim Bundesverwaltungsgericht',\n", + " '186': 'Vertreter(in) des öffentlichen Interesses',\n", + " '187': 'Verurteilte(r)',\n", + " '188': 'Verwalter(in) der Wohnungseigentümergemeinschaft',\n", + " '189': 'Verwaltungsbehörde',\n", + " '190': 'Vollstreckungsgläubiger(in)',\n", + " '191': 'Vollstreckungsschuldner(in)',\n", + " '192': 'Vorläufige(r) Betreuer(in)',\n", + " '193': 'Vormund',\n", + " '194': 'Vorstand',\n", + " '195': 'Vorsorgebevollmächtigte(r)',\n", + " '196': 'Wahlverteidiger(in)',\n", + " '197': 'Widerbeklagte(r)',\n", + " '198': 'Widerkläger(in)',\n", + " '199': 'Wiederaufnahmebeklagte(r)',\n", + " '200': 'Wiederaufnahmekläger(in)',\n", + " '201': 'Zahlungs- und Auflagenempfänger(in)',\n", + " '202': 'Zeuge (Zeugin)',\n", + " '203': 'Zeugenbeistand',\n", + " '204': 'Zulassungsantragsgegner(in)',\n", + " '205': 'Zulassungsantragsteller(in)',\n", + " '206': 'Zustellungsbevollmächtigte(r)',\n", + " '207': 'Zustellungsvertreter(in) (§6 ZVG)',\n", + " '208': 'Notar(in)',\n", + " '209': 'Auskunftsempfänger(in)',\n", + " '210': 'Melder(in)',\n", + " '211': 'Verwahrstelle',\n", + " '212': 'Aussteller(in)',\n", + " '213': 'Berechtigte(r)',\n", + " '214': 'Berechtigte(r) an einem Recht',\n", + " '215': 'Einreicher(in)',\n", + " '216': 'Erbbauberechtigte(r)',\n", + " '217': 'Finanzamt',\n", + " '218': 'Grundbuchvertreter(in)',\n", + " '219': 'Insolvenzgericht',\n", + " '220': 'Mitteilungsempfänger(in)',\n", + " '221': 'Nacherbe (Nacherbin)',\n", + " '222': 'Rechnungsempfänger(in)',\n", + " '223': 'Veranlasser(in)',\n", + " '224': 'Versteigerungsabteilung',\n", + " '225': 'Vertretungsberechtigte(r)',\n", + " '226': 'Zweitschuldner(in)',\n", + " '227': 'Vertreter(in)',\n", + " '228': 'Arbeitgeber(in)',\n", + " '229': 'RV-Träger(in)',\n", + " '230': 'Vollstreckungsstelle',\n", + " '231': 'Abkömmling',\n", + " '232': 'Kreditnehmer(in)',\n", + " '233': 'Neu vorzutragende(r) Eigentümer(in)',\n", + " '234': 'Notariatsverwalter(in)',\n", + " '235': 'Notarvertreter(in)',\n", + " '236': 'Partei kraft Amtes',\n", + " '237': 'Sequester',\n", + " '238': 'Treuhänder(in)',\n", + " '239': 'Zustimmende(r)',\n", + " '240': 'Gläubigervertreter(in)',\n", + " '241': 'Schuldnervertreter(in)',\n", + " '242': 'Zahlungsempfänger(in)',\n", + " '243': 'Anteilsinhaber(in)',\n", + " '244': 'Antragsteller(in) -Eröffnung',\n", + " '245': 'Debitor(in)',\n", + " '246': 'Gesellschafter(in)',\n", + " '247': 'Handlungsbevollmächtigte(r)',\n", + " '248': 'Mitglied einer Gesamt-Anteilsinhaberschaft',\n", + " '249': 'Mitglied einer Gläubigergemeinschaft',\n", + " '250': 'Mitreeder(in)',\n", + " '251': 'Partner(in)',\n", + " '252': 'Persönlich haftende(r) Gesellschafter(in)',\n", + " '253': 'Prozesspfleger(in)',\n", + " '254': 'Sachwalter(in)',\n", + " '255': 'Treuhänder(in) (Wohlverhaltensperiode)',\n", + " '256': 'Vermögensträger(in)',\n", + " '257': 'Vorläufige(r) Insolvenzverwalter(in)',\n", + " '258': 'Vorläufige(r) Treuhänder(in)',\n", + " '259': 'Sondersachwalter(in)',\n", + " '260': 'Sonderinsolvenzverwalter(in)',\n", + " '261': 'Vorläufige(r) Sachwalter(in)',\n", + " '262': 'Abwickler(in)',\n", + " '263': 'Übernehmender Rechtsträger',\n", + " '264': 'Aufsichtsrat (-rätin)',\n", + " '265': 'Besondere(r) Vertreter(in) nach § 30 BGB',\n", + " '266': 'Betriebsleiter(in)',\n", + " '267': 'Empfangsberechtigte(r)',\n", + " '268': 'Geschäftsführende(r) Direktor(in)',\n", + " '269': 'Geschäftsleiter(in)',\n", + " '271': 'Gründer(in)',\n", + " '272': 'Gründungsprüfer(in)',\n", + " '273': 'Hauptniederlassung',\n", + " '274': 'Inhaber(in)',\n", + " '275': 'Kommanditist(in)',\n", + " '276': 'Konkursverwalter(in)',\n", + " '277': 'Mitglied des Leitungsorgans',\n", + " '278': 'Mitglied EWIV',\n", + " '279': 'Nachgründungsprüfer(in)',\n", + " '280': 'Nachtragsabwickler(in)',\n", + " '281': 'Nachtragsliquidator(in)',\n", + " '282': 'Notgeschäftsführer(in)',\n", + " '283': 'Notliquidator(in)',\n", + " '284': 'Notvorstand',\n", + " '285': 'Prokurist(in)',\n", + " '287': 'Rechtsträger(in)',\n", + " '288': 'Registergericht',\n", + " '289': 'Sacheinlagenprüfer(in)',\n", + " '290': 'Ständige(r) Vertreter(in) für die Zweigniederlassung',\n", + " '291': 'Übertragender Rechtsträger',\n", + " '292': 'Vergleichsverwalter(in)',\n", + " '293': 'Verwaltungsrat (-rätin)',\n", + " '294': 'Vorstandsvorsitzende(r)',\n", + " '295': 'Zweigniederlassung',\n", + " '296': 'Vertreter(in) des Klägers/der Klägerin',\n", + " '297': 'Vertreter(in) des/der Beklagten',\n", + " '298': 'Bewährungshilfe',\n", + " '299': 'Gerichtshilfe',\n", + " '300': 'Justizvollzug',\n", + " '301': 'Pseudoname',\n", + " '302': 'Gesetzliche(r) Vertreter(in) des Gläubigers/der Gläubigerin',\n", + " '303': 'Gesetzliche(r) Vertreter(in) des Schuldners/der Schuldnerin',\n", + " '304': 'Bevollmächtigte(r) des Gläubigers/der Gläubigerin',\n", + " '305': 'Bevollmächtigte(r) des Schuldners/der Schuldnerin',\n", + " '306': 'Fahrzeughalter(in)',\n", + " '307': 'Frühere(r) Lebenspartner(in)',\n", + " '308': 'Sicherungsverwalter(in)',\n", + " '309': 'Zwangsverwalter(in)',\n", + " '310': 'Mieter(in)',\n", + " '311': 'Bürge (Bürgin)',\n", + " '312': 'Meistbietende(r)',\n", + " '313': 'Abschlussprüfer(in)',\n", + " '314': 'Antragstellervertreter(in)',\n", + " '315': 'Aufsichtsratsvorsitzende(r)',\n", + " '316': 'Berufskammer',\n", + " '317': 'Betroffenenvertreter(in)',\n", + " '318': 'Bürgermeister(in)',\n", + " '319': 'Eingliederungsbeteiligte(r)',\n", + " '320': 'Formwechselnder Rechtsträger',\n", + " '321': 'Gewerbeamt',\n", + " '322': 'Inhaber(in) (nicht eingetragen)',\n", + " '323': 'Kostenempfänger(in)',\n", + " '324': 'Nachlassgericht',\n", + " '325': 'Sonderprüfer(in)',\n", + " '326': 'Sonstige(r) gerichtlich bestellte(r) Vertreter(in)',\n", + " '327': 'Sonstige(r) gesetzliche(r) Vertreter(in) BGB',\n", + " '328': 'Sonstige(r) organschaftliche(r) Vertreter(in) HRB',\n", + " '329': 'Standardkostenschuldner(in)',\n", + " '330': 'Übernahmeschuldner(in)',\n", + " '331': 'Unternehmensvertragsbeteiligte(r)',\n", + " '332': 'Vertreter(in) des persönlich haftenden Gesellschafters',\n", + " '333': 'Werkleiter(in)',\n", + " '334': 'Mehrfachsitz',\n", + " '335': 'Mitglied VR',\n", + " '336': 'Mitglied e. BGB-Gesellschaft als Abwicklerin',\n", + " '337': 'Mitglied e. BGB-Gesellschaft als ges. Vertreterin',\n", + " '338': 'Mitglied e. BGB-Gesellschaft als Kommanditistin',\n", + " '339': 'Mitglied e. BGB-Gesellschaft als Liquidatorin',\n", + " '340': 'Mitglied e. BGB-Gesellschaft als Mitglied e. EWIV',\n", + " '341': 'Mitglied e. BGB-Gesellschaft als phG',\n", + " '342': 'Mitglied e. Erbengemeinschaft als ges. Vertreterin',\n", + " '343': 'Mitglied e. Erbengemeinschaft als Inhaberin',\n", + " '344': 'Mitglied e. Erbengemeinschaft als Kommanditistin',\n", + " '345': 'Mitglied e. Erbengemeinschaft als Mitglied e. EWIV',\n", + " '346': 'Nebensitz',\n", + " '347': 'Gesamthandsgemeinschaft',\n", + " '348': 'Mitglied einer Gesamthandsgemeinschaft',\n", + " '349': 'Leitungsperson i.S.v. § 30 Abs. 1 Nr. 1 bis 5 OWiG',\n", + " '350': 'Einziehungsbeteiligter',\n", + " '351': 'Antragsgegnervertreter(in)',\n", + " '352': 'Verbraucher(in)',\n", + " '353': 'Vielmelder(in)',\n", + " '354': 'Vollmachtgeber(in)',\n", + " '355': 'Nebenbeteiligte(r) § 444 StPO',\n", + " '356': 'Verfallsbeteiligte(r) § 442 StPO a.F.',\n", + " '357': 'Verfolgte(r) § 34 IRG',\n", + " '358': 'Rechtsnachfolger(in)',\n", + " '359': 'Statuswechselnde(r) Rechtsträger(in)',\n", + " '360': 'Haftangehörige'}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import xmltodict\n", + "\n", + "with open('../src/aki_prj23_transparenzregister/utils/data_extraction/unternehmensregister/xjustiz_0040_cl_rollenbezeichnung_3_3.xsd', encoding=\"utf-8\") as file:\n", + " content = file.read()\n", + " data = xmltodict.parse(content)\n", + "mapping = {}\n", + "for entry in data[\"xs:schema\"][\"xs:simpleType\"][\"xs:restriction\"][\"xs:enumeration\"]:\n", + " mapping[entry['@value']] = entry['xs:annotation']['xs:appinfo']['wert']\n", + " print(f\"id: {entry['@value']}\")\n", + " print(f\"value: {entry['xs:annotation']['xs:appinfo']['wert']}\")\n", + "mapping" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Geschäftsführer(in)'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mapping[\"086\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -16,7 +1121,7 @@ "source": [ "import json\n", "import dataclasses\n", - "from transform import map_unternehmensregister_json\n", + "from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform import map_unternehmensregister_json\n", "\n", "with open('../tmp/json/GEAFarmTechnologiesGmbH.json', \"r\") as file:\n", " content = json.load(file)\n", @@ -28,7 +1133,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -40,10 +1145,6 @@ } ], "source": [ - "import json\n", - "import dataclasses\n", - "from transform import map_unternehmensregister_json\n", - "\n", "with open('../tmp/json/ZalandoLoungeServiceGmbH.json', \"r\") as file:\n", " content = json.load(file)\n", " company_data = map_unternehmensregister_json(content)\n", @@ -54,7 +1155,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -66,10 +1167,6 @@ } ], "source": [ - "import json\n", - "import dataclasses\n", - "from transform import map_unternehmensregister_json\n", - "\n", "with open('../tmp/json/ZalandoSE.json', \"r\") as file:\n", " content = json.load(file)\n", " company_data = map_unternehmensregister_json(content)\n",