Skip to content

Commit 2424c66

Browse files
committed
Various changes
1 parent 9fefc1f commit 2424c66

7 files changed

Lines changed: 103 additions & 70 deletions

File tree

docs/restrictions.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ such that it can be implemented in most programming languages.
1717

1818
* In general, BOs won't be referenced by COMs but it's not prohibited. In fact, there are some cases in which a COM
1919
references a BO. Keep that in mind when designing a package structure e.g. to prevent circular import errors.
20-
* There are no circular references. This means, when drawing a reference graph of BO4E there will be no loops.
20+
* There are no circular references **except for** self references. A model can reference itself in the same class.
21+
This means, when drawing a reference graph of BO4E there will be no loops except for "tiny" loops corresponding
22+
to self references. E.g. `BO Rechnung` can have a field `teilrechnungen` of type `list[BO Rechnung]`.
23+
But it cannot reference another model which references back to `BO Rechnung`.
2124

2225
* As a result, we cannot directly support `n x m`-relationships as they would require a back-reference.
2326
If you're designing a database structure you have to manually add these relationship tables where needed.

src/bo4e/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
"VerwendungszweckProMarktrolle",
104104
"Zaehlwerk",
105105
"Zaehlzeitregister",
106+
"Zahlungsinformation",
106107
"Zeitraum",
107108
"Zeitreihenwert",
108109
"Zustaendigkeit",
@@ -202,7 +203,6 @@
202203
"ZaehlertypSpezifikation",
203204
"Zeitreihentyp",
204205
"ZusatzAttribut",
205-
"Zahlungsinformationen",
206206
"__version__",
207207
"__gh_version__",
208208
]
@@ -306,7 +306,7 @@
306306
from .com.verwendungszweckpromarktrolle import VerwendungszweckProMarktrolle
307307
from .com.zaehlwerk import Zaehlwerk
308308
from .com.zaehlzeitregister import Zaehlzeitregister
309-
from .com.zahlungsinformationen import Zahlungsinformationen
309+
from .com.zahlungsinformation import Zahlungsinformation
310310
from .com.zeitraum import Zeitraum
311311
from .com.zeitreihenwert import Zeitreihenwert
312312
from .com.zustaendigkeit import Zustaendigkeit

src/bo4e/bo/rechnung.py

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ..com.betrag import Betrag
1616
from ..com.rechnungsposition import Rechnungsposition
1717
from ..com.steuerbetrag import Steuerbetrag
18-
from ..com.zahlungsinformationen import Zahlungsinformationen
18+
from ..com.zahlungsinformation import Zahlungsinformation
1919
from ..com.zeitraum import Zeitraum
2020
from ..enum.netznutzungrechnungsart import NetznutzungRechnungsart
2121
from ..enum.netznutzungrechnungstyp import NetznutzungRechnungstyp
@@ -29,6 +29,7 @@
2929
from .marktteilnehmer import Marktteilnehmer
3030
from .messlokation import Messlokation
3131
from .vertrag import Vertrag
32+
from .zaehler import Zaehler
3233

3334
# pylint: disable=too-few-public-methods, too-many-instance-attributes
3435

@@ -48,11 +49,7 @@ class Rechnung(Geschaeftsobjekt):
4849
"""
4950

5051
typ: Annotated[Literal[BoTyp.RECHNUNG], Field(alias="_typ")] = BoTyp.RECHNUNG
51-
ist_storno: Optional[bool] = None
52-
"""
53-
Kennzeichnung, ob es sich um eine Stornorechnung handelt;
54-
im Falle "true" findet sich im Attribut "originalrechnungsnummer" die Nummer der Originalrechnung.
55-
"""
52+
5653
rechnungsnummer: Optional[str] = None
5754
"""Eine im Verwendungskontext eindeutige Nummer für die Rechnung"""
5855
rechnungsdatum: Optional[pydantic.AwareDatetime] = None
@@ -64,9 +61,13 @@ class Rechnung(Geschaeftsobjekt):
6461
rechnungsperiode: Optional["Zeitraum"] = None
6562
"""Der Zeitraum der zugrunde liegenden Lieferung zur Rechnung"""
6663
rechnungsersteller: Optional["Geschaeftspartner"] = None
67-
"""Der Aussteller der Rechnung, die Rollencodenummer kennt man über den im Geschäftspartner verlinkten Marktteilnehmer"""
64+
"""
65+
Der Aussteller der Rechnung. Die Rollencodenummer kennt man über den im Geschäftspartner verlinkten Marktteilnehmer.
66+
"""
6867
rechnungsempfaenger: Optional["Geschaeftspartner"] = None
69-
"""Der Aussteller der Rechnung, die Rollencodenummer kennt man über den im Geschäftspartner verlinkten Marktteilnehmer"""
68+
"""
69+
Der Aussteller der Rechnung. Die Rollencodenummer kennt man über den im Geschäftspartner verlinkten Marktteilnehmer.
70+
"""
7071
gesamtnetto: Optional["Betrag"] = None
7172
"""Die Summe der Nettobeträge der Rechnungsteile"""
7273
gesamtsteuer: Optional["Betrag"] = None
@@ -75,58 +76,68 @@ class Rechnung(Geschaeftsobjekt):
7576
"""Die Summe aus Netto- und Steuerbetrag"""
7677
zu_zahlen: Optional["Betrag"] = None
7778
"""Der zu zahlende Betrag, der sich aus (gesamtbrutto - vorausbezahlt - rabattBrutto) ergibt"""
79+
zaehler: Optional[list["Zaehler"]] = None
80+
zukuenftiger_abschlag: Optional["Betrag"] = None
81+
kaeuferreferenz: Optional[str] = None
82+
#!
83+
7884
rechnungspositionen: Optional[list["Rechnungsposition"]] = None
7985
"""Die Rechnungspositionen"""
80-
rechnungstitel: Optional[str] = None
86+
rechnungstitel: Optional[str] = None #!
8187
"""Bezeichnung für die vorliegende Rechnung"""
8288
rechnungsstatus: Optional["Rechnungsstatus"] = None
8389
"""Status der Rechnung zur Kennzeichnung des Bearbeitungsstandes"""
8490
original_rechnungsnummer: Optional[str] = None
8591
"""Im Falle einer Stornorechnung (storno = true) steht hier die Rechnungsnummer der stornierten Rechnung"""
86-
vorausgezahlt: Optional["Betrag"] = None
92+
vorausgezahlt: Optional["Betrag"] = None #!
8793
"""Die Summe evtl. vorausgezahlter Beträge, z.B. Abschläge. Angabe als Bruttowert"""
88-
rabatt_brutto: Optional["Betrag"] = None
89-
"""Gesamtrabatt auf den Bruttobetrag"""
90-
steuerbetraege: Optional[list["Steuerbetrag"]] = None
94+
rabatt_netto: Optional["Betrag"] = None
95+
"""Gesamtrabatt auf den Nettobetrag"""
96+
steuerbetraege: Optional[list["Steuerbetrag"]] = None #!
9197
"""
9298
Eine Liste mit Steuerbeträgen pro Steuerkennzeichen/Steuersatz;
9399
die Summe dieser Beträge ergibt den Wert für gesamtsteuer.
94100
"""
95-
sparte: Optional["Sparte"] = None
101+
sparte: Optional["Sparte"] = None #!
96102
"""Sparte (Strom, Gas ...) für die die Rechnung ausgestellt ist"""
97103
netznutzungrechnungsart: Optional["NetznutzungRechnungsart"] = None
98104
"""Aus der INVOIC entnommen, befüllt wenn es sich um eine Netznutzungsrechnung handelt"""
99105
netznutzungrechnungstyp: Optional["NetznutzungRechnungstyp"] = None
100106
"""Aus der INVOIC entnommen, befüllt wenn es sich um eine Netznutzungsrechnung handelt"""
101-
ist_original: Optional[bool] = None
107+
ist_original: Optional[bool] = None #!
102108
"""Kennzeichen, ob es sich um ein Original (true) oder eine Kopie handelt (false)"""
103-
ist_simuliert: Optional[bool] = None
109+
ist_simuliert: Optional[bool] = None #!
104110
"""Kennzeichen, ob es sich um eine simulierte Rechnung, z.B. zur Rechnungsprüfung handelt"""
111+
ist_storno: Optional[bool] = None #!
112+
"""
113+
Kennzeichnung, ob es sich um eine Stornorechnung handelt;
114+
im Falle "true" findet sich im Attribut "originalrechnungsnummer" die Nummer der Originalrechnung.
115+
"""
105116
marktlokation: Optional["Marktlokation"] = None
106117
"""Marktlokation, auf die sich die Rechnung bezieht"""
107118
messlokation: Optional["Messlokation"] = None
108119
"""Messlokation, auf die sich die Rechnung bezieht"""
109-
teilrechnungen: Optional[list["Rechnung"]]
120+
teilrechnungen: Optional[list["Rechnung"]] = None
110121
"""Rechnungen, die durch diese Rechnung zusammengefasst werden"""
111-
zahlungsinformationen: Optional["Zahlungsinformationen"]
122+
zahlungsinformationen: Optional[list["Zahlungsinformation"]] = None
112123
"""Informationen wie eine Rechnung bezahlt werden soll"""
113-
vertrag: Optional["Vertrag"]
124+
vertrag: Optional["Vertrag"] = None
114125
"""enthält Informationen über den der Rechnung zugrundeliegenden Vertrag für Rechnungen nach EnWG § 40"""
115-
messstellenbetreiber: Optional["Marktteilnehmer"]
126+
messstellenbetreiber: Optional["Marktteilnehmer"] = None
116127
"""der Messtellenbetreiber an der Lieferstelle, relevant für Rechnungen gemäß EnWG § 40"""
117-
netzbetreiber: Optional["Marktteilnehmer"]
128+
netzbetreiber: Optional["Marktteilnehmer"] = None
118129
"""der Netzbetreiber an der Lieferstelle, relevant für Rechnungen gemäß EnWG § 40"""
119-
anfangszaehlerstand: Optional["Energiemenge"]
130+
anfangszaehlerstand: Optional["Energiemenge"] = None
120131
"""Für Verbrauchsbasierte Rechnungen der Zählerstand zur Beginn des abgerechneten Zeitraums, Pflicht für Rechnungen gemäß EnWG § 40"""
121-
endzaehlerstand: Optional["Energiemenge"]
132+
endzaehlerstand: Optional["Energiemenge"] = None
122133
"""Für Verbrauchsbasierte Rechnungen der Zählerstand zum Ende des abgerechneten Zeitraums, Pflicht für Rechnungen gemäß EnWG § 40"""
123-
aktuellerverbrauch: Optional["Energiemenge"]
134+
aktueller_verbrauch: Optional["Energiemenge"] = None
124135
"""Verbrauch des abgerechneten Zeitraums, Pflicht für Rechnungen gemäß EnWG § 40"""
125-
jahresverbrauch: Optional["Energiemenge"]
136+
jahresverbrauch: Optional["Energiemenge"] = None
126137
"""ggf. auf einen Vergleichszeitraum hochgerechneter Verbrauch des abgerechneten Zeitraums zu Vergleichszwecken mit dem Vorjahr, gemäß EnWG § 40"""
127-
vorjahresverbrauch: Optional["Energiemenge"]
138+
vorjahresverbrauch: Optional["Energiemenge"] = None
128139
"""ggf. auf einen Vergleichszeitraum hochgerechneter Verbrauch des vorherigen Jahres zu Vergleichszwecken mit dem aktuellen Jahr, gemäß EnWG § 40"""
129-
fremdkosten: Optional["Fremdkosten"]
140+
fremdkosten: Optional["Fremdkosten"] = None
130141
"""Zur Ausweisung der in die Kalkulation eingeflossenen Preise gemäß EnWG § 40"""
131-
referenzverbrauch: Optional[list["Energiemenge"]]
142+
referenzverbraeuche: Optional[list["Energiemenge"]] = None
132143
"""Verbräuche von Referenzkundengruppen gemäß EnWG § 40"""
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""
2+
Contains Zahlungsinformation class
3+
"""
4+
5+
from decimal import Decimal
6+
from typing import TYPE_CHECKING, Annotated, Literal, Optional
7+
8+
from pydantic import Field
9+
10+
from ..enum.comtyp import ComTyp
11+
from ..utils import postprocess_docstring
12+
from .com import COM
13+
14+
if TYPE_CHECKING:
15+
from ..enum.zahlungsart import Zahlungsart
16+
17+
18+
@postprocess_docstring
19+
class Zahlungsinformation(COM):
20+
"""
21+
Mit dieser Komponente kann eine einzelne Zahlungsinformation dargestellt werden.
22+
23+
.. raw:: html
24+
25+
<object data="../_static/images/bo4e/com/Zahlungsinformation.svg" type="image/svg+xml"></object>
26+
27+
.. HINT::
28+
`Zahlungsinformation JSON Schema <https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/{__gh_version__}/src/bo4e_schemas/com/Zahlungsinformation.json>`_
29+
30+
"""
31+
32+
typ: Annotated[Literal[ComTyp.ZAHLUNGSINFORMATION], Field(alias="_typ")] = ComTyp.ZAHLUNGSINFORMATION
33+
34+
zahlungsart: Optional["Zahlungsart"] = None
35+
"""Die Zahlungsart dieser Zahlungsinformation"""
36+
iban: Optional[str] = None
37+
"""Eine IBAN-Nummer"""
38+
bic: Optional[str] = None
39+
"""Eine BIC-Nummer"""
40+
kontoinhaber: Optional[str] = None
41+
"""Der Name des Kontoinhabers"""
42+
betreff: Optional[str] = None
43+
"""Eine konstante Betreffzeile für Überweisungen"""
44+
sepa_referenz: Optional[str] = None
45+
"""Eine SEPA-Referenz"""

src/bo4e/com/zahlungsinformationen.py

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/bo4e/enum/comtyp.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ComTyp(StrEnum):
6868
VERWENDUNGSZWECKPROMARKTROLLE = "VERWENDUNGSZWECKPROMARKTROLLE"
6969
ZAEHLWERK = "ZAEHLWERK"
7070
ZAEHLZEITREGISTER = "ZAEHLZEITREGISTER"
71+
ZAHLUNGSINFORMATION = "ZAHLUNGSINFORMATION"
7172
ZEITRAUM = "ZEITRAUM"
7273
ZEITREIHENWERT = "ZEITREIHENWERT"
7374
ZUSTAENDIGKEIT = "ZUSTAENDIGKEIT"

src/bo4e/enum/zahlungsart.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# pylint:disable=missing-module-docstring
2+
3+
from bo4e.enum.strenum import StrEnum
4+
5+
6+
class Zahlungsart(StrEnum):
7+
"""
8+
Gibt an, um was für eine Zahlungsart es sich handelt.
9+
"""
10+
11+
SEPA_LASTSCHRIFT = "SEPA_LASTSCHRIFT"
12+
UEBERWEISUNG = "UEBERWEISUNG"

0 commit comments

Comments
 (0)