Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ [#158] added rekeningnummer endpoint #161

Merged
merged 1 commit into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/openklant/components/klantinteracties/admin/partijen.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.contrib import admin
from django.utils.translation import gettext_lazy as _

from openklant.components.klantinteracties.models.rekeningnummers import Rekeningnummer

from ..models.constants import SoortPartij
from ..models.digitaal_adres import DigitaalAdres
from ..models.klantcontacten import Betrokkene
Expand Down Expand Up @@ -40,6 +42,12 @@ class DigitaalAdresInlineAdmin(admin.StackedInline):
extra = 0


class RekeningnummerInlineAdmin(admin.StackedInline):
readonly_fields = ("uuid",)
model = Rekeningnummer
extra = 0


class PersoonInlineAdmin(admin.StackedInline):
model = Persoon
extra = 0
Expand Down Expand Up @@ -83,6 +91,7 @@ class PartijAdmin(admin.ModelAdmin):
ContactpersoonInlineAdmin,
OrganisatieInlineAdmin,
DigitaalAdresInlineAdmin,
RekeningnummerInlineAdmin,
BetrokkeneInlineAdmin,
VertegenwoordigdenInlineAdmin,
)
Expand Down
131 changes: 130 additions & 1 deletion src/openklant/components/klantinteracties/api/serializers/partijen.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
Persoon,
Vertegenwoordigden,
)
from openklant.components.klantinteracties.models.rekeningnummers import Rekeningnummer


class PartijForeignkeyBaseSerializer(serializers.HyperlinkedModelSerializer):
Expand Down Expand Up @@ -417,6 +418,10 @@ def create(self, validated_data):


class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
from openklant.components.klantinteracties.api.serializers.rekeningnummers import (
RekeningnummerForeignKeySerializer,
)

discriminator = Discriminator(
discriminator_field="soort_partij",
mapping={
Expand Down Expand Up @@ -445,7 +450,7 @@ class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
required=True,
allow_null=True,
help_text=_(
"Digitaal adres dat een partij verstrekte voor gebruik bij "
"Digitaal adresen dat een partij verstrekte voor gebruik bij "
"toekomstig contact met de gemeente."
),
source="digitaaladres_set",
Expand All @@ -458,6 +463,18 @@ class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
"Digitaal adres waarop een partij bij voorkeur door de gemeente benaderd wordt."
),
)
rekeningnummers = RekeningnummerForeignKeySerializer(
required=True,
allow_null=True,
help_text=_("Rekeningnummers van een partij"),
source="rekeningnummer_set",
many=True,
)
voorkeurs_rekeningnummer = RekeningnummerForeignKeySerializer(
required=True,
allow_null=True,
help_text=_("Rekeningsnummer die een partij bij voorkeur gebruikt."),
)
vertegenwoordigden = serializers.SerializerMethodField(
help_text=_("Partijen die een andere partijen vertegenwoordigden."),
)
Expand Down Expand Up @@ -507,6 +524,8 @@ class Meta:
"digitale_adressen",
"voorkeurs_digitaal_adres",
"vertegenwoordigden",
"rekeningnummers",
"voorkeurs_rekeningnummer",
"partij_identificatoren",
"soort_partij",
"indicatie_geheimhouding",
Expand Down Expand Up @@ -606,6 +625,82 @@ def update(self, instance, validated_data):

validated_data["voorkeurs_digitaal_adres"] = voorkeurs_digitaal_adres

if "rekeningnummer_set" in validated_data:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ik dacht dat we hier alleen lezen van hadden gemaakt zodat dit soort constructies niet meer hoefde. Maar ik ga er nog eenmaal geheel door heen.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dit is voor de gemak van de gebruiker. Omdat we forceren dat de voorkeurs rekkeningnummer een gekoppelde rekkeningnummer is heb ik dit toegevoegd. Als we dit niet doen dan kan je niet in 1 keer een partij toevoegen met een voorkeurs rekkeningnummer.

existing_rekeningnummers = instance.rekeningnummer_set.all()
rekeningnummers_uuids = [
rekeningnummer["uuid"]
for rekeningnummer in validated_data.pop("rekeningnummer_set")
]

# unset relation of rekeningnummer that weren't given with the update
for rekeningnummer in existing_rekeningnummers:
if rekeningnummer.uuid not in rekeningnummers_uuids:
rekeningnummer.partij = None
rekeningnummer.save()

# create relation between rekeningnummer and partij of new entries
for rekeninnummers_uuid in rekeningnummers_uuids:
if rekeninnummers_uuid not in existing_rekeningnummers.values_list(
"uuid", flat=True
):
rekeningnummer = Rekeningnummer.objects.get(
uuid=rekeninnummers_uuid
)
rekeningnummer.partij = instance
rekeningnummer.save()

if "voorkeurs_rekeningnummer" in validated_data:
if voorkeurs_rekeningnummer := validated_data.pop(
"voorkeurs_rekeningnummer", None
):
voorkeurs_rekeningnummer_uuid = voorkeurs_rekeningnummer.get("uuid")
match (method):
case "PUT":
if len(rekeningnummers_uuids) == 0:
raise serializers.ValidationError(
{
"voorkeurs_rekeningnummer": _(
"voorkeursRekeningnummer mag niet meegegeven worden "
"als rekeningnummers leeg is."
)
}
)
if voorkeurs_rekeningnummer_uuid not in rekeningnummers_uuids:
raise serializers.ValidationError(
{
"voorkeurs_rekeningnummer": _(
"Het voorkeurs rekeningnummer moet een gelinkte rekeningnummer zijn."
)
}
)
case "PATCH":
if (
voorkeurs_rekeningnummer_uuid
not in instance.rekeningnummer_set.all().values_list(
"uuid", flat=True
)
):
raise serializers.ValidationError(
{
"voorkeurs_rekeningnummer": _(
"Het voorkeurs rekeningnummer moet een gelinkte rekeningnummer zijn."
)
}
)

voorkeurs_rekeningnummer = Rekeningnummer.objects.get(
uuid=str(voorkeurs_rekeningnummer_uuid)
)

validated_data["voorkeurs_rekeningnummer"] = voorkeurs_rekeningnummer

if "vertegenwoordigde" in validated_data:
if vertegenwoordigde := validated_data.pop("vertegenwoordigde", []):
partijen = [str(partij["uuid"]) for partij in vertegenwoordigde]
vertegenwoordigde = Partij.objects.filter(uuid__in=partijen)

instance.vertegenwoordigde.set(vertegenwoordigde)

partij = super().update(instance, validated_data)

if partij_identificatie:
Expand All @@ -627,6 +722,7 @@ def update(self, instance, validated_data):
def create(self, validated_data):
partij_identificatie = validated_data.pop("partij_identificatie")
digitale_adressen = validated_data.pop("digitaaladres_set")
rekeningnummers = validated_data.pop("rekeningnummer_set")

if voorkeurs_digitaal_adres := validated_data.pop(
"voorkeurs_digitaal_adres", None
Expand All @@ -646,7 +742,32 @@ def create(self, validated_data):
uuid=str(voorkeurs_digitaal_adres_uuid)
)

if voorkeurs_rekeningnummer := validated_data.pop(
"voorkeurs_rekeningnummer", None
):
voorkeurs_rekeningnummer_uuid = voorkeurs_rekeningnummer.get("uuid")
if voorkeurs_rekeningnummer and voorkeurs_rekeningnummer_uuid not in [
rekeningnummer["uuid"] for rekeningnummer in rekeningnummers
]:
raise serializers.ValidationError(
{
"voorkeurs_rekeningnummer": _(
"Het voorkeurs rekeningnummer moet een gelinkte rekeningnummer zijn."
)
}
)
voorkeurs_rekeningnummer = Rekeningnummer.objects.get(
uuid=str(voorkeurs_rekeningnummer_uuid)
)

if vertegenwoordigde := validated_data.pop("vertegenwoordigde", None):
partijen = [str(partij["uuid"]) for partij in vertegenwoordigde]
validated_data["vertegenwoordigde"] = Partij.objects.filter(
uuid__in=partijen
)

validated_data["voorkeurs_digitaal_adres"] = voorkeurs_digitaal_adres
validated_data["voorkeurs_rekeningnummer"] = voorkeurs_rekeningnummer

partij = super().create(validated_data)

Expand All @@ -671,6 +792,14 @@ def create(self, validated_data):
digitaal_adres.partij = partij
digitaal_adres.save()

if rekeningnummers:
for rekeningnummer in rekeningnummers:
rekeningnummer = Rekeningnummer.objects.get(
uuid=str(rekeningnummer["uuid"])
)
rekeningnummer.partij = partij
rekeningnummer.save()

return partij


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from django.db import transaction
from django.utils.translation import gettext_lazy as _

from rest_framework import serializers

from openklant.components.klantinteracties.api.validators import Rekeningnummer_exists
from openklant.components.klantinteracties.models.partijen import Partij
from openklant.components.klantinteracties.models.rekeningnummers import Rekeningnummer


class RekeningnummerForeignKeySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Rekeningnummer
fields = (
"uuid",
"url",
)
extra_kwargs = {
"uuid": {"required": True, "validators": [Rekeningnummer_exists]},
"url": {
"view_name": "klantinteracties:rekeningnummer-detail",
"lookup_field": "uuid",
"help_text": _(
"De unieke URL van deze rekeningnummer binnen deze API."
),
},
}


class RekeningnummerSerializer(serializers.HyperlinkedModelSerializer):
from openklant.components.klantinteracties.api.serializers.partijen import (
PartijForeignKeySerializer,
)

partij = PartijForeignKeySerializer(
required=True,
allow_null=True,
help_text=_("Rekeningnummer van een partij"),
)

class Meta:
model = Rekeningnummer
fields = ("uuid", "partij", "iban", "bic")
extra_kwargs = {
"uuid": {"read_only": True},
"url": {
"view_name": "klantinteracties:rekeningnummer-detail",
"lookup_field": "uuid",
"help_text": _(
"De unieke URL van deze rekeningnummer binnen deze API."
),
},
}

@transaction.atomic
def create(self, validated_data):
if partij := validated_data.pop("partij", None):
validated_data["partij"] = Partij.objects.get(uuid=str(partij.get("uuid")))

return super().create(validated_data)

@transaction.atomic
def update(self, instance, validated_data):
if "partij" in validated_data:
if partij := validated_data.pop("partij", None):
partij = Partij.objects.get(uuid=str(partij.get("uuid")))

validated_data["partij"] = partij

return super().update(instance, validated_data)
Loading
Loading