Skip to content

Commit 97c8bd8

Browse files
authored
Implement BO Fremdkosten (#332)
1 parent 2f42f89 commit 97c8bd8

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

src/bo4e/bo/fremdkosten.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
Contains Fremdkosten class and corresponding marshmallow schema for de-/serialization
3+
"""
4+
from typing import List, Optional
5+
6+
import attr
7+
from marshmallow import fields
8+
9+
from bo4e.bo.geschaeftsobjekt import Geschaeftsobjekt, GeschaeftsobjektSchema
10+
from bo4e.com.betrag import Betrag, BetragSchema
11+
from bo4e.com.fremdkostenblock import Fremdkostenblock, FremdkostenblockSchema
12+
from bo4e.com.zeitraum import Zeitraum, ZeitraumSchema
13+
from bo4e.enum.botyp import BoTyp
14+
15+
16+
# pylint: disable=too-few-public-methods
17+
@attr.s(auto_attribs=True, kw_only=True)
18+
class Fremdkosten(Geschaeftsobjekt):
19+
"""
20+
Mit diesem BO werden die Fremdkosten, beispielsweise für eine Angebotserstellung oder eine Rechnungsprüfung,
21+
übertragen.
22+
Die Fremdkosten enthalten dabei alle Kostenblöcke, die von anderen Marktteilnehmern oder Instanzen erhoben werden.
23+
"""
24+
25+
# required attributes
26+
bo_typ: BoTyp = attr.ib(default=BoTyp.FREMDKOSTEN)
27+
#: Für diesen Zeitraum wurden die Kosten ermittelt
28+
gueltigkeit: Zeitraum = attr.ib(validator=attr.validators.instance_of(Zeitraum))
29+
# optional attributes
30+
#: Die Gesamtsumme über alle Kostenblöcke und -positionen
31+
summe_kosten: Optional[Betrag] = attr.ib(
32+
validator=attr.validators.optional(attr.validators.instance_of(Betrag)), default=None
33+
)
34+
#: In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc
35+
kostenbloecke: Optional[List[Fremdkostenblock]] = attr.ib(
36+
default=None,
37+
validator=attr.validators.optional(
38+
attr.validators.deep_iterable(
39+
member_validator=attr.validators.instance_of(Fremdkostenblock),
40+
iterable_validator=attr.validators.instance_of(list),
41+
)
42+
),
43+
)
44+
45+
46+
class FremdkostenSchema(GeschaeftsobjektSchema):
47+
"""
48+
Schema for de-/serialization of Fremdkosten
49+
"""
50+
51+
class_name = Fremdkosten
52+
# required attributes
53+
gueltigkeit = fields.Nested(ZeitraumSchema)
54+
55+
# optional attributes
56+
summe_kosten = fields.Nested(BetragSchema, load_default=None)
57+
kostenbloecke = fields.List(fields.Nested(FremdkostenblockSchema), load_default=None)

src/bo4e/enum/botyp.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class BoTyp(StrEnum):
1212
AUSSCHREIBUNG = "AUSSCHREIUNG"
1313
BUENDELVERTRAG = "BUENDELVERTRAG"
1414
ENERGIEMENGE = "ENERGIEMENGE"
15+
FREMDKOSTEN = "FREMDKOSTEN"
1516
# It is practical to use the BoTyp Enum as discriminator in the database.
1617
# Therefore, we added one additional entry for GESCHAEFTSOBJEKT
1718
# This is not defined by the documentation!

tests/test_fremdkosten.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import pytest # type:ignore[import]
2+
3+
from bo4e.bo.fremdkosten import Fremdkosten, FremdkostenSchema
4+
from bo4e.com.fremdkostenblock import Fremdkostenblock
5+
from tests.serialization_helper import assert_serialization_roundtrip # type:ignore[import]
6+
from tests.test_betrag import example_betrag # type:ignore[import]
7+
from tests.test_zeitraum import example_zeitraum # type:ignore[import]
8+
9+
10+
class TestFremdkosten:
11+
@pytest.mark.parametrize(
12+
"fremdkosten",
13+
[
14+
pytest.param(
15+
Fremdkosten(
16+
gueltigkeit=example_zeitraum,
17+
summe_kosten=example_betrag,
18+
kostenbloecke=[Fremdkostenblock(kostenblockbezeichnung="teststring")],
19+
)
20+
),
21+
],
22+
)
23+
def test_serialization_roundtrip(self, fremdkosten: Fremdkosten):
24+
"""
25+
Test de-/serialisation
26+
"""
27+
assert_serialization_roundtrip(fremdkosten, FremdkostenSchema())
28+
29+
def test_missing_required_attribute(self):
30+
with pytest.raises(TypeError) as excinfo:
31+
_ = Fremdkosten()
32+
assert "missing 1 required" in str(excinfo.value)

0 commit comments

Comments
 (0)