Repository: bo4e/BO4E-python (language: python)

Issue:
Implement Preisblatt Konzessionsabgabe
https://www.bo4e.de/dokumentation/geschaeftsobjekte/bo-preisblattkonzessionsabgabe
- #200 
- #98 


Discussion / hints:

Fix patch:
diff --git a/src/bo4e/bo/preisblattkonzessionsabgabe.py b/src/bo4e/bo/preisblattkonzessionsabgabe.py
new file mode 100644
index 000000000..951a396aa
--- /dev/null
+++ b/src/bo4e/bo/preisblattkonzessionsabgabe.py
@@ -0,0 +1,35 @@
+"""
+Contains PreisblattKonzessionsabgabe class and corresponding marshmallow schema for de-/serialization
+"""
+
+import attr
+from marshmallow_enum import EnumField  # type:ignore[import]
+
+from bo4e.bo.preisblatt import Preisblatt, PreisblattSchema
+from bo4e.enum.botyp import BoTyp
+from bo4e.enum.kundengruppeka import KundengruppeKA
+
+
+# pylint: disable=too-few-public-methods
+@attr.s(auto_attribs=True, kw_only=True)
+class PreisblattKonzessionsabgabe(Preisblatt):
+    """
+    Die Variante des Preisblattmodells zur Abbildung von allgemeinen Abgaben
+    """
+
+    bo_typ: BoTyp = attr.ib(default=BoTyp.PREISBLATTKONZESSIONSABGABE)
+    # required attributes (additional to those of Preisblatt)
+    #: Kundegruppe anhand derer die Höhe der Konzessionabgabe festgelegt ist
+    kundengruppe_k_a: KundengruppeKA = attr.ib(validator=attr.validators.instance_of(KundengruppeKA))
+
+    # there are no optional attributes (additionally to those of Preisblatt)
+
+
+class PreisblattKonzessionsabgabeSchema(PreisblattSchema):
+    """
+    Schema for de-/serialization of PreisblattKonzessionsabgabe
+    """
+
+    class_name = PreisblattKonzessionsabgabe  # type:ignore[assignment]
+    # required attributes
+    kundengruppe_k_a = EnumField(KundengruppeKA, data_key="kundengruppeKA")


Test patch:
diff --git a/tests/test_preisblatt_konzessionsabgabe.py b/tests/test_preisblatt_konzessionsabgabe.py
new file mode 100644
index 000000000..1fc8d5d72
--- /dev/null
+++ b/tests/test_preisblatt_konzessionsabgabe.py
@@ -0,0 +1,39 @@
+import pytest  # type:ignore[import]
+
+from bo4e.bo.preisblattkonzessionsabgabe import PreisblattKonzessionsabgabe, PreisblattKonzessionsabgabeSchema
+from bo4e.enum.kundengruppeka import KundengruppeKA
+from bo4e.enum.preisstatus import Preisstatus
+from bo4e.enum.sparte import Sparte
+from tests.serialization_helper import assert_serialization_roundtrip  # type:ignore[import]
+from tests.test_marktteilnehmer import example_marktteilnehmer  # type:ignore[import]
+from tests.test_preisposition import example_preisposition  # type:ignore[import]
+from tests.test_zeitraum import example_zeitraum  # type:ignore[import]
+
+
+class TestPreisblatt:
+    @pytest.mark.parametrize(
+        "preisblatt_ka",
+        [
+            pytest.param(
+                PreisblattKonzessionsabgabe(
+                    bezeichnung="foo",
+                    sparte=Sparte.STROM,
+                    preisstatus=Preisstatus.ENDGUELTIG,
+                    preispositionen=[example_preisposition],
+                    gueltigkeit=example_zeitraum,
+                    herausgeber=example_marktteilnehmer,
+                    kundengruppe_k_a=KundengruppeKA.G_SONDERKUNDE,
+                )
+            ),
+        ],
+    )
+    def test_serialization_roundtrip(self, preisblatt_ka: PreisblattKonzessionsabgabe):
+        """
+        Test de-/serialisation
+        """
+        assert_serialization_roundtrip(preisblatt_ka, PreisblattKonzessionsabgabeSchema())
+
+    def test_missing_required_attribute(self):
+        with pytest.raises(TypeError) as excinfo:
+            _ = PreisblattKonzessionsabgabe()
+        assert "missing 6 required" in str(excinfo.value)  # 5 from preisblatt + 1 from preisblatt konzessionsabgabe