Skip to content

Commit 005ec93

Browse files
hf-krechanhf-kkleinhf-aschloegl
authored
Some small fixes to be compatible with a database structure (#28)
* Add Links in README.rst to Open PR/Draft a Release * Add more detail to serialization test * Correct typos in test_missing_required_attributes * Fix typo in street name * Add postfach as alternative to strasse Before strasse and hausnummer were required attributes and postfach was optional. Since postfach should be an alternative address to strasse and hausnummer this was changed to either strasse and hausnummer or postfach are required attributes. Additionally the other required attributes are made sure to be strings and not empty. * ✅ Add tests for postfach as required field Add two test: one for postfach as regular required field, the second for different combinations of strasse, hausnummer and postfach to test the validator in the Adresse class (adresse.py) * Add assertion for landescode Co-authored-by: hf-krechan <68426071+hf-krechan@users.noreply.github.com> * Correct Landescode assertion Landescode has to be an Enum * Update address requirements The minimal address in Germany is only a zip code and city (for example for institutions like universities or big companies or postfächer without a number but a special zip code) A street always needs a hausnummer and vice versa. Postfächer don't have a street, but a number OR a zipcode. * ✅ Update tests for updated address requirements Added test for only postleitzahl and ort Added docstrings to serialization tests of strasse and postleitzahl Updated test for the function strasse_xor_postfach in Class Adresse (adresse.py) for the updates in the requirements of a german address * 🏷️ fix wrongly defined enumerations * ✅ update the tests accordingly. * ➕ Add marshmallow and marshmallow-enum to dependencies * ♻️ Rebuild serialisation with marshmallow instead of jsons * ✅ Fix tests to match new serialisation setup with marshmallow * 🐛 Fix case conversion during de-/serialisiation Javascript uses CamelCase and python uses snake_case. Therefore you have to convert the keys during the de- and serialisation * ➖ remove jsons dependency I will miss you 😥 * 🩹 Remove jsons import in test_adresse * ♻️ Replace jsons with marshmallow in externereferenz * ♻️ Replace jsons with marshmallow in geokoordinaten * ✅ Add test for deserialisation of geschaeftspartner * ♻️ Replace jsons with marshmallow in katasteradresse * Replace jsons with marshmallow For marshmallow we have to create a Schema for each class we would like to de-/serialise. * Fix casing * 🔥 Remove old code * ✅ Update tests to marshmallow de-/serialisation * ♻️ Improve deserialisation of all Geschaeftsobjekte Thanks to Jack Smith we got a nice and central way to deserialise Geschaeftsobjekte. The new ansatz reduces also the amount of source code https://stackoverflow.com/questions/65668561/marshmallow-schema-and-class-inheritance/65668854#65668854 * ✅ Update assertions for geschaeftsobjekt test * 🎨 Rename deserialisation functions * ♻️ Replace jsons with marshmallow in setup.cfg * 🔥 Remove jsons import * 🎨 Add new lines at the end of files * ➖ ➕ Replace jsons with marshmallow and marshmallow-enum * 📝 Automatically documentation update * 💡 Add docstring to JavaScriptMixin class The docstring explains the purpose of th functions to_snakecase and to_camelcase * 💡 Add comments to clarify which attributes are required or optional Rearranged lines to the required and optional categories to get a better overview. * 💡 Translate and rearrange docstrings * 🎨 Remove JavaScriptMixin from GeschaeftsobjektSchema children The GeschaeftsobjektSchema has already the JavaScriptMixin. This property will inherited, so there is no need to inherit JavaScriptMixin in each BO * 🎨 Remove bo_typ from BO Schemas bo_typ is already defined in GeschaeftsobjektSchema. Cause all BOs-Schema inherit from GeschaeftsobjektSchema the attribute bo_typ is already defined. * 💡 Add explanation for the class_name variable * 🎨 Move bo_typ to the required attributes remove additional section called `required attributes with default value` You can quickly see if an attribute use a default value * 💡 Translate and reformat docstring * ✅ Add assertion for BoTyp.MARKTLOKATION * 🐛 Make marktlokation to required attribute * 🐛 Make unterbrechbar an optional attribute * 🐛 Use nested GeschaeftspartnerSchema for endkunde Before it was a string field, which leads to errors after deserialisation. You would get a string object in endkunde, but we would like to have a Geschaeftspartner object. * ✅ Update tests for de-/serialisation of marktlokation Test serialisation with required attributes only as well as required attributes plus optional attributes. Additionally I added a test for a broken json_string which misses the required attribute marktlokations_id. * 🔥 Remove not used packages from the documentation * ✅ Switch result and expection Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * Add component messlokationszuordnung * ✅ Add tests for messlokationszuordnung * Add enumeration ArithmetischeOperation This is needed by the component messlokationszuordnung * 🐛 Make postleitzahl and ort required in address postleitzahl and ort were optional, but they are necessary for each kind of address. * 🐛 Change zugehoerige_messlokation from string to Messlokation zugehoerige_messlokation should be a Messlokationszuordnung object. So this commit changes the typehint in the class Messlokationszuordnung and the related marshmallow schema * 🖤 black formatting * 📝 Update documentation Add component messlokationszuordnung and enumeration arithmetische operation * 🎨 Remove one whitespace Flake8 does not like double spaces after assert * Improve translated docstring of Geschaeftspartner Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * Improve translated docstring for Marktlokation Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * 💡 Improve understanding of docstring in cases.py Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * ✏️ Fix typo Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * ✅ Specify the assumption in test The `is` operator is stricter than the `==` operator. Besides the value, the type is also compared Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * ✏️ Fix typo in comment Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com> * ✏️ Fix typo in comment Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com> * ✏️ Fix typo in comment Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com> * 💡 Switch to American English Cause this is an open source project and the American English is the international English version we should use it * 👥 Add Annika to contributors * 🔧 Add marshmallow-enum and stringcase to setup.py New dependencies for our bo4e package. Came through the shift from jsons to marshmallow * 💡 Add comment to test_marktlokation for clarification * 💡 Remove unnecessary comment * 💡 Improve the understanding of a comment Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com> * 💡 Translate comments in marktrolle.py Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> * 🎨 Change order of odd and even checksum To be more consistent with the BDEW Anwendungshilfe https://bdew-codes.de/Content/Files/MaLo/2017-04-28-BDEW-Anwendungshilfe-MaLo-ID_Version1.0_FINAL.PDF * ✅ Use dictionaries for assertions instead of strings * 💩 Update tox.ini to get a positive linter check I will remove the E501 (ignore line length) in the next PR. I will update the format settings for black and flake9 in the next PR * 💡 Translate docstring for gebietstyp.py * ✏️ Fix typo in the word function * ✏️Fix typos * 💡 Translate comments Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com> * 💡 Add Multiplikation and Division as arithmetic operations in docstring * ✏️ Fix typo in gebiettyp Remove s in gebietstyp to match the same naming like the BO4E documenation * 🐛 Set empty list to default for externe_referenzen Empty list makes the implementation into a database easier compared to None type. * 🩹 Add BoTyp.GESCHAEFTSOBJEKT and set it to default The BoTyp can be used as a descriminator in databases. But the Geschaeftsobjekt itself has no BoTyp in the documentation. To realize a good table inheritance you have to define a table for each class and **each** class have to identified by a discriminator. Therefore we added the BoTyp.GESCHAEFTSOBJEKT to the BoTyp enumeration. * 🐛 Change type from geschaeftspartnerrolle and kontaktweg to List * ✅ Update tests to List type kontaktweg and geschaeftspartnerrolle changed to List type * 🩹 Fix import of Gebiettyp enumeration Removed the s between tt * 🎨 Use the same structure for marktrolle like in the other enumerations * 🩹 Change type of versionstruktur * 🐛 Change type of versionsstruktur in GeschaeftsobjektSchema to string * ✅ Update tests to string type of versionstruktur * 📝 Update gebiettyp enumeration in documentation * ✅ Update tests to string type of versionstruktur * 📝🐛 Replace `-` with `_` Got error in sphinx documentation: invalid signature for autoattribute ('bo4e.enum.marktrolle::Marktrolle.KUNDE-SELBST-NN') Co-authored-by: hf-kklein <konstantin.klein@hochfrequenz.de> Co-authored-by: Annika Schlögl <annika.schloegl@hochfrequenz.de> Co-authored-by: hf-aschloegl <73470827+hf-aschloegl@users.noreply.github.com>
1 parent fbdf087 commit 005ec93

12 files changed

+60
-54
lines changed

docs/api/bo4e.enum.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ bo4e.enum.gasqualitaet module
5252
:undoc-members:
5353
:show-inheritance:
5454

55-
bo4e.enum.gebietstyp module
56-
---------------------------
55+
bo4e.enum.gebiettyp module
56+
--------------------------
5757

58-
.. automodule:: bo4e.enum.gebietstyp
58+
.. automodule:: bo4e.enum.gebiettyp
5959
:members:
6060
:undoc-members:
6161
:show-inheritance:

src/bo4e/bo/geschaeftsobjekt.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ class Geschaeftsobjekt:
1616
"""
1717

1818
# required attributes
19-
versionstruktur: int = attr.ib(default=2)
20-
bo_typ: BoTyp
19+
versionstruktur: str = attr.ib(default="2")
20+
bo_typ: BoTyp = attr.ib(default=BoTyp.GESCHAEFTSOBJEKT)
2121

2222
# optional attributes
2323
externe_referenzen: Optional[List[ExterneReferenz]] = attr.ib(
24-
default=None, validator=attr.validators.instance_of((type(None), List))
24+
default=[], validator=attr.validators.instance_of(List)
2525
)
2626

2727

@@ -35,7 +35,7 @@ class GeschaeftsobjektSchema(Schema, JavaScriptMixin):
3535
class_name = Geschaeftsobjekt
3636

3737
# required attributes
38-
versionstruktur = fields.Integer()
38+
versionstruktur = fields.String()
3939
bo_typ = EnumField(BoTyp)
4040

4141
# optional attributes

src/bo4e/bo/geschaeftspartner.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from marshmallow import fields
44
from marshmallow_enum import EnumField
5+
from typing import List
56

67
from bo4e.bo.geschaeftsobjekt import Geschaeftsobjekt, GeschaeftsobjektSchema
78
from bo4e.com.adresse import Adresse, AdresseSchema
@@ -21,7 +22,7 @@ class Geschaeftspartner(Geschaeftsobjekt):
2122
bo_typ: BoTyp = attr.ib(default=BoTyp.GESCHAEFTSPARTNER)
2223
name1: str
2324
gewerbekennzeichnung: bool
24-
geschaeftspartnerrolle: Geschaeftspartnerrolle
25+
geschaeftspartnerrolle: List[Geschaeftspartnerrolle]
2526
partneradresse: Adresse
2627

2728
# optional attributes
@@ -30,7 +31,7 @@ class Geschaeftspartner(Geschaeftsobjekt):
3031
name3: str = attr.ib(default=None)
3132
hrnummer: str = attr.ib(default=None)
3233
amtsgericht: str = attr.ib(default=None)
33-
kontaktweg: Kontaktart = attr.ib(default=None)
34+
kontaktweg: List[Kontaktart] = attr.ib(default=[])
3435
umsatzsteuer_id: str = attr.ib(default=None)
3536
glaeubiger_id: str = attr.ib(default=None)
3637
e_mail_adresse: str = attr.ib(default=None)
@@ -45,7 +46,7 @@ class GeschaeftspartnerSchema(GeschaeftsobjektSchema):
4546
# required attributes
4647
name1 = fields.Str()
4748
gewerbekennzeichnung = fields.Bool()
48-
geschaeftspartnerrolle = EnumField(Geschaeftspartnerrolle)
49+
geschaeftspartnerrolle = fields.List(EnumField(Geschaeftspartnerrolle))
4950
partneradresse = fields.Nested(AdresseSchema)
5051

5152
# optional attributes
@@ -54,7 +55,7 @@ class GeschaeftspartnerSchema(GeschaeftsobjektSchema):
5455
name3 = fields.Str(missing=None)
5556
hrnummer = fields.Str(missing=None)
5657
amtsgericht = fields.Str(missing=None)
57-
kontaktweg = EnumField(Kontaktart, missing=None)
58+
kontaktweg = fields.List(EnumField(Kontaktart), missing=None)
5859
umsatzsteuer_id = fields.Str(missing=None)
5960
glaeubiger_id = fields.Str(missing=None)
6061
e_mail_adresse = fields.Str(missing=None)

src/bo4e/bo/marktlokation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from bo4e.enum.bilanzierungsmethode import Bilanzierungsmethode
2020
from bo4e.enum.verbrauchsart import Verbrauchsart
2121
from bo4e.enum.netzebene import Netzebene
22-
from bo4e.enum.gebietstyp import Gebietstyp
22+
from bo4e.enum.gebiettyp import Gebiettyp
2323
from bo4e.enum.gasqualitaet import Gasqualitaet
2424

2525
_malo_id_pattern = re.compile(r"^[1-9][\d]{10}$")
@@ -57,7 +57,7 @@ def _validate_marktlokations_id(self, marktlokations_id_attribute, value):
5757
verbrauchsart: Verbrauchsart = attr.ib(default=None)
5858
unterbrechbar: bool = attr.ib(default=None)
5959
netzbetreibercodenr: str = attr.ib(default=None)
60-
gebietstyp: Gebietstyp = attr.ib(default=None)
60+
gebietstyp: Gebiettyp = attr.ib(default=None)
6161
netzgebietsnr: str = attr.ib(default=None)
6262
bilanzierungsgebiet: str = attr.ib(default=None)
6363
grundversorgercodenr: str = attr.ib(default=None)
@@ -127,7 +127,7 @@ class MarktlokationSchema(GeschaeftsobjektSchema):
127127
verbrauchsart = EnumField(Verbrauchsart, missing=None)
128128
unterbrechbar = fields.Bool(missing=None)
129129
netzbetreibercodenr = fields.Str(missing=None)
130-
gebietstyp = EnumField(Gebietstyp, missing=None)
130+
gebietstyp = EnumField(Gebiettyp, missing=None)
131131
netzgebietsnr = fields.Str(missing=None)
132132
bilanzierungsgebiet = fields.Str(missing=None)
133133
grundversorgercodenr = fields.Str(missing=None)

src/bo4e/enum/botyp.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,32 @@
55
from enum import Enum
66

77
_boTyp = {
8-
"MARKTLOKATION": "MARKTLOKATION",
9-
"MESSLOKATION": "MESSLOKATION",
10-
"GESCHAEFTSPARTNER": "GESCHAEFTSPARTNER",
11-
"ZAEHLER": "ZAEHLER",
12-
"ANSPRECHPARTNER": "ANSPRECHPARTNER",
138
"ANGEBOT": "ANGEBOT",
14-
"MARKTTEILNEHMER": "MARKTTEILNEHMER",
9+
"ANSPRECHPARTNER": "ANSPRECHPARTNER",
10+
"AUSSCHREIBUNG": "AUSSCHREIUNG",
1511
"ENERGIEMENGE": "ENERGIEMENGE",
12+
# It is practical to use the BoTyp Enum as discriminator in the database.
13+
# Therefore we added one additional entry for GESCHAEFTSOBJEKT
14+
# This is not defined by the documentation!
15+
"GESCHAEFTSOBJEKT": "GESCHAEFTSOBJEKT",
16+
"GESCHAEFTSPARTNER": "GESCHAEFTSPARTNER",
1617
"KOSTEN": "KOSTEN",
17-
"AUSSCHREIBUNG": "AUSSCHREIUNG",
18+
"MARKTLOKATION": "MARKTLOKATION",
19+
"MESSLOKATION": "MESSLOKATION",
20+
"MARKTTEILNEHMER": "MARKTTEILNEHMER",
21+
"NETZNUTZUNGSRECHNUNG": "NETZNUTZUNGSRECHNUNG",
1822
"PREISBLATT": "PREISBLATT",
19-
"PREISBLATTNETZNUTZUNG": "PREISBLATTNETZNUTZUNG",
20-
"PREISBLATTMESSUNG": "PREISBLATTMESSUNG",
2123
"PREISBLATTDIENSTLEISTUNG": "PREISBLATTDIENSTLEISTUNG",
22-
"PREISBLATTUMLAGEN": "PREISBLATTUMLAGEN",
2324
"PREISBLATTKONZESSIONSABGABE": "PREISBLATTKONZESSIONSABGABE",
25+
"PREISBLATTMESSUNG": "PREISBLATTMESSUNG",
26+
"PREISBLATTNETZNUTZUNG": "PREISBLATTNETZNUTZUNG",
27+
"PREISBLATTUMLAGEN": "PREISBLATTUMLAGEN",
28+
"RECHNUNG": "RECHNUNG",
29+
"REGIONALTARIF": "REGIONALTARIF",
2430
"TARIFINFO": "TARIFINFO",
2531
"TARIFKOSTEN": "TARIFKOSTEN",
26-
"RECHNUNG": "RECHNUNG",
27-
"NETZNUTZUNGSRECHNUNG": "NETZNUTZUNGSRECHNUNG",
2832
"TARIFPREISBLATT": "TARIFPREISBLATT",
29-
"REGIONALTARIF": "REGIONALTARIF",
30-
"ZEITREIHE": "ZEITREIHE"
33+
"ZAEHLER": "ZAEHLER",
34+
"ZEITREIHE": "ZEITREIHE",
3135
}
3236
BoTyp = Enum("BoTyp", _boTyp)
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""
2-
List of possible Gebietstypen.
2+
List of possible Gebiettypen.
33
"""
44
from enum import Enum
55

6-
_gebietstyp = {
6+
_gebiettyp = {
77
"REGELZONE": "REGELZONE",
88
"MARKTGEBIET": "MARKTGEBIET",
99
"BILANZIERUNGSGEBIET": "BILANZIERUNGSGEBIET",
@@ -14,4 +14,4 @@
1414
"GRUNDVERSORGUNGSGEBIET": "GRUNDVERSORGUNGSGEBIET",
1515
"VERSORGUNGSGEBIET": "VERSORGUNGSGEBIET",
1616
}
17-
Gebietstyp = Enum("Gebietstyp", _gebietstyp)
17+
Gebiettyp = Enum("Gebiettyp", _gebiettyp)

src/bo4e/enum/marktrolle.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
from enum import Enum
55

66
_marktrolle = {
7-
"VNB": "NB", # Grid Operator
7+
"NB": "NB", # Grid Operator
88
"LF": "LF", # Supplier
99
"MSB": "MSB", # Messstellenbetreiber
10-
"DIENSTLEISTER": "DL", # Dienstleister
10+
"DL": "DL", # Dienstleister
1111
"BKV": "BKV", # Bilanzkreisverantwortlicher,
12-
"BIKO": "BKV", # Bilanzkoordinator / Marktgebietsverantwortlicher
12+
"BKO": "BKO", # Bilanzkoordinator / Marktgebietsverantwortlicher
1313
"UENB": "UENB", # Übertragungsnetzbetreiber
14-
"KUNDE_NN_SELBST": "KUNDE-NN-SELBST", # Kunden, die Netznutzungsentgelte selbst zahlen
14+
"KUNDE_SELBST_NN": "KUNDE_SELBST_NN", # Kunden, die Netznutzungsentgelte selbst zahlen
1515
"MGV": "MGV", # Marktgebietsverantwortlicher
1616
"EIV": "EIV", # Einsatzverantwortlicher
1717
"RB": "RB", # Registerbetreiber

tests/test_externe_referenz.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_list_of_externe_referenz(self):
2828
name1="Duck",
2929
name2="Donald",
3030
gewerbekennzeichnung=False,
31-
geschaeftspartnerrolle=Geschaeftspartnerrolle.KUNDE,
31+
geschaeftspartnerrolle=[Geschaeftspartnerrolle.KUNDE],
3232
partneradresse=Adresse(
3333
strasse="Am Geldspeicher",
3434
hausnummer="17",
@@ -51,7 +51,7 @@ def test_geschaeftspartner_with_no_externe_referenz(self):
5151
name1="Duck",
5252
name2="Donald",
5353
gewerbekennzeichnung=False,
54-
geschaeftspartnerrolle=Geschaeftspartnerrolle.KUNDE,
54+
geschaeftspartnerrolle=[Geschaeftspartnerrolle.KUNDE],
5555
partneradresse=Adresse(
5656
strasse="Am Geldspeicher",
5757
hausnummer="17",
@@ -65,4 +65,5 @@ def test_geschaeftspartner_with_no_externe_referenz(self):
6565
gp_json = schema.dumps(gp, ensure_ascii=False)
6666

6767
deserialized_gp: Geschaeftspartner = schema.loads(gp_json)
68-
assert deserialized_gp.externe_referenzen is None
68+
69+
assert deserialized_gp.externe_referenzen == []

tests/test_geschaeftsobjekt.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class TestGeschaeftsobjet:
1111
[
1212
(
1313
BoTyp.ENERGIEMENGE,
14-
2,
14+
"2",
1515
[
1616
ExterneReferenz(
1717
ex_ref_name="HOCHFREQUENZ_HFSAP_100", ex_ref_wert="12345"
@@ -23,14 +23,14 @@ class TestGeschaeftsobjet:
2323
),
2424
(
2525
BoTyp.ENERGIEMENGE,
26-
2,
26+
"2",
2727
[
2828
ExterneReferenz(
2929
ex_ref_name="HOCHFREQUENZ_HFSAP_100", ex_ref_wert="12345"
3030
)
3131
],
3232
),
33-
(BoTyp.ENERGIEMENGE, 2, None),
33+
(BoTyp.ENERGIEMENGE, "2", []),
3434
],
3535
)
3636
def test_serialisation(
@@ -58,8 +58,8 @@ def test_serialisation(
5858
def test_initialization_with_minimal_attributs(self):
5959
go = Geschaeftsobjekt(bo_typ=BoTyp.ANSPRECHPARTNER)
6060

61-
assert go.externe_referenzen is None
62-
assert go.versionstruktur == 2
61+
assert go.externe_referenzen == []
62+
assert go.versionstruktur == "2"
6363

6464
def test_no_list_in_externen_referenzen(self):
6565
with pytest.raises(TypeError) as excinfo:
@@ -69,4 +69,4 @@ def test_no_list_in_externen_referenzen(self):
6969
ex_ref_name="Schufa-ID", ex_ref_wert="aksdlakoeuhn"
7070
),
7171
)
72-
assert "must be (<class 'NoneType'>, typing.List)" in str(excinfo.value)
72+
assert "must be typing.List" in str(excinfo.value)

tests/test_geschaeftspartner.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ def test_serializable(self, datafiles):
2828
gewerbekennzeichnung=True,
2929
hrnummer="HRB 254466",
3030
amtsgericht="Amtsgericht München",
31-
kontaktweg=Kontaktart.E_MAIL,
31+
kontaktweg=[Kontaktart.E_MAIL],
3232
umsatzsteuer_id="DE267311963",
3333
glaeubiger_id="DE98ZZZ09999999999",
3434
e_mail_adresse="test@bo4e.de",
3535
website="bo4e.de",
36-
geschaeftspartnerrolle=Geschaeftspartnerrolle.DIENSTLEISTER,
36+
geschaeftspartnerrolle=[Geschaeftspartnerrolle.DIENSTLEISTER],
3737
partneradresse=Adresse(
3838
postleitzahl=address_test_data["postleitzahl"],
3939
ort=address_test_data["ort"],

0 commit comments

Comments
 (0)