diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index c45aebf00..1be6619e2 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -9,8 +9,10 @@ """ __all__ = [ + "Abwicklungsmodell", "Angebot", "Ausschreibung", + "Bilanzierung", "Buendelvertrag", "Energiemenge", "Fremdkosten", @@ -68,6 +70,7 @@ "Kostenblock", "Kostenposition", "KriteriumWert", + "Lastprofil", "MarktgebietInfo", "Menge", "PositionsAufAbschlag", @@ -86,6 +89,7 @@ "StandorteigenschaftenGas", "StandorteigenschaftenStrom", "Steuerbetrag", + "Tagesparameter", "Tarifberechnungsparameter", "Tarifeinschraenkung", "Tarifpreis", @@ -103,6 +107,7 @@ "Zeitreihenwert", "Zustaendigkeit", "AbgabeArt", + "Aggregationsverantwortung", "Angebotsstatus", "Anrede", "ArithmetischeOperation", @@ -120,6 +125,7 @@ "EMobilitaetsart", "Energierichtung", "Erzeugungsart", + "Fallgruppenzuordnung", "Gasqualitaet", "Gebiettyp", "Geraeteklasse", @@ -156,6 +162,10 @@ "Preismodell", "Preisstatus", "Preistyp", + "Profilart", + "Profiltyp", + "Profilverfahren", + "Prognosegrundlage", "Rechnungslegung", "Rechnungsstatus", "Rechnungstyp", @@ -183,6 +193,7 @@ "Vertragsstatus", "Verwendungszweck", "Voraussetzungen", + "WahlrechtPrognosegrundlage", "Waehrungscode", "Waehrungseinheit", "Waermenutzung", @@ -191,6 +202,7 @@ "Zaehlergroesse", "Zaehlertyp", "ZaehlertypSpezifikation", + "Zeitreihentyp", "ZusatzAttribut", "__version__", "__gh_version__", @@ -201,6 +213,7 @@ # Import BOs from .bo.angebot import Angebot from .bo.ausschreibung import Ausschreibung +from .bo.bilanzierung import Bilanzierung from .bo.buendelvertrag import Buendelvertrag from .bo.energiemenge import Energiemenge from .bo.fremdkosten import Fremdkosten @@ -261,6 +274,7 @@ from .com.kostenblock import Kostenblock from .com.kostenposition import Kostenposition from .com.kriteriumwert import KriteriumWert +from .com.lastprofil import Lastprofil from .com.marktgebietinfo import MarktgebietInfo from .com.menge import Menge from .com.positionsaufabschlag import PositionsAufAbschlag @@ -279,6 +293,7 @@ from .com.standorteigenschaftengas import StandorteigenschaftenGas from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom from .com.steuerbetrag import Steuerbetrag +from .com.tagesparameter import Tagesparameter from .com.tarifberechnungsparameter import Tarifberechnungsparameter from .com.tarifeinschraenkung import Tarifeinschraenkung from .com.tarifpreis import Tarifpreis @@ -298,6 +313,8 @@ # Import Enums from .enum.abgabeart import AbgabeArt +from .enum.abwicklungsmodell import Abwicklungsmodell +from .enum.aggregationsverantwortung import Aggregationsverantwortung from .enum.angebotsstatus import Angebotsstatus from .enum.anrede import Anrede from .enum.arithmetische_operation import ArithmetischeOperation @@ -315,6 +332,7 @@ from .enum.emobilitaetsart import EMobilitaetsart from .enum.energierichtung import Energierichtung from .enum.erzeugungsart import Erzeugungsart +from .enum.fallgruppenzuordnung import Fallgruppenzuordnung from .enum.gasqualitaet import Gasqualitaet from .enum.gebiettyp import Gebiettyp from .enum.geraeteklasse import Geraeteklasse @@ -350,6 +368,10 @@ from .enum.preismodell import Preismodell from .enum.preisstatus import Preisstatus from .enum.preistyp import Preistyp +from .enum.profilart import Profilart +from .enum.profiltyp import Profiltyp +from .enum.profilverfahren import Profilverfahren +from .enum.prognosegrundlage import Prognosegrundlage from .enum.rechnungslegung import Rechnungslegung from .enum.rechnungsstatus import Rechnungsstatus from .enum.rechnungstyp import Rechnungstyp @@ -380,11 +402,13 @@ from .enum.waehrungscode import Waehrungscode from .enum.waehrungseinheit import Waehrungseinheit from .enum.waermenutzung import Waermenutzung +from .enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage from .enum.wertermittlungsverfahren import Wertermittlungsverfahren from .enum.zaehlerauspraegung import Zaehlerauspraegung from .enum.zaehlergroesse import Zaehlergroesse from .enum.zaehlertyp import Zaehlertyp from .enum.zaehlertypspezifikation import ZaehlertypSpezifikation +from .enum.zeitreihentyp import Zeitreihentyp from .version import __gh_version__, __version__ from .zusatzattribut import ZusatzAttribut diff --git a/src/bo4e/bo/bilanzierung.py b/src/bo4e/bo/bilanzierung.py new file mode 100644 index 000000000..ad9586651 --- /dev/null +++ b/src/bo4e/bo/bilanzierung.py @@ -0,0 +1,81 @@ +""" +Contains class Bilanzierung +""" + +from datetime import datetime +from decimal import Decimal +from typing import Annotated, Optional + +from pydantic import Field + +from bo4e.bo.geschaeftsobjekt import Geschaeftsobjekt +from bo4e.com.lastprofil import Lastprofil +from bo4e.com.menge import Menge +from bo4e.enum.aggregationsverantwortung import Aggregationsverantwortung +from bo4e.enum.fallgruppenzuordnung import Fallgruppenzuordnung +from bo4e.enum.profiltyp import Profiltyp +from bo4e.enum.prognosegrundlage import Prognosegrundlage +from bo4e.enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage +from bo4e.enum.zeitreihentyp import Zeitreihentyp + +from ..enum.abwicklungsmodell import Abwicklungsmodell +from ..enum.typ import Typ + + +class Bilanzierung(Geschaeftsobjekt): + """ + Das BO Bilanzierung erfasst alle relevanten Informationen zur Bilanzierung. + + .. raw:: html + + + + .. HINT:: + `Lastprofil JSON Schema `_ + + """ + + typ: Annotated[Optional[Typ], Field(alias="_typ")] = Typ.BILANZIERUNG + + marktlokations_id: Optional[str] = None #: ID der Marktlokation + lastprofil: Optional[list[Lastprofil]] = None #: Eine Liste der verwendeten Lastprofile (SLP, SLP/TLP, ALP etc.) + bilanzierungsbeginn: Optional[datetime] = None #: Inklusiver Start der Bilanzierung + bilanzierungsende: Optional[datetime] = None #: Exklusives Ende der Bilanzierung + bilanzkreis: Optional[str] = None #: Bilanzkreis + jahresverbrauchsprognose: Optional[Menge] = None #: Jahresverbrauchsprognose + temperatur_arbeit: Optional[Menge] = None #: Temperatur Arbeit + kundenwert: Optional[Menge] = None #: Kundenwert + verbrauchsaufteilung: Optional[Decimal] = None + """ + Verbrauchsaufteilung in % zwischen SLP und TLP-Profil. + + 1. [Gemessene Energiemenge der OBIS "nicht Schwachlast"] * [Verbrauchsaufteilung in % / 100%] + = [zu verlagernde Energiemenge] + 2. [Gemessene Energiemenge der OBIS "Schwachlast"] - [zu verlagernde Energiemenge] + = [Ermittelte Energiemenge für Schwachlast] + 3. [Gemessene Energiemenge der OBIS "nicht Schwachlast"] + [zu verlagernde Energiemenge] + = [Ermittelte Energiemenge für nicht Schwachlast] + """ + zeitreihentyp: Optional[Zeitreihentyp] = None #: Zeitreihentyp (SLS, TLS, etc.) + aggregationsverantwortung: Optional[Aggregationsverantwortung] = None #: Aggregationsverantwortung + prognosegrundlage: Optional[Prognosegrundlage] = None #: Prognosegrundlage + details_prognosegrundlage: Optional[list[Profiltyp]] = None + """ + Prognosegrundlage. + + Besteht der Bedarf ein tagesparameteräbhängiges Lastprofil mit gemeinsamer Messung anzugeben, + so ist dies über die 2 -malige Wiederholung des CAV Segments mit der Angabe der Codes E02 und E14 möglich. + """ + wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None + """ + Wahlrecht der Prognosegrundlage. + """ + fallgruppenzuordnung: Optional[Fallgruppenzuordnung] = None #: Fallgruppenzuordnung (für gas RLM) + prioritaet: Optional[int] = None #: Priorität des Bilanzkreises (für Gas) + grund_wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None + """ + Grund Wahlrecht der Prognosegrundlage. + + true=Wahlrecht beim Lieferanten vorhanden + """ + abwicklungsmodell: Optional[Abwicklungsmodell] = None #: Abwicklungsmodell diff --git a/src/bo4e/bo/energiemenge.py b/src/bo4e/bo/energiemenge.py index ed1043ea1..247489eaf 100644 --- a/src/bo4e/bo/energiemenge.py +++ b/src/bo4e/bo/energiemenge.py @@ -37,7 +37,6 @@ class Energiemenge(Geschaeftsobjekt): typ: Annotated[Literal[Typ.ENERGIEMENGE], Field(alias="_typ")] = Typ.ENERGIEMENGE lokations_id: Optional[str] = None """Eindeutige Nummer der Marktlokation bzw. der Messlokation, zu der die Energiemenge gehört""" - # todo: add validator such that only mess- or marktlokations IDs are accepted + cross check with lokationstyp lokationstyp: Optional["Lokationstyp"] = None """Gibt an, ob es sich um eine Markt- oder Messlokation handelt""" diff --git a/src/bo4e/com/lastprofil.py b/src/bo4e/com/lastprofil.py new file mode 100644 index 000000000..0fd80c1f0 --- /dev/null +++ b/src/bo4e/com/lastprofil.py @@ -0,0 +1,34 @@ +""" +Contains class Lastprofil +""" + +from typing import Optional + +from bo4e.com.com import COM +from bo4e.com.tagesparameter import Tagesparameter +from bo4e.enum.profilart import Profilart +from bo4e.enum.profilverfahren import Profilverfahren + + +class Lastprofil(COM): + """ + Informationen zum Lastprofil. + + .. raw:: html + + + + .. HINT:: + `Lastprofil JSON Schema `_ + + """ + + bezeichnung: Optional[str] = None #: Bezeichnung des Profils, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) + profilschar: Optional[str] = ( + None #: Bezeichnung der Profilschar, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) + ) + verfahren: Optional[Profilverfahren] = None #: Verfahren des Profils (analytisch oder synthetisch) + ist_einspeisung: Optional[bool] = None #: Einspeiseprofil: True/False + tagesparameter: Optional[Tagesparameter] = None #: Klimazone / Temperaturmessstelle + profilart: Optional[Profilart] = None #: Profilart des Lastprofils, e.g. ART_STANDARDLASTPROFIL + herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW diff --git a/src/bo4e/com/tagesparameter.py b/src/bo4e/com/tagesparameter.py new file mode 100644 index 000000000..f76793d30 --- /dev/null +++ b/src/bo4e/com/tagesparameter.py @@ -0,0 +1,19 @@ +""" +Contains tagesparameter class +""" + +from typing import Optional + +from bo4e.com.com import COM + + +class Tagesparameter(COM): + """ + Speichert Informationen zu einer tagesparameter abhängigen Messstelle. z.B. den Namen einer Klimazone oder die ID + der Wetterstation für die Temperaturmessstelle + """ + + klimazone: Optional[str] = None #: Qualifier der Klimazone, e.g. 7624q + temperaturmessstelle: Optional[str] = None #: Qualifier der Temperaturmessstelle, e.g. 1234x + dienstanbieter: Optional[str] = None #: Dienstanbieter (bei Temperaturmessstellen), e.g. ZT1 + herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW diff --git a/src/bo4e/enum/abwicklungsmodell.py b/src/bo4e/enum/abwicklungsmodell.py new file mode 100644 index 000000000..467a0b144 --- /dev/null +++ b/src/bo4e/enum/abwicklungsmodell.py @@ -0,0 +1,11 @@ +# pylint: disable=missing-module-docstring +from bo4e.enum.strenum import StrEnum + + +class Abwicklungsmodell(StrEnum): + """ + Art des Abwicklungsmodell (E-Mob) + """ + + MODELL_1 = "MODELL_1" #: Modell 1 "Bilanzierung an der Marktlokation" + MODELL_2 = "MODELL_2" #: Modell 2 "Bilanzierung im Bilanzierungsgebiet (BG) des LPB diff --git a/src/bo4e/enum/aggregationsverantwortung.py b/src/bo4e/enum/aggregationsverantwortung.py new file mode 100644 index 000000000..8f60f58a0 --- /dev/null +++ b/src/bo4e/enum/aggregationsverantwortung.py @@ -0,0 +1,14 @@ +""" +Contains class Aggregationsverantwortungs +""" + +from bo4e.enum.strenum import StrEnum + + +class Aggregationsverantwortung(StrEnum): + """ + Mögliche Qualifier für die Aggregationsverantwortung + """ + + UENB = "UENB" #: Übertragungsnetzbetreiber + VNB = "VNB" #: Verteilnetzbetreiber diff --git a/src/bo4e/enum/fallgruppenzuordnung.py b/src/bo4e/enum/fallgruppenzuordnung.py new file mode 100644 index 000000000..42307c2d7 --- /dev/null +++ b/src/bo4e/enum/fallgruppenzuordnung.py @@ -0,0 +1,18 @@ +""" +Contains Enums for Fallgruppenzuordnung +""" + +from bo4e.enum.strenum import StrEnum + + +class Fallgruppenzuordnung(StrEnum): + """ + Fallgruppenzuordnung nach edi@energy + """ + + GABI_RLM_MIT_TAGESBAND = "GABI_RLM_MIT_TAGESBAND" + """RLM mit Tagesband""" + GABI_RLM_OHNE_TAGESBAND = "GABI_RLM_OHNE_TAGESBAND" + """RLM ohne Tagesband""" + GABI_RLM_IM_NOMINIERUNGSERSATZVERFAHREN = "GABI_RLM_IM_NOMINIERUNGSERSATZVERFAHREN" + """RLM im Nominierungsersatzverfahren""" diff --git a/src/bo4e/enum/profilart.py b/src/bo4e/enum/profilart.py new file mode 100644 index 000000000..70337ea95 --- /dev/null +++ b/src/bo4e/enum/profilart.py @@ -0,0 +1,19 @@ +""" +Contains Enums for Profilart. +""" + +from bo4e.enum.strenum import StrEnum + + +class Profilart(StrEnum): + """ + Profilart: temperaturabh./Standardlastprofil. + """ + + ART_STANDARDLASTPROFIL = "ART_STANDARDLASTPROFIL" #: ART_STANDARDLASTPROFIL, Z02 + ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL = "ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL" + """ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL, Z03""" + ART_LASTPROFIL = "ART_LASTPROFIL" #: ART_LASTPROFIL, Z12 + ART_STANDARDEINSPEISEPROFIL = "ART_STANDARDEINSPEISEPROFIL" #: ART_STANDARDEINSPEISEPROFIL, Z04 + ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL = "ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL" + #: ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL, Z05 diff --git a/src/bo4e/enum/profiltyp.py b/src/bo4e/enum/profiltyp.py new file mode 100644 index 000000000..d2067b21c --- /dev/null +++ b/src/bo4e/enum/profiltyp.py @@ -0,0 +1,14 @@ +""" +Contains Enums for Profiltyp. +""" + +from bo4e.enum.strenum import StrEnum + + +class Profiltyp(StrEnum): + """ + Profiltyp (temperaturabhängig / Standardlastprofil). + """ + + SLP_SEP = "SLP_SEP" #: SLP/SEP + TLP_TEP = "TLP_TEP" #: TLP/TEP diff --git a/src/bo4e/enum/profilverfahren.py b/src/bo4e/enum/profilverfahren.py new file mode 100644 index 000000000..6c726911d --- /dev/null +++ b/src/bo4e/enum/profilverfahren.py @@ -0,0 +1,14 @@ +""" +Contains Enums for Profilverfahren. +""" + +from bo4e.enum.strenum import StrEnum + + +class Profilverfahren(StrEnum): + """ + Profilverfahren: synthetisch/ analytisch. + """ + + SYNTHETISCH = "SYNTHETISCH" #: SLP + ANALYTISCH = "ANALYTISCH" #: ALP diff --git a/src/bo4e/enum/prognosegrundlage.py b/src/bo4e/enum/prognosegrundlage.py new file mode 100644 index 000000000..d244325dc --- /dev/null +++ b/src/bo4e/enum/prognosegrundlage.py @@ -0,0 +1,14 @@ +""" +Contains Enums for Prognosegrundlage. +""" + +from bo4e.enum.strenum import StrEnum + + +class Prognosegrundlage(StrEnum): + """ + Prognosegrundlage (WERTE, PROFILE). + """ + + WERTE = "WERTE" #: Prognose auf Basis von Werten + PROFILE = "PROFILE" #: Prognose auf Basis von Profilen diff --git a/src/bo4e/enum/typ.py b/src/bo4e/enum/typ.py index d3dcdaf46..ba853fba6 100644 --- a/src/bo4e/enum/typ.py +++ b/src/bo4e/enum/typ.py @@ -9,6 +9,7 @@ class Typ(StrEnum): ANGEBOT = "ANGEBOT" AUSSCHREIBUNG = "AUSSCHREIBUNG" + BILANZIERUNG = "BILANZIERUNG" BUENDELVERTRAG = "BUENDELVERTRAG" ENERGIEMENGE = "ENERGIEMENGE" FREMDKOSTEN = "FREMDKOSTEN" diff --git a/src/bo4e/enum/wahlrechtprognosegrundlage.py b/src/bo4e/enum/wahlrechtprognosegrundlage.py new file mode 100644 index 000000000..436a752df --- /dev/null +++ b/src/bo4e/enum/wahlrechtprognosegrundlage.py @@ -0,0 +1,18 @@ +""" +Contains Enums for Wahlrechtsprognosgrundlage. +""" + +from bo4e.enum.strenum import StrEnum + + +class WahlrechtPrognosegrundlage(StrEnum): + """ + Wahlrecht der Prognosegrundlage der Marktlokation. + """ + + DURCH_LF = "DURCH_LF" #: Wahlrecht durch LF gegeben, remark: SG10 CAV + DURCH_LF_NICHT_GEGEBEN = "DURCH_LF_NICHT_GEGEBEN" #: Wahlrecht durch LF nicht gegeben, remark: CAV + ZE2 + NICHT_WEGEN_GROSSEN_VERBRAUCHS = "NICHT_WEGEN_GROSSEN_VERBRAUCHS" # : kein WR, Verbrauch>10k, CAV+ Z55 + NICHT_WEGEN_EIGENVERBRAUCH = "NICHT_WEGEN_EIGENVERBRAUCH" #: kein WR, Eigenverbrauch, CAV + ZC1 + NICHT_WEGEN_TAGES_VERBRAUCH = "NICHT_WEGEN_TAGES_VERBRAUCH" # : kein WR, tagesparam.abh. Verbrauch, CAV + ZD2 + NICHT_WEGEN_ENWG = "NICHT_WEGEN_ENWG" #: WR nicht wegen $14a EnWG, CAV + ZE3 diff --git a/src/bo4e/enum/zeitreihentyp.py b/src/bo4e/enum/zeitreihentyp.py new file mode 100644 index 000000000..fc7843a6e --- /dev/null +++ b/src/bo4e/enum/zeitreihentyp.py @@ -0,0 +1,25 @@ +""" +Contains Enums for Zeitreihentyp. +""" + +from bo4e.enum.strenum import StrEnum + + +class Zeitreihentyp(StrEnum): + """ + Codes der Summenzeitreihentypen. + + Die nachfolgenden Codes sind in DE7111 zu nutzen: + https://www.edi-energy.de/index.php?id=38&tx_bdew_bdew%5Buid%5D=695&tx_bdew_bdew%5Baction%5D=download + &tx_bdew_bdew%5Bcontroller%5D=Dokument&cHash=67782e05d8b0f75fbe3a0e1801d07ed0 + """ + + EGS = "EGS" #: Einspeisegangsumme + LGS = "LGS" #: Lastgangsumme + NZR = "NZR" #: Netzzeitreihe + SES = "SES" #: Standardeinspeiseprofilsumme + SLS = "SLS" #: Standardlastsumme + TES = "TES" #: tagesparameterabhängige Einspeiseprofilsumme + TLS = "TLS" #: tagesparameterabhängige Lastprofilsumme + SLS_TLS = "SLS_TLS" #: gemeinsame Messung aus SLS und TLS + SES_TES = "SES_TES" #: gemeinsame Messung aus SES und TES diff --git a/tests/test_bilanzierung.py b/tests/test_bilanzierung.py new file mode 100644 index 000000000..9a70acff1 --- /dev/null +++ b/tests/test_bilanzierung.py @@ -0,0 +1,66 @@ +from datetime import datetime, timezone + +import pytest +from _decimal import Decimal + +from bo4e.bo.bilanzierung import Bilanzierung +from bo4e.com.lastprofil import Lastprofil +from bo4e.com.menge import Menge +from bo4e.com.tagesparameter import Tagesparameter +from bo4e.enum.aggregationsverantwortung import Aggregationsverantwortung +from bo4e.enum.fallgruppenzuordnung import Fallgruppenzuordnung +from bo4e.enum.mengeneinheit import Mengeneinheit +from bo4e.enum.profilart import Profilart +from bo4e.enum.profiltyp import Profiltyp +from bo4e.enum.profilverfahren import Profilverfahren +from bo4e.enum.prognosegrundlage import Prognosegrundlage +from bo4e.enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage +from bo4e.enum.zeitreihentyp import Zeitreihentyp +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestBilanzierung: + @pytest.mark.parametrize( + "bilanzierung", + [ + pytest.param( + Bilanzierung( + marktlokations_id="51238696781", + lastprofil=[ + Lastprofil( + bezeichnung="foo", + profilschar="foo2", + verfahren=Profilverfahren.SYNTHETISCH, + ist_einspeisung=True, + tagesparameter=Tagesparameter( + klimazone="7624q", + temperaturmessstelle="1234x", + dienstanbieter="ZT1", + herausgeber="BDEW", + ), + profilart=Profilart.ART_LASTPROFIL, + herausgeber="BDEW", + ) + ], + bilanzierungsbeginn=datetime(2022, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + bilanzierungsende=datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + bilanzkreis="foo", + jahresverbrauchsprognose=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH), + temperatur_arbeit=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH), + # todo: check einheiten + kundenwert=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH), + verbrauchsaufteilung=Decimal(1.5), + zeitreihentyp=Zeitreihentyp.EGS, + aggregationsverantwortung=Aggregationsverantwortung.VNB, + prognosegrundlage=Prognosegrundlage.WERTE, + details_prognosegrundlage=[Profiltyp.SLP_SEP], + wahlrecht_prognosegrundlage=WahlrechtPrognosegrundlage.DURCH_LF, + fallgruppenzuordnung=Fallgruppenzuordnung.GABI_RLM_MIT_TAGESBAND, + prioritaet=1, + grund_wahlrecht_prognosegrundlage=WahlrechtPrognosegrundlage.DURCH_LF_NICHT_GEGEBEN, + ) + ), + ], + ) + def test_serialization_roundtrip(self, bilanzierung: Bilanzierung) -> None: + assert_serialization_roundtrip(bilanzierung) diff --git a/tests/test_lastprofil.py b/tests/test_lastprofil.py new file mode 100644 index 000000000..354e94d57 --- /dev/null +++ b/tests/test_lastprofil.py @@ -0,0 +1,36 @@ +import pytest + +from bo4e.com.lastprofil import Lastprofil +from bo4e.com.tagesparameter import Tagesparameter +from bo4e.enum.profilart import Profilart +from bo4e.enum.profilverfahren import Profilverfahren +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestLastprofil: + @pytest.mark.parametrize( + "lastprofil", + [ + pytest.param( + Lastprofil( + bezeichnung="foo", + profilschar="foo2", + verfahren=Profilverfahren.SYNTHETISCH, + ist_einspeisung=True, + tagesparameter=Tagesparameter( + klimazone="7624q", + temperaturmessstelle="1234x", + dienstanbieter="ZT1", + herausgeber="BDEW", + ), + profilart=Profilart.ART_LASTPROFIL, + herausgeber="BDEW", + ) + ), + ], + ) + def test_serialization_roundtrip(self, lastprofil: Lastprofil) -> None: + """ + Test de-/serialisation + """ + assert_serialization_roundtrip(lastprofil) diff --git a/tests/test_tagesparameter.py b/tests/test_tagesparameter.py new file mode 100644 index 000000000..a52d3851b --- /dev/null +++ b/tests/test_tagesparameter.py @@ -0,0 +1,25 @@ +import pytest + +from bo4e.com.tagesparameter import Tagesparameter +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestTagesparameter: + @pytest.mark.parametrize( + "tagesparameter", + [ + pytest.param( + Tagesparameter( + klimazone="7624q", + temperaturmessstelle="1234x", + dienstanbieter="ZT1", + herausgeber="BDEW", + ) + ), + ], + ) + def test_serialization_roundtrip(self, tagesparameter: Tagesparameter) -> None: + """ + Test de-/serialisation of Tagesparameter. + """ + assert_serialization_roundtrip(tagesparameter)