From f03b4d5e66e2454c85be5c2843e48e41b1c11f73 Mon Sep 17 00:00:00 2001 From: bart-maykin Date: Thu, 12 Oct 2023 11:29:43 +0200 Subject: [PATCH] :card_file_box: [#63] added model Betrokkene and added foreignkeys relations --- .../migrations/0003_betrokkene.py | 211 ++++++++++++++++++ .../klantinteracties/models/klantcontacten.py | 205 ++++++++++++++++- .../klantinteracties/models/partijen.py | 15 ++ 3 files changed, 429 insertions(+), 2 deletions(-) create mode 100644 src/openklant/components/klantinteracties/migrations/0003_betrokkene.py diff --git a/src/openklant/components/klantinteracties/migrations/0003_betrokkene.py b/src/openklant/components/klantinteracties/migrations/0003_betrokkene.py new file mode 100644 index 00000000..b408f606 --- /dev/null +++ b/src/openklant/components/klantinteracties/migrations/0003_betrokkene.py @@ -0,0 +1,211 @@ +# Generated by Django 3.2.18 on 2023-10-11 10:26 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + dependencies = [ + ("klantinteracties", "0002_klantcontact"), + ] + + operations = [ + migrations.CreateModel( + name="Betrokkene", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + help_text="Unieke (technische) identificatiecode van de betrokkene bij klantcontact.", + primary_key=True, + serialize=False, + unique=True, + ), + ), + ( + "rol", + models.CharField( + choices=[ + ("vertegenwoordiger", "Vertegenwoordiger"), + ("klant", "Klant"), + ], + help_text="Rol die de betrokkene bij klantcontact tijdens dat contact vervulde.", + max_length=17, + verbose_name="Rol", + ), + ), + ( + "organisatienaam", + models.CharField( + blank=True, + help_text="Naam van de organisatie waarmee de betrokkene bij klantcontact een relatie had.", + max_length=200, + verbose_name="Organisatienaam", + ), + ), + ( + "contactnaam_voorletters", + models.CharField( + help_text="Een afkorting van de voornamen. Meestal de beginletter, maar in sommige gevallen de beginletter gecombineerd met de tweede letter van een voornaam.", + max_length=6, + verbose_name="Voorletters", + ), + ), + ( + "contactnaam_voornaam", + models.CharField( + blank=True, + help_text="De voornaam die de persoon wil gebruiken tijdens communicatie met de gemeente.", + max_length=200, + verbose_name="Voornaam", + ), + ), + ( + "contactnaam_voorvoegsel_achternaam", + models.CharField( + blank=True, + help_text="Een eventueel voorvoegsel dat hoort bij de achternaam die de persoon wil gebruiken tijdens communicatie met de gemeente.", + max_length=10, + verbose_name="Voorvoegsel achternaam", + ), + ), + ( + "contactnaam_achternaam", + models.CharField( + blank=True, + help_text="Een achternaam die de persoon wil gebruiken tijdens communicatie met de gemeente.", + max_length=200, + verbose_name="Achternaam", + ), + ), + ( + "correspondentieadres_nummeraanduiding_id", + models.UUIDField( + blank=True, + help_text="Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen.", + null=True, + unique=True, + verbose_name="Nummeraanduiding ID", + ), + ), + ( + "correspondentieadres_adresregel1", + models.CharField( + blank=True, + help_text="Eerste deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 1", + ), + ), + ( + "correspondentieadres_adresregel2", + models.CharField( + blank=True, + help_text="Tweede deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 2", + ), + ), + ( + "correspondentieadres_adresregel3", + models.CharField( + blank=True, + help_text="Derde van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 3", + ), + ), + ( + "correspondentieadres_land", + models.CharField( + blank=True, + help_text="Een code, opgenomen in Tabel 34, Landentabel, die het land (buiten Nederland) aangeeft alwaar de ingeschrevene verblijft.", + max_length=4, + validators=[ + django.core.validators.MinLengthValidator(limit_value=4), + django.core.validators.validate_integer, + ], + verbose_name="Land", + ), + ), + ( + "bezoekadres_nummeraanduiding_id", + models.UUIDField( + blank=True, + help_text="Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen.", + null=True, + unique=True, + verbose_name="Nummeraanduiding ID", + ), + ), + ( + "bezoekadres_adresregel1", + models.CharField( + blank=True, + help_text="Eerste deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 1", + ), + ), + ( + "bezoekadres_adresregel2", + models.CharField( + blank=True, + help_text="Tweede deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 2", + ), + ), + ( + "bezoekadres_adresregel3", + models.CharField( + blank=True, + help_text="Derde deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen.", + max_length=80, + verbose_name="Adresregel 3", + ), + ), + ( + "bezoekadres_land", + models.IntegerField( + blank=True, + help_text="Een code, opgenomen in Tabel 34, Landentabel, die het land (buiten Nederland) aangeeft alwaar de ingeschrevene verblijft.", + max_length=4, + validators=[ + django.core.validators.MinLengthValidator(limit_value=4), + django.core.validators.validate_integer, + ], + verbose_name="Land", + ), + ), + ( + "klantcontact", + models.ForeignKey( + help_text="'Klantcontact' had 'Betrokkene bij klantcontact'", + on_delete=django.db.models.deletion.CASCADE, + related_name="betrokkene", + to="klantinteracties.klantcontact", + verbose_name="Klantcontact", + ), + ), + ], + options={ + "verbose_name": "betrokkene bij klantcontact", + }, + ), + migrations.AddField( + model_name="partij", + name="betrokkene", + field=models.ForeignKey( + help_text="'Betrokkene bij klantcontact' was 'Partij'", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="partijen", + to="klantinteracties.betrokkene", + verbose_name="Betrokkene", + ), + ), + ] diff --git a/src/openklant/components/klantinteracties/models/klantcontacten.py b/src/openklant/components/klantinteracties/models/klantcontacten.py index c6e5a904..37bd849f 100644 --- a/src/openklant/components/klantinteracties/models/klantcontacten.py +++ b/src/openklant/components/klantinteracties/models/klantcontacten.py @@ -1,10 +1,12 @@ import uuid -from django.core.validators import validate_integer +from django.core.validators import MinLengthValidator, validate_integer from django.db import models from django.utils.translation import gettext_lazy as _ -from .constants import Initiator +from vng_api_common.descriptors import GegevensGroepType + +from .constants import Initiator, Klantcontrol class Klantcontact(models.Model): @@ -87,3 +89,202 @@ class Klantcontact(models.Model): class Meta: verbose_name = _("klantcontact") verbose_name_plural = _("klantcontacten") + + +class Betrokkene(models.Model): + id = models.UUIDField( + primary_key=True, + unique=True, + default=uuid.uuid4, + help_text=_( + "Unieke (technische) identificatiecode van de betrokkene bij klantcontact." + ), + ) + klantcontact = models.ForeignKey( + Klantcontact, + on_delete=models.CASCADE, + verbose_name=_("Klantcontact"), + related_name="betrokkene", + help_text=_("'Klantcontact' had 'Betrokkene bij klantcontact'"), + null=False, + ) + # TODO: Add fk to Digital adres + rol = models.CharField( + _("Rol"), + help_text=_( + "Rol die de betrokkene bij klantcontact tijdens dat contact vervulde." + ), + choices=Klantcontrol.choices, + max_length=17, + ) + organisatienaam = models.CharField( + _("Organisatienaam"), + help_text=_( + "Naam van de organisatie waarmee de betrokkene bij klantcontact een relatie had." + ), + max_length=200, + blank=True, + ) + + # Contactnaam model fields: + # TODO: check if the max length is correct + contactnaam_voorletters = models.CharField( + _("Voorletters"), + help_text=_( + "Een afkorting van de voornamen. Meestal de beginletter, maar in sommige gevallen " + "de beginletter gecombineerd met de tweede letter van een voornaam." + ), + max_length=6, + ) + contactnaam_voornaam = models.CharField( + _("Voornaam"), + help_text=_( + "De voornaam die de persoon wil gebruiken tijdens communicatie met de gemeente." + ), + max_length=200, + blank=True, + ) + contactnaam_voorvoegsel_achternaam = models.CharField( + _("Voorvoegsel achternaam"), + help_text=_( + "Een eventueel voorvoegsel dat hoort bij de achternaam die de persoon " + "wil gebruiken tijdens communicatie met de gemeente." + ), + max_length=10, + blank=True, + ) + contactnaam_achternaam = models.CharField( + _("Achternaam"), + help_text=_( + "Een achternaam die de persoon wil gebruiken tijdens communicatie met de gemeente." + ), + max_length=200, + blank=True, + ) + + # Correspondentieadres model fields: + correspondentieadres_nummeraanduiding_id = models.UUIDField( + verbose_name=_("Nummeraanduiding ID"), + help_text=_( + "Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen." + ), + unique=True, + blank=True, + null=True, + ) + correspondentieadres_adresregel1 = models.CharField( + _("Adresregel 1"), + help_text=_( + "Eerste deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + correspondentieadres_adresregel2 = models.CharField( + _("Adresregel 2"), + help_text=_( + "Tweede deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + correspondentieadres_adresregel3 = models.CharField( + _("Adresregel 3"), + help_text=_( + "Derde van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + correspondentieadres_land = models.CharField( + _("Land"), + help_text=_( + "Een code, opgenomen in Tabel 34, Landentabel, die het land (buiten Nederland) " + "aangeeft alwaar de ingeschrevene verblijft." + ), + validators=[ + MinLengthValidator(limit_value=4), + validate_integer, + ], + max_length=4, + blank=True, + ) + + # Bezoekadres model fields: + bezoekadres_nummeraanduiding_id = models.UUIDField( + verbose_name=_("Nummeraanduiding ID"), + help_text=_( + "Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen." + ), + unique=True, + blank=True, + null=True, + ) + bezoekadres_adresregel1 = models.CharField( + _("Adresregel 1"), + help_text=_( + "Eerste deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + bezoekadres_adresregel2 = models.CharField( + _("Adresregel 2"), + help_text=_( + "Tweede deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + bezoekadres_adresregel3 = models.CharField( + _("Adresregel 3"), + help_text=_( + "Derde deel van het adres dat niet voorkomt in de Basisregistratie Adressen en Gebouwen." + ), + max_length=80, + blank=True, + ) + bezoekadres_land = models.IntegerField( + _("Land"), + help_text=_( + "Een code, opgenomen in Tabel 34, Landentabel, die het land (buiten Nederland) " + "aangeeft alwaar de ingeschrevene verblijft." + ), + validators=[ + MinLengthValidator(limit_value=4), + validate_integer, + ], + max_length=4, + blank=True, + ) + + # Group types: + Contactnaam = GegevensGroepType( + { + "voorletters": contactnaam_voorletters, + "voornaam": contactnaam_voornaam, + "voorvoegsel achternaam": contactnaam_voorvoegsel_achternaam, + "achternaam": contactnaam_achternaam, + } + ) + correspondentieadres = GegevensGroepType( + { + "nummeraanduiding id": correspondentieadres_nummeraanduiding_id, + "adresregel 1": correspondentieadres_adresregel1, + "adresregel 2": correspondentieadres_adresregel2, + "adresregel 3": correspondentieadres_adresregel3, + "land": correspondentieadres_land, + }, + ) + bezoekadres = GegevensGroepType( + { + "nummeraanduiding id": bezoekadres_nummeraanduiding_id, + "adresregel 1": bezoekadres_adresregel1, + "adresregel 2": bezoekadres_adresregel2, + "adresregel 3": bezoekadres_adresregel3, + "land": bezoekadres_land, + } + ) + + class Meta: + verbose_name = _("betrokkene bij klantcontact") diff --git a/src/openklant/components/klantinteracties/models/partijen.py b/src/openklant/components/klantinteracties/models/partijen.py index 21f195f0..ac453531 100644 --- a/src/openklant/components/klantinteracties/models/partijen.py +++ b/src/openklant/components/klantinteracties/models/partijen.py @@ -7,6 +7,7 @@ from vng_api_common.descriptors import GegevensGroepType from .constants import SoortPartij +from .klantcontacten import Betrokkene class Partij(models.Model): @@ -16,6 +17,14 @@ class Partij(models.Model): default=uuid.uuid4, help_text=_("Unieke (technische) identificatiecode van de partij."), ) + betrokkene = models.ForeignKey( + Betrokkene, + on_delete=models.CASCADE, + verbose_name=_("Betrokkene"), + related_name="partijen", + help_text=_("'Betrokkene bij klantcontact' was 'Partij'"), + null=True, + ) nummer = models.CharField( _("Nummer"), help_text=_( @@ -222,6 +231,8 @@ class Persoon(models.Model): related_name="persoon", null=True, ) + + # Contactnaam model fields: # TODO: check if the max length is correct contactnaam_voorletters = models.CharField( _("Voorletters"), @@ -257,6 +268,7 @@ class Persoon(models.Model): blank=True, ) + # Group types: Contactnaam = GegevensGroepType( { "voorletters": contactnaam_voorletters, @@ -290,6 +302,8 @@ class Contactpersoon(models.Model): help_text=_("De organisatie waar een contactpersoon voor werkt."), null=True, ) + + # Contactnaam model fields: # TODO: check if the max length is correct contactnaam_voorletters = models.CharField( _("Voorletters"), @@ -325,6 +339,7 @@ class Contactpersoon(models.Model): blank=True, ) + # Group types: Contactnaam = GegevensGroepType( { "voorletters": contactnaam_voorletters,