From 0d1048c6f2f53ce9aaf4421cd06bb28d34c40625 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Mon, 10 Nov 2025 16:44:59 +0100 Subject: [PATCH 01/43] Model new `BO Region` --- .pre-commit-config.yaml | 4 +- requirements.txt | 2 +- src/bo4e/bo/region.py | 22 ++++--- src/bo4e/com/regionskriterium.py | 45 -------------- src/bo4e/com/regionsoperation.py | 59 +++++++++++++++++++ ...arithmetische_operation.py => operator.py} | 4 +- ...onskriteriumtyp.py => regionskriterium.py} | 4 +- 7 files changed, 81 insertions(+), 59 deletions(-) delete mode 100644 src/bo4e/com/regionskriterium.py create mode 100644 src/bo4e/com/regionsoperation.py rename src/bo4e/enum/{arithmetische_operation.py => operator.py} (73%) rename src/bo4e/enum/{regionskriteriumtyp.py => regionskriterium.py} (97%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9738b8ba4..1daeb9ec8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,12 +7,12 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/psf/black - rev: 24.4.2 # Replace by any tag/version: https://github.com/psf/black/tags + rev: 25.1.0 # Replace by any tag/version: https://github.com/psf/black/tags hooks: - id: black language_version: python3 # Should be a command that runs python3.6+ - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 6.0.1 hooks: - id: isort name: isort (python) diff --git a/requirements.txt b/requirements.txt index 10d5dbd41..99ecab9af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile requirements.in +# pip-compile '.\requirements.in' # annotated-types==0.7.0 # via pydantic diff --git a/src/bo4e/bo/region.py b/src/bo4e/bo/region.py index 085d2fda9..2c91d2302 100644 --- a/src/bo4e/bo/region.py +++ b/src/bo4e/bo/region.py @@ -11,7 +11,7 @@ from .geschaeftsobjekt import Geschaeftsobjekt if TYPE_CHECKING: - from ..com.regionskriterium import Regionskriterium + from ..com.regionsoperation import Regionsoperation # pylint: disable=too-few-public-methods @@ -21,7 +21,13 @@ @postprocess_docstring class Region(Geschaeftsobjekt): """ - Modellierung einer Region als Menge von Kriterien, die eine Region beschreiben + Modellierung einer Region als Liste von Regionsoperationen. + + Die Reihenfolge der Regionsoperationen ist relevant, + wird aber nicht zwingend durch die Sortierung innerhalb der Liste definiert. Die Sortierung der Regionsoperationen + wird durch das Feld `prioritaet` im COM `Regionsoperation` explizit festgelegt, um technischen Problemen bei + spezifischen Umsetzungen vorzubeugen und Klarheit zu schaffen. + Bei einer Implementierung sollte darauf geachtet werden, dass sich "prioritaeten" nicht doppeln können. .. raw:: html @@ -35,9 +41,11 @@ class Region(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.REGION], Field(alias="_typ")] = BoTyp.REGION bezeichnung: Optional[str] = None """Bezeichnung der Region""" + beschreibung: Optional[str] = None + """Beschreibung der Region""" - positiv_liste: Optional[list["Regionskriterium"]] = None - """Positivliste der Kriterien zur Definition der Region""" - - negativ_liste: Optional[list["Regionskriterium"]] = None - """Negativliste der Kriterien zur Definition der Region""" + regionsoperationen: Optional[list[Regionsoperation]] = None + """ + Eine (unsortierte) Liste von Regionsoperationen. + Die Sortierung wird durch das Feld `prioritaet` im COM `Regionsoperation` festgelegt. + """ diff --git a/src/bo4e/com/regionskriterium.py b/src/bo4e/com/regionskriterium.py deleted file mode 100644 index 16281d728..000000000 --- a/src/bo4e/com/regionskriterium.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Contains Regionskriterium class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.gueltigkeitstyp import Gueltigkeitstyp - from ..enum.regionskriteriumtyp import Regionskriteriumtyp - - -# pylint: disable=too-few-public-methods - - -@postprocess_docstring -class Regionskriterium(COM): - """ - Komponente zur Abbildung eines Regionskriteriums - - .. raw:: html - - - - .. HINT:: - `Regionskriterium JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONSKRITERIUM], Field(alias="_typ")] = ComTyp.REGIONSKRITERIUM - - gueltigkeitstyp: Optional["Gueltigkeitstyp"] = None - """Hier wird festgelegt, ob es sich um ein einschließendes oder ausschließendes Kriterium handelt.""" - regionskriteriumtyp: Optional["Regionskriteriumtyp"] = None - """Hier wird das Kriterium selbst angegeben, z.B. Bundesland.""" - wert: Optional[str] = None - """ - Der Wert, den das Kriterium annehmen kann, z.B. NRW. - Im Falle des Regionskriteriumstyp BUNDESWEIT spielt dieser Wert keine Rolle. - """ diff --git a/src/bo4e/com/regionsoperation.py b/src/bo4e/com/regionsoperation.py new file mode 100644 index 000000000..ea7f8a3d5 --- /dev/null +++ b/src/bo4e/com/regionsoperation.py @@ -0,0 +1,59 @@ +""" +Contains Regionskriterium class +""" + +from decimal import Decimal +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..enum.operator import Operator + from ..enum.regionskriterium import Regionskriterium + + +# pylint: disable=too-few-public-methods + + +@postprocess_docstring +class Regionsoperation(COM): + """ + Komponente zur Abbildung einer Regionsoperation. + + In Kombination mit anderen Regionsoperationen kann eine Region definiert werden. Eine Regionsoperation ermöglicht + die Definition einer Region in eingeschränkter Form. Durch den Operator können mehrere "einfache" Regionsoperationen + miteinander kombiniert werden, um eine komplexere Region zu definieren. + + .. raw:: html + + + + .. HINT:: + `Regionsoperation JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.REGIONSKRITERIUM], Field(alias="_typ")] = ComTyp.REGIONSKRITERIUM + + regionsoperator: Optional[Operator] = None + prioritaet: Optional[int] = None + """ + Priorität dieser Regionsoperation. Theoretisch sind Listen in JSON sortiert, jedoch ist eine solche Sortierung + eventuell implementierungsbedingt fehleranfällig. Daher nutzen wir dieses Feld. angefangen bei 1 (höchste Priorität) und aufsteigend + """ + bezeichnung: Optional[str] = None + """(auch IDs und PLZ möglich)""" + bezeichnung2: Optional[str] = None + """(TODO: bessere Benamung! geht vor allem um Postort: PLZ & Ort als Schnittmenge)""" + wert_von: Optional[str] = None + """(inklusiv)""" + wert_bis: Optional[str] = None + """(inklusiv)""" + radius_in_km: Optional[Decimal] = None + """(inklusiv)""" + regionskriterium: Optional[Regionskriterium] = None + """(ehemals Regionskriteriumtyp)]""" diff --git a/src/bo4e/enum/arithmetische_operation.py b/src/bo4e/enum/operator.py similarity index 73% rename from src/bo4e/enum/arithmetische_operation.py rename to src/bo4e/enum/operator.py index 08512d178..938e6d67c 100644 --- a/src/bo4e/enum/arithmetische_operation.py +++ b/src/bo4e/enum/operator.py @@ -2,9 +2,9 @@ from bo4e.enum.strenum import StrEnum -class ArithmetischeOperation(StrEnum): +class Operator(StrEnum): """ - Mit dieser Aufzählung können arithmetische Operationen festgelegt werden. + Mit dieser Aufzählung können Operationen festgelegt werden. """ ADDITION = "ADDITION" diff --git a/src/bo4e/enum/regionskriteriumtyp.py b/src/bo4e/enum/regionskriterium.py similarity index 97% rename from src/bo4e/enum/regionskriteriumtyp.py rename to src/bo4e/enum/regionskriterium.py index 6fc0af17f..d6fae6ac2 100644 --- a/src/bo4e/enum/regionskriteriumtyp.py +++ b/src/bo4e/enum/regionskriterium.py @@ -2,7 +2,7 @@ from bo4e.enum.strenum import StrEnum -class Regionskriteriumtyp(StrEnum): +class Regionskriterium(StrEnum): """ Klassifizierung der Kriterien für eine regionale Eingrenzung. """ @@ -67,7 +67,7 @@ class Regionskriteriumtyp(StrEnum): """Einwohnerzahl Gemeinde""" EINWOHNERZAHL_ORT = "EINWOHNERZAHL_ORT" """Einwohnerzahl Ort""" - KM_UMKREIS = "KM_UMKREIS" + PLZ_KM_UMKREIS = "PLZ_KM_UMKREIS" """km Umkreis""" BUNDESWEIT = "BUNDESWEIT" """Bundesweite Betrachtung""" From dfca26172acf01eb3d7d10ed0ada9eb8bc9bacb6 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Mon, 10 Nov 2025 16:50:30 +0100 Subject: [PATCH 02/43] Rename ComTyp --- src/bo4e/com/regionsoperation.py | 2 +- src/bo4e/enum/comtyp.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bo4e/com/regionsoperation.py b/src/bo4e/com/regionsoperation.py index ea7f8a3d5..1122059ac 100644 --- a/src/bo4e/com/regionsoperation.py +++ b/src/bo4e/com/regionsoperation.py @@ -37,7 +37,7 @@ class Regionsoperation(COM): """ - typ: Annotated[Literal[ComTyp.REGIONSKRITERIUM], Field(alias="_typ")] = ComTyp.REGIONSKRITERIUM + typ: Annotated[Literal[ComTyp.REGIONSOPERATION], Field(alias="_typ")] = ComTyp.REGIONSOPERATION regionsoperator: Optional[Operator] = None prioritaet: Optional[int] = None diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index afca3294d..8cac48828 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -49,7 +49,7 @@ class ComTyp(StrEnum): REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL" REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG" REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" - REGIONSKRITERIUM = "REGIONSKRITERIUM" + REGIONSOPERATION = "REGIONSOPERATION" SIGMOIDPARAMETER = "SIGMOIDPARAMETER" STANDORTEIGENSCHAFTENGAS = "STANDORTEIGENSCHAFTENGAS" STANDORTEIGENSCHAFTENSTROM = "STANDORTEIGENSCHAFTENSTROM" From c39961af7367241be012fa87e720d177355ed870 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Mon, 10 Nov 2025 16:57:44 +0100 Subject: [PATCH 03/43] Fix type hints --- src/bo4e/bo/region.py | 2 +- src/bo4e/com/regionsoperation.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bo4e/bo/region.py b/src/bo4e/bo/region.py index 2c91d2302..e4f75bfa0 100644 --- a/src/bo4e/bo/region.py +++ b/src/bo4e/bo/region.py @@ -44,7 +44,7 @@ class Region(Geschaeftsobjekt): beschreibung: Optional[str] = None """Beschreibung der Region""" - regionsoperationen: Optional[list[Regionsoperation]] = None + regionsoperationen: Optional[list["Regionsoperation"]] = None """ Eine (unsortierte) Liste von Regionsoperationen. Die Sortierung wird durch das Feld `prioritaet` im COM `Regionsoperation` festgelegt. diff --git a/src/bo4e/com/regionsoperation.py b/src/bo4e/com/regionsoperation.py index 1122059ac..bfb3b3c5d 100644 --- a/src/bo4e/com/regionsoperation.py +++ b/src/bo4e/com/regionsoperation.py @@ -55,5 +55,5 @@ class Regionsoperation(COM): """(inklusiv)""" radius_in_km: Optional[Decimal] = None """(inklusiv)""" - regionskriterium: Optional[Regionskriterium] = None + regionskriterium: Optional["Regionskriterium"] = None """(ehemals Regionskriteriumtyp)]""" From 06e8a8e122a5e088d6bcf77e0f12bf1ea5ff66ea Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Mon, 10 Nov 2025 16:58:03 +0100 Subject: [PATCH 04/43] Model new `COM Regionszeitscheibe` --- src/bo4e/com/regionszeitscheibe.py | 43 ++++++++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 44 insertions(+) create mode 100644 src/bo4e/com/regionszeitscheibe.py diff --git a/src/bo4e/com/regionszeitscheibe.py b/src/bo4e/com/regionszeitscheibe.py new file mode 100644 index 000000000..e2a16289a --- /dev/null +++ b/src/bo4e/com/regionszeitscheibe.py @@ -0,0 +1,43 @@ +""" +Contains Regionszeitscheibe class +""" + +from decimal import Decimal +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..bo.region import Region + from .zeitraum import Zeitraum + + +# pylint: disable=too-few-public-methods + + +@postprocess_docstring +class Regionszeitscheibe(COM): + """ + Komponente zur Abbildung einer Region mit einer Zeitscheibe. + + .. raw:: html + + + + .. HINT:: + `Regionszeitscheibe JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.REGIONSZEITSCHEIBE], Field(alias="_typ")] = ComTyp.REGIONSZEITSCHEIBE + + region: Optional["Region"] = None + """Die Region wird durch das Feld `zeitscheibengueltigkeit ` mit einer Zeitscheibe versehen.""" + zeitscheibengueltigkeit: Optional["Zeitraum"] = None + """ + Versieht die Region mit einer Zeitscheibe. Der Start- und Endzeitpunkt sollte durch das Objekt ermittelbar sein. + """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 8cac48828..1b477b15c 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -50,6 +50,7 @@ class ComTyp(StrEnum): REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG" REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" REGIONSOPERATION = "REGIONSOPERATION" + REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" SIGMOIDPARAMETER = "SIGMOIDPARAMETER" STANDORTEIGENSCHAFTENGAS = "STANDORTEIGENSCHAFTENGAS" STANDORTEIGENSCHAFTENSTROM = "STANDORTEIGENSCHAFTENSTROM" From eb3947511cce85ce4e55f224e4b35e9a295b3482 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 12 Nov 2025 16:59:17 +0100 Subject: [PATCH 05/43] Add new `BO Zaehlzeitdefinition` --- src/bo4e/bo/zaehlzeitdefinition.py | 49 ++++++++++++++++++++++++++++++ src/bo4e/com/umschaltzeit.py | 37 ++++++++++++++++++++++ src/bo4e/enum/botyp.py | 1 + src/bo4e/enum/comtyp.py | 1 + src/bo4e/enum/wiederholungstyp.py | 21 +++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 src/bo4e/bo/zaehlzeitdefinition.py create mode 100644 src/bo4e/com/umschaltzeit.py create mode 100644 src/bo4e/enum/wiederholungstyp.py diff --git a/src/bo4e/bo/zaehlzeitdefinition.py b/src/bo4e/bo/zaehlzeitdefinition.py new file mode 100644 index 000000000..224f9975c --- /dev/null +++ b/src/bo4e/bo/zaehlzeitdefinition.py @@ -0,0 +1,49 @@ +""" +Contains Zaehlzeitdefinition class +""" + +# pylint: disable=unused-argument +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.botyp import BoTyp +from ..utils import postprocess_docstring +from .geschaeftsobjekt import Geschaeftsobjekt + +if TYPE_CHECKING: + from ..com.umschaltzeit import Umschaltzeit + from ..enum.wiederholungstyp import Wiederholungstyp + +# pylint: disable=too-many-instance-attributes, too-few-public-methods + + +@postprocess_docstring +class Zaehlzeitdefinition(Geschaeftsobjekt): + """ + Beinhaltet Informationen zu welchen Zeiten welche Register zählen. + + .. raw:: html + + + + .. HINT:: + `Zaehlzeitdefinition JSON Schema `_ + + """ + + typ: Annotated[Literal[BoTyp.ZAEHLZEITDEFINITION], Field(alias="_typ")] = BoTyp.ZAEHLZEITDEFINITION + + wiederholend: Optional["Wiederholungstyp"] = None + """Dieses Feld gibt an, an welchen Tagen das Schaltschema gilt, das durch die Umschaltzeiten definiert ist.""" + umschaltzeiten: Optional[list["Umschaltzeit"]] = None + """ + Die einzelnen Umschaltzeiten in dieser Liste definieren, zu welchen Uhrzeiten welches Register zählt. + + Die Liste füllt stets einen ganzen Tag vollständig und überlappungsfrei aus. Die jeweilige Umschaltzeit in jedem + Objekt der Liste ergibt (wenn der Größe nach sortiert) ein entsprechendes Schema, wobei die untere Grenze (inklusiv) + als 00:00 Uhr und die obere Grenze (exklusiv) als 24:00 Uhr definiert ist. + + Anmerkung: Die Umschaltzeiten sollten sich natürlich niemals doppeln. + """ diff --git a/src/bo4e/com/umschaltzeit.py b/src/bo4e/com/umschaltzeit.py new file mode 100644 index 000000000..7f4dbf9cb --- /dev/null +++ b/src/bo4e/com/umschaltzeit.py @@ -0,0 +1,37 @@ +""" +Contains Umschaltzeit class +""" + +from datetime import time + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + + +@postprocess_docstring +class Umschaltzeit(COM): + """ + Modelliert eine Umschaltzeit, wann auf ein bestimmtes Register geschaltet werden soll. + + .. raw:: html + + + + .. HINT:: + `Umschaltzeit JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.UMSCHALTZEIT], Field(alias="_typ")] = ComTyp.UMSCHALTZEIT + + umschaltzeit: Optional[time] = None + """Definiert den Zeitpunkt ab dem auf das Register geschaltet wird, das im Feld `registercode` spezifiziert ist.""" + registercode: Optional[str] = None + """Ein Code, der ein Register spezifiziert. Typischerweise eine 3-stellige Zeichenkette.""" diff --git a/src/bo4e/enum/botyp.py b/src/bo4e/enum/botyp.py index 846f1bd5d..26891a44b 100644 --- a/src/bo4e/enum/botyp.py +++ b/src/bo4e/enum/botyp.py @@ -50,5 +50,6 @@ class BoTyp(StrEnum): TARIFPREISBLATT = "TARIFPREISBLATT" VERTRAG = "VERTRAG" ZAEHLER = "ZAEHLER" + ZAEHLZEITDEFINITION = "ZAEHLZEITDEFINITION" ZEITREIHE = "ZEITREIHE" LOKATIONSZUORDNUNG = "LOKATIONSZUORDNUNG" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index c2b6a87d4..0ff66f232 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -63,6 +63,7 @@ class ComTyp(StrEnum): TARIFPREISPOSITION = "TARIFPREISPOSITION" TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT" TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" + UMSCHALTZEIT = "UMSCHALTZEIT" UNTERSCHRIFT = "UNTERSCHRIFT" VERBRAUCH = "VERBRAUCH" VERTRAGSKONDITIONEN = "VERTRAGSKONDITIONEN" diff --git a/src/bo4e/enum/wiederholungstyp.py b/src/bo4e/enum/wiederholungstyp.py new file mode 100644 index 000000000..257c25336 --- /dev/null +++ b/src/bo4e/enum/wiederholungstyp.py @@ -0,0 +1,21 @@ +# pylint: disable=missing-module-docstring +from bo4e.enum.strenum import StrEnum + + +class Wiederholungstyp(StrEnum): + """ + Gibt an zu welchen Tagen etwas wiederholt werden soll. + """ + + TAEGLICH = "TAEGLICH" + WERKTAGS = "WERKTAGS" + WOCHENENDE = "WOCHENENDE" + FEIERTAGS = "FEIERTAGS" + + MONTAGS = "MONTAGS" + DIENSTAGS = "DIENSTAGS" + MITTWOCHS = "MITTWOCHS" + DONNERTAGS = "DONNERTAGS" + FREITAGS = "FREITAGS" + SAMSTAGS = "SAMSTAGS" + SONNTAGS = "SONNTAGS" From 6663a3c0323295f2de6b021d97c01bec552bf7e2 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Fri, 14 Nov 2025 20:47:54 +0100 Subject: [PATCH 06/43] Add `ENUM Preisreferenz` --- src/bo4e/enum/preisreferenz.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/bo4e/enum/preisreferenz.py diff --git a/src/bo4e/enum/preisreferenz.py b/src/bo4e/enum/preisreferenz.py new file mode 100644 index 000000000..fa0660d44 --- /dev/null +++ b/src/bo4e/enum/preisreferenz.py @@ -0,0 +1,14 @@ +# pylint: disable=missing-module-docstring +from bo4e.enum.strenum import StrEnum + + +class Preisreferenz(StrEnum): + """ + Referenz worauf sich eine Preisposition bezieht. + """ + + ENERGIEMENGE = "ENERGIEMENGE" + LEISTUNG = "LEISTUNG" + ZEITRAUM = "ZEITRAUM" + ANZAHL = "ANZAHL" + PAUSCHAL = "PAUSCHAL" From 065061ee8098bd30cab5ffaf556aafb7dd7e15c4 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Fri, 14 Nov 2025 20:32:18 +0100 Subject: [PATCH 07/43] Add `COM EinheitsPreisposition` --- src/bo4e/com/einheitspreisposition.py | 47 +++++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 48 insertions(+) create mode 100644 src/bo4e/com/einheitspreisposition.py diff --git a/src/bo4e/com/einheitspreisposition.py b/src/bo4e/com/einheitspreisposition.py new file mode 100644 index 000000000..230f0ea18 --- /dev/null +++ b/src/bo4e/com/einheitspreisposition.py @@ -0,0 +1,47 @@ +""" +Contains EinheitsPreisposition class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..enum.preisreferenz import Preisreferenz + from .preis import Preis + + +@postprocess_docstring +class EinheitsPreisposition(COM): + """ + Die Einheits-Preisposition modelliert Preispositionen ohne Variabilität + (bis auf die übergeordnete Variabilität durch eine Zeitscheibe und einer Region). + + Dies kann z.B. ein Arbeitspreis sein. Der Bezug wird dabei durch die Preisreferenz angegeben. + + .. raw:: html + + + + .. HINT:: + `EinheitsPreisposition JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.EINHEITSPREISPOSITION], Field(alias="_typ")] = ComTyp.EINHEITSPREISPOSITION + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisposition.""" + preisreferenz: Optional["Preisreferenz"] = None + """ + Die Referenz worauf sich der Preis bezieht. + Die explizite Einheit wird durch das Feld `bezugswert` im `COM Preis` angegeben. + """ + preis: Optional["Preis"] = None + """Der Preis für diese Position.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 0ff66f232..f8b7cc697 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -23,6 +23,7 @@ class ComTyp(StrEnum): AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" BETRAG = "BETRAG" DIENSTLEISTUNG = "DIENSTLEISTUNG" + EINHEITSPREISPOSITION = "EINHEITSPREISPOSITION" ENERGIEHERKUNFT = "ENERGIEHERKUNFT" ENERGIEMIX = "ENERGIEMIX" FREMDKOSTENBLOCK = "FREMDKOSTENBLOCK" From 1afd0305b91c2d4a4feb69af12e415606cfa8997 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Fri, 14 Nov 2025 20:41:25 +0100 Subject: [PATCH 08/43] Add `COM ZeitvariablePreisposition` --- src/bo4e/com/zeitvariablepreisposition.py | 46 +++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 47 insertions(+) create mode 100644 src/bo4e/com/zeitvariablepreisposition.py diff --git a/src/bo4e/com/zeitvariablepreisposition.py b/src/bo4e/com/zeitvariablepreisposition.py new file mode 100644 index 000000000..b824428a3 --- /dev/null +++ b/src/bo4e/com/zeitvariablepreisposition.py @@ -0,0 +1,46 @@ +""" +Contains ZeitvariablePreisposition class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..bo.zaehlzeitdefinition import Zaehlzeitdefinition + from ..enum.preisreferenz import Preisreferenz + from .preis import Preis + + +@postprocess_docstring +class ZeitvariablePreisposition(COM): + """ + Modelliert eine zeitvariable Preisposition. + + .. raw:: html + + + + .. HINT:: + `ZeitvariablePreisposition JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.ZEITVARIABLEPREISPOSITION], Field(alias="_typ")] = ComTyp.ZEITVARIABLEPREISPOSITION + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisposition.""" + preisreferenz: Optional["Preisreferenz"] = None + """ + Die Referenz worauf sich der Preis bezieht. + Die explizite Einheit wird durch das Feld `bezugswert` im `COM Preis` angegeben. + """ + preis: Optional["Preis"] = None + """Der Preis für diese Position.""" + zaehlzeitdefinition: Optional["Zaehlzeitdefinition"] = None diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index f8b7cc697..eb758319e 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -74,4 +74,5 @@ class ComTyp(StrEnum): ZAEHLZEITREGISTER = "ZAEHLZEITREGISTER" ZEITRAUM = "ZEITRAUM" ZEITREIHENWERT = "ZEITREIHENWERT" + ZEITVARIABLEPREISPOSITION = "ZEITVARIABLEPREISPOSITION" ZUSTAENDIGKEIT = "ZUSTAENDIGKEIT" From 27f6c026317446e5ad7b4bf9e85c401b960288ac Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Fri, 14 Nov 2025 20:50:56 +0100 Subject: [PATCH 09/43] Add `COM LastvariablePreisposition` --- src/bo4e/com/lastvariablepreisposition.py | 55 +++++++++++++++++++++++ src/bo4e/com/preisstaffel.py | 25 ++++++++--- src/bo4e/enum/comtyp.py | 1 + 3 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/bo4e/com/lastvariablepreisposition.py diff --git a/src/bo4e/com/lastvariablepreisposition.py b/src/bo4e/com/lastvariablepreisposition.py new file mode 100644 index 000000000..cd1e20c24 --- /dev/null +++ b/src/bo4e/com/lastvariablepreisposition.py @@ -0,0 +1,55 @@ +""" +Contains LastvariablePreisposition class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..enum.mengeneinheit import Mengeneinheit + from ..enum.preisreferenz import Preisreferenz + from ..enum.tarifkalkulationsmethode import Tarifkalkulationsmethode + from ..enum.waehrungseinheit import Waehrungseinheit + from .preisstaffel import Preisstaffel + + +@postprocess_docstring +class LastvariablePreisposition(COM): + """ + Modelliert eine lastvariable Preisposition. + + .. raw:: html + + + + .. HINT:: + `LastvariablePreisposition JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.LASTVARIABLEPREISPOSITION], Field(alias="_typ")] = ComTyp.LASTVARIABLEPREISPOSITION + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisposition.""" + preisreferenz: Optional["Preisreferenz"] = None + """ + Die Referenz worauf sich der Preis bezieht. + Die explizite Einheit wird durch das Feld `preis_bezugseinheit` angegeben. + """ + preis_waehrungseinheit: Optional["Waehrungseinheit"] = None + """Währungseinheit für die Preise in allen Preisstaffeln, z.B. Euro oder Ct.""" + preis_bezugseinheit: Optional["Mengeneinheit"] = None + """Angabe, für welche Bezugsgröße die Preise in den Preisstaffeln gelten. Z.B. kWh.""" + staffelgrenzeneinheit: Optional["Mengeneinheit"] = None + """Die Einheit, in denen die Staffelgrenzen in den Preisstaffeln angegeben sind.""" + tarifkalkulationsmethode: Optional["Tarifkalkulationsmethode"] = None + """Das Modell, das der Preisbildung zugrunde liegt""" + preisstaffeln: Optional[list["Preisstaffel"]] = None + """Preisstaffeln, die zu dieser Preisposition gehören""" diff --git a/src/bo4e/com/preisstaffel.py b/src/bo4e/com/preisstaffel.py index 0a14fa53b..c8e4a1baa 100644 --- a/src/bo4e/com/preisstaffel.py +++ b/src/bo4e/com/preisstaffel.py @@ -34,15 +34,26 @@ class Preisstaffel(COM): typ: Annotated[Literal[ComTyp.PREISSTAFFEL], Field(alias="_typ")] = ComTyp.PREISSTAFFEL - einheitspreis: Optional[Decimal] = None - """Preis pro abgerechneter Mengeneinheit""" + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisstaffel.""" + preis: Optional[Decimal] = None + """Preis pro abgerechneter Mengeneinheit. Die Mengeneinheit wird durch das übergeordnete Objekt angegeben.""" staffelgrenze_von: Optional[Decimal] = None - """Inklusiver unterer Wert, ab dem die Staffel gilt""" + """ + Inklusiver unterer Wert, ab dem die Staffel gilt (inklusiv). + Grenzen werden bspw. wie folgt angegeben: `0 - 1000, 1001 - 2000, etc.` + Werte zwischen den Grenzen (z.B. `1000,6`) rutschen in die obere Zone / Staffel. + """ staffelgrenze_bis: Optional[Decimal] = None - """Exklusiver oberer Wert, bis zu dem die Staffel gilt""" - + """ + Exklusiver oberer Wert, bis zu dem die Staffel gilt (inklusiv). + Grenzen werden bspw. wie folgt angegeben: `0 - 1000, 1001 - 2000, etc.` + Werte zwischen den Grenzen (z.B. `1000,6`) rutschen in die obere Zone / Staffel. + """ sigmoidparameter: Optional["Sigmoidparameter"] = None """Parameter zur Berechnung des Preises anhand der Jahresmenge und weiterer netzbezogener Parameter""" - artikel_id: Optional[str] = None - """Standardisierte vom BDEW herausgegebene Liste, welche im Strommarkt die BDEW-Artikelnummer ablöst""" + """ + Standardisierte vom BDEW herausgegebene Liste, welche im Strommarkt die BDEW-Artikelnummer ablöst. + TODO: Kann das Feld weg? + """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index eb758319e..20e5566f9 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -37,6 +37,7 @@ class ComTyp(StrEnum): KOSTENPOSITION = "KOSTENPOSITION" KRITERIUMWERT = "KRITERIUMWERT" LASTPROFIL = "LASTPROFIL" + LASTVARIABLEPREISPOSITION = "LASTVARIABLEPREISPOSITION" MARKTGEBIETINFO = "MARKTGEBIETINFO" MENGE = "MENGE" MESSWERT = "MESSWERT" From ba8a44094b9fb2f238cd40c934e0dfdba3c450dc Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 18 Nov 2025 11:18:32 +0100 Subject: [PATCH 10/43] Add `COM RelativePreisposition` --- src/bo4e/com/relativepreisposition.py | 49 +++++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 50 insertions(+) create mode 100644 src/bo4e/com/relativepreisposition.py diff --git a/src/bo4e/com/relativepreisposition.py b/src/bo4e/com/relativepreisposition.py new file mode 100644 index 000000000..ab1189b5c --- /dev/null +++ b/src/bo4e/com/relativepreisposition.py @@ -0,0 +1,49 @@ +""" +Contains RelativePreisposition class +""" + +from decimal import Decimal + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + + +@postprocess_docstring +class RelativePreisposition(COM): + """ + Modelliert eine relative Preisposition. + + .. raw:: html + + + + .. HINT:: + `RelativePreisposition JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.RELATIVEPREISPOSITION], Field(alias="_typ")] = ComTyp.RELATIVEPREISPOSITION + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisposition.""" + id_referenz: Optional[str] = None + """ + Referenziert auf eine andere Preisposition. + Die Referenz bezieht sich auf das technische Feld `_id`, da es sich hier um eine technische Lösung handelt + und der Wert selbst keine fachliche Bedeutung hat. + Das `_id` Feld der unterschiedlichen Preispositionen muss innerhalb einer `Tarifpreiszeitscheibe` + entsprechend unique sein. + """ + wert: Optional[Decimal] = None + """ + Der Modifikator in Prozent, der auf den Preis der referenzierten Preisposition angewendet wird. + Der Wert wird multiplikativ angewendet. D.h. wenn bspw. ein Rabatt von 20% angewendet werden soll, muss der Wert + `0,8` betragen. + """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 20e5566f9..8ddbf5b19 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -54,6 +54,7 @@ class ComTyp(StrEnum): REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" REGIONSOPERATION = "REGIONSOPERATION" REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" + RELATIVEPREISPOSITION = "RELATIVEPREISPOSITION" SIGMOIDPARAMETER = "SIGMOIDPARAMETER" STANDORTEIGENSCHAFTENGAS = "STANDORTEIGENSCHAFTENGAS" STANDORTEIGENSCHAFTENSTROM = "STANDORTEIGENSCHAFTENSTROM" From bc57d3565cbe11a00fbccb7af6c925677a7123d1 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 18 Nov 2025 17:03:48 +0100 Subject: [PATCH 11/43] Add `COM Tarifpreiszeitscheibe` --- src/bo4e/com/tarifpreiszeitscheibe.py | 64 +++++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 65 insertions(+) create mode 100644 src/bo4e/com/tarifpreiszeitscheibe.py diff --git a/src/bo4e/com/tarifpreiszeitscheibe.py b/src/bo4e/com/tarifpreiszeitscheibe.py new file mode 100644 index 000000000..31c79264f --- /dev/null +++ b/src/bo4e/com/tarifpreiszeitscheibe.py @@ -0,0 +1,64 @@ +""" +Contains Tarifpreiszeitscheibe class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from .einheitspreisposition import EinheitsPreisposition + from .lastvariablepreisposition import LastvariablePreisposition + from .relativepreisposition import RelativePreisposition + from .zeitraum import Zeitraum + from .zeitvariablepreisposition import ZeitvariablePreisposition + + +@postprocess_docstring +class Tarifpreiszeitscheibe(COM): + """ + Mit dieser Komponente kann ein aus verschiedenen Preispositionen zusammengesetzter Tarifpreis zeitaufgelöst + dargestellt werden. + + .. raw:: html + + + + .. HINT:: + `Tarifpreiszeitscheibe JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.TARIFPREISZEITSCHEIBE], Field(alias="_typ")] = ComTyp.TARIFPREISZEITSCHEIBE + + zeitscheibengueltigkeit: Optional["Zeitraum"] = None + """Gibt an für welchen Zeitraum dieser zusammengesetzte Tarifpreis gültig ist.""" + einheits_preispositionen: Optional[list["EinheitsPreisposition"]] = None + """Eine Liste von Einheits-Preispositionen.""" + zeitvariable_preispositionen: Optional[list["ZeitvariablePreisposition"]] = None + """ + Eine Liste von zeitvariablen Preispositionen. + Dies können z.B. Preispositionen mit Zählzeitdefinitionen sein, um ein klassisches HT/NT Modell abzubilden. + """ + lastvariable_preispositionen: Optional[list["LastvariablePreisposition"]] = None + """ + Eine Liste von lastvariablen Preispositionen. + Diese Preispositionen sind vorgesehen, um bspw. ein Staffel- oder Zonenmodell abzubilden. + """ + relative_preispositionen: Optional[list["RelativePreisposition"]] = None + """ + Eine Liste von relativen Preispositionen. + Diese Preispositionen modellieren prozentuale Modifikationen auf bestehende Preispositionen. + + Dazu wird über ein Feld in `RelativePreisposition` auf die `_id` einer anderen Preispositionen verwiesen. + Die ID hat hierbei kein vorgegebenes Format und hat auch keine fachliche Bedeutung. Es handelt sich hierbei + um eine rein technische Lösung, um einen Querverweis zu modellieren. + """ + dynamischer_tarif_quelle: Optional[str] = None + """Gibt die Bezugsquelle für den dynamischen Tarif an. TODO: Brauchen wir das hier überhaupt noch???""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 8ddbf5b19..dfe730352 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -66,6 +66,7 @@ class ComTyp(StrEnum): TARIFPREISPOSITION = "TARIFPREISPOSITION" TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT" TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" + TARIFPREISZEITSCHEIBE = "TARIFPREISZEITSCHEIBE" UMSCHALTZEIT = "UMSCHALTZEIT" UNTERSCHRIFT = "UNTERSCHRIFT" VERBRAUCH = "VERBRAUCH" From e523f3d22c676918917adc555ec1f9adba0f941d Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 18 Nov 2025 17:15:13 +0100 Subject: [PATCH 12/43] Add `COM Regionspreis` --- src/bo4e/com/regionspreis.py | 47 ++++++++++++++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 48 insertions(+) create mode 100644 src/bo4e/com/regionspreis.py diff --git a/src/bo4e/com/regionspreis.py b/src/bo4e/com/regionspreis.py new file mode 100644 index 000000000..e7febe710 --- /dev/null +++ b/src/bo4e/com/regionspreis.py @@ -0,0 +1,47 @@ +""" +Contains Regionspreis class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from .regionszeitscheibe import Regionszeitscheibe + from .tarifpreiszeitscheibe import Tarifpreiszeitscheibe + + +@postprocess_docstring +class Regionspreis(COM): + """ + Mit dieser Komponente wird ein aus mehreren Positionen zusammengesetzter Preis regionsaufgelöst dargestellt. + Zu jedem Zeitpunkt darf es nur eine gültige Region und einen gültigen Preis geben. + + .. raw:: html + + + + .. HINT:: + `Regionspreis JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.REGIONSPREIS], Field(alias="_typ")] = ComTyp.REGIONSPREIS + + regionszeitscheiben: Optional[list["Regionszeitscheibe"]] = None + """ + Eine Liste von mit Zeitscheiben versehenen Regionen. + Die Zeitscheiben sollten sich nicht überschneiden. + """ + tarifpreiszeitscheiben: Optional[list["Tarifpreiszeitscheibe"]] = None + """ + Eine Liste von mit Zeitscheiben versehenen Tarifpreisen. + Die Zeitscheiben sollten sich nicht überschneiden. + Die Tarifpreise sind aus mehreren Tarifpreispositionen zusammengesetzt. + """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index dfe730352..6a2a7e836 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -53,6 +53,7 @@ class ComTyp(StrEnum): REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG" REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" REGIONSOPERATION = "REGIONSOPERATION" + REGIONSPREIS = "REGIONSPREIS" REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" RELATIVEPREISPOSITION = "RELATIVEPREISPOSITION" SIGMOIDPARAMETER = "SIGMOIDPARAMETER" From fb3224ada156ce3bbe13450a17a9c1aae0ee4974 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 25 Nov 2025 15:39:02 +0100 Subject: [PATCH 13/43] Add `COM DynamischePreisposition` --- src/bo4e/com/dynamischepreisposition.py | 49 +++++++++++++++++++++++++ src/bo4e/enum/comtyp.py | 1 + 2 files changed, 50 insertions(+) create mode 100644 src/bo4e/com/dynamischepreisposition.py diff --git a/src/bo4e/com/dynamischepreisposition.py b/src/bo4e/com/dynamischepreisposition.py new file mode 100644 index 000000000..a567ead5f --- /dev/null +++ b/src/bo4e/com/dynamischepreisposition.py @@ -0,0 +1,49 @@ +""" +Contains DynamischePreisposition class +""" + +# pylint: disable=too-few-public-methods +# pylint: disable=no-name-in-module +from typing import TYPE_CHECKING, Annotated, Literal, Optional + +from pydantic import Field + +from ..enum.comtyp import ComTyp +from ..utils import postprocess_docstring +from .com import COM + +if TYPE_CHECKING: + from ..enum.preisreferenz import Preisreferenz + + +@postprocess_docstring +class DynamischePreisposition(COM): + """ + Modelliert eine dynamische Preisposition. + + Diese Preisposition enthält lediglich eine Referenz zum Börsenindex, auf den sie sich bezieht. Das Format dieser + Referenz ist vom Standard nicht spezifiziert. + + .. raw:: html + + + + .. HINT:: + `DynamischePreisposition JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.DYNAMISCHEPREISPOSITION], Field(alias="_typ")] = ComTyp.DYNAMISCHEPREISPOSITION + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für die Preisposition.""" + preisreferenz: Optional["Preisreferenz"] = None + """ + Die Referenz worauf sich der Preis bezieht. + Die explizite Einheit wird durch das Feld `preis_bezugseinheit` angegeben. + """ + index: Optional[str] = None + """ + Eine Referenz zum Börsenindex dieser dynamischen Preisposition. + Das genaue Format ist vom Standard nicht spezifiziert. + """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 6a2a7e836..afec64eec 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -23,6 +23,7 @@ class ComTyp(StrEnum): AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" BETRAG = "BETRAG" DIENSTLEISTUNG = "DIENSTLEISTUNG" + DYNAMISCHEPREISPOSITION = "DYNAMISCHEPREISPOSITION" EINHEITSPREISPOSITION = "EINHEITSPREISPOSITION" ENERGIEHERKUNFT = "ENERGIEHERKUNFT" ENERGIEMIX = "ENERGIEMIX" From a1b0b154d9cd79be0b2261e6f25cc4d9721706fc Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 25 Nov 2025 16:38:55 +0100 Subject: [PATCH 14/43] Rework `BO Tarif` --- src/bo4e/bo/tarif.py | 95 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index 1e514d80e..bf7f07c58 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -12,11 +12,19 @@ from .tarifinfo import Tarifinfo if TYPE_CHECKING: - from ..com.aufabschlagregional import AufAbschlagRegional + from ..bo.marktteilnehmer import Marktteilnehmer + from ..com.dynamischepreisposition import DynamischePreisposition + from ..com.energiemix import Energiemix from ..com.preisgarantie import Preisgarantie + from ..com.regionspreis import Regionspreis from ..com.tarifberechnungsparameter import Tarifberechnungsparameter - from ..com.tarifeinschraenkung import Tarifeinschraenkung - from ..com.tarifpreispositionproort import TarifpreispositionProOrt + from ..com.vertragskonditionen import Vertragskonditionen + from ..com.zeitraum import Zeitraum + from ..enum.kundentyp import Kundentyp + from ..enum.registeranzahl import Registeranzahl + from ..enum.sparte import Sparte + from ..enum.tarifmerkmal import Tarifmerkmal + from ..enum.tariftyp import Tariftyp # pylint: disable=too-few-public-methods @@ -26,7 +34,24 @@ @postprocess_docstring class Tarif(Tarifinfo): """ - Abbildung eines Tarifs mit regionaler Zuordnung von Preisen und Auf- und Abschlägen + Abbildung eines Tarifs. + + Der Tarifpreis kann regionsaufgelöst und unter Angabe von Zeitscheiben angegeben werden. So kann bspw. derselbe + Tarif je nach Region andere Preise aufweisen. Es können auch Tarifpreise abgebildet werden, die sich ab einem + bestimmten Zeitpunkt auf andere Regionen ausweiten, da die Regionen ebenfalls mit Zeitscheiben versehen sind. + + Ein Tarifpreis setzt sich dabei aus mehreren Preispositionen zusammen. So können z.B. auch mit + `COM RelativePreisposition` prozentuale Auf- und Abschläge auf andere Preispositionen definiert werden. + Alle Preispositionen hängen unter `COM Tarifpreiszeitscheibe` mit einer Ausnahme. + + Möchten Sie einen dynamischen Tarif modellieren, so gibt es das `COM DynamischePreisposition`. Da diese + Preisposition weder orts- noch zeitabhängig ist, hängt diese direkt unter dem `BO Tarif`. Eine zeitabhängige + Änderung einer dynamischen Tarifpreisposition ist unsinnig, da es sich (unserer Ansicht nach) dann um einen + völlig neuen Tarif handelt. Davon unabhängig können (und müssen) natürlich weiterhin zusätzlich alle anderen + Preispositionen orts- und zeitabhängig angegeben werden. + + > Hinweis: Das Vorhandensein einer `COM DynamischePreisposition` dient gleichzeitig auch als "Flag" dafür, ob + > es sich bei diesem Tarif um einen dynamischen handelt. .. raw:: html @@ -37,21 +62,53 @@ class Tarif(Tarifinfo): """ - typ: Annotated[Literal[BoTyp.TARIF], Field(alias="_typ")] = BoTyp.TARIF # type: ignore[assignment] - preisstand: Optional[pydantic.AwareDatetime] = None - """Gibt an, wann der Preis zuletzt angepasst wurde""" - berechnungsparameter: Optional["Tarifberechnungsparameter"] = None - """Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen""" - tarifpreise: Optional[list["TarifpreispositionProOrt"]] = None - """Die festgelegten Preise mit regionaler Eingrenzung z.B. für Arbeitspreis, Grundpreis etc.""" + typ: Annotated[Literal[BoTyp.TARIF], Field(alias="_typ")] = BoTyp.TARIF - tarif_auf_abschlaege: Optional[list["AufAbschlagRegional"]] = None - """Auf- und Abschläge auf die Preise oder Kosten mit regionaler Eingrenzung""" - # todo: fix inconsistency: RegionalerAufAbschlag vs. AufAbschlagRegional - # https://github.com/Hochfrequenz/BO4E-python/issues/345 + regionspreise: Optional[list["Regionspreis"]] = None + """ + Enthält alle regions- und zeitaufgelösten Tarifpreise. + Ausschließlich die `COM DynamischePreisposition` wird unter einem anderen Feld namens `dynamischePreisposition` + angegeben. + """ + dynamische_preisposition: Optional["DynamischePreisposition"] = None + """ + Dieses Feld muss genau dann gesetzt werden, wenn es sich bei diesem Tarif um einen dynamischen Tarif handelt. + Die dynamische Preisposition enthält im wesentlichen eine Referenz zum entsprechenden Börsenindex. + """ + + bezeichnung: Optional[str] = None + """Eine (beliebige) Bezeichnung für den Tarif.""" + beschreibung: Optional[str] = None + """Eine (beliebige) Beschreibung für den Tarif.""" + anbieter: Optional["Marktteilnehmer"] = None + """Der Marktteilnehmer, der diesen Tarif anbietet, angeboten hat oder anbieten wird.""" - preisgarantie: Optional["Preisgarantie"] = None + zeitraum_vermarktung: Optional["Zeitraum"] = None + """Der Zeitraum, in dem der Tarif beim Anbieter vertraglich abschließbar ist.""" + zeitraum_belieferbarkeit: Optional["Zeitraum"] = None + """Der Zeitraum, in dem eine Belieferung (für diesen Tarif) möglich ist.""" + vertragskonditionen: Optional["Vertragskonditionen"] + """Vertragskonditionen für diesen Tarif.""" + vertriebskanal: Optional[str] = None + """TODO: Create a COM for this.""" + website: Optional[str] + """Internetseite, auf der der Tarif veröffentlicht ist.""" + energiemix: Optional[list["Energiemix"]] + """TODO: Write meaningful doc-string""" + kundentypen: Optional[list["Kundentyp"]] + """Eine Liste an Kundentypen, für die dieser Tarif vorgesehen ist.""" + tariftyp: Optional["Tariftyp"] + """Der Tariftyp. Bsp.: Grundversorgung, Ersatzversorgung, etc.""" + tarifmerkmale: Optional[list["Tarifmerkmal"]] + """Eine Liste von Produktmerkmalen im Zusammenhang mit diesem Tarif.""" + sparte: Optional["Sparte"] + """Strom / Gas""" + registeranzahl: Optional["Registeranzahl"] + """ + Hinweis zu den Registern bzw. Zählwerken. + Bspw. benötigt ein HT-/NT-Tarif auch eine entsprechende Registeranzahl. + """ + preisgarantie: Optional["Preisgarantie"] """Preisgarantie für diesen Tarif""" - # todo: fix inconsistency with regionaltarif https://github.com/Hochfrequenz/BO4E-python/issues/346 - tarifeinschraenkung: Optional["Tarifeinschraenkung"] = None - """Die Bedingungen und Einschränkungen unter denen ein Tarif angewendet werden kann""" + berechnungsparameter: Optional["Tarifberechnungsparameter"] + """Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen""" From 332c7f0f3a318ee6ef863734a2c89f67ae92243c Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:37:01 +0100 Subject: [PATCH 15/43] Fix init --- src/bo4e/__init__.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 910aaac07..c68880630 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -85,7 +85,6 @@ "RegionalePreisstaffel", "RegionalerAufAbschlag", "RegionaleTarifpreisposition", - "Regionskriterium", "Sigmoidparameter", "StandorteigenschaftenGas", "StandorteigenschaftenStrom", @@ -111,7 +110,6 @@ "Aggregationsverantwortung", "Angebotsstatus", "Anrede", - "ArithmetischeOperation", "AufAbschlagstyp", "AufAbschlagsziel", "Ausschreibungsportal", @@ -156,6 +154,7 @@ "NetznutzungRechnungstyp", "Oekolabel", "Oekozertifikat", + "Operator", "Organisationstyp", "Preisgarantietyp", "Preismodell", @@ -168,7 +167,7 @@ "Rechnungslegung", "Rechnungsstatus", "Rechnungstyp", - "Regionskriteriumtyp", + "Regionskriterium", "Registeranzahl", "Rollencodetyp", "Sparte", @@ -288,7 +287,6 @@ from .com.regionalepreisstaffel import RegionalePreisstaffel from .com.regionaleraufabschlag import RegionalerAufAbschlag from .com.regionaletarifpreisposition import RegionaleTarifpreisposition -from .com.regionskriterium import Regionskriterium from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom @@ -317,7 +315,6 @@ from .enum.aggregationsverantwortung import Aggregationsverantwortung from .enum.angebotsstatus import Angebotsstatus from .enum.anrede import Anrede -from .enum.arithmetische_operation import ArithmetischeOperation from .enum.aufabschlagstyp import AufAbschlagstyp from .enum.aufabschlagsziel import AufAbschlagsziel from .enum.ausschreibungsportal import Ausschreibungsportal @@ -363,6 +360,7 @@ from .enum.netznutzungrechnungstyp import NetznutzungRechnungstyp from .enum.oekolabel import Oekolabel from .enum.oekozertifikat import Oekozertifikat +from .enum.operator import Operator from .enum.organisationstyp import Organisationstyp from .enum.preisgarantietyp import Preisgarantietyp from .enum.preismodell import Preismodell @@ -375,7 +373,7 @@ from .enum.rechnungslegung import Rechnungslegung from .enum.rechnungsstatus import Rechnungsstatus from .enum.rechnungstyp import Rechnungstyp -from .enum.regionskriteriumtyp import Regionskriteriumtyp +from .enum.regionskriterium import Regionskriterium from .enum.registeranzahl import Registeranzahl from .enum.rollencodetyp import Rollencodetyp from .enum.sparte import Sparte From 44d66d4c131ca2103ac1fed3021faa9f35cf99ea Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:38:39 +0100 Subject: [PATCH 16/43] Remove `COM TarifpreispositionProOrt` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/tarifpreispositionproort.py | 45 ------------------------ src/bo4e/enum/comtyp.py | 1 - 3 files changed, 48 deletions(-) delete mode 100644 src/bo4e/com/tarifpreispositionproort.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index c68880630..2e6a80346 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -94,7 +94,6 @@ "Tarifeinschraenkung", "Tarifpreis", "Tarifpreisposition", - "TarifpreispositionProOrt", "TarifpreisstaffelProOrt", "Unterschrift", "Verbrauch", @@ -296,7 +295,6 @@ from .com.tarifeinschraenkung import Tarifeinschraenkung from .com.tarifpreis import Tarifpreis from .com.tarifpreisposition import Tarifpreisposition -from .com.tarifpreispositionproort import TarifpreispositionProOrt from .com.tarifpreisstaffelproort import TarifpreisstaffelProOrt from .com.unterschrift import Unterschrift from .com.verbrauch import Verbrauch diff --git a/src/bo4e/com/tarifpreispositionproort.py b/src/bo4e/com/tarifpreispositionproort.py deleted file mode 100644 index f2a9e0d7c..000000000 --- a/src/bo4e/com/tarifpreispositionproort.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Contains TarifpreispositionProOrt class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - - from .tarifpreisstaffelproort import TarifpreisstaffelProOrt - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class TarifpreispositionProOrt(COM): - """ - Mit dieser Komponente können Tarifpreise verschiedener Typen abgebildet werden - - .. raw:: html - - - - .. HINT:: - `TarifpreispositionProOrt JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.TARIFPREISPOSITIONPROORT], Field(alias="_typ")] = ComTyp.TARIFPREISPOSITIONPROORT - - postleitzahl: Optional[str] = None - """Postleitzahl des Ortes für den der Preis gilt""" - ort: Optional[str] = None - """Ort für den der Preis gilt""" - netznr: Optional[str] = None - """ene't-Netznummer des Netzes in dem der Preis gilt""" - # Hier sind die Staffeln mit ihren Preisenangaben definiert - preisstaffeln: Optional[list["TarifpreisstaffelProOrt"]] = None - # there are no optional attributes diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index afec64eec..8d10cd71c 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -66,7 +66,6 @@ class ComTyp(StrEnum): TARIFEINSCHRAENKUNG = "TARIFEINSCHRAENKUNG" TARIFPREIS = "TARIFPREIS" TARIFPREISPOSITION = "TARIFPREISPOSITION" - TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT" TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" TARIFPREISZEITSCHEIBE = "TARIFPREISZEITSCHEIBE" UMSCHALTZEIT = "UMSCHALTZEIT" From 5d64cae3c65f36752960e505e18c5f7231bcda56 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:40:30 +0100 Subject: [PATCH 17/43] Remove `COM TarifpreisstaffelProOrt` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/tarifpreisstaffelproort.py | 47 ------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 50 deletions(-) delete mode 100644 src/bo4e/com/tarifpreisstaffelproort.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 2e6a80346..1a1e49418 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -94,7 +94,6 @@ "Tarifeinschraenkung", "Tarifpreis", "Tarifpreisposition", - "TarifpreisstaffelProOrt", "Unterschrift", "Verbrauch", "Vertragskonditionen", @@ -295,7 +294,6 @@ from .com.tarifeinschraenkung import Tarifeinschraenkung from .com.tarifpreis import Tarifpreis from .com.tarifpreisposition import Tarifpreisposition -from .com.tarifpreisstaffelproort import TarifpreisstaffelProOrt from .com.unterschrift import Unterschrift from .com.verbrauch import Verbrauch from .com.vertragskonditionen import Vertragskonditionen diff --git a/src/bo4e/com/tarifpreisstaffelproort.py b/src/bo4e/com/tarifpreisstaffelproort.py deleted file mode 100644 index 82c219b00..000000000 --- a/src/bo4e/com/tarifpreisstaffelproort.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -Contains TarifpreisstaffelProOrt class -""" - -from decimal import Decimal -from typing import Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -# pylint: disable=too-few-public-methods - - -@postprocess_docstring -class TarifpreisstaffelProOrt(COM): - """ - Gibt die Staffelgrenzen der jeweiligen Preise an - - .. raw:: html - - - - .. HINT:: - `TarifpreisstaffelProOrt JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.TARIFPREISSTAFFELPROORT], Field(alias="_typ")] = ComTyp.TARIFPREISSTAFFELPROORT - - # todo: decimal doesn't make sense here imo - # https://github.com/Hochfrequenz/BO4E-python/issues/344 - - arbeitspreis: Optional[Decimal] = None - """Der Arbeitspreis in ct/kWh""" - arbeitspreis_n_t: Optional[Decimal] = None - """Der Arbeitspreis für Verbräuche in der Niedertarifzeit in ct/kWh""" - grundpreis: Optional[Decimal] = None - """Der Grundpreis in Euro/Jahr""" - staffelgrenze_von: Optional[Decimal] = None - """Unterer Wert, ab dem die Staffel gilt (inklusive)""" - staffelgrenze_bis: Optional[Decimal] = None - """Oberer Wert, bis zu dem die Staffel gilt (exklusive)""" - - # there are no optional attributes diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 8d10cd71c..9e08113c5 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -66,7 +66,6 @@ class ComTyp(StrEnum): TARIFEINSCHRAENKUNG = "TARIFEINSCHRAENKUNG" TARIFPREIS = "TARIFPREIS" TARIFPREISPOSITION = "TARIFPREISPOSITION" - TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" TARIFPREISZEITSCHEIBE = "TARIFPREISZEITSCHEIBE" UMSCHALTZEIT = "UMSCHALTZEIT" UNTERSCHRIFT = "UNTERSCHRIFT" From 4cdf8408aa56e8baa1c5a37a57b136616f97c944 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:42:47 +0100 Subject: [PATCH 18/43] Remove `BO Regionaltarif` --- src/bo4e/__init__.py | 2 -- src/bo4e/bo/regionaltarif.py | 51 ------------------------------------ src/bo4e/enum/botyp.py | 1 - 3 files changed, 54 deletions(-) delete mode 100644 src/bo4e/bo/regionaltarif.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 1a1e49418..73424ebe4 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -35,7 +35,6 @@ "PreisblattNetznutzung", "Rechnung", "Region", - "Regionaltarif", "Standorteigenschaften", "SteuerbareRessource", "Tarif", @@ -232,7 +231,6 @@ from .bo.preisblattnetznutzung import PreisblattNetznutzung from .bo.rechnung import Rechnung from .bo.region import Region -from .bo.regionaltarif import Regionaltarif from .bo.standorteigenschaften import Standorteigenschaften from .bo.steuerbareressource import SteuerbareRessource from .bo.tarif import Tarif diff --git a/src/bo4e/bo/regionaltarif.py b/src/bo4e/bo/regionaltarif.py deleted file mode 100644 index 8b3e2e8ed..000000000 --- a/src/bo4e/bo/regionaltarif.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Contains Regionaltarif class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -import pydantic -from pydantic import Field - -from ..enum.botyp import BoTyp -from .tarifinfo import Tarifinfo - -if TYPE_CHECKING: - from ..com.regionalepreisgarantie import RegionalePreisgarantie - from ..com.regionaleraufabschlag import RegionalerAufAbschlag - from ..com.regionaletarifpreisposition import RegionaleTarifpreisposition - from ..com.tarifberechnungsparameter import Tarifberechnungsparameter - from ..com.tarifeinschraenkung import Tarifeinschraenkung - - -# pylint: disable=too-few-public-methods, empty-docstring -# pylint: disable=no-name-in-module - - -class Regionaltarif(Tarifinfo): - """ - Abbildung eines Tarifs mit regionaler Zuordnung von Preisen und Auf- und Abschlägen. - - .. raw:: html - - - - .. HINT:: - `Regionaltarif JSON Schema `_ - - """ - - typ: Annotated[Literal[BoTyp.REGIONALTARIF], Field(alias="_typ")] = BoTyp.REGIONALTARIF # type: ignore[assignment] - preisstand: Optional[pydantic.AwareDatetime] = None - """Gibt an, wann der Preis zuletzt angepasst wurde""" - berechnungsparameter: Optional["Tarifberechnungsparameter"] = None - """Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen""" - tarifpreise: Optional[list["RegionaleTarifpreisposition"]] = None - """Die festgelegten Preise mit regionaler Eingrenzung, z.B. für Arbeitspreis, Grundpreis etc.""" - - tarif_auf_abschlaege: Optional[list["RegionalerAufAbschlag"]] = None - """Auf- und Abschläge auf die Preise oder Kosten mit regionaler Eingrenzung""" - preisgarantien: Optional[list["RegionalePreisgarantie"]] = None - """Festlegung von Garantien für bestimmte Preisanteile""" - tarifeinschraenkung: Optional["Tarifeinschraenkung"] = None - """Die Bedingungen und Einschränkungen unter denen ein Tarif angewendet werden kann""" diff --git a/src/bo4e/enum/botyp.py b/src/bo4e/enum/botyp.py index 26891a44b..796274b3f 100644 --- a/src/bo4e/enum/botyp.py +++ b/src/bo4e/enum/botyp.py @@ -42,7 +42,6 @@ class BoTyp(StrEnum): PREISBLATTUMLAGEN = "PREISBLATTUMLAGEN" RECHNUNG = "RECHNUNG" REGION = "REGION" - REGIONALTARIF = "REGIONALTARIF" STANDORTEIGENSCHAFTEN = "STANDORTEIGENSCHAFTEN" TARIF = "TARIF" TARIFINFO = "TARIFINFO" From 92b69c57e119282691d35bb47ad4eea4fd73396d Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:44:28 +0100 Subject: [PATCH 19/43] Remove `COM RegionalePreisgarantie` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/regionalepreisgarantie.py | 38 -------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 41 deletions(-) delete mode 100644 src/bo4e/com/regionalepreisgarantie.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 73424ebe4..01ca30c72 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -80,7 +80,6 @@ "Preisstaffel", "Rechnungsposition", "RegionaleGueltigkeit", - "RegionalePreisgarantie", "RegionalePreisstaffel", "RegionalerAufAbschlag", "RegionaleTarifpreisposition", @@ -279,7 +278,6 @@ from .com.preisstaffel import Preisstaffel from .com.rechnungsposition import Rechnungsposition from .com.regionalegueltigkeit import RegionaleGueltigkeit -from .com.regionalepreisgarantie import RegionalePreisgarantie from .com.regionalepreisstaffel import RegionalePreisstaffel from .com.regionaleraufabschlag import RegionalerAufAbschlag from .com.regionaletarifpreisposition import RegionaleTarifpreisposition diff --git a/src/bo4e/com/regionalepreisgarantie.py b/src/bo4e/com/regionalepreisgarantie.py deleted file mode 100644 index a34e15138..000000000 --- a/src/bo4e/com/regionalepreisgarantie.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Contains RegionalePreisgarantie class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .preisgarantie import Preisgarantie - -if TYPE_CHECKING: - from .regionalegueltigkeit import RegionaleGueltigkeit - -# pylint: disable=too-few-public-methods - - -@postprocess_docstring -class RegionalePreisgarantie(Preisgarantie): - """ - Abbildung einer Preisgarantie mit regionaler Abgrenzung - - .. raw:: html - - - - .. HINT:: - `RegionalePreisgarantie JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONALEPREISGARANTIE], Field(alias="_typ")] = ( - ComTyp.REGIONALEPREISGARANTIE # type:ignore[assignment] - ) - - regionale_gueltigkeit: Optional["RegionaleGueltigkeit"] = None - """Regionale Eingrenzung der Preisgarantie.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 9e08113c5..f1f053d4a 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -49,7 +49,6 @@ class ComTyp(StrEnum): PREISSTAFFEL = "PREISSTAFFEL" RECHNUNGSPOSITION = "RECHNUNGSPOSITION" REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT" - REGIONALEPREISGARANTIE = "REGIONALEPREISGARANTIE" REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL" REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG" REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" From 4312edb5c0a615a3719220797259c5c2c40a607a Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:50:52 +0100 Subject: [PATCH 20/43] Remove `COM RegionalerAufAbschlag` --- src/bo4e/__init__.py | 2 - src/bo4e/com/regionaleraufabschlag.py | 104 -------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 107 deletions(-) delete mode 100644 src/bo4e/com/regionaleraufabschlag.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 01ca30c72..382179455 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -81,7 +81,6 @@ "Rechnungsposition", "RegionaleGueltigkeit", "RegionalePreisstaffel", - "RegionalerAufAbschlag", "RegionaleTarifpreisposition", "Sigmoidparameter", "StandorteigenschaftenGas", @@ -279,7 +278,6 @@ from .com.rechnungsposition import Rechnungsposition from .com.regionalegueltigkeit import RegionaleGueltigkeit from .com.regionalepreisstaffel import RegionalePreisstaffel -from .com.regionaleraufabschlag import RegionalerAufAbschlag from .com.regionaletarifpreisposition import RegionaleTarifpreisposition from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas diff --git a/src/bo4e/com/regionaleraufabschlag.py b/src/bo4e/com/regionaleraufabschlag.py deleted file mode 100644 index e715669ef..000000000 --- a/src/bo4e/com/regionaleraufabschlag.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -Contains RegionalerAufAbschlag class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp - -# pylint: disable=R0801 -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.aufabschlagstyp import AufAbschlagstyp - from ..enum.aufabschlagsziel import AufAbschlagsziel - from ..enum.waehrungseinheit import Waehrungseinheit - from .energiemix import Energiemix - from .preisgarantie import Preisgarantie - from .regionalepreisstaffel import RegionalePreisstaffel - from .tarifeinschraenkung import Tarifeinschraenkung - from .vertragskonditionen import Vertragskonditionen - from .zeitraum import Zeitraum - -# pylint: disable=too-few-public-methods, too-many-instance-attributes -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class RegionalerAufAbschlag(COM): - """ - Mit dieser Komponente können Auf- und Abschläge verschiedener Typen im Zusammenhang mit regionalen Gültigkeiten - abgebildet werden. - Hier sind auch die Auswirkungen auf verschiedene Tarifparameter modelliert, die sich durch die Auswahl eines Auf- - oder Abschlags ergeben. - - .. raw:: html - - - - .. HINT:: - `RegionalerAufAbschlag JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONALERAUFABSCHLAG], Field(alias="_typ")] = ComTyp.REGIONALERAUFABSCHLAG - - bezeichnung: Optional[str] = None - """Bezeichnung des Auf-/Abschlags""" - - staffeln: Optional[list["RegionalePreisstaffel"]] = None - """Werte für die gestaffelten Auf/Abschläge mit regionaler Eingrenzung""" - - beschreibung: Optional[str] = None - """Beschreibung des Auf-/Abschlags""" - - auf_abschlagstyp: Optional["AufAbschlagstyp"] = None - """Typ des Aufabschlages (z.B. absolut oder prozentual)""" - - auf_abschlagsziel: Optional["AufAbschlagsziel"] = None - """Diesem Preis oder den Kosten ist der Auf/Abschlag zugeordnet. Z.B. Arbeitspreis, Gesamtpreis etc.""" - - einheit: Optional["Waehrungseinheit"] = None - """Gibt an in welcher Währungseinheit der Auf/Abschlag berechnet wird (nur im Falle absoluter Aufschlagstypen).""" - - website: Optional[str] = None - """Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind""" - - zusatzprodukte: Optional[list[str]] = None - """Zusatzprodukte, die nur in Kombination mit diesem AufAbschlag erhältlich sind""" - - voraussetzungen: Optional[list[str]] = None - """Voraussetzungen, die erfüllt sein müssen, damit dieser AufAbschlag zur Anwendung kommen kann""" - - tarifnamensaenderungen: Optional[str] = None - """Durch die Anwendung des Auf/Abschlags kann eine Änderung des Tarifnamens auftreten""" - - gueltigkeitszeitraum: Optional["Zeitraum"] = None - """Zeitraum, in dem der Abschlag zur Anwendung kommen kann""" - - energiemixaenderung: Optional["Energiemix"] = None - """ - Der Energiemix kann sich durch einen AufAbschlag ändern (z.B. zwei Cent Aufschlag für Ökostrom). - Sollte dies der Fall sein, wird hier die neue Zusammensetzung des Energiemix angegeben. - """ - - vertagskonditionsaenderung: Optional["Vertragskonditionen"] = None - """ - Änderungen in den Vertragskonditionen; - Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. - """ - - garantieaenderung: Optional["Preisgarantie"] = None - """ - Änderungen in den Garantievereinbarungen; - Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. - """ - - einschraenkungsaenderung: Optional["Tarifeinschraenkung"] = None - """ - Änderungen in den Einschränkungen zum Tarif; - Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. - """ diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index f1f053d4a..93245a0eb 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -50,7 +50,6 @@ class ComTyp(StrEnum): RECHNUNGSPOSITION = "RECHNUNGSPOSITION" REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT" REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL" - REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG" REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" REGIONSOPERATION = "REGIONSOPERATION" REGIONSPREIS = "REGIONSPREIS" From c1f03bdfacd019f4f1888f8f4f7ec3c123d8db67 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:57:53 +0100 Subject: [PATCH 21/43] Remove `COM RegionaleTarifpreisposition` --- src/bo4e/__init__.py | 2 - src/bo4e/com/regionaletarifpreisposition.py | 51 --------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 54 deletions(-) delete mode 100644 src/bo4e/com/regionaletarifpreisposition.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 382179455..79635540c 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -81,7 +81,6 @@ "Rechnungsposition", "RegionaleGueltigkeit", "RegionalePreisstaffel", - "RegionaleTarifpreisposition", "Sigmoidparameter", "StandorteigenschaftenGas", "StandorteigenschaftenStrom", @@ -278,7 +277,6 @@ from .com.rechnungsposition import Rechnungsposition from .com.regionalegueltigkeit import RegionaleGueltigkeit from .com.regionalepreisstaffel import RegionalePreisstaffel -from .com.regionaletarifpreisposition import RegionaleTarifpreisposition from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom diff --git a/src/bo4e/com/regionaletarifpreisposition.py b/src/bo4e/com/regionaletarifpreisposition.py deleted file mode 100644 index 0b268e98e..000000000 --- a/src/bo4e/com/regionaletarifpreisposition.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Contains RegionaleTarifpreisposition class -""" - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.mengeneinheit import Mengeneinheit - from ..enum.preistyp import Preistyp - from ..enum.waehrungseinheit import Waehrungseinheit - from .regionalepreisstaffel import RegionalePreisstaffel - - -@postprocess_docstring -class RegionaleTarifpreisposition(COM): - """ - Mit dieser Komponente können Tarifpreise verschiedener Typen im Zusammenhang mit regionalen Gültigkeiten abgebildet - werden. - - .. raw:: html - - - - .. HINT:: - `RegionaleTarifpreisposition JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONALETARIFPREISPOSITION], Field(alias="_typ")] = ( - ComTyp.REGIONALETARIFPREISPOSITION - ) - - preistyp: Optional["Preistyp"] = None - """Angabe des Preistypes (z.B. Grundpreis)""" - einheit: Optional["Waehrungseinheit"] = None - """Einheit des Preises (z.B. EURO)""" - bezugseinheit: Optional["Mengeneinheit"] = None - """Größe, auf die sich die Einheit bezieht, beispielsweise kWh, Jahr""" - preisstaffeln: Optional[list["RegionalePreisstaffel"]] = None - """Hier sind die Staffeln mit ihren Preisangaben und regionalen Gültigkeiten definiert""" - - mengeneinheitstaffel: Optional["Mengeneinheit"] = None - """Gibt an, nach welcher Menge die vorgenannte Einschränkung erfolgt (z.B. Jahresstromverbrauch in kWh)""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 93245a0eb..630714c41 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -50,7 +50,6 @@ class ComTyp(StrEnum): RECHNUNGSPOSITION = "RECHNUNGSPOSITION" REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT" REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL" - REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION" REGIONSOPERATION = "REGIONSOPERATION" REGIONSPREIS = "REGIONSPREIS" REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" From 21e21481362ba84e15237ac82d2ff31067ac8643 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 12:58:52 +0100 Subject: [PATCH 22/43] Remove `COM RegionalePreisstaffel` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/regionalepreisstaffel.py | 38 --------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 41 deletions(-) delete mode 100644 src/bo4e/com/regionalepreisstaffel.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 79635540c..cc1c0c160 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -80,7 +80,6 @@ "Preisstaffel", "Rechnungsposition", "RegionaleGueltigkeit", - "RegionalePreisstaffel", "Sigmoidparameter", "StandorteigenschaftenGas", "StandorteigenschaftenStrom", @@ -276,7 +275,6 @@ from .com.preisstaffel import Preisstaffel from .com.rechnungsposition import Rechnungsposition from .com.regionalegueltigkeit import RegionaleGueltigkeit -from .com.regionalepreisstaffel import RegionalePreisstaffel from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom diff --git a/src/bo4e/com/regionalepreisstaffel.py b/src/bo4e/com/regionalepreisstaffel.py deleted file mode 100644 index 24c76054a..000000000 --- a/src/bo4e/com/regionalepreisstaffel.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Contains RegionalePreisstaffel class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .preisstaffel import Preisstaffel - -if TYPE_CHECKING: - from .regionalegueltigkeit import RegionaleGueltigkeit - -# pylint: disable=too-few-public-methods - - -@postprocess_docstring -class RegionalePreisstaffel(Preisstaffel): - """ - Mit dieser Komponente können Staffelpreise abgebildet werden, die sich auf eine Region beziehen. - - .. raw:: html - - - - .. HINT:: - `RegionalePreisstaffel JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONALEPREISSTAFFEL], Field(alias="_typ")] = ( - ComTyp.REGIONALEPREISSTAFFEL # type:ignore[assignment] - ) - - regionale_gueltigkeit: Optional["RegionaleGueltigkeit"] = None - """Regionale Eingrenzung der Preisstaffel""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 630714c41..b4b9bf1ec 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -49,7 +49,6 @@ class ComTyp(StrEnum): PREISSTAFFEL = "PREISSTAFFEL" RECHNUNGSPOSITION = "RECHNUNGSPOSITION" REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT" - REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL" REGIONSOPERATION = "REGIONSOPERATION" REGIONSPREIS = "REGIONSPREIS" REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" From e758d8bc11c3aacd38b86dac2a1b866f9264ef9f Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:00:07 +0100 Subject: [PATCH 23/43] Remove `COM RegionaleGueltigkeit` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/regionalegueltigkeit.py | 40 ---------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 43 deletions(-) delete mode 100644 src/bo4e/com/regionalegueltigkeit.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index cc1c0c160..de0901b12 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -79,7 +79,6 @@ "Preisposition", "Preisstaffel", "Rechnungsposition", - "RegionaleGueltigkeit", "Sigmoidparameter", "StandorteigenschaftenGas", "StandorteigenschaftenStrom", @@ -274,7 +273,6 @@ from .com.preisposition import Preisposition from .com.preisstaffel import Preisstaffel from .com.rechnungsposition import Rechnungsposition -from .com.regionalegueltigkeit import RegionaleGueltigkeit from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom diff --git a/src/bo4e/com/regionalegueltigkeit.py b/src/bo4e/com/regionalegueltigkeit.py deleted file mode 100644 index afaa013a0..000000000 --- a/src/bo4e/com/regionalegueltigkeit.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Contains RegionaleGueltigkeit class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.gueltigkeitstyp import Gueltigkeitstyp - from .kriteriumwert import KriteriumWert - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class RegionaleGueltigkeit(COM): - """ - Mit dieser Komponente können regionale Gültigkeiten, z.B. für Tarife, Zu- und Abschläge und Preise definiert werden. - - .. raw:: html - - - - .. HINT:: - `RegionaleGueltigkeit JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.REGIONALEGUELTIGKEIT], Field(alias="_typ")] = ComTyp.REGIONALEGUELTIGKEIT - - gueltigkeitstyp: Optional["Gueltigkeitstyp"] = None - """Unterscheidung ob Positivliste oder Negativliste übertragen wird""" - kriteriums_werte: Optional[list["KriteriumWert"]] = None - """Hier stehen die Kriterien, die die regionale Gültigkeit festlegen""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index b4b9bf1ec..1026dc505 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -48,7 +48,6 @@ class ComTyp(StrEnum): PREISPOSITION = "PREISPOSITION" PREISSTAFFEL = "PREISSTAFFEL" RECHNUNGSPOSITION = "RECHNUNGSPOSITION" - REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT" REGIONSOPERATION = "REGIONSOPERATION" REGIONSPREIS = "REGIONSPREIS" REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE" From 61d5afb2e15a6b1a2056065cb012bc0f51825b22 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:01:57 +0100 Subject: [PATCH 24/43] Remove `COM KriteriumWert` --- src/bo4e/__init__.py | 2 -- src/bo4e/com/kriteriumwert.py | 37 ----------------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 40 deletions(-) delete mode 100644 src/bo4e/com/kriteriumwert.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index de0901b12..756047cd5 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -68,7 +68,6 @@ "Konzessionsabgabe", "Kostenblock", "Kostenposition", - "KriteriumWert", "Lastprofil", "MarktgebietInfo", "Menge", @@ -262,7 +261,6 @@ from .com.konzessionsabgabe import Konzessionsabgabe from .com.kostenblock import Kostenblock from .com.kostenposition import Kostenposition -from .com.kriteriumwert import KriteriumWert from .com.lastprofil import Lastprofil from .com.marktgebietinfo import MarktgebietInfo from .com.menge import Menge diff --git a/src/bo4e/com/kriteriumwert.py b/src/bo4e/com/kriteriumwert.py deleted file mode 100644 index 6aeb03f82..000000000 --- a/src/bo4e/com/kriteriumwert.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Contains KriteriumWert class -""" - -# pylint: disable=too-few-public-methods -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.tarifregionskriterium import Tarifregionskriterium - - -@postprocess_docstring -class KriteriumWert(COM): - """ - Mit dieser Komponente können Kriterien und deren Werte definiert werden - - .. raw:: html - - - - .. HINT:: - `KriteriumWert JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.KRITERIUMWERT], Field(alias="_typ")] = ComTyp.KRITERIUMWERT - - kriterium: Optional["Tarifregionskriterium"] = None - """Hier steht, für welches Kriterium der Wert gilt. Z.B. Postleitzahlen""" - wert: Optional[str] = None - """Ein Wert, passend zum Kriterium. Z.B. eine Postleitzahl.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 1026dc505..5b79b5c81 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -36,7 +36,6 @@ class ComTyp(StrEnum): KONZESSIONSABGABE = "KONZESSIONSABGABE" KOSTENBLOCK = "KOSTENBLOCK" KOSTENPOSITION = "KOSTENPOSITION" - KRITERIUMWERT = "KRITERIUMWERT" LASTPROFIL = "LASTPROFIL" LASTVARIABLEPREISPOSITION = "LASTVARIABLEPREISPOSITION" MARKTGEBIETINFO = "MARKTGEBIETINFO" From 3b242653f635ba2ce4de22985b90decf26536344 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:03:13 +0100 Subject: [PATCH 25/43] Remove `ENUM Tarifregionskriterium` --- src/bo4e/__init__.py | 2 -- src/bo4e/enum/tarifregionskriterium.py | 19 ------------------- 2 files changed, 21 deletions(-) delete mode 100644 src/bo4e/enum/tarifregionskriterium.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 756047cd5..989a310da 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -168,7 +168,6 @@ "StrEnum", "Tarifkalkulationsmethode", "Tarifmerkmal", - "Tarifregionskriterium", "Tariftyp", "Tarifzeit", "TechnischeRessourceNutzung", @@ -365,7 +364,6 @@ from .enum.strenum import StrEnum from .enum.tarifkalkulationsmethode import Tarifkalkulationsmethode from .enum.tarifmerkmal import Tarifmerkmal -from .enum.tarifregionskriterium import Tarifregionskriterium from .enum.tariftyp import Tariftyp from .enum.tarifzeit import Tarifzeit from .enum.technischeressourcenutzung import TechnischeRessourceNutzung diff --git a/src/bo4e/enum/tarifregionskriterium.py b/src/bo4e/enum/tarifregionskriterium.py deleted file mode 100644 index da273b774..000000000 --- a/src/bo4e/enum/tarifregionskriterium.py +++ /dev/null @@ -1,19 +0,0 @@ -# pylint: disable=missing-module-docstring -from bo4e.enum.strenum import StrEnum - - -class Tarifregionskriterium(StrEnum): - """ - Mit diesen Kriterien können regionale Bereiche definiert werden. - """ - - NETZ_NUMMER = "NETZ_NUMMER" - """Netznummer""" - POSTLEITZAHL = "POSTLEITZAHL" - """Postleitzahl""" - ORT = "ORT" - """Ort""" - GRUNDVERSORGER_NUMMER = "GRUNDVERSORGER_NUMMER" - """Nummer des Grundversorgers""" - REGION = "REGION" - """Referenz auf ein BO Region (URL)""" From 6768eb7f2f6df93fa1d4639db25c97eb7809a132 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:04:29 +0100 Subject: [PATCH 26/43] Remove `COM Gueltigkeitstyp` --- src/bo4e/__init__.py | 2 -- src/bo4e/enum/gueltigkeitstyp.py | 15 --------------- 2 files changed, 17 deletions(-) delete mode 100644 src/bo4e/enum/gueltigkeitstyp.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 989a310da..b2bdc735c 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -120,7 +120,6 @@ "Geraeteklasse", "Geraetetyp", "Geschaeftspartnerrolle", - "Gueltigkeitstyp", "Kalkulationsmethode", "Konfigurationsprodukt", "Kontaktart", @@ -317,7 +316,6 @@ from .enum.geraeteklasse import Geraeteklasse from .enum.geraetetyp import Geraetetyp from .enum.geschaeftspartnerrolle import Geschaeftspartnerrolle -from .enum.gueltigkeitstyp import Gueltigkeitstyp from .enum.kalkulationsmethode import Kalkulationsmethode from .enum.kontaktart import Kontaktart from .enum.kostenklasse import Kostenklasse diff --git a/src/bo4e/enum/gueltigkeitstyp.py b/src/bo4e/enum/gueltigkeitstyp.py deleted file mode 100644 index c02685f0a..000000000 --- a/src/bo4e/enum/gueltigkeitstyp.py +++ /dev/null @@ -1,15 +0,0 @@ -# pylint: disable=missing-module-docstring -from bo4e.enum.strenum import StrEnum - - -class Gueltigkeitstyp(StrEnum): - """ - Übersicht der verschiedenen Gültigkeiten zur Umsetzung von Positiv- bzw. Negativlisten. - """ - - NUR_IN = "NUR_IN" - """Ein so eingeschränktes Merkmal gilt nur mit den angebenen Werten""" - NICHT_IN = "NICHT_IN" - """Ein so eingeschränktes Merkmal gilt nicht mit den angebenen Werten""" - NUR_IN_KOMBINATION_MIT = "NUR_IN_KOMBINATION_MIT" - """Die Kriterien mit diesem Gültigkeitstyp werden miteinander kombiniert""" From ed29c7403556ebf071ca498674909a9c02138b50 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:17:53 +0100 Subject: [PATCH 27/43] Remove `COM AufAbschlagRegional` Wurde anscheinend vorher schon nicht mehr genutzt --- src/bo4e/__init__.py | 2 - src/bo4e/com/aufabschlagregional.py | 83 ----------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 86 deletions(-) delete mode 100644 src/bo4e/com/aufabschlagregional.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index b2bdc735c..db75da70b 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -51,7 +51,6 @@ "Angebotsvariante", "AufAbschlag", "AufAbschlagProOrt", - "AufAbschlagRegional", "AufAbschlagstaffelProOrt", "Ausschreibungsdetail", "Ausschreibungslos", @@ -241,7 +240,6 @@ from .com.angebotsvariante import Angebotsvariante from .com.aufabschlag import AufAbschlag from .com.aufabschlagproort import AufAbschlagProOrt -from .com.aufabschlagregional import AufAbschlagRegional from .com.aufabschlagstaffelproort import AufAbschlagstaffelProOrt from .com.ausschreibungsdetail import Ausschreibungsdetail from .com.ausschreibungslos import Ausschreibungslos diff --git a/src/bo4e/com/aufabschlagregional.py b/src/bo4e/com/aufabschlagregional.py deleted file mode 100644 index 70cb3f23a..000000000 --- a/src/bo4e/com/aufabschlagregional.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Contains AufAbschlagRegional -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring - -# pylint: disable=R0801 -from .com import COM - -if TYPE_CHECKING: - from ..enum.aufabschlagstyp import AufAbschlagstyp - from ..enum.aufabschlagsziel import AufAbschlagsziel - from ..enum.waehrungseinheit import Waehrungseinheit - from .aufabschlagproort import AufAbschlagProOrt - from .energiemix import Energiemix - from .preisgarantie import Preisgarantie - from .tarifeinschraenkung import Tarifeinschraenkung - from .vertragskonditionen import Vertragskonditionen - from .zeitraum import Zeitraum - -# pylint: disable=too-few-public-methods, too-many-instance-attributes -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class AufAbschlagRegional(COM): - """ - Mit dieser Komponente können Auf- und Abschläge verschiedener Typen - im Zusammenhang mit regionalen Gültigkeiten abgebildet werden. - Hier sind auch die Auswirkungen auf verschiedene Tarifparameter modelliert, - die sich durch die Auswahl eines Auf- oder Abschlags ergeben. - - .. raw:: html - - - - .. HINT:: - `AufAbschlagRegional JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.AUFABSCHLAGREGIONAL], Field(alias="_typ")] = ComTyp.AUFABSCHLAGREGIONAL - # required attributess - bezeichnung: Optional[str] = None - """Bezeichnung des Auf-/Abschlags""" - betraege: Optional[list["AufAbschlagProOrt"]] = None - """Werte für die gestaffelten Auf/Abschläge mit regionaler Eingrenzung""" - - beschreibung: Optional[str] = None - """Beschreibung zum Auf-/Abschlag""" - #:Typ des Aufabschlages (z.B. absolut oder prozentual) - auf_abschlagstyp: Optional["AufAbschlagstyp"] = None - auf_abschlagsziel: Optional["AufAbschlagsziel"] = None - """Diesem Preis oder den Kosten ist der Auf/Abschlag zugeordnet. Z.B. Arbeitspreis, Gesamtpreis etc.""" - einheit: Optional["Waehrungseinheit"] = None - """Gibt an in welcher Währungseinheit der Auf/Abschlag berechnet wird. Euro oder Ct.""" - website: Optional[str] = None - """Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind""" - zusatzprodukte: Optional[list[str]] = None - """Zusatzprodukte, die nur in Kombination mit diesem AufAbschlag erhältlich sind""" - voraussetzungen: Optional[list[str]] = None - """Voraussetzungen, die erfüllt sein müssen, damit dieser AufAbschlag zur Anwendung kommen kann""" - tarifnamensaenderungen: Optional[str] = None - """Durch die Anwendung des Auf/Abschlags kann eine Änderung des Tarifnamens auftreten.""" - gueltigkeitszeitraum: Optional["Zeitraum"] = None - """Zeitraum, in dem der Abschlag zur Anwendung kommen kann""" - energiemixaenderung: Optional["Energiemix"] = None - """ Der Energiemix kann sich durch einen AufAbschlag ändern (z.B. zwei Cent Aufschlag für Ökostrom: - Sollte dies der Fall sein, wird hier die neue Zusammensetzung des Energiemix angegeben.""" - vertagskonditionsaenderung: Optional["Vertragskonditionen"] = None - """ Änderungen in den Vertragskonditionen. Falls in dieser Komponenten angegeben, - werden die Tarifparameter hiermit überschrieben.""" - garantieaenderung: Optional["Preisgarantie"] = None - """ Änderungen in den Garantievereinbarungen. Falls in dieser Komponenten angegeben, - werden die Tarifparameter hiermit überschrieben.""" - einschraenkungsaenderung: Optional["Tarifeinschraenkung"] = None - """ Änderungen in den Einschränkungen zum Tarif. Falls in dieser Komponenten angegeben, - werden die Tarifparameter hiermit überschrieben.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 5b79b5c81..758b90bb2 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -17,7 +17,6 @@ class ComTyp(StrEnum): ANGEBOTSVARIANTE = "ANGEBOTSVARIANTE" AUFABSCHLAG = "AUFABSCHLAG" AUFABSCHLAGPROORT = "AUFABSCHLAGPROORT" - AUFABSCHLAGREGIONAL = "AUFABSCHLAGREGIONAL" AUFABSCHLAGSTAFFELPROORT = "AUFABSCHLAGSTAFFELPROORT" AUSSCHREIBUNGSDETAIL = "AUSSCHREIBUNGSDETAIL" AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" From 72fc7a14c363af017b97b33c10b95a10f1adb6f6 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:18:59 +0100 Subject: [PATCH 28/43] Remove `COM AufAbschlagProOrt` Wurde anscheinend vorher schon nicht mehr genutzt --- src/bo4e/__init__.py | 2 -- src/bo4e/com/aufabschlagproort.py | 46 ------------------------------- src/bo4e/enum/comtyp.py | 1 - 3 files changed, 49 deletions(-) delete mode 100644 src/bo4e/com/aufabschlagproort.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index db75da70b..382e2adc0 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -50,7 +50,6 @@ "Angebotsteil", "Angebotsvariante", "AufAbschlag", - "AufAbschlagProOrt", "AufAbschlagstaffelProOrt", "Ausschreibungsdetail", "Ausschreibungslos", @@ -239,7 +238,6 @@ from .com.angebotsteil import Angebotsteil from .com.angebotsvariante import Angebotsvariante from .com.aufabschlag import AufAbschlag -from .com.aufabschlagproort import AufAbschlagProOrt from .com.aufabschlagstaffelproort import AufAbschlagstaffelProOrt from .com.ausschreibungsdetail import Ausschreibungsdetail from .com.ausschreibungslos import Ausschreibungslos diff --git a/src/bo4e/com/aufabschlagproort.py b/src/bo4e/com/aufabschlagproort.py deleted file mode 100644 index ae814f294..000000000 --- a/src/bo4e/com/aufabschlagproort.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Contains AufAbschlagProOrt class -""" - -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - - from .aufabschlagstaffelproort import AufAbschlagstaffelProOrt - - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class AufAbschlagProOrt(COM): - """ - Mit dieser Komponente können Auf- und Abschläge verschiedener Typen im Zusammenhang - mit örtlichen Gültigkeiten abgebildet werden. - - .. raw:: html - - - - .. HINT:: - `AufAbschlagProOrt JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.AUFABSCHLAGPROORT], Field(alias="_typ")] = ComTyp.AUFABSCHLAGPROORT - - postleitzahl: Optional[str] = None - """Die Postleitzahl des Ortes für den der Aufschlag gilt.""" - ort: Optional[str] = None - """Der Ort für den der Aufschlag gilt.""" - netznr: Optional[str] = None - """Die ene't-Netznummer des Netzes in dem der Aufschlag gilt.""" - staffeln: Optional[list["AufAbschlagstaffelProOrt"]] = None - """Werte für die gestaffelten Auf/Abschläge mit regionaler Eingrenzung.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 758b90bb2..2a324cc4c 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -16,7 +16,6 @@ class ComTyp(StrEnum): ANGEBOTSTEIL = "ANGEBOTSTEIL" ANGEBOTSVARIANTE = "ANGEBOTSVARIANTE" AUFABSCHLAG = "AUFABSCHLAG" - AUFABSCHLAGPROORT = "AUFABSCHLAGPROORT" AUFABSCHLAGSTAFFELPROORT = "AUFABSCHLAGSTAFFELPROORT" AUSSCHREIBUNGSDETAIL = "AUSSCHREIBUNGSDETAIL" AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" From 4f9b9f21d81436226ec67b85d2464ea3d8655d53 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:19:52 +0100 Subject: [PATCH 29/43] Remove `COM AufAbschlagstaffelProOrt` Wurde anscheinend vorher schon nicht mehr genutzt --- src/bo4e/__init__.py | 2 -- src/bo4e/com/aufabschlagstaffelproort.py | 38 ------------------------ src/bo4e/enum/comtyp.py | 1 - 3 files changed, 41 deletions(-) delete mode 100644 src/bo4e/com/aufabschlagstaffelproort.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 382e2adc0..7e4363700 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -50,7 +50,6 @@ "Angebotsteil", "Angebotsvariante", "AufAbschlag", - "AufAbschlagstaffelProOrt", "Ausschreibungsdetail", "Ausschreibungslos", "Betrag", @@ -238,7 +237,6 @@ from .com.angebotsteil import Angebotsteil from .com.angebotsvariante import Angebotsvariante from .com.aufabschlag import AufAbschlag -from .com.aufabschlagstaffelproort import AufAbschlagstaffelProOrt from .com.ausschreibungsdetail import Ausschreibungsdetail from .com.ausschreibungslos import Ausschreibungslos from .com.betrag import Betrag diff --git a/src/bo4e/com/aufabschlagstaffelproort.py b/src/bo4e/com/aufabschlagstaffelproort.py deleted file mode 100644 index 3793d7554..000000000 --- a/src/bo4e/com/aufabschlagstaffelproort.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Contains AufAbschlagstaffelProOrt class -""" - -from decimal import Decimal -from typing import Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -# pylint: disable=too-few-public-methods - - -@postprocess_docstring -class AufAbschlagstaffelProOrt(COM): - """ - Gibt den Wert eines Auf- oder Abschlags und dessen Staffelgrenzen an - - .. raw:: html - - - - .. HINT:: - `AufAbschlagstaffelProOrt JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.AUFABSCHLAGSTAFFELPROORT], Field(alias="_typ")] = ComTyp.AUFABSCHLAGSTAFFELPROORT - - wert: Optional[Decimal] = None - """Der Wert für den Auf- oder Abschlag.""" - staffelgrenze_von: Optional[Decimal] = None - """Unterer Wert, ab dem die Staffel gilt.""" - staffelgrenze_bis: Optional[Decimal] = None - """Oberer Wert, bis zu dem die Staffel gilt.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 2a324cc4c..d17a22e91 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -16,7 +16,6 @@ class ComTyp(StrEnum): ANGEBOTSTEIL = "ANGEBOTSTEIL" ANGEBOTSVARIANTE = "ANGEBOTSVARIANTE" AUFABSCHLAG = "AUFABSCHLAG" - AUFABSCHLAGSTAFFELPROORT = "AUFABSCHLAGSTAFFELPROORT" AUSSCHREIBUNGSDETAIL = "AUSSCHREIBUNGSDETAIL" AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" BETRAG = "BETRAG" From bb002618b38f53b4ec98ac609e5b9bf5e4872b90 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:26:51 +0100 Subject: [PATCH 30/43] Remove `COM PositionsAufAbschlag` Wurde anscheinend vorher schon nicht mehr genutzt --- src/bo4e/__init__.py | 2 -- src/bo4e/com/positionsaufabschlag.py | 49 ---------------------------- src/bo4e/enum/comtyp.py | 1 - tests/test_positionsaufabschlag.py | 28 ---------------- 4 files changed, 80 deletions(-) delete mode 100644 src/bo4e/com/positionsaufabschlag.py delete mode 100644 tests/test_positionsaufabschlag.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 7e4363700..b3e2e8ae8 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -69,7 +69,6 @@ "MarktgebietInfo", "Menge", "Messwert", - "PositionsAufAbschlag", "Preis", "Preisgarantie", "Preisposition", @@ -257,7 +256,6 @@ from .com.marktgebietinfo import MarktgebietInfo from .com.menge import Menge from .com.messwert import Messwert -from .com.positionsaufabschlag import PositionsAufAbschlag from .com.preis import Preis from .com.preisgarantie import Preisgarantie from .com.preisposition import Preisposition diff --git a/src/bo4e/com/positionsaufabschlag.py b/src/bo4e/com/positionsaufabschlag.py deleted file mode 100644 index 74ff018c1..000000000 --- a/src/bo4e/com/positionsaufabschlag.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -Contains PositionsAufAbschlag -""" - -from decimal import Decimal - -# pylint: disable=too-few-public-methods -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.aufabschlagstyp import AufAbschlagstyp - from ..enum.waehrungseinheit import Waehrungseinheit - - -@postprocess_docstring -class PositionsAufAbschlag(COM): - """ - Differenzierung der zu betrachtenden Produkte anhand der preiserhöhenden (Aufschlag) - bzw. preisvermindernden (Abschlag) Zusatzvereinbarungen, - die individuell zu einem neuen oder bestehenden Liefervertrag abgeschlossen werden können. - Es können mehrere Auf-/Abschläge gleichzeitig ausgewählt werden. - - .. raw:: html - - - - .. HINT:: - `PositionsAufAbschlag JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.POSITIONSAUFABSCHLAG], Field(alias="_typ")] = ComTyp.POSITIONSAUFABSCHLAG - - bezeichnung: Optional[str] = None - """Bezeichnung des Auf-/Abschlags""" - beschreibung: Optional[str] = None - """Beschreibung zum Auf-/Abschlag""" - auf_abschlagstyp: Optional["AufAbschlagstyp"] = None - """Typ des AufAbschlages""" - auf_abschlagswert: Optional[Decimal] = None - """Höhe des Auf-/Abschlages""" - auf_abschlagswaehrung: Optional["Waehrungseinheit"] = None - """Einheit, in der der Auf-/Abschlag angegeben ist (z.B. ct/kWh).""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index d17a22e91..364367deb 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -38,7 +38,6 @@ class ComTyp(StrEnum): MARKTGEBIETINFO = "MARKTGEBIETINFO" MENGE = "MENGE" MESSWERT = "MESSWERT" - POSITIONSAUFABSCHLAG = "POSITIONSAUFABSCHLAG" PREIS = "PREIS" PREISGARANTIE = "PREISGARANTIE" PREISPOSITION = "PREISPOSITION" diff --git a/tests/test_positionsaufabschlag.py b/tests/test_positionsaufabschlag.py deleted file mode 100644 index c00aba6d3..000000000 --- a/tests/test_positionsaufabschlag.py +++ /dev/null @@ -1,28 +0,0 @@ -from decimal import Decimal - -import pytest - -from bo4e import AufAbschlagstyp, PositionsAufAbschlag, Waehrungseinheit -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestPositionsAufAbschlag: - @pytest.mark.parametrize( - "positionsaufabschlag", - [ - pytest.param( - PositionsAufAbschlag( - bezeichnung="foo", - beschreibung="bar", - auf_abschlagstyp=AufAbschlagstyp.ABSOLUT, - auf_abschlagswert=Decimal(4.25), - auf_abschlagswaehrung=Waehrungseinheit.EUR, - ), - ), - ], - ) - def test_serialization_roundtrip(self, positionsaufabschlag: PositionsAufAbschlag) -> None: - """ - Test de-/serialisation of PositionsAufAbschlag. - """ - assert_serialization_roundtrip(positionsaufabschlag) From f76664221a4f8fb18ddbfb593cf1470d7d5c884e Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 13:33:28 +0100 Subject: [PATCH 31/43] Remove tests --- tests/test_aufabschlagproort.py | 28 ----------- tests/test_aufabschlagregional.py | 48 ------------------ tests/test_aufabschlagstaffelproort.py | 28 ----------- tests/test_kriteriumswert.py | 23 --------- tests/test_regionalegueltigkeit.py | 29 ----------- tests/test_regionalepreisgarantie.py | 44 ---------------- tests/test_regionalepreisstaffel.py | 54 -------------------- tests/test_regionaleraufabschlag.py | 48 ------------------ tests/test_regionaletarifpreisposition.py | 53 -------------------- tests/test_regionaltarif.py | 61 ----------------------- tests/test_regionskriterium.py | 24 --------- tests/test_tarifpreispositionproort.py | 26 ---------- tests/test_tarifpreisstaffelproort.py | 29 ----------- 13 files changed, 495 deletions(-) delete mode 100644 tests/test_aufabschlagproort.py delete mode 100644 tests/test_aufabschlagregional.py delete mode 100644 tests/test_aufabschlagstaffelproort.py delete mode 100644 tests/test_kriteriumswert.py delete mode 100644 tests/test_regionalegueltigkeit.py delete mode 100644 tests/test_regionalepreisgarantie.py delete mode 100644 tests/test_regionalepreisstaffel.py delete mode 100644 tests/test_regionaleraufabschlag.py delete mode 100644 tests/test_regionaletarifpreisposition.py delete mode 100644 tests/test_regionaltarif.py delete mode 100644 tests/test_regionskriterium.py delete mode 100644 tests/test_tarifpreispositionproort.py delete mode 100644 tests/test_tarifpreisstaffelproort.py diff --git a/tests/test_aufabschlagproort.py b/tests/test_aufabschlagproort.py deleted file mode 100644 index bc5def60a..000000000 --- a/tests/test_aufabschlagproort.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest - -from bo4e import AufAbschlagProOrt, AufAbschlagstaffelProOrt -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestAufAbschlagProOrt: - @pytest.mark.parametrize( - "aufabschlagproort", - [ - pytest.param( - AufAbschlagProOrt( - postleitzahl="01187", - ort="Dresden", - netznr="2", - staffeln=[AufAbschlagstaffelProOrt()], - ), - ) - ], - ) - def test_serialization_roundtrip( - self, - aufabschlagproort: AufAbschlagProOrt, - ) -> None: - """ - Test de-/serialisation of AufAbschlagProOrt. - """ - assert_serialization_roundtrip(aufabschlagproort) diff --git a/tests/test_aufabschlagregional.py b/tests/test_aufabschlagregional.py deleted file mode 100644 index fec3a5c73..000000000 --- a/tests/test_aufabschlagregional.py +++ /dev/null @@ -1,48 +0,0 @@ -import pytest - -from bo4e import ( - AufAbschlagProOrt, - AufAbschlagRegional, - AufAbschlagstyp, - AufAbschlagsziel, - Energiemix, - Preisgarantie, - Tarifeinschraenkung, - Vertragskonditionen, - Waehrungseinheit, - Zeitraum, -) -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestAufAbschlagRegional: - @pytest.mark.parametrize( - "aufabschlagregional", - [ - pytest.param( - AufAbschlagRegional( - bezeichnung="foo", - betraege=[AufAbschlagProOrt()], - beschreibung="bar", - auf_abschlagstyp=AufAbschlagstyp.RELATIV, - auf_abschlagsziel=AufAbschlagsziel.ARBEITSPREIS_HT, - einheit=Waehrungseinheit.EUR, - website="foo.bar", - zusatzprodukte=["Asterix", "Obelix"], - voraussetzungen=["Petterson", "Findus"], - tarifnamensaenderungen="foobar", - gueltigkeitszeitraum=Zeitraum(), - energiemixaenderung=Energiemix(), - vertagskonditionsaenderung=Vertragskonditionen(), - garantieaenderung=Preisgarantie(), - einschraenkungsaenderung=Tarifeinschraenkung(), - ), - id="all attributes at first level", - ), - ], - ) - def test_serialization_roundtrip(self, aufabschlagregional: AufAbschlagRegional) -> None: - """ - Test de-/serialisation of AufAbschlagRegional with minimal attributes. - """ - assert_serialization_roundtrip(aufabschlagregional) diff --git a/tests/test_aufabschlagstaffelproort.py b/tests/test_aufabschlagstaffelproort.py deleted file mode 100644 index 099da290d..000000000 --- a/tests/test_aufabschlagstaffelproort.py +++ /dev/null @@ -1,28 +0,0 @@ -from decimal import Decimal - -import pytest - -from bo4e import AufAbschlagstaffelProOrt -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestAufAbschlagstaffelProOrt: - @pytest.mark.parametrize( - "aufabschlagstaffelproort", - [ - pytest.param( - AufAbschlagstaffelProOrt( - wert=Decimal(2.5), - staffelgrenze_von=Decimal(1), - staffelgrenze_bis=Decimal(5), - ), - ), - ], - ) - def test_aufabschlagstaffelproort_required_attributes( - self, aufabschlagstaffelproort: AufAbschlagstaffelProOrt - ) -> None: - """ - Test de-/serialisation of AufAbschlagstaffelProOrt. - """ - assert_serialization_roundtrip(aufabschlagstaffelproort) diff --git a/tests/test_kriteriumswert.py b/tests/test_kriteriumswert.py deleted file mode 100644 index 825e429ea..000000000 --- a/tests/test_kriteriumswert.py +++ /dev/null @@ -1,23 +0,0 @@ -import pytest - -from bo4e import KriteriumWert, Tarifregionskriterium -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestKriteriumWert: - @pytest.mark.parametrize( - "kriteriumwert", - [ - pytest.param( - KriteriumWert( - kriterium=Tarifregionskriterium.ORT, - wert="Grünwald", - ), - ), - ], - ) - def test_kriteriumwert_serialization_roundtrip(self, kriteriumwert: KriteriumWert) -> None: - """ - Test de-/serialisation of KriteriumWert. - """ - assert_serialization_roundtrip(kriteriumwert) diff --git a/tests/test_regionalegueltigkeit.py b/tests/test_regionalegueltigkeit.py deleted file mode 100644 index 5629dde24..000000000 --- a/tests/test_regionalegueltigkeit.py +++ /dev/null @@ -1,29 +0,0 @@ -import pytest - -from bo4e import Gueltigkeitstyp, KriteriumWert, RegionaleGueltigkeit, Tarifregionskriterium -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionaleGueltigkeit: - @pytest.mark.parametrize( - "regionalegueltigkeit", - [ - pytest.param( - RegionaleGueltigkeit( - gueltigkeitstyp=Gueltigkeitstyp.NUR_IN, - kriteriums_werte=[ - KriteriumWert( - kriterium=Tarifregionskriterium.NETZ_NUMMER, - wert="12345", - ), - ], - ), - id="all attributes at first level", - ), - ], - ) - def test_regionalegueltigkeit_serialization_roundtrip(self, regionalegueltigkeit: RegionaleGueltigkeit) -> None: - """ - Test de-/serialisation of RegionaleGueltigkeit with minimal attributes. - """ - assert_serialization_roundtrip(regionalegueltigkeit) diff --git a/tests/test_regionalepreisgarantie.py b/tests/test_regionalepreisgarantie.py deleted file mode 100644 index 2344d2ec9..000000000 --- a/tests/test_regionalepreisgarantie.py +++ /dev/null @@ -1,44 +0,0 @@ -from datetime import datetime, time - -import pytest - -from bo4e import ( - Gueltigkeitstyp, - KriteriumWert, - Preisgarantietyp, - RegionaleGueltigkeit, - RegionalePreisgarantie, - Tarifregionskriterium, - Zeitraum, -) -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionalePreisgarantie: - @pytest.mark.parametrize( - "regionale_preisgarantie", - [ - pytest.param( - RegionalePreisgarantie( - preisgarantietyp=Preisgarantietyp.NUR_ENERGIEPREIS, - zeitliche_gueltigkeit=Zeitraum( - startdatum=datetime(2011, 2, 5), - startuhrzeit=time(16, 43), - enddatum=datetime(2021, 7, 30), - enduhrzeit=time(16, 43), - ), - regionale_gueltigkeit=RegionaleGueltigkeit( - gueltigkeitstyp=Gueltigkeitstyp.NUR_IN, - kriteriums_werte=[KriteriumWert(kriterium=Tarifregionskriterium.POSTLEITZAHL, wert="01069")], - ), - ), - ), - ], - ) - def test_regionale_preisgarantie_serialization_roundtrip( - self, regionale_preisgarantie: RegionalePreisgarantie - ) -> None: - """ - Test de-/serialisation of RegionalePreisgarantie with minimal attributes. - """ - assert_serialization_roundtrip(regionale_preisgarantie) diff --git a/tests/test_regionalepreisstaffel.py b/tests/test_regionalepreisstaffel.py deleted file mode 100644 index 8b332747e..000000000 --- a/tests/test_regionalepreisstaffel.py +++ /dev/null @@ -1,54 +0,0 @@ -from decimal import Decimal - -import pytest - -from bo4e import ( - Gueltigkeitstyp, - KriteriumWert, - RegionaleGueltigkeit, - RegionalePreisstaffel, - Sigmoidparameter, - Tarifregionskriterium, -) -from tests.serialization_helper import assert_serialization_roundtrip - -example_regionale_preisstaffel = RegionalePreisstaffel( - einheitspreis=Decimal(40.0), - staffelgrenze_von=Decimal(12.5), - staffelgrenze_bis=Decimal(25.0), - sigmoidparameter=Sigmoidparameter(), - regionale_gueltigkeit=RegionaleGueltigkeit( - gueltigkeitstyp=Gueltigkeitstyp.NUR_IN, - kriteriums_werte=[KriteriumWert(kriterium=Tarifregionskriterium.POSTLEITZAHL, wert="01069")], - ), -) - - -class TestRegionalePreisstaffel: - @pytest.mark.parametrize( - "regionale_preisstaffel", - [ - pytest.param( - RegionalePreisstaffel( - einheitspreis=Decimal(40.0), - staffelgrenze_von=Decimal(12.5), - staffelgrenze_bis=Decimal(25.0), - sigmoidparameter=Sigmoidparameter(), - regionale_gueltigkeit=RegionaleGueltigkeit( - gueltigkeitstyp=Gueltigkeitstyp.NUR_IN, - kriteriums_werte=[KriteriumWert(kriterium=Tarifregionskriterium.POSTLEITZAHL, wert="01069")], - ), - ), - id="maximal attributes", - # the messing sigmoidparameter is tested in the Preisstaffel tests - ), - ], - ) - def test_serialization_roundtrip( - self, - regionale_preisstaffel: RegionalePreisstaffel, - ) -> None: - """ - Test de-/serialisation of RegionalePreisgarantie with maximal attributes. - """ - assert_serialization_roundtrip(regionale_preisstaffel) diff --git a/tests/test_regionaleraufabschlag.py b/tests/test_regionaleraufabschlag.py deleted file mode 100644 index 6d828a35e..000000000 --- a/tests/test_regionaleraufabschlag.py +++ /dev/null @@ -1,48 +0,0 @@ -import pytest - -from bo4e import ( - AufAbschlagstyp, - AufAbschlagsziel, - Energiemix, - Preisgarantie, - RegionalePreisstaffel, - RegionalerAufAbschlag, - Tarifeinschraenkung, - Vertragskonditionen, - Waehrungseinheit, - Zeitraum, -) -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionalerAufAbschlag: - @pytest.mark.parametrize( - "regionaler_auf_abschlag", - [ - pytest.param( - RegionalerAufAbschlag( - bezeichnung="Foo", - beschreibung="Bar", - auf_abschlagstyp=AufAbschlagstyp.RELATIV, - auf_abschlagsziel=AufAbschlagsziel.ARBEITSPREIS_HT, - einheit=Waehrungseinheit.CT, - website="https://www.hochfrequenz.de", - zusatzprodukte=["ein standmixer", "ein thermomix"], - voraussetzungen=["lecker essen", "mit ökostrom gekocht"], - tarifnamensaenderungen="Super-Duper Tarif", - staffeln=[RegionalePreisstaffel()], - gueltigkeitszeitraum=Zeitraum(), - energiemixaenderung=Energiemix(), - vertagskonditionsaenderung=Vertragskonditionen(), - garantieaenderung=Preisgarantie(), - einschraenkungsaenderung=Tarifeinschraenkung(), - ), - id="maximal attributes", - ), - ], - ) - def test_serialization_roundtrip(self, regionaler_auf_abschlag: RegionalerAufAbschlag) -> None: - """ - Test de-/serialisation - """ - assert_serialization_roundtrip(regionaler_auf_abschlag) diff --git a/tests/test_regionaletarifpreisposition.py b/tests/test_regionaletarifpreisposition.py deleted file mode 100644 index 78a24b335..000000000 --- a/tests/test_regionaletarifpreisposition.py +++ /dev/null @@ -1,53 +0,0 @@ -from decimal import Decimal - -import pytest - -from bo4e import ( - Gueltigkeitstyp, - KriteriumWert, - Mengeneinheit, - Preistyp, - RegionaleGueltigkeit, - RegionalePreisstaffel, - RegionaleTarifpreisposition, - Sigmoidparameter, - Tarifregionskriterium, - Waehrungseinheit, -) -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionaleTarifpreisPosition: - @pytest.mark.parametrize( - "regionale_tarifpreis_position", - [ - pytest.param( - RegionaleTarifpreisposition( - preistyp=Preistyp.ARBEITSPREIS_NT, - einheit=Waehrungseinheit.EUR, - bezugseinheit=Mengeneinheit.KWH, - mengeneinheitstaffel=Mengeneinheit.WH, - preisstaffeln=[ - RegionalePreisstaffel( - einheitspreis=Decimal(40.0), - staffelgrenze_von=Decimal(12.5), - staffelgrenze_bis=Decimal(25.0), - sigmoidparameter=Sigmoidparameter(), - regionale_gueltigkeit=RegionaleGueltigkeit( - gueltigkeitstyp=Gueltigkeitstyp.NUR_IN, - kriteriums_werte=[ - KriteriumWert(kriterium=Tarifregionskriterium.POSTLEITZAHL, wert="01069") - ], - ), - ), - ], - ), - id="all attributes", - ), - ], - ) - def test_serialization_roundtrip(self, regionale_tarifpreis_position: RegionaleTarifpreisposition) -> None: - """ - Test de-/serialisation - """ - assert_serialization_roundtrip(regionale_tarifpreis_position) diff --git a/tests/test_regionaltarif.py b/tests/test_regionaltarif.py deleted file mode 100644 index f5655969e..000000000 --- a/tests/test_regionaltarif.py +++ /dev/null @@ -1,61 +0,0 @@ -from datetime import datetime, timezone - -import pytest - -from bo4e import ( - Energiemix, - Kundentyp, - Marktteilnehmer, - RegionalePreisgarantie, - RegionalerAufAbschlag, - RegionaleTarifpreisposition, - Regionaltarif, - Registeranzahl, - Sparte, - Tarifberechnungsparameter, - Tarifeinschraenkung, - Tarifmerkmal, - Tariftyp, - Vertragskonditionen, - Zeitraum, -) -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionaltarif: - @pytest.mark.parametrize( - "regionaltarif", - [ - pytest.param( - Regionaltarif( - preisstand=datetime(2022, 2, 1, 0, 0, 0, tzinfo=timezone.utc), - berechnungsparameter=Tarifberechnungsparameter(), - tarif_auf_abschlaege=[RegionalerAufAbschlag()], - tarifpreise=[RegionaleTarifpreisposition()], - preisgarantien=[RegionalePreisgarantie()], - tarifeinschraenkung=Tarifeinschraenkung(), - # ^^ above are the attributes of Regionaltarif - # vv below is all copy pasted from Tarifinfo test - bezeichnung="foo", - anbietername="der beste stromanbieter", - sparte=Sparte.STROM, - kundentypen=[Kundentyp.PRIVAT, Kundentyp.GEWERBE], - registeranzahl=Registeranzahl.MEHRTARIF, - tariftyp=Tariftyp.GRUND_ERSATZVERSORGUNG, - tarifmerkmale=[Tarifmerkmal.HEIZSTROM], - website="https://foo.inv", - bemerkung="super billig aber auch super dreckig", - vertragskonditionen=Vertragskonditionen(), - zeitliche_gueltigkeit=Zeitraum(), - energiemix=Energiemix(), - anbieter=Marktteilnehmer(), - ), - id="all attributes", - ) - ], - ) - def test_serialization_roundtrip(self, regionaltarif: Regionaltarif) -> None: - """ - Test de-/serialisation - """ - assert_serialization_roundtrip(regionaltarif) diff --git a/tests/test_regionskriterium.py b/tests/test_regionskriterium.py deleted file mode 100644 index acae42d9f..000000000 --- a/tests/test_regionskriterium.py +++ /dev/null @@ -1,24 +0,0 @@ -import pytest - -from bo4e import Gueltigkeitstyp, Regionskriterium, Regionskriteriumtyp -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestRegionskriterium: - @pytest.mark.parametrize( - "regionskriterium", - [ - pytest.param( - Regionskriterium( - regionskriteriumtyp=Regionskriteriumtyp.REGELGEBIET_NAME, - gueltigkeitstyp=Gueltigkeitstyp.NICHT_IN, - wert="Was ist ein Regionskriterium?", - ), - ), - ], - ) - def test_regionskriterium_serialization_roundtrip(self, regionskriterium: Regionskriterium) -> None: - """ - Test de-/serialisation of Regionskriterium with minimal attributes. - """ - assert_serialization_roundtrip(regionskriterium) diff --git a/tests/test_tarifpreispositionproort.py b/tests/test_tarifpreispositionproort.py deleted file mode 100644 index 5185fc2db..000000000 --- a/tests/test_tarifpreispositionproort.py +++ /dev/null @@ -1,26 +0,0 @@ -import pytest - -from bo4e import TarifpreispositionProOrt, TarifpreisstaffelProOrt -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestTarifpreispositionProOrt: - @pytest.mark.parametrize( - "tarifpreispositionproort", - [ - pytest.param( - TarifpreispositionProOrt( - postleitzahl="82031", - ort="Grünwald", - netznr="0815", - preisstaffeln=[TarifpreisstaffelProOrt()], - ), - id="minimal and maximal attributes", - ), - ], - ) - def test_serialization_roundtrip(self, tarifpreispositionproort: TarifpreispositionProOrt) -> None: - """ - Test de-/serialisation - """ - assert_serialization_roundtrip(tarifpreispositionproort) diff --git a/tests/test_tarifpreisstaffelproort.py b/tests/test_tarifpreisstaffelproort.py deleted file mode 100644 index 67e7280d4..000000000 --- a/tests/test_tarifpreisstaffelproort.py +++ /dev/null @@ -1,29 +0,0 @@ -from decimal import Decimal - -import pytest - -from bo4e import TarifpreisstaffelProOrt -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestTarifpreisstaffelProOrt: - @pytest.mark.parametrize( - "tarifpreisstaffelproort", - [ - pytest.param( - TarifpreisstaffelProOrt( - arbeitspreis=Decimal(10), - arbeitspreis_n_t=Decimal(11), - grundpreis=Decimal(12), - staffelgrenze_von=Decimal(13), - staffelgrenze_bis=Decimal(14), - ), - id="maximal (and minimal) attributes", - ), - ], - ) - def test_serialization_roundtrip(self, tarifpreisstaffelproort: TarifpreisstaffelProOrt) -> None: - """ - Test de-/serialisation - """ - assert_serialization_roundtrip(tarifpreisstaffelproort) From 82a1a97bd87732be1261b3fede26e1f76c5e92f0 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 15:44:20 +0100 Subject: [PATCH 32/43] Add new models to __init__ --- src/bo4e/__init__.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index b3e2e8ae8..dfd6574ac 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -44,6 +44,7 @@ "TechnischeRessource", "Vertrag", "Zaehler", + "Zaehlzeitdefinition", "Zeitreihe", "Adresse", "Angebotsposition", @@ -55,6 +56,8 @@ "Betrag", "COM", "Dienstleistung", + "DynamischePreisposition", + "EinheitsPreisposition", "Energieherkunft", "Energiemix", "Fremdkostenblock", @@ -66,6 +69,7 @@ "Kostenblock", "Kostenposition", "Lastprofil", + "LastvariablePreisposition", "MarktgebietInfo", "Menge", "Messwert", @@ -74,6 +78,10 @@ "Preisposition", "Preisstaffel", "Rechnungsposition", + "Regionsoperation", + "Regionspreis", + "Regionszeitscheibe", + "RelativePreisposition", "Sigmoidparameter", "StandorteigenschaftenGas", "StandorteigenschaftenStrom", @@ -83,6 +91,8 @@ "Tarifeinschraenkung", "Tarifpreis", "Tarifpreisposition", + "Tarifpreiszeitscheibe", + "Umschaltzeit", "Unterschrift", "Verbrauch", "Vertragskonditionen", @@ -92,6 +102,7 @@ "Zaehlzeitregister", "Zeitraum", "Zeitreihenwert", + "ZeitvariablePreisposition", "Zustaendigkeit", "AbgabeArt", "Aggregationsverantwortung", @@ -144,6 +155,7 @@ "Organisationstyp", "Preisgarantietyp", "Preismodell", + "Preisreferenz", "Preisstatus", "Preistyp", "Profilart", @@ -181,6 +193,7 @@ "Waehrungscode", "Waehrungseinheit", "Waermenutzung", + "Wiederholungstyp", "Zaehlerauspraegung", "Zaehlergroesse", "Zaehlertyp", @@ -228,6 +241,7 @@ from .bo.technischeressource import TechnischeRessource from .bo.vertrag import Vertrag from .bo.zaehler import Zaehler +from .bo.zaehlzeitdefinition import Zaehlzeitdefinition from .bo.zeitreihe import Zeitreihe # Import COMs @@ -241,6 +255,8 @@ from .com.betrag import Betrag from .com.com import COM from .com.dienstleistung import Dienstleistung +from .com.dynamischepreisposition import DynamischePreisposition +from .com.einheitspreisposition import EinheitsPreisposition from .com.energieherkunft import Energieherkunft from .com.energiemix import Energiemix from .com.fremdkostenblock import Fremdkostenblock @@ -253,6 +269,7 @@ from .com.kostenblock import Kostenblock from .com.kostenposition import Kostenposition from .com.lastprofil import Lastprofil +from .com.lastvariablepreisposition import LastvariablePreisposition from .com.marktgebietinfo import MarktgebietInfo from .com.menge import Menge from .com.messwert import Messwert @@ -261,6 +278,10 @@ from .com.preisposition import Preisposition from .com.preisstaffel import Preisstaffel from .com.rechnungsposition import Rechnungsposition +from .com.regionsoperation import Regionsoperation +from .com.regionspreis import Regionspreis +from .com.regionszeitscheibe import Regionszeitscheibe +from .com.relativepreisposition import RelativePreisposition from .com.sigmoidparameter import Sigmoidparameter from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom @@ -270,6 +291,8 @@ from .com.tarifeinschraenkung import Tarifeinschraenkung from .com.tarifpreis import Tarifpreis from .com.tarifpreisposition import Tarifpreisposition +from .com.tarifpreiszeitscheibe import Tarifpreiszeitscheibe +from .com.umschaltzeit import Umschaltzeit from .com.unterschrift import Unterschrift from .com.verbrauch import Verbrauch from .com.vertragskonditionen import Vertragskonditionen @@ -279,6 +302,7 @@ from .com.zaehlzeitregister import Zaehlzeitregister from .com.zeitraum import Zeitraum from .com.zeitreihenwert import Zeitreihenwert +from .com.zeitvariablepreisposition import ZeitvariablePreisposition from .com.zustaendigkeit import Zustaendigkeit # Import Enums @@ -335,6 +359,7 @@ from .enum.organisationstyp import Organisationstyp from .enum.preisgarantietyp import Preisgarantietyp from .enum.preismodell import Preismodell +from .enum.preisreferenz import Preisreferenz from .enum.preisstatus import Preisstatus from .enum.preistyp import Preistyp from .enum.profilart import Profilart @@ -370,6 +395,7 @@ from .enum.waehrungseinheit import Waehrungseinheit from .enum.waermenutzung import Waermenutzung from .enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage +from .enum.wiederholungstyp import Wiederholungstyp from .enum.zaehlerauspraegung import Zaehlerauspraegung from .enum.zaehlergroesse import Zaehlergroesse from .enum.zaehlertyp import Zaehlertyp From 88ce8bcdd9796ecd1ce346e68f1e79f8adf43d47 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 15:49:25 +0100 Subject: [PATCH 33/43] Fix type hint in `Regionsoperation` --- src/bo4e/com/regionsoperation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bo4e/com/regionsoperation.py b/src/bo4e/com/regionsoperation.py index bfb3b3c5d..87c8fce5f 100644 --- a/src/bo4e/com/regionsoperation.py +++ b/src/bo4e/com/regionsoperation.py @@ -39,7 +39,7 @@ class Regionsoperation(COM): typ: Annotated[Literal[ComTyp.REGIONSOPERATION], Field(alias="_typ")] = ComTyp.REGIONSOPERATION - regionsoperator: Optional[Operator] = None + regionsoperator: Optional["Operator"] = None prioritaet: Optional[int] = None """ Priorität dieser Regionsoperation. Theoretisch sind Listen in JSON sortiert, jedoch ist eine solche Sortierung From 9c1882c3739cea103ba15b790cd860de48b09efb Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Wed, 26 Nov 2025 15:50:04 +0100 Subject: [PATCH 34/43] Add little function to detect unconnected COMs and ENUMs --- docs/test_uml.py | 4 +++- docs/uml.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/test_uml.py b/docs/test_uml.py index bc3ca37c6..e600803a6 100644 --- a/docs/test_uml.py +++ b/docs/test_uml.py @@ -1,6 +1,6 @@ from pathlib import Path -from docs.uml import PlantUMLNetwork, build_network +from docs.uml import PlantUMLNetwork, build_network, get_unconnected_coms_and_enums def test_network_build() -> None: @@ -10,3 +10,5 @@ def test_network_build() -> None: project_root_dir = Path(__file__).parent.parent module_dir = project_root_dir / "src/bo4e" _network, _namespaces_to_parse = build_network(module_dir, PlantUMLNetwork) + unconnected_els = get_unconnected_coms_and_enums(_network) + print(unconnected_els) diff --git a/docs/uml.py b/docs/uml.py index ed6802fb2..79afaef10 100644 --- a/docs/uml.py +++ b/docs/uml.py @@ -14,6 +14,7 @@ import shlex import subprocess from abc import ABCMeta, abstractmethod +from copy import copy from pathlib import Path from types import NoneType from typing import Any, Dict, List, Optional, Tuple, Type, Union, cast, get_args @@ -594,3 +595,16 @@ def compile_files_plantuml(input_dir: Path, output_dir: Path, executable: Path) """ command = f'java -jar "{executable}" "{input_dir}" -svg -o "{output_dir}"' subprocess.call(shlex.split(command)) + + +def get_unconnected_coms_and_enums(graph: _UMLNetworkABC) -> set[str]: + """ + Detects all COMs and ENUMs which are not reachable from any BO inside the `graph`. + """ + all_nodes = set(graph.nodes) + all_bos = set(filter(lambda modl_namespace: modl_namespace.startswith("bo4e.bo"), all_nodes)) + connected_nodes = copy(all_bos) + for bo in all_bos: + connected_nodes |= set(nx.descendants(graph, bo)) + + return all_nodes - connected_nodes From 751f5368b717c10da5e504ceb2b4c9b5b4d66f34 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Sat, 27 Dec 2025 16:44:27 +0100 Subject: [PATCH 35/43] =?UTF-8?q?=F0=9F=94=A5Remove=20TODO=20comment=20for?= =?UTF-8?q?=20`COM=20Preisstaffel.artikel=5Fid`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bo4e/com/preisstaffel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bo4e/com/preisstaffel.py b/src/bo4e/com/preisstaffel.py index c8e4a1baa..9731b8f8c 100644 --- a/src/bo4e/com/preisstaffel.py +++ b/src/bo4e/com/preisstaffel.py @@ -55,5 +55,4 @@ class Preisstaffel(COM): artikel_id: Optional[str] = None """ Standardisierte vom BDEW herausgegebene Liste, welche im Strommarkt die BDEW-Artikelnummer ablöst. - TODO: Kann das Feld weg? """ From cfba9dd178bb7f69f64526719a41a4f36d904088 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Sat, 27 Dec 2025 16:50:17 +0100 Subject: [PATCH 36/43] Drop `COM DynamischePreisposition` --- src/bo4e/__init__.py | 2 - src/bo4e/bo/tarif.py | 5 +-- src/bo4e/com/dynamischepreisposition.py | 49 ------------------------- src/bo4e/com/tarifpreiszeitscheibe.py | 2 - src/bo4e/enum/comtyp.py | 1 - 5 files changed, 2 insertions(+), 57 deletions(-) delete mode 100644 src/bo4e/com/dynamischepreisposition.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index ffe62fd3c..116b5142d 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -56,7 +56,6 @@ "Betrag", "COM", "Dienstleistung", - "DynamischePreisposition", "EinheitsPreisposition", "Energieherkunft", "Energiemix", @@ -257,7 +256,6 @@ from .com.betrag import Betrag from .com.com import COM from .com.dienstleistung import Dienstleistung -from .com.dynamischepreisposition import DynamischePreisposition from .com.einheitspreisposition import EinheitsPreisposition from .com.energieherkunft import Energieherkunft from .com.energiemix import Energiemix diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index bf7f07c58..7f416ffc1 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -13,7 +13,6 @@ if TYPE_CHECKING: from ..bo.marktteilnehmer import Marktteilnehmer - from ..com.dynamischepreisposition import DynamischePreisposition from ..com.energiemix import Energiemix from ..com.preisgarantie import Preisgarantie from ..com.regionspreis import Regionspreis @@ -70,10 +69,10 @@ class Tarif(Tarifinfo): Ausschließlich die `COM DynamischePreisposition` wird unter einem anderen Feld namens `dynamischePreisposition` angegeben. """ - dynamische_preisposition: Optional["DynamischePreisposition"] = None + dynamische_preisposition_quelle: Optional[str] = None """ + Gibt die Bezugsquelle (z.B. Börsenindex) für den dynamischen Tarif an. Dieses Feld muss genau dann gesetzt werden, wenn es sich bei diesem Tarif um einen dynamischen Tarif handelt. - Die dynamische Preisposition enthält im wesentlichen eine Referenz zum entsprechenden Börsenindex. """ bezeichnung: Optional[str] = None diff --git a/src/bo4e/com/dynamischepreisposition.py b/src/bo4e/com/dynamischepreisposition.py deleted file mode 100644 index a567ead5f..000000000 --- a/src/bo4e/com/dynamischepreisposition.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -Contains DynamischePreisposition class -""" - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.preisreferenz import Preisreferenz - - -@postprocess_docstring -class DynamischePreisposition(COM): - """ - Modelliert eine dynamische Preisposition. - - Diese Preisposition enthält lediglich eine Referenz zum Börsenindex, auf den sie sich bezieht. Das Format dieser - Referenz ist vom Standard nicht spezifiziert. - - .. raw:: html - - - - .. HINT:: - `DynamischePreisposition JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.DYNAMISCHEPREISPOSITION], Field(alias="_typ")] = ComTyp.DYNAMISCHEPREISPOSITION - - bezeichnung: Optional[str] = None - """Eine (beliebige) Bezeichnung für die Preisposition.""" - preisreferenz: Optional["Preisreferenz"] = None - """ - Die Referenz worauf sich der Preis bezieht. - Die explizite Einheit wird durch das Feld `preis_bezugseinheit` angegeben. - """ - index: Optional[str] = None - """ - Eine Referenz zum Börsenindex dieser dynamischen Preisposition. - Das genaue Format ist vom Standard nicht spezifiziert. - """ diff --git a/src/bo4e/com/tarifpreiszeitscheibe.py b/src/bo4e/com/tarifpreiszeitscheibe.py index 31c79264f..e71ded4ee 100644 --- a/src/bo4e/com/tarifpreiszeitscheibe.py +++ b/src/bo4e/com/tarifpreiszeitscheibe.py @@ -60,5 +60,3 @@ class Tarifpreiszeitscheibe(COM): Die ID hat hierbei kein vorgegebenes Format und hat auch keine fachliche Bedeutung. Es handelt sich hierbei um eine rein technische Lösung, um einen Querverweis zu modellieren. """ - dynamischer_tarif_quelle: Optional[str] = None - """Gibt die Bezugsquelle für den dynamischen Tarif an. TODO: Brauchen wir das hier überhaupt noch???""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index c05d99484..a530c1b80 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -20,7 +20,6 @@ class ComTyp(StrEnum): AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS" BETRAG = "BETRAG" DIENSTLEISTUNG = "DIENSTLEISTUNG" - DYNAMISCHEPREISPOSITION = "DYNAMISCHEPREISPOSITION" EINHEITSPREISPOSITION = "EINHEITSPREISPOSITION" ENERGIEHERKUNFT = "ENERGIEHERKUNFT" ENERGIEMIX = "ENERGIEMIX" From 2aa50083d879b21bfbb025371c3458f574f9e998 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Sat, 27 Dec 2025 16:51:46 +0100 Subject: [PATCH 37/43] Leave out `COM Vertriebskanal` for future workshops --- src/bo4e/bo/tarif.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index 7f416ffc1..662077c8f 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -88,8 +88,6 @@ class Tarif(Tarifinfo): """Der Zeitraum, in dem eine Belieferung (für diesen Tarif) möglich ist.""" vertragskonditionen: Optional["Vertragskonditionen"] """Vertragskonditionen für diesen Tarif.""" - vertriebskanal: Optional[str] = None - """TODO: Create a COM for this.""" website: Optional[str] """Internetseite, auf der der Tarif veröffentlicht ist.""" energiemix: Optional[list["Energiemix"]] From 7a880c7b3a3e35a34ae4f0cab2d5de479faba400 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Sat, 27 Dec 2025 16:54:04 +0100 Subject: [PATCH 38/43] Write doc string for `BO Tarif.energiemix` --- src/bo4e/bo/tarif.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index 662077c8f..8f91e4d4e 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -91,7 +91,7 @@ class Tarif(Tarifinfo): website: Optional[str] """Internetseite, auf der der Tarif veröffentlicht ist.""" energiemix: Optional[list["Energiemix"]] - """TODO: Write meaningful doc-string""" + """Der Energiemix mit einem Eintrag pro Gültigkeitsjahr (siehe `Energiemix.gueltigkeitsjahr`).""" kundentypen: Optional[list["Kundentyp"]] """Eine Liste an Kundentypen, für die dieser Tarif vorgesehen ist.""" tariftyp: Optional["Tariftyp"] From 91c346578793e845c1f573894ec79b292217ff8e Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Sat, 27 Dec 2025 16:55:42 +0100 Subject: [PATCH 39/43] Readd `BO Tarif.tarifeinschraenkung` --- src/bo4e/bo/tarif.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index 8f91e4d4e..c153df466 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -17,6 +17,7 @@ from ..com.preisgarantie import Preisgarantie from ..com.regionspreis import Regionspreis from ..com.tarifberechnungsparameter import Tarifberechnungsparameter + from ..com.tarifeinschraenkung import Tarifeinschraenkung from ..com.vertragskonditionen import Vertragskonditionen from ..com.zeitraum import Zeitraum from ..enum.kundentyp import Kundentyp @@ -109,3 +110,5 @@ class Tarif(Tarifinfo): """Preisgarantie für diesen Tarif""" berechnungsparameter: Optional["Tarifberechnungsparameter"] """Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen""" + tarifeinschraenkung: Optional["Tarifeinschraenkung"] = None + """Die Bedingungen und Einschränkungen unter denen ein Tarif angewendet werden kann""" From 5c2450ee0c8f653a52150febe0c6280a02100f98 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 13 Jan 2026 11:16:36 +0100 Subject: [PATCH 40/43] Fix doc creation --- src/bo4e/com/regionszeitscheibe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bo4e/com/regionszeitscheibe.py b/src/bo4e/com/regionszeitscheibe.py index e2a16289a..f90c8a893 100644 --- a/src/bo4e/com/regionszeitscheibe.py +++ b/src/bo4e/com/regionszeitscheibe.py @@ -36,7 +36,7 @@ class Regionszeitscheibe(COM): typ: Annotated[Literal[ComTyp.REGIONSZEITSCHEIBE], Field(alias="_typ")] = ComTyp.REGIONSZEITSCHEIBE region: Optional["Region"] = None - """Die Region wird durch das Feld `zeitscheibengueltigkeit ` mit einer Zeitscheibe versehen.""" + """Die Region wird durch das Feld `zeitscheibengueltigkeit` mit einer Zeitscheibe versehen.""" zeitscheibengueltigkeit: Optional["Zeitraum"] = None """ Versieht die Region mit einer Zeitscheibe. Der Start- und Endzeitpunkt sollte durch das Objekt ermittelbar sein. From f46782c545ebe70c7dbc7319ad8ce1cdf19b9ebf Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 13 Jan 2026 22:38:46 +0100 Subject: [PATCH 41/43] Fix tests --- tests/test_preisstaffel.py | 2 +- tests/test_region.py | 36 +++++++++++++++--- tests/test_tarif.py | 65 +++++++++++++++++++++++++++++--- tests/test_tarifpreisposition.py | 2 +- 4 files changed, 92 insertions(+), 13 deletions(-) diff --git a/tests/test_preisstaffel.py b/tests/test_preisstaffel.py index cf869bd20..5c42ad345 100644 --- a/tests/test_preisstaffel.py +++ b/tests/test_preisstaffel.py @@ -14,7 +14,7 @@ class TestPreisstaffel: [ pytest.param( Preisstaffel( - einheitspreis=Decimal(40.0), + preis=Decimal(40.0), staffelgrenze_von=Decimal(12.5), staffelgrenze_bis=Decimal(25.0), sigmoidparameter=Sigmoidparameter(), diff --git a/tests/test_region.py b/tests/test_region.py index 1c7747611..a9d851a2b 100644 --- a/tests/test_region.py +++ b/tests/test_region.py @@ -1,6 +1,6 @@ import pytest -from bo4e import Region, Regionskriterium +from bo4e import Operator, Region, Regionskriterium, Regionsoperation from tests.serialization_helper import assert_serialization_roundtrip @@ -11,12 +11,38 @@ class TestRegion: pytest.param( Region( bezeichnung="Bikini Bottom", - positiv_liste=[Regionskriterium()], - negativ_liste=[Regionskriterium()], + beschreibung="Heimatort der Krabbencrew", + regionsoperationen=[ + Regionsoperation( + regionsoperator=Operator.ADDITION, + prioritaet=0, + bezeichnung="Bikini Bottom", + regionskriterium=Regionskriterium.ORT, + ), + ], ), - id="max attributes", + id="single regionsoperation", + ), + pytest.param( + Region( + bezeichnung="NRW ohne Düsseldorf", + regionsoperationen=[ + Regionsoperation( + regionsoperator=Operator.ADDITION, + prioritaet=0, + bezeichnung="NRW", + regionskriterium=Regionskriterium.BUNDESLAND_NAME, + ), + Regionsoperation( + regionsoperator=Operator.SUBTRAKTION, + prioritaet=1, + bezeichnung="Düsseldorf", + regionskriterium=Regionskriterium.ORT, + ), + ], + ), + id="combined regionsoperationen", ), - pytest.param(Region(bezeichnung="Bikini Bottom", positiv_liste=[Regionskriterium()]), id="min attributes"), ], ) def test_serialization_roundtrip(self, region: Region) -> None: diff --git a/tests/test_tarif.py b/tests/test_tarif.py index 42d646427..babf4b407 100644 --- a/tests/test_tarif.py +++ b/tests/test_tarif.py @@ -1,22 +1,34 @@ from datetime import datetime, timezone +from decimal import Decimal import pytest from bo4e import ( - AufAbschlagRegional, + EinheitsPreisposition, Energiemix, Kundentyp, Marktteilnehmer, + Mengeneinheit, + Operator, + Preis, Preisgarantie, + Preisreferenz, + Region, + Regionskriterium, + Regionsoperation, + Regionspreis, + Regionszeitscheibe, Registeranzahl, + RelativePreisposition, Sparte, Tarif, Tarifberechnungsparameter, Tarifeinschraenkung, Tarifmerkmal, - TarifpreispositionProOrt, + Tarifpreiszeitscheibe, Tariftyp, Vertragskonditionen, + Waehrungseinheit, Zeitraum, ) from tests.serialization_helper import assert_serialization_roundtrip @@ -28,10 +40,7 @@ class TestTarif: [ pytest.param( Tarif( - preisstand=datetime(2022, 2, 1, 0, 0, 0, tzinfo=timezone.utc), berechnungsparameter=Tarifberechnungsparameter(), - tarif_auf_abschlaege=[AufAbschlagRegional()], - tarifpreise=[TarifpreispositionProOrt()], preisgarantie=Preisgarantie(), tarifeinschraenkung=Tarifeinschraenkung(), # below are the attributes of tarifinfo @@ -46,8 +55,52 @@ class TestTarif: bemerkung="super billig aber auch super dreckig", vertragskonditionen=Vertragskonditionen(), zeitliche_gueltigkeit=Zeitraum(), - energiemix=Energiemix(), + energiemix=[Energiemix()], anbieter=Marktteilnehmer(), + regionspreise=[ + Regionspreis( + regionszeitscheiben=[ + Regionszeitscheibe( + zeitscheibengueltigkeit=Zeitraum(startdatum=datetime(2020, 1, 1)), + region=Region( + bezeichnung="Deutschland", + regionsoperationen=[ + Regionsoperation( + regionsoperator=Operator.ADDITION, + prioritaet=0, + bezeichnung="Deutschland", + regionskriterium=Regionskriterium.BUNDESWEIT, + ) + ], + ), + ), + ], + tarifpreiszeitscheiben=[ + Tarifpreiszeitscheibe( + zeitscheibengueltigkeit=Zeitraum(startdatum=datetime(2020, 1, 1)), + einheits_preispositionen=[ + EinheitsPreisposition( + id="12345", + bezeichnung="Arbeitspreis", + preisreferenz=Preisreferenz.ENERGIEMENGE, + preis=Preis( + wert=Decimal("30"), + einheit=Waehrungseinheit.CT, + bezugswert=Mengeneinheit.KWH, + ), + ) + ], + relative_preispositionen=[ + RelativePreisposition( + bezeichnung="5% Rabatt auf Arbeitspreis", + id_referenz="12345", + wert=Decimal("0.95"), + ) + ], + ) + ], + ) + ], ), id="all attributes", ), diff --git a/tests/test_tarifpreisposition.py b/tests/test_tarifpreisposition.py index cc0d62e17..ae9ef7ca0 100644 --- a/tests/test_tarifpreisposition.py +++ b/tests/test_tarifpreisposition.py @@ -17,7 +17,7 @@ class TestTarifpreisposition: bezugseinheit=Mengeneinheit.KWH, preisstaffeln=[ Preisstaffel( - einheitspreis=Decimal(40.0), + preis=Decimal(40.0), staffelgrenze_von=Decimal(12.5), staffelgrenze_bis=Decimal(25.0), ), From 75c78d956b5d9de4fc18a5d37c9ba279c8dfcbd0 Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 13 Jan 2026 22:41:39 +0100 Subject: [PATCH 42/43] Fix linting --- src/bo4e/bo/tarif.py | 1 - src/bo4e/com/regionszeitscheibe.py | 1 - 2 files changed, 2 deletions(-) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index c153df466..d3bc6279c 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -4,7 +4,6 @@ from typing import TYPE_CHECKING, Annotated, Literal, Optional -import pydantic from pydantic import Field from ..enum.botyp import BoTyp diff --git a/src/bo4e/com/regionszeitscheibe.py b/src/bo4e/com/regionszeitscheibe.py index f90c8a893..615919440 100644 --- a/src/bo4e/com/regionszeitscheibe.py +++ b/src/bo4e/com/regionszeitscheibe.py @@ -2,7 +2,6 @@ Contains Regionszeitscheibe class """ -from decimal import Decimal from typing import TYPE_CHECKING, Annotated, Literal, Optional from pydantic import Field From aeb1a5f62834d401daa78e8cae35880a14cac4fa Mon Sep 17 00:00:00 2001 From: Leon Haffmans Date: Tue, 13 Jan 2026 22:47:48 +0100 Subject: [PATCH 43/43] Fix mypy --- src/bo4e/bo/tarif.py | 4 ++-- tests/test_preisstaffel.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index d3bc6279c..51e4d44e3 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -61,7 +61,7 @@ class Tarif(Tarifinfo): """ - typ: Annotated[Literal[BoTyp.TARIF], Field(alias="_typ")] = BoTyp.TARIF + typ: Annotated[Literal[BoTyp.TARIF], Field(alias="_typ")] = BoTyp.TARIF # type:ignore[assignment] regionspreise: Optional[list["Regionspreis"]] = None """ @@ -90,7 +90,7 @@ class Tarif(Tarifinfo): """Vertragskonditionen für diesen Tarif.""" website: Optional[str] """Internetseite, auf der der Tarif veröffentlicht ist.""" - energiemix: Optional[list["Energiemix"]] + energiemix: Optional[list["Energiemix"]] # type:ignore[assignment] """Der Energiemix mit einem Eintrag pro Gültigkeitsjahr (siehe `Energiemix.gueltigkeitsjahr`).""" kundentypen: Optional[list["Kundentyp"]] """Eine Liste an Kundentypen, für die dieser Tarif vorgesehen ist.""" diff --git a/tests/test_preisstaffel.py b/tests/test_preisstaffel.py index 5c42ad345..47f874eda 100644 --- a/tests/test_preisstaffel.py +++ b/tests/test_preisstaffel.py @@ -40,7 +40,7 @@ def test_serialization_roundtrip(self, preisstaffel: Preisstaffel) -> None: def test_failing_validation(self, not_a_sigmoid_parameter: Any) -> None: with pytest.raises(ValidationError) as excinfo: _ = Preisstaffel( - einheitspreis=Decimal(40.0), + preis=Decimal(40.0), staffelgrenze_von=Decimal(12.5), staffelgrenze_bis=Decimal(25.0), sigmoidparameter=not_a_sigmoid_parameter,