From 6a17ebae19c95aaeebf01867f3965b3713725093 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 12:05:29 +0100
Subject: [PATCH] wip - ares data loading

---
 contracts/admin.py              | 25 +++++++++++++++++++++++++
 contracts/models.py             |  1 +
 package.json                    |  3 ++-
 static_src/admin/signee_form.js | 33 +++++++++++++++++++++++++++++++--
 webpack.config.js               | 10 ++++++++++
 5 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/contracts/admin.py b/contracts/admin.py
index 010bce2..1e7ecc2 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -1,4 +1,5 @@
 from django.contrib import admin
+from django.utils.html import format_html
 
 from shared.admin import MarkdownxGuardedModelAdmin
 
@@ -156,8 +157,32 @@ class SigneeRepresentativeInline(admin.TabularInline):
 class SigneeAdmin(MarkdownxGuardedModelAdmin):
     form = SigneeAdminForm
 
+    fields = (
+        "name",
+        "entity_type",
+        "address_street_with_number",
+        "address_district",
+        "address_zip",
+        "address_country",
+        "ico_number",
+        "load_ares_data_button",
+        "date_of_birth",
+        "department",
+        "role",
+    )
+
+    readonly_fields = ("load_ares_data_button",)
+
     inlines = (SigneeRepresentativeInline,)
 
+    def load_ares_data_button(self, obj):
+        return format_html(
+            "<button type=\"button\" id=\"load_ares_data\">Načíst data</button>"
+        )
+
+    load_ares_data_button.allow_tags = True
+    load_ares_data_button.short_description = "ARES"
+
 
 class ContracteeRepresentativeInline(admin.TabularInline):
     form = ContractFileAdminForm
diff --git a/contracts/models.py b/contracts/models.py
index 8d6236e..33601ce 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -73,6 +73,7 @@ class Signee(models.Model):
         blank=True,
         null=True,
         verbose_name="IČO",
+        help_text="Vyplněním můžeš automaticky načíst data z ARES."
     )  # WARNING: Legal entity status dependent!
 
     date_of_birth = models.DateField(
diff --git a/package.json b/package.json
index eea8208..4ba021e 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
   "license": "AGPL-3.0-or-later",
   "dependencies": {
     "@tailwindcss/typography": "^0.5.9",
+    "alertifyjs": "^1.13.1",
     "css-loader": "^6.7.3",
     "jquery": "^3.6.3",
     "style-loader": "^3.3.1",
@@ -21,6 +22,6 @@
     "vue": "v2-latest",
     "webpack": "^5.75.0",
     "webpack-bundle-tracker": "^1.8.0",
-    "webpack-cli": "^5.0.1"
+    "webpack-cli": "^5.0.1",
   }
 }
diff --git a/static_src/admin/signee_form.js b/static_src/admin/signee_form.js
index 3776c5d..0b0da41 100644
--- a/static_src/admin/signee_form.js
+++ b/static_src/admin/signee_form.js
@@ -1,4 +1,7 @@
 import $ from "jquery";
+import alertify from "alertifyjs";
+
+const xmlParser = require("xml2json");
 
 const fieldDepartmentValues = new Set([
     "legal_entity",
@@ -19,7 +22,7 @@ $(window).ready(
             )
         );
         
-        $(".field-ico_number").
+        $(".field-ico_number,.field-load_ares_data_button").
         css(
             "display",
             (
@@ -55,7 +58,7 @@ $(window).ready(
                         "block" : "none"
                     )
                 );
-                $(".field-ico_number").
+                $(".field-ico_number,.field-load_ares_data_button").
                 css(
                     "display",
                     (
@@ -78,5 +81,31 @@ $(window).ready(
                 if (!fieldDepartmentValues.has($(event.target).val()) && !isEmpty) $("#id_department").val("");
             }
         );
+        
+        $("#load_ares_data").on(
+            "click",
+            async (event) => {
+                const icoValue = $("#id_ico_number").val();
+                
+                const aresXMLResponse = await fetch(
+                    `https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico=${icoValue}`
+                );
+                
+                if (!aresXMLResponse.ok) {
+                    alertify.error("Chyba při načítní dat z ARES. Je IČO správné?");
+                    
+                    console.warn(
+                        "Error loading ARES data: ",
+                        await aresXMLResponse.text()
+                    );
+                    
+                    return;
+                }
+                
+                const formattedAresResponse = xmlParser.toJson(aresXMLResponse);
+                
+                console.log(formattedAresResponse);
+            }
+        );
     }
 );
diff --git a/webpack.config.js b/webpack.config.js
index 36fbd6c..a40806e 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -41,4 +41,14 @@ module.exports = {
   plugins: [
     new BundleTracker({filename: './webpack-stats.json'})
   ],
+  resolve: {
+    fallback: {
+      "path": require.resolve("path-browserify"),
+      "crypto": require.resolve("crypto-browserify"),
+      "assert": require.resolve("assert/"),
+      "buffer": require.resolve("buffer/"),
+      "stream": require.resolve("stream-browserify"),
+    },
+    extensions: [".js"],
+  }
 };
-- 
GitLab