Skip to content

Commit

Permalink
[#46] add product eigenaar
Browse files Browse the repository at this point in the history
  • Loading branch information
Floris272 committed Mar 6, 2025
1 parent f6156c1 commit fc82519
Show file tree
Hide file tree
Showing 18 changed files with 821 additions and 215 deletions.
10 changes: 10 additions & 0 deletions src/open_producten/producten/admin/eigenaar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.contrib import admin

from open_producten.logging.admin_tools import AuditLogInlineformset
from open_producten.producten.models import Eigenaar


class EigenaarInline(admin.TabularInline):
formset = AuditLogInlineformset
model = Eigenaar
extra = 1
3 changes: 3 additions & 0 deletions src/open_producten/producten/admin/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
ProductType,
)

from .eigenaar import EigenaarInline


def get_status_choices(product_type_id, instance):

Expand Down Expand Up @@ -104,6 +106,7 @@ class ProductAdmin(AdminAuditLogMixin, admin.ModelAdmin):
autocomplete_fields = ("product_type",)
search_fields = ("product_type__translations__naam",)
form = ProductAdminForm
inlines = (EigenaarInline,)

@admin.display(description="Product Type")
def product_type_name(self, obj):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Generated by Django 4.2.17 on 2025-03-05 16:43

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import open_producten.producten.models.validators
import uuid


class Migration(migrations.Migration):

dependencies = [
("producten", "0004_product_frequentie_product_prijs"),
]

operations = [
migrations.RemoveField(
model_name="product",
name="bsn",
),
migrations.RemoveField(
model_name="product",
name="kvk",
),
migrations.CreateModel(
name="Eigenaar",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
(
"bsn_nummer",
models.CharField(
blank=True,
help_text="De BSN van de product eigenaar, BSN van 8 karakters moet met een extra 0 beginnen.",
null=True,
validators=[
open_producten.producten.models.validators.validate_bsn
],
verbose_name="BSN nummer",
),
),
(
"kvk_nummer",
models.CharField(
blank=True,
help_text="Het kvk nummer van de product eigenaar",
max_length=8,
null=True,
validators=[
django.core.validators.MinLengthValidator(8),
django.core.validators.RegexValidator("^[0-9]*$"),
],
verbose_name="KVK nummer",
),
),
(
"vestigingsnummer",
models.CharField(
blank=True,
help_text="Een korte unieke aanduiding van een vestiging.",
max_length=24,
null=True,
verbose_name="Vestigingsnummer",
),
),
(
"klantnummer",
models.CharField(
blank=True,
help_text="Uniek identificerend nummer dat tijdens communicatie tussen mensen kan worden gebruikt om het specifieke klantcontact aan te duiden.",
max_length=10,
null=True,
validators=[django.core.validators.validate_integer],
verbose_name="Klantnummer",
),
),
(
"product",
models.ForeignKey(
help_text="De organisatie van het contact",
on_delete=django.db.models.deletion.CASCADE,
related_name="eigenaren",
to="producten.product",
verbose_name="product",
),
),
],
options={
"verbose_name": "Eigenaar",
"verbose_name_plural": "Eigenaren",
},
),
]
3 changes: 2 additions & 1 deletion src/open_producten/producten/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .eigenaar import Eigenaar
from .product import Product

__all__ = ["Product"]
__all__ = ["Product", "Eigenaar"]
101 changes: 101 additions & 0 deletions src/open_producten/producten/models/eigenaar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
from django.core.exceptions import ValidationError
from django.core.validators import MinLengthValidator, RegexValidator, validate_integer
from django.db import models
from django.utils.translation import gettext_lazy as _

from open_producten.producten.models.validators import validate_bsn
from open_producten.utils.models import BaseModel

from .product import Product


class Eigenaar(BaseModel):

product = models.ForeignKey(
Product,
verbose_name=_("product"),
related_name="eigenaren",
on_delete=models.CASCADE,
help_text=_("De organisatie van het contact"),
)

bsn_nummer = models.CharField(
_("BSN nummer"),
help_text=_(
"De BSN van de product eigenaar, BSN van 8 karakters moet met een extra 0 beginnen."
),
validators=[validate_bsn],
null=True,
blank=True,
)

kvk_nummer = models.CharField(
_("KVK nummer"),
help_text=_("Het kvk nummer van de product eigenaar"),
max_length=8,
validators=[MinLengthValidator(8), RegexValidator("^[0-9]*$")],
null=True,
blank=True,
)

vestigingsnummer = models.CharField(
_("Vestigingsnummer"),
max_length=24,
null=True,
blank=True,
help_text=_("Een korte unieke aanduiding van een vestiging."),
)

klantnummer = models.CharField(
_("Klantnummer"),
help_text=_(
"Uniek identificerend nummer dat tijdens communicatie tussen mensen kan "
"worden gebruikt om het specifieke klantcontact aan te duiden."
),
validators=[validate_integer],
max_length=10,
null=True,
blank=True,
)

def clean(self):
validate_vestingsnummer_only_with_kvk(self.kvk_nummer, self.vestigingsnummer)
validate_bsn_kvk_or_klant(self.bsn_nummer, self.kvk_nummer, self.klantnummer)

def __str__(self):
if self.bsn_nummer:
return f"BSN {self.bsn_nummer}"

if self.klantnummer:
return f"klantnummer {self.klantnummer}"

if self.kvk_nummer:
return f"KVK {self.kvk_nummer}" + (
f" vestigingsnummer {self.vestigingsnummer}"
if self.vestigingsnummer
else ""
)

class Meta:
verbose_name = _("Eigenaar")
verbose_name_plural = _("Eigenaren")


def validate_bsn_kvk_or_klant(bsn_nummer, kvk_nummer, klantnummer):
if not bsn_nummer and not kvk_nummer and not klantnummer:
raise ValidationError(
_(
"Een eigenaar moet een bsn, klantnummer, kvk nummer (met of zonder vestigingsnummer) of een combinatie hebben."
)
)


def validate_vestingsnummer_only_with_kvk(kvk_nummer, vestigingsnummer):
if vestigingsnummer and not kvk_nummer:
raise ValidationError(
{
"vestigingsnummer": _(
"Een vestigingsnummer kan alleen in combinatie met een kvk nummer worden ingevuld."
)
}
)
38 changes: 2 additions & 36 deletions src/open_producten/producten/models/product.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
from datetime import date
from decimal import Decimal

from django.core.validators import (
MinLengthValidator,
MinValueValidator,
RegexValidator,
ValidationError,
)
from django.core.validators import MinValueValidator, ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _

Expand All @@ -15,8 +10,6 @@
from open_producten.producttypen.models.producttype import ProductStateChoices
from open_producten.utils.models import BasePublishableModel

from .validators import validate_bsn


class PrijsFrequentieChoices(models.TextChoices):

Expand Down Expand Up @@ -51,16 +44,6 @@ class Product(BasePublishableModel):
blank=True,
)

bsn = models.CharField(
_("BSN"),
help_text=_(
"De BSN van de product eigenaar, BSN van 8 karakters moet met een extra 0 beginnen."
),
validators=[validate_bsn],
null=True,
blank=True,
)

status = models.CharField(
_("status"),
choices=ProductStateChoices.choices,
Expand All @@ -70,15 +53,6 @@ class Product(BasePublishableModel):
default=ProductStateChoices.INITIEEL,
)

kvk = models.CharField(
_("KVK nummer"),
help_text=_("Het kvk nummer van de product eigenaar"),
max_length=8,
validators=[MinLengthValidator(8), RegexValidator("^[0-9]*$")],
null=True,
blank=True,
)

prijs = models.DecimalField(
verbose_name=_("bedrag"),
decimal_places=2,
Expand All @@ -99,7 +73,6 @@ class Meta:
verbose_name_plural = _("Producten")

def clean(self):
validate_bsn_or_kvk(self.bsn, self.kvk)
validate_dates(self.start_datum, self.eind_datum)

def save(self, *args, **kwargs):
Expand Down Expand Up @@ -136,14 +109,7 @@ def handle_eind_datum(self):
self.status = ProductStateChoices.VERLOPEN

def __str__(self):
return f"{self.bsn if self.bsn else self.kvk} {self.product_type.naam}"


def validate_bsn_or_kvk(bsn, kvk):
if not bsn and not kvk:
raise ValidationError(
_("Een product moet een bsn, kvk nummer of beiden hebben.")
)
return f"{self.product_type.naam} instantie."


def validate_status(status, product_type):
Expand Down
19 changes: 19 additions & 0 deletions src/open_producten/producten/serializers/eigenaar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from rest_framework import serializers

from open_producten.producten.models import Eigenaar
from open_producten.producten.serializers.validators import (
EigenaarIdentifierValidator,
EigenaarVestigingsnummerValidator,
)


class EigenaarSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(required=False)

class Meta:
model = Eigenaar
fields = ["id", "bsn_nummer", "kvk_nummer", "vestigingsnummer", "klantnummer"]
validators = [
EigenaarIdentifierValidator(),
EigenaarVestigingsnummerValidator(),
]
Loading

0 comments on commit fc82519

Please sign in to comment.