From 6cf720bc7bd16c27bc2dc077d2b1eb78ae678fc1 Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Thu, 26 Sep 2019 18:32:27 +0530
Subject: [PATCH] Fixes:#1173::Uma::Multi picklist Validation and save for
 editable picklist values is supported

---
 modules/Calendar/actions/Save.php       | 18 ++----------
 modules/SalesOrder/actions/SaveAjax.php | 36 ++++--------------------
 modules/Vtiger/actions/Save.php         | 18 ++----------
 modules/Vtiger/actions/SaveAjax.php     | 37 ++++---------------------
 modules/Vtiger/helpers/Util.php         | 20 +++++++++++++
 5 files changed, 38 insertions(+), 91 deletions(-)

diff --git a/modules/Calendar/actions/Save.php b/modules/Calendar/actions/Save.php
index 32cb30162..6fc2b91e4 100644
--- a/modules/Calendar/actions/Save.php
+++ b/modules/Calendar/actions/Save.php
@@ -144,24 +144,12 @@ class Calendar_Save_Action extends Vtiger_Save_Action {
 			$fieldValue = $request->get($fieldName, null);
             // For custom time fields in Calendar, it was not converting to db insert format(sending as 10:00 AM/PM)
             $fieldDataType = $fieldModel->getFieldDataType();
+            if($fieldValue){
+                $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+            }
 			if($fieldDataType == 'time' && $fieldValue !== null){
 				$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
             }
-            if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                $fieldInfo = $fieldModel->getFieldInfo();
-                $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                if($fieldDataType == 'multipicklist'&& !empty($editablePicklistValues)){
-                    $selectedMultiPick = array();
-                    foreach ($fieldValue as $key => $selectedValue) {
-                        if(in_array($selectedValue, $editablePicklistValues)){
-                            $selectedMultiPick[] = $selectedValue;
-                        }
-                    }
-                    $fieldValue = $selectedMultiPick;
-                }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                    $fieldValue = null;
-                }
-            }
             // End
             if ($fieldName === $request->get('field')) {
 				$fieldValue = $request->get('value');
diff --git a/modules/SalesOrder/actions/SaveAjax.php b/modules/SalesOrder/actions/SaveAjax.php
index bcb53e74a..92d2df700 100755
--- a/modules/SalesOrder/actions/SaveAjax.php
+++ b/modules/SalesOrder/actions/SaveAjax.php
@@ -56,24 +56,12 @@ class SalesOrder_SaveAjax_Action extends Inventory_SaveAjax_Action {
 				}
 
 				$fieldDataType = $fieldModel->getFieldDataType();
+                if($fieldValue){
+                    $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+                }
 				if ($fieldDataType == 'time' && $fieldValue !== null) {
 					$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
 				}
-                if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                    $fieldInfo = $fieldModel->getFieldInfo();
-                    $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                    if($fieldDataType == 'multipicklist'&& !empty($editablePicklistValues)){
-                        $selectedMultiPick = array();
-                        foreach ($fieldValue as $key => $selectedValue) {
-                            if(in_array($selectedValue, $editablePicklistValues)){
-                                $selectedMultiPick[] = $selectedValue;
-                            }
-                        }
-                        $fieldValue = $selectedMultiPick;
-                    }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                        $fieldValue = null;
-                    }
-                }
 				if ($fieldValue !== null) {
 					if (!is_array($fieldValue)) {
 						$fieldValue = trim($fieldValue);
@@ -96,24 +84,12 @@ class SalesOrder_SaveAjax_Action extends Inventory_SaveAjax_Action {
 					$fieldValue = $fieldModel->getDefaultFieldValue();
 				}
 				$fieldDataType = $fieldModel->getFieldDataType();
+                if($fieldValue){
+                    $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+                }
 				if ($fieldDataType == 'time' && $fieldValue !== null) {
 					$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
 				}
-                if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                    $fieldInfo = $fieldModel->getFieldInfo();
-                    $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                    if($fieldDataType == 'multipicklist'&& !empty($editablePicklistValues)){
-                        $selectedMultiPick = array();
-                        foreach ($fieldValue as $key => $selectedValue) {
-                            if(in_array($selectedValue, $editablePicklistValues)){
-                                $selectedMultiPick[] = $selectedValue;
-                            }
-                        }
-                        $fieldValue = $selectedMultiPick;
-                    }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                        $fieldValue = null;
-                    }
-                }
 				if ($fieldValue !== null) {
 					if (!is_array($fieldValue)) {
 						$fieldValue = trim($fieldValue);
diff --git a/modules/Vtiger/actions/Save.php b/modules/Vtiger/actions/Save.php
index fdbf584dc..3def25fd8 100644
--- a/modules/Vtiger/actions/Save.php
+++ b/modules/Vtiger/actions/Save.php
@@ -158,24 +158,12 @@ class Vtiger_Save_Action extends Vtiger_Action_Controller {
 		foreach ($fieldModelList as $fieldName => $fieldModel) {
 			$fieldValue = $request->get($fieldName, null);
 			$fieldDataType = $fieldModel->getFieldDataType();
+            if($fieldValue){
+                $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+            }
 			if($fieldDataType == 'time' && $fieldValue !== null){
 				$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
 			}
-            if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                $fieldInfo = $fieldModel->getFieldInfo();
-                $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                if($fieldDataType == 'multipicklist'&& !empty($editablePicklistValues)){
-                    $selectedMultiPick = array();
-                    foreach ($fieldValue as $key => $selectedValue) {
-                        if(in_array($selectedValue, $editablePicklistValues)){
-                            $selectedMultiPick[] = $selectedValue;
-                        }
-                    }
-                    $fieldValue = $selectedMultiPick;
-                }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                    $fieldValue = null;
-                }
-            }
 			if($fieldValue !== null) {
 				if(!is_array($fieldValue) && $fieldDataType != 'currency') {
 					$fieldValue = trim($fieldValue);
diff --git a/modules/Vtiger/actions/SaveAjax.php b/modules/Vtiger/actions/SaveAjax.php
index 2a560adaa..4207e24b1 100644
--- a/modules/Vtiger/actions/SaveAjax.php
+++ b/modules/Vtiger/actions/SaveAjax.php
@@ -102,26 +102,13 @@ class Vtiger_SaveAjax_Action extends Vtiger_Save_Action {
 				}else if($fieldName === $request->get('field')){
 					$fieldValue = $request->get('value');
 				}
-
+                if($fieldValue){
+                    $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+                }
 				$fieldDataType = $fieldModel->getFieldDataType();
 				if ($fieldDataType == 'time' && $fieldValue !== null) {
 					$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
 				}
-                if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                    $fieldInfo = $fieldModel->getFieldInfo();
-                    $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                    if($fieldDataType == 'multipicklist'&& !empty($editablePicklistValues)){
-                        $selectedMultiPick = array();
-                        foreach ($fieldValue as $key => $selectedValue) {
-                            if(in_array($selectedValue, $editablePicklistValues)){
-                                $selectedMultiPick[] = $selectedValue;
-                            }
-                        }
-                        $fieldValue = $selectedMultiPick;
-                    }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                        $fieldValue = null;
-                    }
-                }
 				if ($fieldValue !== null) {
 					if (!is_array($fieldValue)) {
 						$fieldValue = trim($fieldValue);
@@ -147,25 +134,13 @@ class Vtiger_SaveAjax_Action extends Vtiger_Save_Action {
 				} else {
 					$fieldValue = $fieldModel->getDefaultFieldValue();
 				}
+                if($fieldValue){
+                    $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel);
+                }
 				$fieldDataType = $fieldModel->getFieldDataType();
 				if ($fieldDataType == 'time' && $fieldValue !== null) {
 					$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
 				}
-                if(($fieldDataType == 'picklist' || $fieldDataType == 'multipicklist' || $fieldDataType == 'multiowner') && $fieldValue !== null){
-                    $fieldInfo = $fieldModel->getFieldInfo();
-                    $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
-                    if($fieldDataType == 'multipicklist'){
-                        $selectedMultiPick = array();
-                        foreach ($fieldValue as $key => $selectedValue) {
-                            if(in_array($selectedValue, $editablePicklistValues)){
-                                $selectedMultiPick[] = $selectedValue;
-                            }
-                        }
-                        $fieldValue = $selectedMultiPick;
-                    }else if( $fieldDataType != 'multipicklist' && !empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
-                        $fieldValue = null;
-                    }
-                }
 				if ($fieldValue !== null) {
 					if (!is_array($fieldValue)) {
 						$fieldValue = trim($fieldValue);
diff --git a/modules/Vtiger/helpers/Util.php b/modules/Vtiger/helpers/Util.php
index 23b7f18e7..a23595084 100644
--- a/modules/Vtiger/helpers/Util.php
+++ b/modules/Vtiger/helpers/Util.php
@@ -1250,4 +1250,24 @@ class Vtiger_Util_Helper {
 		}
 		return $encryptedFileName;
 	}
+    
+    public static function validateFieldValue($fieldValue,$fieldModel){
+        $fieldDataType = $fieldModel->getFieldDataType();
+        $fieldInfo = $fieldModel->getFieldInfo();
+        $editablePicklistValues = $fieldInfo['editablepicklistvalues'];
+        if($fieldValue && $fieldDataType == 'picklist'){
+           if(!empty($editablePicklistValues) && !in_array($fieldValue, $editablePicklistValues)){
+                $fieldValue = null;
+            }
+        }elseif(count($fieldValue) > 0 && $fieldDataType == 'multipicklist'){
+            if(!empty($editablePicklistValues)){
+                foreach($fieldValue as $key => $value){
+                    if(!in_array($value, $editablePicklistValues)){
+                        unset($fieldValue[$key]);
+                    }
+                }
+            }
+        }
+        return $fieldValue;
+    }
 }
-- 
GitLab