From c5bb91d31accaeb16fa76b3cd5d79ee58ae5a912 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Thu, 10 Sep 2020 10:59:13 +0200
Subject: [PATCH] FEAT #14458 TIME 1:10 empty value in import contact

---
 .../contact/controllers/ContactController.php | 35 +++++++++++--------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/app/contact/controllers/ContactController.php b/src/app/contact/controllers/ContactController.php
index e70c0ee790f..70a1a8a360e 100755
--- a/src/app/contact/controllers/ContactController.php
+++ b/src/app/contact/controllers/ContactController.php
@@ -1239,21 +1239,21 @@ class ContactController
 
             // Check format of fields
             foreach ($contactFields as $frontField => $backField) {
-                if (!empty($contact[$frontField])) {
+                if (!empty($contact[$frontField]) && $contact[$frontField] !== false) {
                     if (strpos($frontField, 'contactCustomField_') !== false) {
                         $customId = explode('_', $frontField)[1];
                         // Check custom field format
                         $type = $customTypes[(string)$customId];
-                        if (in_array($type, ['checkbox', 'radio']) && !Validator::arrayType()->validate($contact[$frontField])) {
+                        if ($type == 'checkbox' && !Validator::arrayType()->validate($contact[$frontField])) {
                             $errors[] = ['error' => "Argument {$frontField} is not an array for contact {$key}", 'index' => $key, 'lang' => 'argumentNotArray'];
                             continue 2;
-                        } elseif ($customTypes[$customId] == 'integer' && !Validator::intVal()->validate($contact[$frontField])) {
+                        } elseif ($type == 'integer' && !Validator::floatVal()->validate($contact[$frontField])) {
                             $errors[] = ['error' => "Argument {$frontField} is not an integer for contact {$key}", 'index' => $key, 'lang' => 'argumentNotInteger'];
                             continue 2;
-                        } elseif ($customTypes[$customId] == 'date' && !Validator::date()->validate($contact[$frontField])) {
+                        } elseif ($type == 'date' && !Validator::date()->validate($contact[$frontField])) {
                             $errors[] = ['error' => "Argument {$frontField} is not a date for contact {$key}", 'index' => $key, 'lang' => 'argumentNotDate'];
                             continue 2;
-                        } elseif (in_array($customTypes[$customId], ['string', 'select']) && !Validator::stringType()->validate($contact[$frontField]) || !Validator::length(1, 255)->validate($contact[$frontField])) {
+                        } elseif (in_array($type, ['string', 'select', 'radio']) && !Validator::stringType()->validate($contact[$frontField]) || !Validator::length(1, 255)->validate($contact[$frontField])) {
                             $errors[] = ['error' => "Argument {$frontField} is not a string for contact {$key}", 'index' => $key, 'lang' => 'argumentNotString'];
                             continue 2;
                         }
@@ -1293,7 +1293,7 @@ class ContactController
 
                 $contactToCreate = ['creator' => $GLOBALS['id'], 'custom_fields' => []];
                 foreach ($contactFields as $frontField => $backField) {
-                    if (isset($contact[$frontField])) {
+                    if (!empty($contact[$frontField])) {
                         if (strpos($frontField, 'contactCustomField_') !== false) {
                             $contactToCreate['custom_fields'][$backField] = $contact[$frontField];
                         } else {
@@ -1307,25 +1307,32 @@ class ContactController
             } else {
                 // If id, then we update the contact
                 $set = ['modification_date' => 'CURRENT_TIMESTAMP', 'custom_fields' => []];
+                $customsToRemove = [];
                 foreach ($contactFields as $frontField => $backField) {
-                    if (isset($contact[$frontField])) {
+                    if (!empty($contact[$frontField])) {
                         if (strpos($frontField, 'contactCustomField_') !== false) {
                             $set['custom_fields'][$backField] = $contact[$frontField];
                         } else {
                             $set[$backField] = $contact[$frontField];
                         }
+                    } elseif ($contact[$frontField] === false && strpos($frontField, 'contactCustomField_') !== false) {
+                        $customsToRemove[] = $backField;
+                    } elseif ($contact[$frontField] === false && strpos($frontField, 'contactCustomField_') === false) {
+                        $set[$backField] = null;
                     }
                 }
 
-                if (empty($set['custom_fields'])) {
-                    unset($set['custom_fields']);
-                } else {
-                    $oldContact = ContactModel::getById(['id' => $contact['id'], 'select' => ['custom_fields']]);
-                    if (!empty($oldContact['custom_fields'])) {
-                        $set['custom_fields'] = $set['custom_fields'] + json_decode($oldContact['custom_fields'], true);
+
+                $oldContact = ContactModel::getById(['id' => $contact['id'], 'select' => ['custom_fields']]);
+                if (!empty($oldContact['custom_fields'])) {
+                    $set['custom_fields'] = $set['custom_fields'] + json_decode($oldContact['custom_fields'], true);
+                }
+                if (!empty($customsToRemove)) {
+                    foreach ($customsToRemove as $item) {
+                        unset($set['custom_fields'][$item]);
                     }
-                    $set['custom_fields'] = json_encode($set['custom_fields']);
                 }
+                $set['custom_fields'] = !empty($set['custom_fields']) ? json_encode($set['custom_fields']) : '{}';
 
                 if (!empty($set)) {
                     ContactModel::update([
-- 
GitLab