diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index cfd217cc1..987f65378 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -40,6 +40,7 @@ "ComTyp", "Dienstleistung", "Dienstleistungstyp", + "DynamischePreiszeitreihe", "EMobilitaetsart", "EinheitsPreisposition", "Energieherkunft", @@ -117,6 +118,8 @@ "Preisstaffel", "Preisstatus", "Preistyp", + "Preiszeitreihe", + "Preiszeitreihenwert", "Profilart", "Profiltyp", "Profilverfahren", @@ -212,6 +215,7 @@ from .bo.ausschreibung import Ausschreibung from .bo.bilanzierung import Bilanzierung from .bo.buendelvertrag import Buendelvertrag +from .bo.dynamischepreiszeitreihe import DynamischePreiszeitreihe from .bo.energiemenge import Energiemenge from .bo.fremdkosten import Fremdkosten from .bo.geraet import Geraet @@ -277,6 +281,8 @@ from .com.preisgarantie import Preisgarantie from .com.preisposition import Preisposition from .com.preisstaffel import Preisstaffel +from .com.preiszeitreihe import Preiszeitreihe +from .com.preiszeitreihenwert import Preiszeitreihenwert from .com.rechnungsposition import Rechnungsposition from .com.regionsoperation import Regionsoperation from .com.regionspreis import Regionspreis diff --git a/src/bo4e/bo/dynamischepreiszeitreihe.py b/src/bo4e/bo/dynamischepreiszeitreihe.py new file mode 100644 index 000000000..a91a66c33 --- /dev/null +++ b/src/bo4e/bo/dynamischepreiszeitreihe.py @@ -0,0 +1,40 @@ +""" +Contains DynamischePreiszeitreihe 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 ..com.preiszeitreihe import Preiszeitreihe + from .marktlokation import Marktlokation + from .zaehler import Zaehler + + +@postprocess_docstring +class DynamischePreiszeitreihe(Geschaeftsobjekt): + """ + Abbildung einer dynamischen Preiszeitreihe. + + .. raw:: html + + + + .. HINT:: + `DynamischePreiszeitreihe JSON Schema `_ + + """ + + typ: Annotated[Literal[BoTyp.DYNAMISCHEPREISZEITREIHE], Field(alias="_typ")] = BoTyp.DYNAMISCHEPREISZEITREIHE + + marktlokation: Optional["Marktlokation"] = None + """Marktlokation der dynamischen Preiszeitreihe""" + zaehler: Optional["Zaehler"] = None + """Zaehler der dynamischen Preiszeitreihe""" + preiszeitreihen: list["Preiszeitreihe"] | None = None + """Werte der Preiszeitreihe""" diff --git a/src/bo4e/com/preiszeitreihe.py b/src/bo4e/com/preiszeitreihe.py new file mode 100644 index 000000000..f3a52adc7 --- /dev/null +++ b/src/bo4e/com/preiszeitreihe.py @@ -0,0 +1,42 @@ +""" +Contains Preiszeitreihe +""" + +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.preistyp import Preistyp + from .preiszeitreihenwert import Preiszeitreihenwert + + +@postprocess_docstring +class Preiszeitreihe(COM): + """ + + Gibt Bezeichnung und Preisart zu einer Preiszeitreihe an + + .. raw:: html + + + + .. HINT:: + `Preiszeitreihe JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.PREISZEITREIHE], Field(alias="_typ")] = ComTyp.PREISZEITREIHE + + preiszeitreihe_id: str | None = None + """Identifier der Preiszeitreihe""" + bezeichnung: str | None = None + """Bezeichnung der Preiszeitreihe""" + preistyp: Optional["Preistyp"] = None + """Angabe des Preistyps""" + werte: list["Preiszeitreihenwert"] | None = None + """Liste der Preiszeitreihenwerte, die die Preiszeitreihe bilden""" diff --git a/src/bo4e/com/preiszeitreihenwert.py b/src/bo4e/com/preiszeitreihenwert.py new file mode 100644 index 000000000..583ac07b9 --- /dev/null +++ b/src/bo4e/com/preiszeitreihenwert.py @@ -0,0 +1,40 @@ +""" +Contains Preiszeitreihenwert +""" + +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 .menge import Menge + from .preis import Preis + from .zeitraum import Zeitraum + + +@postprocess_docstring +class Preiszeitreihenwert(COM): + """ + Gibt einen Wert und Preis zu einer Zeitreihe an + + .. raw:: html + + + + .. HINT:: + `Preiszeitreihenwert JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.PREISZEITREIHENWERT], Field(alias="_typ")] = ComTyp.PREISZEITREIHENWERT + + zeitraum: Optional["Zeitraum"] = None + """Zeitraum des Preiszeitreihenwerts""" + preis: Optional["Preis"] = None + """Preis des Preiszeitreihenwerts""" + menge: Optional["Menge"] = None + """Menge des Preiszeitreihenwerts""" diff --git a/src/bo4e/enum/botyp.py b/src/bo4e/enum/botyp.py index 796274b3f..47c048383 100644 --- a/src/bo4e/enum/botyp.py +++ b/src/bo4e/enum/botyp.py @@ -15,6 +15,7 @@ class BoTyp(StrEnum): AUSSCHREIBUNG = "AUSSCHREIBUNG" BILANZIERUNG = "BILANZIERUNG" BUENDELVERTRAG = "BUENDELVERTRAG" + DYNAMISCHEPREISZEITREIHE = "DYNAMISCHEPREISZEITREIHE" ENERGIEMENGE = "ENERGIEMENGE" FREMDKOSTEN = "FREMDKOSTEN" GERAET = "GERAET" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 29abed106..c611a30cd 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -41,6 +41,8 @@ class ComTyp(StrEnum): PREISGARANTIE = "PREISGARANTIE" PREISPOSITION = "PREISPOSITION" PREISSTAFFEL = "PREISSTAFFEL" + PREISZEITREIHE = "PREISZEITREIHE" + PREISZEITREIHENWERT = "PREISZEITREIHENWERT" RECHNUNGSPOSITION = "RECHNUNGSPOSITION" REGIONSOPERATION = "REGIONSOPERATION" REGIONSPREIS = "REGIONSPREIS" diff --git a/src/bo4e/enum/preistyp.py b/src/bo4e/enum/preistyp.py index 12602c9a0..31bc7725a 100644 --- a/src/bo4e/enum/preistyp.py +++ b/src/bo4e/enum/preistyp.py @@ -27,3 +27,5 @@ class Preistyp(StrEnum): """Entgelt für MSB (Entgelt für Einbau, Betrieb und Wartung der Messtechnik)""" PROVISION = "PROVISION" """Provision""" + GESAMTPREIS_BRUTTO = "GESAMTPREIS_BRUTTO" + """Brutto Gesamtpreis""" diff --git a/tests/test_dynamische_preiszeitreihe.py b/tests/test_dynamische_preiszeitreihe.py new file mode 100644 index 000000000..dce8c5207 --- /dev/null +++ b/tests/test_dynamische_preiszeitreihe.py @@ -0,0 +1,24 @@ +import pytest + +from bo4e import DynamischePreiszeitreihe, Marktlokation, Preiszeitreihe, Zaehler +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestPreiszeitreihe: + @pytest.mark.parametrize( + "dynamische_preiszeitreihe", + [ + pytest.param( + DynamischePreiszeitreihe( + marktlokation=Marktlokation(), + zaehler=Zaehler(), + preiszeitreihen=[Preiszeitreihe()], + ) + ), + ], + ) + def test_serialization_roundtrip(self, dynamische_preiszeitreihe: DynamischePreiszeitreihe) -> None: + """ + Test de-/serialisation of Preiszeitreihe + """ + assert_serialization_roundtrip(dynamische_preiszeitreihe) diff --git a/tests/test_preiszeitreihe.py b/tests/test_preiszeitreihe.py new file mode 100644 index 000000000..ca33c28bc --- /dev/null +++ b/tests/test_preiszeitreihe.py @@ -0,0 +1,25 @@ +import pytest + +from bo4e import Preiszeitreihe, Preiszeitreihenwert, Preistyp +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestPreiszeitreihe: + @pytest.mark.parametrize( + "preiszeitreihe", + [ + pytest.param( + Preiszeitreihe( + preiszeitreihe_id="1-2-3", + bezeichnung="Bezeichnung", + preistyp=Preistyp.GESAMTPREIS_BRUTTO, + werte=[Preiszeitreihenwert()], + ) + ), + ], + ) + def test_serialization_roundtrip(self, preiszeitreihe: Preiszeitreihe) -> None: + """ + Test de-/serialisation of Preiszeitreihe + """ + assert_serialization_roundtrip(preiszeitreihe) diff --git a/tests/test_preiszeitreihenwert.py b/tests/test_preiszeitreihenwert.py new file mode 100644 index 000000000..14f3e5d43 --- /dev/null +++ b/tests/test_preiszeitreihenwert.py @@ -0,0 +1,24 @@ +import pytest + +from bo4e import Menge, Preis, Preiszeitreihenwert, Zeitraum +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestPreiszeitreihenwert: + @pytest.mark.parametrize( + "preiszeitreihenwert", + [ + pytest.param( + Preiszeitreihenwert( + zeitraum=Zeitraum(), + preis=Preis(), + menge=Menge(), + ) + ), + ], + ) + def test_serialization_roundtrip(self, preiszeitreihenwert: Preiszeitreihenwert) -> None: + """ + Test de-/serialisation of Preiszeitreihenwert + """ + assert_serialization_roundtrip(preiszeitreihenwert)