diff --git a/src/openklant/components/klantinteracties/migrations/0005_actor.py b/src/openklant/components/klantinteracties/migrations/0005_actor.py new file mode 100644 index 00000000..8d7d84f0 --- /dev/null +++ b/src/openklant/components/klantinteracties/migrations/0005_actor.py @@ -0,0 +1,242 @@ +# Generated by Django 3.2.18 on 2023-10-12 14:45 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + dependencies = [ + ("klantinteracties", "0004_digitaaladres"), + ] + + operations = [ + migrations.CreateModel( + name="Actor", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + help_text="Unieke (technische) identificatiecode van de actor.", + primary_key=True, + serialize=False, + unique=True, + ), + ), + ( + "naam", + models.CharField( + help_text="Naam van de actor.", + max_length=200, + verbose_name="Naam", + ), + ), + ( + "soort_actor", + models.CharField( + choices=[ + ("medewerker", "Medewerker"), + ("geautomatiseerde_actor", "Geautomatiseerde actor"), + ("organisatorische_eenheid", "Organisatorische eenheid"), + ], + help_text="Geeft aan van welke specifieke soort actor sprake is.", + max_length=24, + verbose_name="Soort actor", + ), + ), + ( + "indicatie_actief", + models.BooleanField( + help_text="Geeft aan of aan de actor nog betrokken mag worden bij nieuwe klantcontacten. Voor niet-actieve is dit niet toegestaan.", + verbose_name="Indicatie actief", + ), + ), + ( + "extern_register", + models.URLField( + blank=True, + help_text="Externe (bron)register waarin gegevens over de actor zijn geregistreerd.", + max_length=255, + verbose_name="Extern register", + ), + ), + ( + "extern_id", + models.UUIDField( + blank=True, + help_text="Identificatiecode waarmee een actor in het externe (bron)register uniek geïdentificeerd kan worden.", + unique=True, + verbose_name="Extern ID", + ), + ), + ], + options={ + "verbose_name": "Actor", + "verbose_name_plural": "Actoren", + }, + ), + migrations.CreateModel( + name="OrganisatorischeEenheid", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "omschrijving", + models.CharField( + blank=True, + help_text="Omschrijving van de geautomatiseerde actor.", + max_length=200, + verbose_name="Omschrijving", + ), + ), + ( + "email", + models.EmailField( + blank=True, + help_text="Elektronisch postadres waaronder de MEDEWERKER in de regel bereikbaar is.", + max_length=254, + verbose_name="email address", + ), + ), + ( + "faxnummer", + models.CharField( + help_text="Faxnummer waaronder de organisatorische eenheid in de regel bereikbaar is.", + max_length=20, + verbose_name="Faxnummer", + ), + ), + ( + "telefoonnummer", + models.CharField( + help_text="Telefoonnummer waaronder de MEDEWERKER in de regel bereikbaar is.", + max_length=20, + verbose_name="Telefoonnummer", + ), + ), + ( + "actor", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="organisatorische_eenheid", + to="klantinteracties.actor", + ), + ), + ], + options={ + "verbose_name": "organisatorische eenheid", + }, + ), + migrations.CreateModel( + name="Medewerker", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "functie", + models.CharField( + help_text="Functie van de geautomatiseerde actor of beschrijving van de werkzaamheden die deze uitvoert.", + max_length=40, + verbose_name="Functie", + ), + ), + ( + "email", + models.EmailField( + blank=True, + help_text="Elektronisch postadres waaronder de MEDEWERKER in de regel bereikbaar is.", + max_length=254, + verbose_name="email address", + ), + ), + ( + "telefoonnummer", + models.CharField( + help_text="Telefoonnummer waaronder de MEDEWERKER in de regel bereikbaar is.", + max_length=20, + verbose_name="Telefoonnummer", + ), + ), + ( + "actor", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="medewerker", + to="klantinteracties.actor", + ), + ), + ], + options={ + "verbose_name": "Medewerker", + "verbose_name_plural": "Mederwerkers", + }, + ), + migrations.CreateModel( + name="GeautomatiseerdeActor", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "functie", + models.CharField( + help_text="Functie van de geautomatiseerde actor of beschrijving van de werkzaamheden die deze uitvoert.", + max_length=40, + verbose_name="Functie", + ), + ), + ( + "omschrijving", + models.CharField( + blank=True, + help_text="Omschrijving van de geautomatiseerde actor.", + max_length=200, + verbose_name="Omschrijving", + ), + ), + ( + "actor", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="geautomatiseerde_actor", + to="klantinteracties.actor", + ), + ), + ], + options={ + "verbose_name": "Geautomatiseerde actor", + "verbose_name_plural": "Geautomatiseerde actoren", + }, + ), + migrations.AddField( + model_name="klantcontact", + name="actoren", + field=models.ManyToManyField( + help_text="De actoren die tijdens het klantcontant contact had met klanten of hun vertegenwoordigers.", + related_name="klantcontacten", + to="klantinteracties.Actor", + verbose_name="Actoren", + ), + ), + ] diff --git a/src/openklant/components/klantinteracties/models/__init__.py b/src/openklant/components/klantinteracties/models/__init__.py index 7167c60a..84012ef7 100644 --- a/src/openklant/components/klantinteracties/models/__init__.py +++ b/src/openklant/components/klantinteracties/models/__init__.py @@ -1,3 +1,4 @@ +from .actoren import * # noqa from .digitaal_adres import * # noqa from .klantcontacten import * # noqa from .partijen import * # noqa diff --git a/src/openklant/components/klantinteracties/models/actoren.py b/src/openklant/components/klantinteracties/models/actoren.py new file mode 100644 index 00000000..9e5f96d5 --- /dev/null +++ b/src/openklant/components/klantinteracties/models/actoren.py @@ -0,0 +1,176 @@ +import uuid + +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from .constants import SoortActor + + +class Actor(models.Model): + id = models.UUIDField( + primary_key=True, + unique=True, + default=uuid.uuid4, + max_length=40, + help_text=_("Unieke (technische) identificatiecode van de actor."), + ) + # TODO: add FK to Interne Taak + naam = models.CharField( + _("Naam"), + help_text=_("Naam van de actor."), + max_length=200, + blank=False, + ) + soort_actor = models.CharField( + _("Soort actor"), + help_text=_("Geeft aan van welke specifieke soort actor sprake is."), + choices=SoortActor.choices, + max_length=24, + blank=False, + ) + indicatie_actief = models.BooleanField( + _("Indicatie actief"), + help_text=_( + "Geeft aan of aan de actor nog betrokken mag worden bij nieuwe klantcontacten. " + "Voor niet-actieve is dit niet toegestaan." + ), + blank=False, + ) + # TODO: Check if this field should be a URLField and check what char length it should be. + extern_register = models.URLField( + _("Extern register"), + help_text=_( + "Externe (bron)register waarin gegevens over de actor zijn geregistreerd." + ), + max_length=255, + blank=True, + ) + extern_id = models.UUIDField( + _("Extern ID"), + unique=True, + help_text=_( + "Identificatiecode waarmee een actor in het externe (bron)register uniek geïdentificeerd kan worden." + ), + max_length=40, + blank=True, + ) + + class Meta: + verbose_name = "Actor" + verbose_name_plural = "Actoren" + + def __str__(self): + return self.naam + + +class GeautomatiseerdeActor(models.Model): + actor = models.OneToOneField( + Actor, + on_delete=models.CASCADE, + related_name="geautomatiseerde_actor", + blank=False, + ) + functie = models.CharField( + _("Functie"), + help_text=_( + "Functie van de geautomatiseerde actor of beschrijving van de werkzaamheden die deze uitvoert." + ), + max_length=40, + blank=False, + ) + omschrijving = models.CharField( + _("Omschrijving"), + help_text=_("Omschrijving van de geautomatiseerde actor."), + max_length=200, + blank=True, + ) + + class Meta: + verbose_name = "Geautomatiseerde actor" + verbose_name_plural = "Geautomatiseerde actoren" + + def __str__(self): + return self.functie + + +class Medewerker(models.Model): + actor = models.OneToOneField( + Actor, + on_delete=models.CASCADE, + related_name="medewerker", + blank=False, + ) + functie = models.CharField( + _("Functie"), + help_text=_( + "Functie van de geautomatiseerde actor of beschrijving van de werkzaamheden die deze uitvoert." + ), + max_length=40, + blank=False, + ) + email = models.EmailField( + _("email address"), + help_text=_( + "Elektronisch postadres waaronder de MEDEWERKER in de regel bereikbaar is." + ), + blank=True, + ) + telefoonnummer = models.CharField( + _("Telefoonnummer"), + help_text=_( + "Telefoonnummer waaronder de MEDEWERKER in de regel bereikbaar is." + ), + max_length=20, + blank=False, + ) + + class Meta: + verbose_name = "Medewerker" + verbose_name_plural = "Mederwerkers" + + def __str__(self): + return self.functie + + +class OrganisatorischeEenheid(models.Model): + actor = models.OneToOneField( + Actor, + on_delete=models.CASCADE, + related_name="organisatorische_eenheid", + blank=False, + ) + omschrijving = models.CharField( + _("Omschrijving"), + help_text=_("Omschrijving van de geautomatiseerde actor."), + max_length=200, + blank=True, + ) + email = models.EmailField( + _("email address"), + help_text=_( + "Elektronisch postadres waaronder de MEDEWERKER in de regel bereikbaar is." + ), + blank=True, + ) + faxnummer = models.CharField( + _("Faxnummer"), + help_text=_( + "Faxnummer waaronder de organisatorische eenheid in de regel bereikbaar is." + ), + max_length=20, + blank=False, + ) + telefoonnummer = models.CharField( + _("Telefoonnummer"), + help_text=_( + "Telefoonnummer waaronder de MEDEWERKER in de regel bereikbaar is." + ), + max_length=20, + blank=False, + ) + + class Meta: + verbose_name = "organisatorische eenheid" + + def __str__(self): + return self.omschrijving diff --git a/src/openklant/components/klantinteracties/models/klantcontacten.py b/src/openklant/components/klantinteracties/models/klantcontacten.py index 97ac66cc..70e5f6b4 100644 --- a/src/openklant/components/klantinteracties/models/klantcontacten.py +++ b/src/openklant/components/klantinteracties/models/klantcontacten.py @@ -6,6 +6,8 @@ from vng_api_common.descriptors import GegevensGroepType +from openklant.components.klantinteracties.models.actoren import Actor + from .constants import Initiator, Klantcontrol from .digitaal_adres import DigitaalAdres @@ -31,7 +33,15 @@ class Klantcontact(models.Model): blank=True, null=True, ) - # TODO: add fk to Actor + actoren = models.ManyToManyField( + Actor, + verbose_name=_("Actoren"), + related_name="klantcontacten", + help_text=_( + "De actoren die tijdens het klantcontant contact had met klanten of hun vertegenwoordigers." + ), + blank=False, + ) # TODO: add fk to Onderwerpobject # TODO: add fk to Inhoudsobject nummer = models.PositiveIntegerField(