From dfda4645ceb031852d3d24ba74e4b4061bfd9f30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Wed, 1 Mar 2023 23:59:36 +0100
Subject: [PATCH] finish implementing AO requirements - separate approvals,
 autofill dates + notices, ares error handling

---
 contracts/admin.py                | 24 ++++++++++++++---
 contracts/models.py               | 15 +++++++++--
 static_src/admin/contract_form.js | 43 +++++++++++++++++++++++++++++++
 static_src/admin/signee_form.js   | 15 +++++++++++
 4 files changed, 92 insertions(+), 5 deletions(-)

diff --git a/contracts/admin.py b/contracts/admin.py
index 1e7ecc2..d117abe 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -130,9 +130,14 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
         ]
 
         if request.user.is_superuser or request.user.has_perm("approve", self):
-            fieldsets[0][1]["fields"].insert(
-                fieldsets[0][1]["fields"].index("primary_contract"),
-                "approval_state",
+            fieldsets.insert(
+                0,
+                (
+                    "Schválení",
+                    {
+                        "fields": ["approval_state"]
+                    }
+                ),
             )
 
         return fieldsets
@@ -141,6 +146,19 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
         if obj.created_by is None:
             obj.created_by = request.user
 
+        if obj.valid_start_date is None:
+            last_signature_date = None
+            
+            for signature_set in (
+                obj.contractee_signatures.all(),
+                obj.signee_signatures.all()
+            ):
+                for signature in signature_set:
+                    if last_signature_date is None or last_signature_date < signature.date:
+                        last_signature_date = signature.date
+
+            obj.valid_start_date = last_signature_date
+
         super().save_model(request, obj, form, change)
 
 
diff --git a/contracts/models.py b/contracts/models.py
index 33601ce..55cfefb 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -330,7 +330,7 @@ class Contract(models.Model):
         verbose_name="Stav schválení",
         help_text=(
             "Může měnit jen schvalovatel. Pokud je smlouva "
-            "veřejná, se stavem \"Přijatá\" se vypustí ven."
+            "veřejná, se stavem \"Schválená\" se vypustí ven."
         ),
     )
 
@@ -493,7 +493,18 @@ class Contract(models.Model):
         ).all()
 
     def __str__(self) -> str:
-        return self.name
+        result = ""
+        
+        if self.public_state == Contract.PublicStates.YES:
+            result += "SCHVÁLENÁ - "
+        elif self.public_state == Contract.PublicStates.NO:
+            result += "NESCHVÁLENÁ - "
+        else:
+            result += "KE ZPRACOVÁNÍ - "
+
+        result += self.name
+
+        return result
 
 
 class ContractFile(NameStrMixin, models.Model):
diff --git a/static_src/admin/contract_form.js b/static_src/admin/contract_form.js
index edfdaf9..0cbcbf7 100644
--- a/static_src/admin/contract_form.js
+++ b/static_src/admin/contract_form.js
@@ -1,7 +1,13 @@
 import $ from "jquery";
 
+import alertify from "alertifyjs";
+import "alertifyjs/build/css/alertify.min.css";
+
 $(window).ready(
     () => {
+        let startDateWarningDismissed = false;
+        let endDateWarningDismissed = false;
+        
         $(".field-publishing_rejection_comment").
         css(
             "display",
@@ -24,5 +30,42 @@ $(window).ready(
                 );
             }
         );
+        
+        $(
+            "#contract_form .submit-row input[name=\"_save\"],"
+            + "#contract_form .submit-row input[name=\"_addanother\"],"
+            + "#contract_form .submit-row input[name=\"_continue\"]"
+        ).on(
+            "click",
+            event => {
+                if (!startDateWarningDismissed && $("#id_valid_start_date").val() === "") {
+                    event.preventDefault();
+                    
+                    alertify.alert(
+                        "Začátek platnosti není zadán",
+                        `Začátek platnosti nebyl uveden. Pokud ho necháš tak, jak je, 
+bude automaticky vyplněn podle posledního data
+podpisu smluvních stran. Pokud podpisy neexistují,
+pole zůstane prázdné.`,
+                        () => {
+                            startDateWarningDismissed = true;
+                        }
+                    );
+                }
+                
+                if (!endDateWarningDismissed && $("#id_valid_end_date").val() === "") {
+                    event.preventDefault();
+                    
+                    alertify.alert(
+                        "Konec platnosti není zadán",
+                        `Konec platnosti nebyl uveden. Pokud ho necháš tak, jak je, 
+smlouva bude evidována jako na dobu neurčitou.`,
+                        () => {
+                            endDateWarningDismissed = true;
+                        }
+                    );
+                }
+            }
+        )
     }
 );
diff --git a/static_src/admin/signee_form.js b/static_src/admin/signee_form.js
index e8302df..4d0acae 100644
--- a/static_src/admin/signee_form.js
+++ b/static_src/admin/signee_form.js
@@ -1,5 +1,7 @@
 import $ from "jquery";
+
 import alertify from "alertifyjs";
+import "alertifyjs/build/css/alertify.min.css";
 
 const fieldDepartmentValues = new Set([
     "legal_entity",
@@ -105,6 +107,19 @@ $(window).ready(
                     "text/xml"
                 );
                 
+                const errors = formattedAresData.getElementsByTagName("are:Error");
+                
+                if (errors.length !== 0) {
+                    alertify.error("Chyba při načítní dat z ARES. Je IČO zadáno správně?");
+                    
+                    console.warn(
+                        "Error(s) loading ARES data: ",
+                        errors
+                    );
+                    
+                    return;
+                }
+                
                 let streetResult = "";
                 
                 const streetElements = formattedAresData.getElementsByTagName("dtt:Nazev_ulice");
-- 
GitLab