diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py
index 255977773..4d9316103 100644
--- a/src/bo4e/__init__.py
+++ b/src/bo4e/__init__.py
@@ -177,6 +177,7 @@
"TechnischeRessourceVerbrauchsart",
"Themengebiet",
"Titel",
+ "Erreichbarkeit",
"Typ",
"Verbrauchsart",
"Vertragsart",
@@ -192,6 +193,7 @@
"Zaehlergroesse",
"Zaehlertyp",
"ZaehlertypSpezifikation",
+ "Zeitfenster",
"ZusatzAttribut",
"__version__",
"__gh_version__",
@@ -252,6 +254,7 @@
from .com.dienstleistung import Dienstleistung
from .com.energieherkunft import Energieherkunft
from .com.energiemix import Energiemix
+from .com.erreichbarkeit import Erreichbarkeit
from .com.fremdkostenblock import Fremdkostenblock
from .com.fremdkostenposition import Fremdkostenposition
from .com.geokoordinaten import Geokoordinaten
@@ -293,6 +296,7 @@
from .com.verwendungszweckpromarktrolle import VerwendungszweckProMarktrolle
from .com.zaehlwerk import Zaehlwerk
from .com.zaehlzeitregister import Zaehlzeitregister
+from .com.zeitfenster import Zeitfenster
from .com.zeitraum import Zeitraum
from .com.zeitreihenwert import Zeitreihenwert
from .com.zeitspanne import Zeitspanne
diff --git a/src/bo4e/bo/geschaeftspartner.py b/src/bo4e/bo/geschaeftspartner.py
index 992bb0650..869d0b0c4 100644
--- a/src/bo4e/bo/geschaeftspartner.py
+++ b/src/bo4e/bo/geschaeftspartner.py
@@ -8,6 +8,7 @@
from pydantic import Field
+from ..com.erreichbarkeit import Erreichbarkeit
from ..enum.typ import Typ
from ..utils import postprocess_docstring
from .geschaeftsobjekt import Geschaeftsobjekt
@@ -82,3 +83,4 @@ class Geschaeftspartner(Geschaeftsobjekt):
#: Todo: Add optional connection to marktteilnehmer as discussed in workshop
#: not clear what is the best solution here - circular import marktteilnehmer?
#: discussed in workshop on Feb 6 2024: yes we need the bidirectional option, let's figure out a solution somehow.
+ erreichbarkeit: Optional[Erreichbarkeit] = None
diff --git a/src/bo4e/com/erreichbarkeit.py b/src/bo4e/com/erreichbarkeit.py
new file mode 100644
index 000000000..57eaee358
--- /dev/null
+++ b/src/bo4e/com/erreichbarkeit.py
@@ -0,0 +1,39 @@
+"""
+Contains Erreichbarkeit class and corresponding marshmallow schema for de-/serialization
+"""
+
+# pylint: disable=too-few-public-methods, too-many-instance-attributes
+# pylint: disable=no-name-in-module
+
+from typing import Optional
+
+from ..com.zeitfenster import Zeitfenster
+from ..utils import postprocess_docstring
+from .com import COM
+
+
+@postprocess_docstring
+class Erreichbarkeit(COM):
+ """
+ Eine Komponente zur Abbildung der Erreichbarkeit
+
+ .. raw:: html
+
+
+
+ .. HINT::
+ `Erreichbarkeit JSON Schema `_
+
+ """
+
+ montag_erreichbarkeit: Optional[Zeitfenster] = None
+
+ dienstag_erreichbarkeit: Optional[Zeitfenster] = None
+
+ mittwoch_erreichbarkeit: Optional[Zeitfenster] = None
+
+ donnerstag_erreichbarkeit: Optional[Zeitfenster] = None
+
+ freitag_erreichbarkeit: Optional[Zeitfenster] = None
+
+ mittagspause: Optional[Zeitfenster] = None
diff --git a/src/bo4e/com/zeitfenster.py b/src/bo4e/com/zeitfenster.py
new file mode 100644
index 000000000..6ef67c729
--- /dev/null
+++ b/src/bo4e/com/zeitfenster.py
@@ -0,0 +1,30 @@
+"""
+Contains Zeitfenster class and corresponding marshmallow schema for de-/serialization
+"""
+
+# pylint: disable=too-few-public-methods, too-many-instance-attributes
+# pylint: disable=no-name-in-module
+
+from datetime import time
+from typing import Optional
+
+from ..utils import postprocess_docstring
+from .com import COM
+
+
+@postprocess_docstring
+class Zeitfenster(COM):
+ """
+ Eine Komponente zur Abbildung des Zeitfensters für die Erreichbarkeit
+
+ .. raw:: html
+
+
+
+ .. HINT::
+ `Zeitfenster JSON Schema `_
+
+ """
+
+ startzeit: Optional[time] = None
+ endzeit: Optional[time] = None
diff --git a/tests/test_erreichbarkeit.py b/tests/test_erreichbarkeit.py
new file mode 100644
index 000000000..5bf6ff63f
--- /dev/null
+++ b/tests/test_erreichbarkeit.py
@@ -0,0 +1,42 @@
+from datetime import time, timezone
+
+import pytest
+
+from bo4e.com.erreichbarkeit import Erreichbarkeit
+from bo4e.com.zeitfenster import Zeitfenster
+from tests.serialization_helper import assert_serialization_roundtrip
+
+
+class TestErreichbarkeit:
+ @pytest.mark.parametrize(
+ "erreichbarkeit",
+ [
+ pytest.param(
+ Erreichbarkeit(
+ montag_erreichbarkeit=Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ dienstag_erreichbarkeit=Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ mittwoch_erreichbarkeit=Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ donnerstag_erreichbarkeit=Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ freitag_erreichbarkeit=Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ mittagspause=Zeitfenster(
+ startzeit=time(12, 00, tzinfo=timezone.utc), endzeit=time(13, 00, tzinfo=timezone.utc)
+ ),
+ ),
+ ),
+ ],
+ )
+ def test_serialization_roundtrip(self, erreichbarkeit: Erreichbarkeit) -> None:
+ """
+ Test de-/serialisation of Erreichbarkeit.
+ """
+ assert_serialization_roundtrip(erreichbarkeit)
diff --git a/tests/test_geschaeftspartner.py b/tests/test_geschaeftspartner.py
index 786ad90af..0761301a5 100644
--- a/tests/test_geschaeftspartner.py
+++ b/tests/test_geschaeftspartner.py
@@ -1,3 +1,5 @@
+from datetime import time, timezone
+
import pytest
from bo4e import (
@@ -11,6 +13,8 @@
Person,
Titel,
)
+from bo4e.com.erreichbarkeit import Erreichbarkeit
+from bo4e.com.zeitfenster import Zeitfenster
from tests.serialization_helper import assert_serialization_roundtrip
@@ -55,6 +59,20 @@ class TestGeschaeftspartner:
adresse=Adresse(
postleitzahl="1014", ort="Wien 1", strasse="Ballhausplatz", hausnummer="2", landescode=Landescode.AT # type: ignore[attr-defined]
),
+ erreichbarkeit=Erreichbarkeit(
+ montag_erreichbarkeit=Zeitfenster(
+ startzeit=time(14, 00, tzinfo=timezone.utc), endzeit=time(17, 00, tzinfo=timezone.utc)
+ ),
+ mittwoch_erreichbarkeit=Zeitfenster(
+ startzeit=time(6, 00, tzinfo=timezone.utc), endzeit=time(12, 00, tzinfo=timezone.utc)
+ ),
+ freitag_erreichbarkeit=Zeitfenster(
+ startzeit=time(5, 00, tzinfo=timezone.utc), endzeit=time(22, 00, tzinfo=timezone.utc)
+ ),
+ mittagspause=Zeitfenster(
+ startzeit=time(12, 00, tzinfo=timezone.utc), endzeit=time(13, 00, tzinfo=timezone.utc)
+ ),
+ ),
),
id="Landescode!=DE, DE is default",
),
diff --git a/tests/test_zeitfenster.py b/tests/test_zeitfenster.py
new file mode 100644
index 000000000..17149b9aa
--- /dev/null
+++ b/tests/test_zeitfenster.py
@@ -0,0 +1,25 @@
+from datetime import time, timezone
+
+import pytest
+
+from bo4e.com.zeitfenster import Zeitfenster
+from tests.serialization_helper import assert_serialization_roundtrip
+
+
+class TestZeitfenster:
+ @pytest.mark.parametrize(
+ "zeitfenster",
+ [
+ pytest.param(
+ Zeitfenster(
+ startzeit=time(8, 00, tzinfo=timezone.utc),
+ endzeit=time(17, 00, tzinfo=timezone.utc),
+ ),
+ ),
+ ],
+ )
+ def test_serialization_roundtrip(self, zeitfenster: Zeitfenster) -> None:
+ """
+ Test de-/serialisation of Zeitfenster.
+ """
+ assert_serialization_roundtrip(zeitfenster)