From f56e643d4c2b4efc2a3af1d1c9a6d55379a97dfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Sat, 22 Apr 2023 16:25:41 +0200
Subject: [PATCH] signing party normalization

---
 .../commands/import_old_contracts.py          | 35 +++++++++++++++++--
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py
index 23f456c..4264bbb 100644
--- a/contracts/management/commands/import_old_contracts.py
+++ b/contracts/management/commands/import_old_contracts.py
@@ -7,6 +7,7 @@ from datetime import date, datetime
 import yaml
 from django.conf import settings
 from django.core.management.base import BaseCommand
+from django.db import models
 from postal.parser import parse_address
 
 from git import Repo
@@ -300,10 +301,12 @@ class Command(BaseCommand):
             "česká pirátkská strana",
             "česká pirátská stran",
         ):
-            instance = Contractee()
+            model = Contractee
+            instance = model()
             is_contractee = True
         else:
-            instance = Signee(name=name, address_country="Česká republika")
+            model = Signee
+            instance = model(name=name, address_country="Česká republika")
 
         for signing_party_key, signing_party_value in signing_party.items():
             if isinstance(signing_party_value, str):
@@ -352,7 +355,33 @@ class Command(BaseCommand):
                 case "IČ":
                     instance.ico_number = signing_party_value
 
-        instance.save()
+        # Do our best to merge signing parties together.
+        existing_instance = model.objects.filter(
+            (
+                models.Q(name=instance.name)
+                & (
+                    (
+                        models.Q(address_street_with_number=instance.address_street_with_number)
+                        if instance.address_street_with_number is not None
+                        else models.Value(False)
+                    ) | (
+                        models.Q(date_of_birth=instance.date_of_birth)
+                        if model is Signee and instance.date_of_birth is not None
+                        else models.Value(False)
+                    )
+                )
+            )
+            | (
+                models.Q(ico_number=instance.ico_number)
+                if instance.ico_number is not None
+                else models.Value(False)
+            )
+        ).first()
+
+        if existing_instance is not None:
+            instance = existing_instance
+        else:
+            instance.save()
 
         return instance, is_contractee, issue_count
 
-- 
GitLab