diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index bf331c295..10d89cfc4 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -42,6 +42,7 @@ "Tarifinfo", "Tarifkosten", "Tarifpreisblatt", + "Tarifzeiten", "TechnischeRessource", "Vertrag", "Zaehler", @@ -97,6 +98,8 @@ "Tarifpreisposition", "TarifpreispositionProOrt", "TarifpreisstaffelProOrt", + "TarifzeitenZeitscheibe", + "Tarifzeitstufe", "Unterschrift", "Vertragskonditionen", "Vertragsteil", @@ -241,6 +244,7 @@ from .bo.tarifinfo import Tarifinfo from .bo.tarifkosten import Tarifkosten from .bo.tarifpreisblatt import Tarifpreisblatt +from .bo.tarifzeiten import Tarifzeiten from .bo.technischeressource import TechnischeRessource from .bo.vertrag import Vertrag from .bo.zaehler import Zaehler @@ -299,6 +303,8 @@ from .com.tarifpreisposition import Tarifpreisposition from .com.tarifpreispositionproort import TarifpreispositionProOrt from .com.tarifpreisstaffelproort import TarifpreisstaffelProOrt +from .com.tarifzeitenzeitscheibe import TarifzeitenZeitscheibe +from .com.tarifzeitstufe import Tarifzeitstufe from .com.unterschrift import Unterschrift from .com.vertragskonditionen import Vertragskonditionen from .com.vertragsteil import Vertragsteil diff --git a/src/bo4e/bo/tarifzeiten.py b/src/bo4e/bo/tarifzeiten.py new file mode 100644 index 000000000..795c59abc --- /dev/null +++ b/src/bo4e/bo/tarifzeiten.py @@ -0,0 +1,38 @@ +""" +Contains Tarifzeiten class +""" + +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 ..bo.marktteilnehmer import Marktteilnehmer + from ..com.tarifzeitenzeitscheibe import TarifzeitenZeitscheibe + + +@postprocess_docstring +class Tarifzeiten(Geschaeftsobjekt): + """ + Abbildung von Tarifzeiten, wann welche Preise gelten oder unter welchen Bedingungen. + + .. raw:: html + + + + .. HINT:: + `Tarifzeiten JSON Schema `_ + + """ + + typ: Annotated[Optional[Literal[BoTyp.TARIFZEITEN]], Field(alias="_typ")] = BoTyp.TARIFZEITEN + + marktteilnehmer: Optional["Marktteilnehmer"] = None + """Optionaler Verweis auf den Anbieter / Marktpartner""" + + zeitscheiben: Optional[list["TarifzeitenZeitscheibe"]] = None + """Liste von Zeitabschnitten, die tarifliche Regelungen enthalten""" diff --git a/src/bo4e/com/tarifzeitenzeitscheibe.py b/src/bo4e/com/tarifzeitenzeitscheibe.py new file mode 100644 index 000000000..1d6771caa --- /dev/null +++ b/src/bo4e/com/tarifzeitenzeitscheibe.py @@ -0,0 +1,40 @@ +""" +Contains TarifzeitenZeitscheibe 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 ..com.tarifzeitstufe import Tarifzeitstufe + from ..com.zeitraum import Zeitraum + + +@postprocess_docstring +class TarifzeitenZeitscheibe(COM): + """ + Eine Zeitscheibe innerhalb der Tarifzeiten mit zugehöriger Gültigkeit und Tarifzeitabschnitten. + + .. raw:: html + + + + .. HINT:: + `TarifzeitenZeitscheibe JSON Schema `_ + + """ + + typ: Annotated[Optional[Literal[ComTyp.TARIFZEITENZEITSCHEIBE]], Field(alias="_typ")] = ( + ComTyp.TARIFZEITENZEITSCHEIBE + ) + + gueltigkeit: Optional["Zeitraum"] = None + """Zeitraum, in dem diese Zeitscheibe gültig ist""" + + tarifzeiten: Optional[list["Tarifzeitstufe"]] = None + """Liste von Tarifzeitenstufen, z. B. NT, HT oder weitere Zeitmodelle""" diff --git a/src/bo4e/com/tarifzeitstufe.py b/src/bo4e/com/tarifzeitstufe.py new file mode 100644 index 000000000..343a7b0c6 --- /dev/null +++ b/src/bo4e/com/tarifzeitstufe.py @@ -0,0 +1,37 @@ +""" +Contains Tarifzeitstufe 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 ..com.zeitraum import Zeitraum + + +@postprocess_docstring +class Tarifzeitstufe(COM): + """ + Tarifzeitstufe mit Zuordnung zu einem Zeitraum und einer optionalen Tarifstufe. + + .. raw:: html + + + + .. HINT:: + `Tarifzeitstufe JSON Schema `_ + + """ + + typ: Annotated[Optional[Literal[ComTyp.TARIFZEITSTUFE]], Field(alias="_typ")] = ComTyp.TARIFZEITSTUFE + + zeitraum: Optional["Zeitraum"] = None + """Gültigkeitszeitraum der Tarifzeitstufe""" + + tarifstufe: Optional[str] = None + """Optional: Angabe der Tarifstufe, z. B. HT, NT, ST""" diff --git a/src/bo4e/enum/botyp.py b/src/bo4e/enum/botyp.py index 846f1bd5d..beae1aa88 100644 --- a/src/bo4e/enum/botyp.py +++ b/src/bo4e/enum/botyp.py @@ -48,6 +48,7 @@ class BoTyp(StrEnum): TARIFINFO = "TARIFINFO" TARIFKOSTEN = "TARIFKOSTEN" TARIFPREISBLATT = "TARIFPREISBLATT" + TARIFZEITEN = "TARIFZEITEN" VERTRAG = "VERTRAG" ZAEHLER = "ZAEHLER" ZEITREIHE = "ZEITREIHE" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 3b0cef55c..f152cd87f 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -62,6 +62,8 @@ class ComTyp(StrEnum): TARIFPREISPOSITION = "TARIFPREISPOSITION" TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT" TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" + TARIFZEITENZEITSCHEIBE = "TARIFZEITENZEITSCHEIBE" + TARIFZEITSTUFE = "TARIFZEITSTUFE" UNTERSCHRIFT = "UNTERSCHRIFT" VERTRAGSKONDITIONEN = "VERTRAGSKONDITIONEN" VERTRAGSTEIL = "VERTRAGSTEIL" diff --git a/tests/test_tarifzeiten.py b/tests/test_tarifzeiten.py new file mode 100644 index 000000000..5ae8210d0 --- /dev/null +++ b/tests/test_tarifzeiten.py @@ -0,0 +1,26 @@ +from datetime import date + +import pytest + +from bo4e import Marktteilnehmer, Tarifzeiten, TarifzeitenZeitscheibe +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestTarifzeiten: + @pytest.mark.parametrize( + "tarifzeiten", + [ + pytest.param( + Tarifzeiten( + marktteilnehmer=Marktteilnehmer(), + zeitscheiben=[TarifzeitenZeitscheibe()], + ), + id="all attributes at first level", + ), + ], + ) + def test_serialization_roundtrip(self, tarifzeiten: Tarifzeiten) -> None: + """ + Test de-/serialisation of Tarifzeit. + """ + assert_serialization_roundtrip(tarifzeiten) diff --git a/tests/test_tarifzeitenzeitscheibe.py b/tests/test_tarifzeitenzeitscheibe.py new file mode 100644 index 000000000..594ec9dbc --- /dev/null +++ b/tests/test_tarifzeitenzeitscheibe.py @@ -0,0 +1,26 @@ +from datetime import date + +import pytest + +from bo4e import TarifzeitenZeitscheibe, Tarifzeitstufe, Zeitraum +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestTarifzeitenZeitscheibe: + @pytest.mark.parametrize( + "tarifzeitenzeitscheibe", + [ + pytest.param( + TarifzeitenZeitscheibe( + gueltigkeit=Zeitraum(), + tarifzeiten=[Tarifzeitstufe()], + ), + id="all attributes at first level", + ), + ], + ) + def test_serialization_roundtrip(self, tarifzeitenzeitscheibe: TarifzeitenZeitscheibe) -> None: + """ + Test de-/serialisation of TarifzeitenZeitscheibe. + """ + assert_serialization_roundtrip(tarifzeitenzeitscheibe) diff --git a/tests/test_tarifzeitstufe.py b/tests/test_tarifzeitstufe.py new file mode 100644 index 000000000..e43fe2f35 --- /dev/null +++ b/tests/test_tarifzeitstufe.py @@ -0,0 +1,26 @@ +from datetime import date + +import pytest + +from bo4e import Tarifzeitstufe, Zeitraum +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestTarifzeitstufe: + @pytest.mark.parametrize( + "tarifzeitstufe", + [ + pytest.param( + Tarifzeitstufe( + zeitraum=Zeitraum(), + tarifstufe="HT", + ), + id="all attributes at first level", + ) + ], + ) + def test_serialization_roundtrip(self, tarifzeitstufe: Tarifzeitstufe) -> None: + """ + Test de-/serialisation of Tarifzeitstufe. + """ + assert_serialization_roundtrip(tarifzeitstufe)