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/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
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/__init__.py b/src/bo4e/__init__.py
index 9cff0ce17..116b5142d 100644
--- a/src/bo4e/__init__.py
+++ b/src/bo4e/__init__.py
@@ -35,7 +35,6 @@
"PreisblattNetznutzung",
"Rechnung",
"Region",
- "Regionaltarif",
"Standorteigenschaften",
"SteuerbareRessource",
"Tarif",
@@ -45,20 +44,19 @@
"TechnischeRessource",
"Vertrag",
"Zaehler",
+ "Zaehlzeitdefinition",
"Zeitreihe",
"Adresse",
"Angebotsposition",
"Angebotsteil",
"Angebotsvariante",
"AufAbschlag",
- "AufAbschlagProOrt",
- "AufAbschlagRegional",
- "AufAbschlagstaffelProOrt",
"Ausschreibungsdetail",
"Ausschreibungslos",
"Betrag",
"COM",
"Dienstleistung",
+ "EinheitsPreisposition",
"Energieherkunft",
"Energiemix",
"Fremdkostenblock",
@@ -69,23 +67,20 @@
"Konzessionsabgabe",
"Kostenblock",
"Kostenposition",
- "KriteriumWert",
"Lastprofil",
+ "LastvariablePreisposition",
"MarktgebietInfo",
"Menge",
"Messwert",
- "PositionsAufAbschlag",
"Preis",
"Preisgarantie",
"Preisposition",
"Preisstaffel",
"Rechnungsposition",
- "RegionaleGueltigkeit",
- "RegionalePreisgarantie",
- "RegionalePreisstaffel",
- "RegionalerAufAbschlag",
- "RegionaleTarifpreisposition",
- "Regionskriterium",
+ "Regionsoperation",
+ "Regionspreis",
+ "Regionszeitscheibe",
+ "RelativePreisposition",
"Sigmoidparameter",
"StandorteigenschaftenGas",
"StandorteigenschaftenStrom",
@@ -95,8 +90,8 @@
"Tarifeinschraenkung",
"Tarifpreis",
"Tarifpreisposition",
- "TarifpreispositionProOrt",
- "TarifpreisstaffelProOrt",
+ "Tarifpreiszeitscheibe",
+ "Umschaltzeit",
"Unterschrift",
"Vertragskonditionen",
"Vertragsteil",
@@ -107,12 +102,12 @@
"Zahlungsinformation",
"Zeitraum",
"Zeitreihenwert",
+ "ZeitvariablePreisposition",
"Zustaendigkeit",
"AbgabeArt",
"Aggregationsverantwortung",
"Angebotsstatus",
"Anrede",
- "ArithmetischeOperation",
"AufAbschlagstyp",
"AufAbschlagsziel",
"Ausschreibungsportal",
@@ -132,7 +127,6 @@
"Geraeteklasse",
"Geraetetyp",
"Geschaeftspartnerrolle",
- "Gueltigkeitstyp",
"Kalkulationsmethode",
"Konfigurationsprodukt",
"Kontaktart",
@@ -157,9 +151,11 @@
"NetznutzungRechnungstyp",
"Oekolabel",
"Oekozertifikat",
+ "Operator",
"Organisationstyp",
"Preisgarantietyp",
"Preismodell",
+ "Preisreferenz",
"Preisstatus",
"Preistyp",
"Profilart",
@@ -169,7 +165,7 @@
"Rechnungslegung",
"Rechnungsstatus",
"Rechnungstyp",
- "Regionskriteriumtyp",
+ "Regionskriterium",
"Registeranzahl",
"Rollencodetyp",
"Sparte",
@@ -179,7 +175,6 @@
"StrEnum",
"Tarifkalkulationsmethode",
"Tarifmerkmal",
- "Tarifregionskriterium",
"Tariftyp",
"Tarifzeit",
"TechnischeRessourceNutzung",
@@ -198,6 +193,7 @@
"Waehrungscode",
"Waehrungseinheit",
"Waermenutzung",
+ "Wiederholungstyp",
"Zaehlerauspraegung",
"Zaehlergroesse",
"Zaehlertyp",
@@ -237,7 +233,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
@@ -247,6 +242,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
@@ -255,14 +251,12 @@
from .com.angebotsteil import Angebotsteil
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
from .com.betrag import Betrag
from .com.com import COM
from .com.dienstleistung import Dienstleistung
+from .com.einheitspreisposition import EinheitsPreisposition
from .com.energieherkunft import Energieherkunft
from .com.energiemix import Energiemix
from .com.fremdkostenblock import Fremdkostenblock
@@ -274,23 +268,20 @@
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.lastvariablepreisposition import LastvariablePreisposition
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
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
-from .com.regionskriterium import Regionskriterium
+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
@@ -300,8 +291,8 @@
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.tarifpreiszeitscheibe import Tarifpreiszeitscheibe
+from .com.umschaltzeit import Umschaltzeit
from .com.unterschrift import Unterschrift
from .com.vertragskonditionen import Vertragskonditionen
from .com.vertragsteil import Vertragsteil
@@ -312,6 +303,7 @@
from .com.zahlungsinformation import Zahlungsinformation
from .com.zeitraum import Zeitraum
from .com.zeitreihenwert import Zeitreihenwert
+from .com.zeitvariablepreisposition import ZeitvariablePreisposition
from .com.zustaendigkeit import Zustaendigkeit
# Import Enums
@@ -320,7 +312,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
@@ -342,7 +333,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
@@ -366,9 +356,11 @@
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
+from .enum.preisreferenz import Preisreferenz
from .enum.preisstatus import Preisstatus
from .enum.preistyp import Preistyp
from .enum.profilart import Profilart
@@ -378,7 +370,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
@@ -388,7 +380,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
@@ -405,6 +396,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
diff --git a/src/bo4e/bo/region.py b/src/bo4e/bo/region.py
index 085d2fda9..e4f75bfa0 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/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/bo/tarif.py b/src/bo4e/bo/tarif.py
index 1e514d80e..51e4d44e3 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
@@ -12,11 +11,19 @@
from .tarifinfo import Tarifinfo
if TYPE_CHECKING:
- from ..com.aufabschlagregional import AufAbschlagRegional
+ from ..bo.marktteilnehmer import Marktteilnehmer
+ 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 +33,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 +61,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 # type:ignore[assignment]
- 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_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.
+ """
+
+ 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."""
+ website: Optional[str]
+ """Internetseite, auf der der Tarif veröffentlicht ist."""
+ 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."""
+ 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
+ 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"""
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/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/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/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/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/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/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/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/com/preisstaffel.py b/src/bo4e/com/preisstaffel.py
index 0a14fa53b..9731b8f8c 100644
--- a/src/bo4e/com/preisstaffel.py
+++ b/src/bo4e/com/preisstaffel.py
@@ -34,15 +34,25 @@ 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.
+ """
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/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/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/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/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/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..87c8fce5f
--- /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.REGIONSOPERATION], Field(alias="_typ")] = ComTyp.REGIONSOPERATION
+
+ 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/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/com/regionszeitscheibe.py b/src/bo4e/com/regionszeitscheibe.py
new file mode 100644
index 000000000..615919440
--- /dev/null
+++ b/src/bo4e/com/regionszeitscheibe.py
@@ -0,0 +1,42 @@
+"""
+Contains Regionszeitscheibe 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 ..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/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/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/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/com/tarifpreiszeitscheibe.py b/src/bo4e/com/tarifpreiszeitscheibe.py
new file mode 100644
index 000000000..e71ded4ee
--- /dev/null
+++ b/src/bo4e/com/tarifpreiszeitscheibe.py
@@ -0,0 +1,62 @@
+"""
+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.
+ """
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/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/botyp.py b/src/bo4e/enum/botyp.py
index 846f1bd5d..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"
@@ -50,5 +49,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 8e9767664..a530c1b80 100644
--- a/src/bo4e/enum/comtyp.py
+++ b/src/bo4e/enum/comtyp.py
@@ -16,13 +16,11 @@ class ComTyp(StrEnum):
ANGEBOTSTEIL = "ANGEBOTSTEIL"
ANGEBOTSVARIANTE = "ANGEBOTSVARIANTE"
AUFABSCHLAG = "AUFABSCHLAG"
- AUFABSCHLAGPROORT = "AUFABSCHLAGPROORT"
- AUFABSCHLAGREGIONAL = "AUFABSCHLAGREGIONAL"
- AUFABSCHLAGSTAFFELPROORT = "AUFABSCHLAGSTAFFELPROORT"
AUSSCHREIBUNGSDETAIL = "AUSSCHREIBUNGSDETAIL"
AUSSCHREIBUNGSLOS = "AUSSCHREIBUNGSLOS"
BETRAG = "BETRAG"
DIENSTLEISTUNG = "DIENSTLEISTUNG"
+ EINHEITSPREISPOSITION = "EINHEITSPREISPOSITION"
ENERGIEHERKUNFT = "ENERGIEHERKUNFT"
ENERGIEMIX = "ENERGIEMIX"
FREMDKOSTENBLOCK = "FREMDKOSTENBLOCK"
@@ -34,23 +32,20 @@ class ComTyp(StrEnum):
KONZESSIONSABGABE = "KONZESSIONSABGABE"
KOSTENBLOCK = "KOSTENBLOCK"
KOSTENPOSITION = "KOSTENPOSITION"
- KRITERIUMWERT = "KRITERIUMWERT"
LASTPROFIL = "LASTPROFIL"
+ LASTVARIABLEPREISPOSITION = "LASTVARIABLEPREISPOSITION"
MARKTGEBIETINFO = "MARKTGEBIETINFO"
MENGE = "MENGE"
MESSWERT = "MESSWERT"
- POSITIONSAUFABSCHLAG = "POSITIONSAUFABSCHLAG"
PREIS = "PREIS"
PREISGARANTIE = "PREISGARANTIE"
PREISPOSITION = "PREISPOSITION"
PREISSTAFFEL = "PREISSTAFFEL"
RECHNUNGSPOSITION = "RECHNUNGSPOSITION"
- REGIONALEGUELTIGKEIT = "REGIONALEGUELTIGKEIT"
- REGIONALEPREISGARANTIE = "REGIONALEPREISGARANTIE"
- REGIONALEPREISSTAFFEL = "REGIONALEPREISSTAFFEL"
- REGIONALERAUFABSCHLAG = "REGIONALERAUFABSCHLAG"
- REGIONALETARIFPREISPOSITION = "REGIONALETARIFPREISPOSITION"
- REGIONSKRITERIUM = "REGIONSKRITERIUM"
+ REGIONSOPERATION = "REGIONSOPERATION"
+ REGIONSPREIS = "REGIONSPREIS"
+ REGIONSZEITSCHEIBE = "REGIONSZEITSCHEIBE"
+ RELATIVEPREISPOSITION = "RELATIVEPREISPOSITION"
SIGMOIDPARAMETER = "SIGMOIDPARAMETER"
STANDORTEIGENSCHAFTENGAS = "STANDORTEIGENSCHAFTENGAS"
STANDORTEIGENSCHAFTENSTROM = "STANDORTEIGENSCHAFTENSTROM"
@@ -60,8 +55,8 @@ class ComTyp(StrEnum):
TARIFEINSCHRAENKUNG = "TARIFEINSCHRAENKUNG"
TARIFPREIS = "TARIFPREIS"
TARIFPREISPOSITION = "TARIFPREISPOSITION"
- TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT"
- TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT"
+ TARIFPREISZEITSCHEIBE = "TARIFPREISZEITSCHEIBE"
+ UMSCHALTZEIT = "UMSCHALTZEIT"
UNTERSCHRIFT = "UNTERSCHRIFT"
VERTRAGSKONDITIONEN = "VERTRAGSKONDITIONEN"
VERTRAGSTEIL = "VERTRAGSTEIL"
@@ -72,4 +67,5 @@ class ComTyp(StrEnum):
ZAHLUNGSINFORMATION = "ZAHLUNGSINFORMATION"
ZEITRAUM = "ZEITRAUM"
ZEITREIHENWERT = "ZEITREIHENWERT"
+ ZEITVARIABLEPREISPOSITION = "ZEITVARIABLEPREISPOSITION"
ZUSTAENDIGKEIT = "ZUSTAENDIGKEIT"
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"""
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/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"
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"""
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)"""
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"
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_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)
diff --git a/tests/test_preisstaffel.py b/tests/test_preisstaffel.py
index cf869bd20..47f874eda 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(),
@@ -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,
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_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_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),
),
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)