diff --git a/src/fundamend/reader/ahbreader.py b/src/fundamend/reader/ahbreader.py index 1390ced..41e92cc 100644 --- a/src/fundamend/reader/ahbreader.py +++ b/src/fundamend/reader/ahbreader.py @@ -31,7 +31,7 @@ _is_segment_group, _is_uebertragungsdatei, ) -from fundamend.utils import lstrip, remove_linebreaks_and_hyphens, strip +from fundamend.utils import lstrip, remove_linebreaks_and_hyphens, remove_unnecessary_hyphens, strip # pylint:disable=duplicate-code # yes, it's very similar to the MigReader @@ -252,7 +252,9 @@ def _read_anwendungsfall(self, original_element: ET.Element) -> Anwendungsfall: format_element = next((child for child in original_element[0] if child.tag.startswith("M_"))) return Anwendungsfall( pruefidentifikator=original_element.attrib["Pruefidentifikator"], - beschreibung=remove_linebreaks_and_hyphens(original_element.attrib["Beschreibung"]), + beschreibung=remove_unnecessary_hyphens( + remove_linebreaks_and_hyphens(original_element.attrib["Beschreibung"]) + ), kommunikation_von=original_element.attrib["Kommunikation_von"].strip(), format=EdifactFormat(lstrip("M_", format_element.tag)), elements=tuple(segments_and_groups), diff --git a/src/fundamend/utils.py b/src/fundamend/utils.py index 093aad2..52e1510 100644 --- a/src/fundamend/utils.py +++ b/src/fundamend/utils.py @@ -3,10 +3,13 @@ """ import re -from typing import Optional +from typing import Optional, overload from fundamend.models.kommunikationsrichtung import Kommunikationsrichtung +_unnecessary_hyphen_pattern = re.compile(r"(?<=[a-zäüöß])-(?=[a-zäüöß])") +"""if before AND after a hyphen there are only lower case letters, then we can probably remove it""" + def lstrip(prefix: str, text: str) -> str: """Strip the given prefix from the given text. If the text does not start with the prefix, return the text as is. @@ -143,4 +146,27 @@ def parse_kommunikation_von(kommunikation_von: Optional[str]) -> list[Kommunikat return result -__all__ = ["lstrip", "rstrip", "strip", "parse_kommunikation_von", "remove_linebreaks_and_hyphens"] +@overload +def remove_unnecessary_hyphens(candidate: str) -> str: ... +@overload +def remove_unnecessary_hyphens(candidate: None) -> None: ... +def remove_unnecessary_hyphens(candidate: Optional[str]) -> Optional[str]: + """ + removes hyphens from the middle of words that are likely unnecessary + Example: "Ausfallarbeits-summenzeitreihe" returns "Ausfallarbeitssummenzeitreihe" + or "Bestäti-gung" returns "Bestätigung". But "Sperr-/Entsperrauftrag" stays untouched. + Handles multiple occurrences: "Bestäti-gung der Stornier-ung" returns "Bestätigung der Stornierung". + """ + if candidate is None: + return None + return _unnecessary_hyphen_pattern.sub("", candidate) + + +__all__ = [ + "lstrip", + "rstrip", + "strip", + "parse_kommunikation_von", + "remove_linebreaks_and_hyphens", + "remove_unnecessary_hyphens", +] diff --git a/unittests/__snapshots__/test_ahbreader.ambr b/unittests/__snapshots__/test_ahbreader.ambr index 20be0ee..a8347b8 100644 --- a/unittests/__snapshots__/test_ahbreader.ambr +++ b/unittests/__snapshots__/test_ahbreader.ambr @@ -11,7 +11,7 @@ # name: test_sanitizing_all_awf_beschreibungen list([ '', - '#nv# Anfrage an MSB mit Abhängig-keiten', + '#nv# Anfrage an MSB mit Abhängigkeiten', '#nv# Nicht bila.rel. Änderung vom LF', '(Ankündigung) Zuordnung des LF zur erz. MaLo/ Tranche', '...wird nicht mehr verwendet...', @@ -20,7 +20,7 @@ 'Abl. der Anforderung', 'Ablehnung', 'Ablehnung Ab-/Bestellung Aggregationsebene', - 'Ablehnung Abmelde-anfrage', + 'Ablehnung Abmeldeanfrage', 'Ablehnung Abmeldung', 'Ablehnung Abmeldung vom NB', 'Ablehnung Anforderung Werte', @@ -49,12 +49,12 @@ 'Ablehnung Reklamation einer Definition', 'Ablehnung Sperr-/Entsperrauftrag', 'Ablehnung Stornierung Sperr-/Entsperrauftrag', - 'Ablehnung Verpflicht-ungsanfrage', + 'Ablehnung Verpflichtungsanfrage', 'Ablehnung Weiterverpflichtung', 'Ablehnung Zuordnung des LF zur erz. MaLo/ Tranche', - 'Ablehnung auf Stamm-daten zur erzeugenden Markt-lokation', - 'Ablehnung auf Stammdaten zur Markt-lokation', - 'Ablehnung auf Stammdaten zur ver-brauchenden Markt-lokation', + 'Ablehnung auf Stammdaten zur Marktlokation', + 'Ablehnung auf Stammdaten zur erzeugenden Marktlokation', + 'Ablehnung auf Stammdaten zur verbrauchenden Marktlokation', 'Ablehnung der Ab-/Bestellung von Werten', 'Ablehnung der Anforderung Allokationsliste', 'Ablehnung der Anforderung bilanzierte Menge', @@ -62,14 +62,14 @@ 'Ablehnung der Anfrage Brennwert / Zustandszahl', 'Ablehnung der Anfrage Stammdaten', 'Ablehnung der Anfrage Werte', - 'Ablehnung der Anfrage der Markt-lokations-struktur', + 'Ablehnung der Anfrage der Marktlokationsstruktur', 'Ablehnung der Anfrage vom MSB Gas', 'Ablehnung der Reklamation einer Definition', - 'Ablehnung der Stornier-ung einer Bestellung', + 'Ablehnung der Stornierung einer Bestellung', 'Ablehnung Änderung Konzessionsabgabe', - 'Abmelde-anfrage des NB', + 'Abmeldeanfrage des NB', 'Abmeldung', - 'Abmeldung / Beendig-ung der Zuordnung', + 'Abmeldung / Beendigung der Zuordnung', 'Abmeldung NN', 'Abmeldung NN vom NB', 'Abmeldung aus dem Modell 2', @@ -78,20 +78,20 @@ 'Abr.-Daten BK-Abr. verb. MaLo', 'Abr.-Daten BK-Abr. verb. Malo', 'Abr.-Daten NNA', - 'Abschlags-rechnung', + 'Abschlagsrechnung', 'Abweisung', 'Aggreg. MMM-Rechnung', 'Aggreg. MMM-selbst ausgest. Rechnung', 'Aktivierung ZP LF-AASZR', 'Aktivierung ZP monatliche AAÜZ', 'Aktivierung ZP tägliche AAÜZ', - 'Aktivierung der Zuordnungs-ermächtigung', + 'Aktivierung der Zuordnungsermächtigung', 'Aktivierung von ZP', 'Aktualisierte Stammdaten zum Lokationsbündel', - 'Aktualisierte Stammdaten zur Markt-lokation', + 'Aktualisierte Stammdaten zur Marktlokation', 'Aktualisierte Stammdaten zur Messlokation', - 'Aktualisierte Stammdaten zur erzeugenden Markt-lokation', - 'Aktualisierte Stammdaten zur ver-brauchenden Markt-lokation', + 'Aktualisierte Stammdaten zur erzeugenden Marktlokation', + 'Aktualisierte Stammdaten zur verbrauchenden Marktlokation', 'Anerkennungs- meldung', 'Anforder. Bilanzkreiszuordnungsliste', 'Anforder. Clearingliste BAS', @@ -115,11 +115,11 @@ 'Anfrage Stammdaten Marktlokation (Gas)', 'Anfrage Stammdaten Messlokation (Gas)', 'Anfrage Stammdaten der individuellen Bestellung', - 'Anfrage an MSB mit Abhängig-keiten', + 'Anfrage an MSB mit Abhängigkeiten', 'Anfrage an MSB ohne Abhängigkeiten', 'Anfrage an NB', - 'Anfrage der Lokations-bündelstruktur', - 'Anfrage der Markt-lokations-struktur', + 'Anfrage der Lokationsbündelstruktur', + 'Anfrage der Marktlokationsstruktur', 'Anfrage einer Konfiguration', 'Anfrage nach Stornierung', 'Anfrage vom MSB Gas', @@ -150,49 +150,48 @@ 'Antwort auf Abmeldung vom NB', 'Antwort auf Aktivierung ZP', 'Antwort auf Anfrage', - 'Antwort auf Anfrage der Lokations-bündelstruktur', - 'Antwort auf Anfrage der Markt-lokations-struktur', + 'Antwort auf Anfrage der Lokationsbündelstruktur', + 'Antwort auf Anfrage der Marktlokationsstruktur', 'Antwort auf Anmeldung', 'Antwort auf Beendigung', 'Antwort auf Berechnungsformel', - 'Antwort auf Bilanzierungs-gebiets-clearing-liste', + 'Antwort auf Bilanzierungsgebietsclearingliste', 'Antwort auf DZÜ Liste', 'Antwort auf Deaktivierung ZP', 'Antwort auf GDA', 'Antwort auf GDA (Strom an Gas)', 'Antwort auf GDA erz. MaLo', 'Antwort auf GDA verb. MaLo', - 'Antwort auf Stammdaten-änderung', + 'Antwort auf Stammdatenänderung', 'Antwort auf das Angebot', - 'Antwort auf die Geschäftsdaten-anfrage', 'Antwort auf die Geschäftsdatenanfrage', 'Antwort auf Änderung', - 'Antwort auf Änderung der Lokations-bündelstruktur', - 'Antwort auf Änderung der Marktlokations-struktur', + 'Antwort auf Änderung der Lokationsbündelstruktur', + 'Antwort auf Änderung der Marktlokationsstruktur', 'Antwort auf Änderung vom LF', 'Antwort auf Änderung vom MSB', 'Antwort auf Änderung vom NB', - 'Antwort auf Änderungs-meldung zur Bestands-liste', + 'Antwort auf Änderungsmeldung zur Bestandsliste', 'Anzeige Gerätewechselabsicht', - 'Arbeit Leistungs-max. Kalenderjahr vor Lieferbeginn', + 'Arbeit Leistungsmax. Kalenderjahr vor Lieferbeginn', 'Aufhebung einer zuk. Zuordnung', 'Auftragsstatus (Sperren)', - 'Ausfallarbeits-überführungszeitreihe', - 'Bearbeitungs-standsmeldung', + 'Ausfallarbeitsüberführungszeitreihe', 'Bearbeitungsstand Bestellung Änderung Abrechnungsdaten', 'Bearbeitungsstand Reklamation Konfiguration', + 'Bearbeitungsstandsmeldung', 'Beauftragung Änderung Technik', 'Beendigung Rechnungsabwicklung MSB über LF', 'Beendigung Zuordnung ZP der NGZ zur NZR', - 'Beendigung der Aggregat-ionsverant-wortung vom LF', - 'Beendigung der Aggregat-ionsverant-wortung vom NB', - 'Beendigung der Aggregat-ionsverant-wortung vom ÜNB', + 'Beendigung der Aggregationsverantwortung vom LF', + 'Beendigung der Aggregationsverantwortung vom NB', + 'Beendigung der Aggregationsverantwortung vom ÜNB', 'Beendigung der Zuordnung', 'Beendigung der Zuordnung zur MaLo', 'Beendigung der Zuordnung zur Marktlokation', 'Berechnungsformel', 'Best. der Anforderung zum Beenden des Abos zur Stammdaten bzw. Messwertübermittlung', - 'Bestands-liste zugeordnete Marktlokationenen', + 'Bestandsliste zugeordnete Marktlokationenen', 'Bestandss. / Eigenausbau iMS', 'Bestellanforderung Änderung Gerätekonfiguration', 'Bestellanforderung Änderung Prognosegrundlage/ Gerätekonfiguration', @@ -212,19 +211,15 @@ 'Bestellung Änderung Zählzeitdefinition', 'Bestellungsantwort / -mitteilung', 'Bestellungsbeendigung', - 'Bestäti-gung', - 'Bestäti-gung der Ab-/Bestellung von Werten', - 'Bestäti-gung der Stornier-ung einer Bestellung', - 'Bestätig-ung Anmeldung', - 'Bestätig-ung Anmeldung Neuanl. u. LW m. Trbild. b. N-EE+N-KWKG', 'Bestätigung', - 'Bestätigung Abmelde-anfrage', + 'Bestätigung Abmeldeanfrage', 'Bestätigung Abmeldung', 'Bestätigung Abmeldung vom NB', 'Bestätigung Anfrage Sperrung', 'Bestätigung Anfrage Stornierung', 'Bestätigung Anmeldung', 'Bestätigung Anmeldung MSB', + 'Bestätigung Anmeldung Neuanl. u. LW m. Trbild. b. N-EE+N-KWKG', 'Bestätigung Anmeldung erz. MaLo', 'Bestätigung Anmeldung neue erz. MaLo', 'Bestätigung Anmeldung neue verb. MaLo', @@ -240,45 +235,46 @@ 'Bestätigung Kündigung MSB', 'Bestätigung Sperr-/Entsperrauftrag', 'Bestätigung Stornierung Sperr-/Entsperrauftrag', - 'Bestätigung Verpflicht-ungsanfrage', + 'Bestätigung Verpflichtungsanfrage', 'Bestätigung Weiterverpflichtung', 'Bestätigung Zuordnung des LF zur erz. MaLo/ Tranche', + 'Bestätigung der Ab-/Bestellung von Werten', + 'Bestätigung der Stornierung einer Bestellung', 'Bila.rel. Anfrage an LF', 'Bila.rel. Anfrage an NB mit Abhängigkeiten', - 'Bila.rel. Anfrage an NB ohne Abhängig-keiten', + 'Bila.rel. Anfrage an NB ohne Abhängigkeiten', 'Bila.rel. Änderung vom LF', 'Bila.rel. Änderung vom NB mit Abhängigkeiten', - 'Bilanzierungs-gebiets-clearing-liste', + 'Bilanzierungsgebietsclearingliste', 'Bilanzkreiszuordnungsliste', 'Clearingliste BAS', 'Clearingliste DZR', 'DZÜ Liste', 'Daten auf individuelle Bestellung', - 'Deaktivier-ung von ZP', 'Deaktivierung ZP LF-AASZR', 'Deaktivierung ZP monatliche AAÜZ', - 'Deaktivierung der Zuordnungs-ermächtigung', + 'Deaktivierung der Zuordnungsermächtigung', 'Deaktivierung tägliche AAÜZ', + 'Deaktivierung von ZP', 'Deklarationsliste', 'EEG-Überführungs-ZR', 'EEG-Überführungs-ZR aufgrund Ausfallarbeit', 'Einrichtung Konfiguration Zuordnung LF von MSB', 'Einrichtung Konfiguration Zuordnung LF von NB', - 'Empfangs-bestätigung', + 'Empfangsbestätigung', 'EnFG Informationen', 'Ende MSB', - 'Energie-menge (Strom)', - 'Energie-menge u. Leistungs-max. (Strom)', 'Energiemenge (Gas)', + 'Energiemenge (Strom)', + 'Energiemenge u. Leistungsmax. (Strom)', 'Entsperrauftrag', - 'Ergebnis-bericht', + 'Ergebnisbericht', 'Existierende Zuordnung', 'Fehlermeldung', 'Gasbeschaffenheit', 'Gerätestatus', 'Grundlage POG-Ermittlung', 'Info Entsperrauftrag', - 'Informations-meldung', 'Informationsmeldung', 'Informationsmeldung zur Aufhebung einer zuk. Zuordnung', 'Informationsmeldung zur Beendigung der Zuordnung', @@ -297,15 +293,15 @@ 'Kommunikationsdaten des ÜNB Strom', 'Korrektur Meldepunkt vom NB', 'Korrekturliste LF-AACL', - 'Korrekturliste zur Lieferanten-clearingliste', + 'Korrekturliste zur Lieferantenclearingliste', 'Kündigung', 'Kündigung MSB', 'Kündigung beim alten Lieferanten', 'LF-AACL', 'Lastgang (Gas)', 'Lastgang Marktlokation, Tranche', - 'Lastgang Messlokation, Netzkoppel-punkt, Netzlokation', - 'Lieferanten-clearingliste', + 'Lastgang Messlokation, Netzkoppelpunkt, Netzlokation', + 'Lieferantenclearingliste', 'Lokationsbündelstruktur und DB', 'MMM-Rechnung', 'MMM-selbst ausgest. Rechnung', @@ -342,14 +338,14 @@ 'ORDRSP Bestätigung Beendigung Rechnungsabwicklung MSB über LF', 'ORDRSP Fortführungsbestätigung', 'Preisblatt GPKE und Awh Sperrprozesse Gas', - 'Preisblatt Messstellenbe-trieb / Konfigurationen', + 'Preisblatt Messstellenbetrieb / Konfigurationen', 'Preisblätter MSB-Leistungen', 'Preisblätter NB-Leistungen', 'Profilschar', 'REQOTE Anfrage Rechnungsabwicklung MSB über LF', 'REQOTE Angebotsanfrage', 'Rechnung Sonstige Leistung', - 'Redispatch 2.0 Ausfallarbeits-summenzeitreihe', + 'Redispatch 2.0 Ausfallarbeitssummenzeitreihe', 'Redispatch 2.0 Einzelzeitreihe Ausfallarbeit', 'Reklamation Profile bzw. Profilscharen', 'Reklamation einer Definition', @@ -376,32 +372,31 @@ 'Spartenüb. Kommunikationsdaten des MSB Strom', 'Spartenüb. Kommunikationsdaten des NB Gas', 'Sperrauftrag', - 'Stamm-daten zur erzeugenden Markt-lokation', 'Stammdaten BK-Treue', 'Stammdaten auf eine ORDERS', 'Stammdaten auf individuelle Bestellung', 'Stammdaten aufgrund einer Änderung', 'Stammdaten zum Lokationsbündel', - 'Stammdaten zur Markt-lokation', + 'Stammdaten zur Marktlokation', 'Stammdaten zur Messlokation', - 'Stammdaten zur ver-brauchenden Markt-lokation', - 'Stammdaten-synchron-isation vom LF', - 'Stammdaten-synchron-isation vom NB', - 'Stammdaten-synchron-isation vom ÜNB', - 'Status-meldung', + 'Stammdaten zur erzeugenden Marktlokation', + 'Stammdaten zur verbrauchenden Marktlokation', + 'Stammdatensynchronisation vom LF', + 'Stammdatensynchronisation vom NB', + 'Stammdatensynchronisation vom ÜNB', 'Statusmeldung', 'Stornierung Sperr-/Entsperrauftrag', 'Stornierung der Bestellung', 'Stornorechnung', 'Strom Abweisung Kopf und Summe', 'Strom Abweisung Position', - 'Störungs-meldung', - 'Summen-zeitreihe', - 'Syntaxfehler-meldung in der Nachricht', - 'Syntaxfehler-meldung in der Übertra-gungsdatei', - 'TEP vergh. Werte Referenz-messung', - 'Verpflicht-ungsanfrage / Aufforderung', - 'Vorabinfor-mation', + 'Störungsmeldung', + 'Summenzeitreihe', + 'Syntaxfehlermeldung in der Nachricht', + 'Syntaxfehlermeldung in der Übertragungsdatei', + 'TEP vergh. Werte Referenzmessung', + 'Verpflichtungsanfrage / Aufforderung', + 'Vorabinformation', 'Weiterleitung Aktivierung ZP', 'Weiterleitung Deaktivierung ZP', 'Weiterleitung der Stornierung', @@ -413,7 +408,7 @@ 'Zustimmung Berechnungsformel', 'Zählerstand (Gas)', 'Zählerstand (Strom)', - 'iMS-Ersteinbau-zust.', + 'iMS-Ersteinbauzust.', 'marktlokations- scharfe Allokationsliste Gas (MMMA)', 'marktlokations- scharfe bilanzierte Menge Strom / Gas (MMMA)', 'marktlokations- scharfe bilanzierte Menge Strom/Gas (MMMA)', @@ -427,14 +422,13 @@ 'Änderung Daten der Tranche', 'Änderung MSB-Abr.-Daten der MaLo', 'Änderung Paket-ID der Malo', - 'Änderung der Lokations-bündelstruktur', 'Änderung der Lokationsbündelstruktur', - 'Änderung der Marktlokations-struktur', - 'Änderung der Prognose-grundlage', + 'Änderung der Marktlokationsstruktur', + 'Änderung der Prognosegrundlage', 'Änderung vom MSB für MSB-Abrechnungsdaten des MSB an der Marktlokation', 'Änderung vom MSB mit Abhängig keiten', 'Änderung vom MSB ohne Abhängigkeiten', - 'Änderungs-meldung zur Bestands-liste', + 'Änderungsmeldung zur Bestandsliste', 'Übermittlung Kommunikationsdaten des BIKO', 'Übermittlung Kommunikationsdaten des BKV', 'Übermittlung Kommunikationsdaten des ESA', @@ -443,7 +437,7 @@ 'Übermittlung Kommunikationsdaten des NB', 'Übermittlung Kommunikationsdaten des ÜNB', 'Übermittlung Kommunikationsparameter', - 'Übermittlung der Ausgleichs-energiepreise', + 'Übermittlung der Ausgleichsenergiepreise', 'Übermittlung der Profildefinitionen', 'Übermittlung einer ausgerollten Leistungskurvendefinition', 'Übermittlung einer ausgerollten Schaltzeitdefinition', diff --git a/unittests/test_sanitization.py b/unittests/test_sanitization.py new file mode 100644 index 0000000..261ef45 --- /dev/null +++ b/unittests/test_sanitization.py @@ -0,0 +1,336 @@ +from typing import Optional + +import pytest + +from fundamend.utils import remove_unnecessary_hyphens + + +@pytest.mark.parametrize( + "argument,expected", + [ + pytest.param("Summen-zeitreihe", "Summenzeitreihe", id="13003"), + pytest.param("EEG-Überführungs-ZR", "EEG-Überführungs-ZR", id="13005"), + pytest.param("TEP vergh. Werte Referenz-messung", "TEP vergh. Werte Referenzmessung", id="13012"), + pytest.param( + "marktlokations- scharfe Allokationsliste Gas (MMMA)", + "marktlokations- scharfe Allokationsliste Gas (MMMA)", + id="13013", + ), + pytest.param( + "marktlokations- scharfe bilanzierte Menge Strom / Gas (MMMA)", + "marktlokations- scharfe bilanzierte Menge Strom / Gas (MMMA)", + id="13014", + ), + pytest.param( + "Arbeit Leistungs-max. Kalenderjahr vor Lieferbeginn", + "Arbeit Leistungsmax. Kalenderjahr vor Lieferbeginn", + id="13015", + ), + pytest.param("Energie-menge u. Leistungs-max. (Strom)", "Energiemenge u. Leistungsmax. (Strom)", id="13016"), + pytest.param( + "Lastgang Messlokation, Netzkoppel-punkt, Netzlokation", + "Lastgang Messlokation, Netzkoppelpunkt, Netzlokation", + id="13018", + ), + pytest.param("Energie-menge (Strom)", "Energiemenge (Strom)", id="13019"), + pytest.param("Ausfallarbeits-überführungszeitreihe", "Ausfallarbeitsüberführungszeitreihe", id="13020"), + pytest.param( + "Redispatch 2.0 Ausfallarbeits-summenzeitreihe", "Redispatch 2.0 Ausfallarbeitssummenzeitreihe", id="13023" + ), + pytest.param( + "EEG-Überführungs-ZR aufgrund Ausfallarbeit", "EEG-Überführungs-ZR aufgrund Ausfallarbeit", id="13026" + ), + pytest.param("Grundlage POG-Ermittlung", "Grundlage POG-Ermittlung", id="13028"), + pytest.param( + "Ab-/Bestellung BK-SZR auf Aggregationsebene RZ", + "Ab-/Bestellung BK-SZR auf Aggregationsebene RZ", + id="17207", + ), + pytest.param("Anforderung Clearingliste ÜNB-DZR", "Anforderung Clearingliste ÜNB-DZR", id="17208"), + pytest.param( + "Bestäti-gung der Ab-/Bestellung von Werten", "Bestätigung der Ab-/Bestellung von Werten", id="19011" + ), + pytest.param("Ablehnung der Ab-/Bestellung von Werten", "Ablehnung der Ab-/Bestellung von Werten", id="19012"), + pytest.param( + "Bestäti-gung der Stornier-ung einer Bestellung", "Bestätigung der Stornierung einer Bestellung", id="19013" + ), + pytest.param( + "Ablehnung der Stornier-ung einer Bestellung", "Ablehnung der Stornierung einer Bestellung", id="19014" + ), + pytest.param("Bestätigung Sperr-/Entsperrauftrag", "Bestätigung Sperr-/Entsperrauftrag", id="19116"), + pytest.param("Ablehnung Sperr-/Entsperrauftrag", "Ablehnung Sperr-/Entsperrauftrag", id="19117"), + pytest.param( + "Bestätigung Stornierung Sperr-/Entsperrauftrag", + "Bestätigung Stornierung Sperr-/Entsperrauftrag", + id="19128", + ), + pytest.param( + "Ablehnung Stornierung Sperr-/Entsperrauftrag", "Ablehnung Stornierung Sperr-/Entsperrauftrag", id="19129" + ), + pytest.param( + "Ablehnung Ab-/Bestellung Aggregationsebene", "Ablehnung Ab-/Bestellung Aggregationsebene", id="19204" + ), + pytest.param("Status-meldung", "Statusmeldung", id="21003"), + pytest.param("Status-meldung", "Statusmeldung", id="21004"), + pytest.param("Status-meldung", "Statusmeldung", id="21005"), + pytest.param("Status-meldung", "Statusmeldung", id="21009"), + pytest.param("Status-meldung", "Statusmeldung", id="21010"), + pytest.param("Status-meldung", "Statusmeldung", id="21011"), + pytest.param("Status-meldung", "Statusmeldung", id="21012"), + pytest.param("Status-meldung", "Statusmeldung", id="21013"), + pytest.param("Status-meldung", "Statusmeldung", id="21024"), + pytest.param("Status-meldung", "Statusmeldung", id="21025"), + pytest.param("Status-meldung", "Statusmeldung", id="21026"), + pytest.param("Status-meldung", "Statusmeldung", id="21027"), + pytest.param("Vorabinfor-mation", "Vorabinformation", id="21029"), + pytest.param("iMS-Ersteinbau-zust.", "iMS-Ersteinbauzust.", id="21030"), + pytest.param("Bestellungsantwort / -mitteilung", "Bestellungsantwort / -mitteilung", id="21043"), + pytest.param("Bearbeitungs-standsmeldung", "Bearbeitungsstandsmeldung", id="21047"), + pytest.param("Störungs-meldung", "Störungsmeldung", id="23001"), + pytest.param("Bestäti-gung", "Bestätigung", id="23004"), + pytest.param("Informations-meldung", "Informationsmeldung", id="23005"), + pytest.param("Ergebnis-bericht", "Ergebnisbericht", id="23008"), + pytest.param("Informations-meldung", "Informationsmeldung", id="23009"), + pytest.param("Informations-meldung", "Informationsmeldung", id="23011"), + pytest.param("Informations-meldung", "Informationsmeldung", id="23012"), + pytest.param( + "Übermittlung der Ausgleichs-energiepreise", "Übermittlung der Ausgleichsenergiepreise", id="27001" + ), + pytest.param( + "Preisblatt Messstellenbe-trieb / Konfigurationen", + "Preisblatt Messstellenbetrieb / Konfigurationen", + id="27002a", + ), + pytest.param("Preisblätter MSB-Leistungen", "Preisblätter MSB-Leistungen", id="27002b"), + pytest.param("Preisblätter NB-Leistungen", "Preisblätter NB-Leistungen", id="27003"), + pytest.param("Abschlags-rechnung", "Abschlagsrechnung", id="31001"), + pytest.param("NN-Rechnung", "NN-Rechnung", id="31002"), + pytest.param("WiM-Rechnung", "WiM-Rechnung", id="31003"), + pytest.param("MMM-Rechnung", "MMM-Rechnung", id="31005"), + pytest.param("MMM-selbst ausgest. Rechnung", "MMM-selbst ausgest. Rechnung", id="31006"), + pytest.param("Aggreg. MMM-Rechnung", "Aggreg. MMM-Rechnung", id="31007"), + pytest.param("Aggreg. MMM-selbst ausgest. Rechnung", "Aggreg. MMM-selbst ausgest. Rechnung", id="31008"), + pytest.param("MSB-Rechnung", "MSB-Rechnung", id="31009"), + pytest.param("Stornierung Sperr-/Entsperrauftrag", "Stornierung Sperr-/Entsperrauftrag", id="39000"), + pytest.param("Abmelde-anfrage des NB", "Abmeldeanfrage des NB", id="44010"), + pytest.param("Bestätigung Abmelde-anfrage", "Bestätigung Abmeldeanfrage", id="44011"), + pytest.param("Ablehnung Abmelde-anfrage", "Ablehnung Abmeldeanfrage", id="44012"), + pytest.param( + "Bestands-liste zugeordnete Marktlokationenen", "Bestandsliste zugeordnete Marktlokationenen", id="44019" + ), + pytest.param("Änderungs-meldung zur Bestands-liste", "Änderungsmeldung zur Bestandsliste", id="44020"), + pytest.param( + "Antwort auf Änderungs-meldung zur Bestands-liste", + "Antwort auf Änderungsmeldung zur Bestandsliste", + id="44021", + ), + pytest.param("Antwort auf die Geschäftsdaten-anfrage", "Antwort auf die Geschäftsdatenanfrage", id="44060"), + pytest.param("Stammdaten zur Markt-lokation", "Stammdaten zur Marktlokation", id="44103"), + pytest.param( + "Aktualisierte Stammdaten zur Markt-lokation", "Aktualisierte Stammdaten zur Marktlokation", id="44104" + ), + pytest.param( + "Ablehnung auf Stammdaten zur Markt-lokation", "Ablehnung auf Stammdaten zur Marktlokation", id="44105" + ), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="44143"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="44147"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="44148"), + pytest.param("Verpflicht-ungsanfrage / Aufforderung", "Verpflichtungsanfrage / Aufforderung", id="44168"), + pytest.param("Bestätigung Verpflicht-ungsanfrage", "Bestätigung Verpflichtungsanfrage", id="44169"), + pytest.param("Ablehnung Verpflicht-ungsanfrage", "Ablehnung Verpflichtungsanfrage", id="44170"), + pytest.param("#nv# Anfrage an MSB mit Abhängig-keiten", "#nv# Anfrage an MSB mit Abhängigkeiten", id="44172"), + pytest.param("Änderung der Marktlokations-struktur", "Änderung der Marktlokationsstruktur", id="44175"), + pytest.param( + "Antwort auf Änderung der Marktlokations-struktur", + "Antwort auf Änderung der Marktlokationsstruktur", + id="44176", + ), + pytest.param("Anfrage der Markt-lokations-struktur", "Anfrage der Marktlokationsstruktur", id="44180"), + pytest.param( + "Antwort auf Anfrage der Markt-lokations-struktur", + "Antwort auf Anfrage der Marktlokationsstruktur", + id="44181", + ), + pytest.param( + "Ablehnung der Anfrage der Markt-lokations-struktur", + "Ablehnung der Anfrage der Marktlokationsstruktur", + id="44182", + ), + pytest.param("Abmeldung / Beendig-ung der Zuordnung", "Abmeldung / Beendigung der Zuordnung", id="55007"), + pytest.param("Abmelde-anfrage des NB", "Abmeldeanfrage des NB", id="55010"), + pytest.param("Bestätigung Abmelde-anfrage", "Bestätigung Abmeldeanfrage", id="55011"), + pytest.param("Ablehnung Abmelde-anfrage", "Ablehnung Abmeldeanfrage", id="55012"), + pytest.param("Deaktivier-ung von ZP", "Deaktivierung von ZP", id="55063"), + pytest.param("Lieferanten-clearingliste", "Lieferantenclearingliste", id="55065"), + pytest.param( + "Korrekturliste zur Lieferanten-clearingliste", "Korrekturliste zur Lieferantenclearingliste", id="55066" + ), + pytest.param("Aktivierung der Zuordnungs-ermächtigung", "Aktivierung der Zuordnungsermächtigung", id="55071"), + pytest.param( + "Deaktivierung der Zuordnungs-ermächtigung", "Deaktivierung der Zuordnungsermächtigung", id="55072" + ), + pytest.param("Antwort auf Stammdaten-änderung", "Antwort auf Stammdatenänderung", id="55076"), + pytest.param("Bestätig-ung Anmeldung", "Bestätigung Anmeldung", id="55078"), + pytest.param( + "Bestätig-ung Anmeldung Neuanl. u. LW m. Trbild. b. N-EE+N-KWKG", + "Bestätigung Anmeldung Neuanl. u. LW m. Trbild. b. N-EE+N-KWKG", + id="55079", + ), + pytest.param("Abmelde-anfrage des NB", "Abmeldeanfrage des NB", id="55086"), + pytest.param("Bestätigung Abmelde-anfrage", "Bestätigung Abmeldeanfrage", id="55087"), + pytest.param("Ablehnung Abmelde-anfrage", "Ablehnung Abmeldeanfrage", id="55088"), + pytest.param( + "Stammdaten zur ver-brauchenden Markt-lokation", "Stammdaten zur verbrauchenden Marktlokation", id="55103" + ), + pytest.param( + "Aktualisierte Stammdaten zur ver-brauchenden Markt-lokation", + "Aktualisierte Stammdaten zur verbrauchenden Marktlokation", + id="55104", + ), + pytest.param( + "Ablehnung auf Stammdaten zur ver-brauchenden Markt-lokation", + "Ablehnung auf Stammdaten zur verbrauchenden Marktlokation", + id="55105", + ), + pytest.param( + "Stamm-daten zur erzeugenden Markt-lokation", "Stammdaten zur erzeugenden Marktlokation", id="55106" + ), + pytest.param( + "Aktualisierte Stammdaten zur erzeugenden Markt-lokation", + "Aktualisierte Stammdaten zur erzeugenden Marktlokation", + id="55107", + ), + pytest.param( + "Ablehnung auf Stamm-daten zur erzeugenden Markt-lokation", + "Ablehnung auf Stammdaten zur erzeugenden Marktlokation", + id="55108", + ), + pytest.param("Änderung der Prognose-grundlage", "Änderung der Prognosegrundlage", id="55126a"), + pytest.param("Abr.-Daten BK-Abr. verb. Malo", "Abr.-Daten BK-Abr. verb. Malo", id="55126b"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="55143"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="55147"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="55148"), + pytest.param( + "Bila.rel. Anfrage an NB ohne Abhängig-keiten", "Bila.rel. Anfrage an NB ohne Abhängigkeiten", id="55153" + ), + pytest.param( + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. verb. MaLo", + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. verb. MaLo", + id="55156", + ), + pytest.param("Verpflicht-ungsanfrage / Aufforderung", "Verpflichtungsanfrage / Aufforderung", id="55168"), + pytest.param("Bestätigung Verpflicht-ungsanfrage", "Bestätigung Verpflichtungsanfrage", id="55169"), + pytest.param("Ablehnung Verpflicht-ungsanfrage", "Ablehnung Verpflichtungsanfrage", id="55170"), + pytest.param("Anfrage an MSB mit Abhängig-keiten", "Anfrage an MSB mit Abhängigkeiten", id="55172"), + pytest.param("Änderung der Lokations-bündelstruktur", "Änderung der Lokationsbündelstruktur", id="55173"), + pytest.param( + "Antwort auf Änderung der Lokations-bündelstruktur", + "Antwort auf Änderung der Lokationsbündelstruktur", + id="55174", + ), + pytest.param("Änderung der Marktlokations-struktur", "Änderung der Marktlokationsstruktur", id="55175"), + pytest.param( + "Antwort auf Änderung der Marktlokations-struktur", + "Antwort auf Änderung der Marktlokationsstruktur", + id="55176", + ), + pytest.param("Anfrage der Lokations-bündelstruktur", "Anfrage der Lokationsbündelstruktur", id="55177"), + pytest.param( + "Antwort auf Anfrage der Lokations-bündelstruktur", + "Antwort auf Anfrage der Lokationsbündelstruktur", + id="55178", + ), + pytest.param("Anfrage der Markt-lokations-struktur", "Anfrage der Marktlokationsstruktur", id="55180"), + pytest.param( + "Antwort auf Anfrage der Markt-lokations-struktur", + "Antwort auf Anfrage der Marktlokationsstruktur", + id="55181", + ), + pytest.param( + "Ablehnung der Anfrage der Markt-lokations-struktur", + "Ablehnung der Anfrage der Marktlokationsstruktur", + id="55182", + ), + pytest.param("Stammdaten-synchron-isation vom NB", "Stammdatensynchronisation vom NB", id="55185"), + pytest.param("Stammdaten-synchron-isation vom LF", "Stammdatensynchronisation vom LF", id="55186"), + pytest.param("Stammdaten-synchron-isation vom ÜNB", "Stammdatensynchronisation vom ÜNB", id="55187"), + pytest.param( + "Beendigung der Aggregat-ionsverant-wortung vom NB", + "Beendigung der Aggregationsverantwortung vom NB", + id="55188", + ), + pytest.param( + "Beendigung der Aggregat-ionsverant-wortung vom LF", + "Beendigung der Aggregationsverantwortung vom LF", + id="55189", + ), + pytest.param( + "Beendigung der Aggregat-ionsverant-wortung vom ÜNB", + "Beendigung der Aggregationsverantwortung vom ÜNB", + id="55190", + ), + pytest.param("Antwort auf die Geschäftsdaten-anfrage", "Antwort auf die Geschäftsdatenanfrage", id="55194"), + pytest.param("Bilanzierungs-gebiets-clearing-liste", "Bilanzierungsgebietsclearingliste", id="55195"), + pytest.param( + "Antwort auf Bilanzierungs-gebiets-clearing-liste", + "Antwort auf Bilanzierungsgebietsclearingliste", + id="55196", + ), + pytest.param("Aktivierung ZP LF-AASZR", "Aktivierung ZP LF-AASZR", id="55199"), + pytest.param("Deaktivierung ZP LF-AASZR", "Deaktivierung ZP LF-AASZR", id="55200"), + pytest.param("LF-AACL", "LF-AACL", id="55201"), + pytest.param("Korrekturliste LF-AACL", "Korrekturliste LF-AACL", id="55202"), + pytest.param("Antwort auf die Geschäftsdaten-anfrage", "Antwort auf die Geschäftsdatenanfrage", id="55215"), + pytest.param("Abr.-Daten NNA", "Abr.-Daten NNA", id="55218"), + pytest.param("Rückmeldung/Anfrage Abr.-Daten NNA", "Rückmeldung/Anfrage Abr.-Daten NNA", id="55220"), + pytest.param("Änderung Blindabr.-Daten der NeLo", "Änderung Blindabr.-Daten der NeLo", id="55225"), + pytest.param( + "Rückmeldung/Anfrage Blindabr.-Daten der NeLo", "Rückmeldung/Anfrage Blindabr.-Daten der NeLo", id="55227" + ), + pytest.param("Änderung Blindabr.-Daten der NeLo", "Änderung Blindabr.-Daten der NeLo", id="55230"), + pytest.param( + "Rückmeldung/Anfrage Blindabr.-Daten der NeLo", "Rückmeldung/Anfrage Blindabr.-Daten der NeLo", id="55232" + ), + pytest.param( + "Änderung vom MSB für MSB-Abrechnungsdaten des MSB an der Marktlokation", + "Änderung vom MSB für MSB-Abrechnungsdaten des MSB an der Marktlokation", + id="55557a", + ), + pytest.param("Änderung MSB-Abr.-Daten der MaLo", "Änderung MSB-Abr.-Daten der MaLo", id="55557b"), + pytest.param( + "Anfrage zur MSB-Abrechnungsdaten vom MSB an der Marktlokation", + "Anfrage zur MSB-Abrechnungsdaten vom MSB an der Marktlokation", + id="55559a", + ), + pytest.param( + "Rückmeldung/Anfrage MSB-Abr.-Daten der MaLo", "Rückmeldung/Anfrage MSB-Abr.-Daten der MaLo", id="55559b" + ), + pytest.param("Abr.-Daten BK-Abr. verb. MaLo", "Abr.-Daten BK-Abr. verb. MaLo", id="55613"), + pytest.param( + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. verb. MaLo", + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. verb. MaLo", + id="55614", + ), + pytest.param("Stammdaten BK-Treue", "Stammdaten BK-Treue", id="55670"), + pytest.param("Rückmeldung auf Stammdaten BK-Treue", "Rückmeldung auf Stammdaten BK-Treue", id="55671"), + pytest.param("Abr.-Daten BK-Abr. erz. Malo", "Abr.-Daten BK-Abr. erz. Malo", id="55672"), + pytest.param( + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. erz. Malo", + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. erz. Malo", + id="55673", + ), + pytest.param("Abr.-Daten BK-Abr. erz. Malo", "Abr.-Daten BK-Abr. erz. Malo", id="55674"), + pytest.param( + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. erz. Malo", + "Rückmeldung/Anfrage Abr.-Daten BK-Abr. erz. Malo", + id="55675", + ), + pytest.param("Änderung Paket-ID der Malo", "Änderung Paket-ID der Malo", id="55691"), + pytest.param("Rückmeldung/Anfrage Paket-ID der Malo", "Rückmeldung/Anfrage Paket-ID der Malo", id="55692"), + pytest.param(None, None, id="None"), + pytest.param("", "", id="empty string"), + ], +) +def test_sanitization_hyphens(argument: Optional[str], expected: Optional[str]) -> None: + actual = remove_unnecessary_hyphens(argument) + assert actual == expected