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