From f99ae1270ef40cb28ef4f39b8b87ec246dcaf657 Mon Sep 17 00:00:00 2001
From: akshath <akshath.t@vtiger.com>
Date: Fri, 30 Oct 2020 13:55:09 +0530
Subject: [PATCH] Fix for #1523 - Optimization of record label computation.

---
 data/CRMEntity.php                            | 44 +++++++++++++++----
 modules/Migration/schema/730_to_740.php       | 19 ++++++++
 .../Vtiger/handlers/RecordLabelUpdater.php    | 33 --------------
 3 files changed, 55 insertions(+), 41 deletions(-)
 create mode 100644 modules/Migration/schema/730_to_740.php
 delete mode 100644 modules/Vtiger/handlers/RecordLabelUpdater.php

diff --git a/data/CRMEntity.php b/data/CRMEntity.php
index ec61d6fed..425f7135f 100644
--- a/data/CRMEntity.php
+++ b/data/CRMEntity.php
@@ -278,6 +278,14 @@ class CRMEntity {
 		if ($module == 'Events') {
 			$module = 'Calendar';
 		}
+
+		$entityFields = Vtiger_Functions::getEntityModuleInfo($module);
+        $entityFieldNames  = explode(',', $entityFields['fieldname']);
+        $label = (count($entityFieldNames) > 1) ? 
+                        $this->column_fields[$entityFieldNames[0]].' '.$this->column_fields[$entityFieldNames[1]] : 
+                        $this->column_fields[$entityFieldNames[0]];
+        $this->column_fields['label'] = $label;
+
 		if ($this->mode == 'edit') {
 			$description_val = from_html($this->column_fields['description'], ($insertion_mode == 'edit') ? true : false);
 
@@ -291,8 +299,8 @@ class CRMEntity {
 
 			$acl = Vtiger_AccessControl::loadUserPrivileges($current_user->id);
 			if ($acl->is_admin == true || $acl->profileGlobalPermission[1] == 0 || $acl->profileGlobalPermission[2] == 0 || $this->isWorkFlowFieldUpdate) {
-				$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?,modifiedby=?,description=?, modifiedtime=? where crmid=?";
-				$params = array($ownerid, $groupid, $current_user->id, $description_val, $adb->formatDate($date_var, true), $this->id);
+				$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?,modifiedby=?,description=?, modifiedtime=?";
+				$params = array($ownerid, $groupid, $current_user->id, $description_val, $adb->formatDate($date_var, true));
 			} else {
 				$profileList = getCurrentUserProfileList();
 				$perm_qry = "SELECT columnname FROM vtiger_field INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid = vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid = vtiger_field.fieldid WHERE vtiger_field.tabid = ? AND vtiger_profile2field.visible = 0 AND vtiger_profile2field.readonly = 0 AND vtiger_profile2field.profileid IN (" . generateQuestionMarks($profileList) . ") AND vtiger_def_org_field.visible = 0 and vtiger_field.tablename='vtiger_crmentity' and vtiger_field.displaytype in (1,3) and vtiger_field.presence in (0,2);";
@@ -302,13 +310,22 @@ class CRMEntity {
 					$columname[] = $adb->query_result($perm_result, $i, "columnname");
 				}
 				if (is_array($columname) && in_array("description", $columname)) {
-					$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?, modifiedby=?,description=?, modifiedtime=? where crmid=?";
-					$params = array($ownerid, $groupid, $current_user->id, $description_val, $adb->formatDate($date_var, true), $this->id);
+					$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?, modifiedby=?,description=?, modifiedtime=?";
+					$params = array($ownerid, $groupid, $current_user->id, $description_val, $adb->formatDate($date_var, true));
 				} else {
-					$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?,modifiedby=?, modifiedtime=? where crmid=?";
-					$params = array($ownerid, $groupid, $current_user->id, $adb->formatDate($date_var, true), $this->id);
+					$sql = "update vtiger_crmentity set smownerid=?, smgroupid=?,modifiedby=?, modifiedtime=?";
+					$params = array($ownerid, $groupid, $current_user->id, $adb->formatDate($date_var, true));
 				}
 			}
+
+			if($label) {
+				$sql .= ", label = ? ";
+				array_push($params, trim($label));
+			}
+
+			$sql .= " where crmid=?";
+			array_push($params,$this->id);
+
 			$adb->pquery($sql, $params);
 			$this->column_fields['modifiedtime'] =  $modified_date_var;
 			$this->column_fields['modifiedby'] = $current_user->id;
@@ -339,8 +356,19 @@ class CRMEntity {
 			}
 
 			$description_val = from_html($this->column_fields['description'], ($insertion_mode == 'edit') ? true : false);
-			$sql = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,smgroupid,setype,description,modifiedby,createdtime,modifiedtime,source) values(?,?,?,?,?,?,?,?,?,?)";
-			$params = array($current_id, $current_user->id, $ownerid, $groupid, $module, $description_val, $current_user->id, $created_date_var, $modified_date_var,$source);
+			$params = array("crmid" => $current_id, "smcreatorid" => $current_user->id, "smownerid" => $ownerid, 
+							"smgroupid" => $groupid, "setype" => $module, "description" => $description_val,
+							"modifiedby" => $current_user->id, "createdtime" => $created_date_var, 
+							"modifiedtime" => $modified_date_var, "source" => $source);
+
+			if($label) {
+				$params['label'] = trim($label);
+			}
+
+			$insert_columns = array_keys($params);
+			$insert_data = array_values($params);
+			$sql = "insert into vtiger_crmentity (".implode(",",$insert_columns).") values(".generateQuestionMarks($insert_data).")";
+
 			$adb->pquery($sql, $params);
 
 			$this->column_fields['createdtime'] = $created_date_var;
diff --git a/modules/Migration/schema/730_to_740.php b/modules/Migration/schema/730_to_740.php
new file mode 100644
index 000000000..4a0b367a1
--- /dev/null
+++ b/modules/Migration/schema/730_to_740.php
@@ -0,0 +1,19 @@
+<?php
+/*+********************************************************************************
+ * The contents of this file are subject to the vtiger CRM Public License Version 1.0
+ * ("License"); You may not use this file except in compliance with the License
+ * The Original Code is: vtiger CRM Open Source
+ * The Initial Developer of the Original Code is vtiger.
+ * Portions created by vtiger are Copyright (C) vtiger.
+ * All Rights Reserved.
+ *********************************************************************************/
+
+if (defined('VTIGER_UPGRADE')) {
+	global $current_user, $adb;
+    $db = PearDatabase::getInstance();
+ 
+    $eventManager = new VTEventsManager($db);
+    $className = 'Vtiger_RecordLabelUpdater_Handler';
+    $eventManager->unregisterHandler($className);
+    echo "Unregistered record label update handler.<br>";
+}
\ No newline at end of file
diff --git a/modules/Vtiger/handlers/RecordLabelUpdater.php b/modules/Vtiger/handlers/RecordLabelUpdater.php
deleted file mode 100644
index b4472d3d2..000000000
--- a/modules/Vtiger/handlers/RecordLabelUpdater.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/* +***********************************************************************************
- * The contents of this file are subject to the vtiger CRM Public License Version 1.0
- * ("License"); You may not use this file except in compliance with the License
- * The Original Code is:  vtiger CRM Open Source
- * The Initial Developer of the Original Code is vtiger.
- * Portions created by vtiger are Copyright (C) vtiger.
- * All Rights Reserved.
- * *********************************************************************************** */
-require_once 'include/events/VTEventHandler.inc';
-
-class Vtiger_RecordLabelUpdater_Handler extends VTEventHandler {
-
-	function handleEvent($eventName, $data) {
-		global $adb;
-
-		if ($eventName == 'vtiger.entity.aftersave') {
-			$record = $data->getId();
-			$module = $data->getModuleName();
-
-			if($module === 'Users') {
-				return;
-			}
-
-			$labelInfo = getEntityName($module, $record, true);
-
-			if ($labelInfo) {
-				$label = decode_html($labelInfo[$data->getId()]);
-				$adb->pquery('UPDATE vtiger_crmentity SET label=? WHERE crmid=?', array($label, $record));
-			}
-		}
-	}
-}
\ No newline at end of file
-- 
GitLab