- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
320 lines
12 KiB
PHP
320 lines
12 KiB
PHP
<?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.
|
|
*************************************************************************************/
|
|
|
|
class Leads_Record_Model extends Vtiger_Record_Model {
|
|
|
|
/**
|
|
* Function returns the url for converting lead
|
|
*/
|
|
function getConvertLeadUrl() {
|
|
return 'index.php?module='.$this->getModuleName().'&view=ConvertLead&record='.$this->getId();
|
|
}
|
|
|
|
/**
|
|
* Static Function to get the list of records matching the search key
|
|
* @param <String> $searchKey
|
|
* @return <Array> - List of Vtiger_Record_Model or Module Specific Record Model instances
|
|
*/
|
|
public static function getSearchResult($searchKey, $module=false) {
|
|
$db = PearDatabase::getInstance();
|
|
|
|
$deletedCondition = $this->getModule()->getDeletedRecordCondition();
|
|
$query = 'SELECT * FROM vtiger_crmentity
|
|
INNER JOIN vtiger_leaddetails ON vtiger_leaddetails.leadid = vtiger_crmentity.crmid
|
|
WHERE label LIKE ? AND '.$deletedCondition;
|
|
$params = array("%$searchKey%");
|
|
$result = $db->pquery($query, $params);
|
|
$noOfRows = $db->num_rows($result);
|
|
|
|
$moduleModels = array();
|
|
$matchingRecords = array();
|
|
for($i=0; $i<$noOfRows; ++$i) {
|
|
$row = $db->query_result_rowdata($result, $i);
|
|
$row['id'] = $row['crmid'];
|
|
$moduleName = $row['setype'];
|
|
if(!array_key_exists($moduleName, $moduleModels)) {
|
|
$moduleModels[$moduleName] = Vtiger_Module_Model::getInstance($moduleName);
|
|
}
|
|
$moduleModel = $moduleModels[$moduleName];
|
|
$modelClassName = Vtiger_Loader::getComponentClassName('Model', 'Record', $moduleName);
|
|
$recordInstance = new $modelClassName();
|
|
$matchingRecords[$moduleName][$row['id']] = $recordInstance->setData($row)->setModuleFromInstance($moduleModel);
|
|
}
|
|
return $matchingRecords;
|
|
}
|
|
|
|
/**
|
|
* Function returns Account fields for Lead Convert
|
|
* @return Array
|
|
*/
|
|
function getAccountFieldsForLeadConvert() {
|
|
$accountsFields = array();
|
|
$privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
|
|
$moduleName = 'Accounts';
|
|
|
|
if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) {
|
|
return;
|
|
}
|
|
|
|
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
|
|
if ($moduleModel->isActive()) {
|
|
$fieldModels = $moduleModel->getFields();
|
|
//Fields that need to be shown
|
|
$complusoryFields = array('industry');
|
|
foreach ($fieldModels as $fieldName => $fieldModel) {
|
|
if($fieldModel->isMandatory() && $fieldName != 'assigned_user_id') {
|
|
$keyIndex = array_search($fieldName,$complusoryFields);
|
|
if($keyIndex !== false) {
|
|
unset($complusoryFields[$keyIndex]);
|
|
}
|
|
$leadMappedField = $this->getConvertLeadMappedField($fieldName, $moduleName);
|
|
if($this->get($leadMappedField)) {
|
|
$fieldModel->set('fieldvalue', $this->get($leadMappedField));
|
|
} else {
|
|
$fieldModel->set('fieldvalue', $fieldModel->getDefaultFieldValue());
|
|
}
|
|
$accountsFields[] = $fieldModel;
|
|
}
|
|
}
|
|
foreach($complusoryFields as $complusoryField) {
|
|
$fieldModel = Vtiger_Field_Model::getInstance($complusoryField, $moduleModel);
|
|
if($fieldModel->getPermissions('readwrite') && $fieldModel->isEditable()) {
|
|
$industryFieldModel = $moduleModel->getField($complusoryField);
|
|
$industryLeadMappedField = $this->getConvertLeadMappedField($complusoryField, $moduleName);
|
|
if($this->get($industryLeadMappedField)) {
|
|
$industryFieldModel->set('fieldvalue', $this->get($industryLeadMappedField));
|
|
} else {
|
|
$industryFieldModel->set('fieldvalue', $industryFieldModel->getDefaultFieldValue());
|
|
}
|
|
$accountsFields[] = $industryFieldModel;
|
|
}
|
|
}
|
|
}
|
|
return $accountsFields;
|
|
}
|
|
|
|
/**
|
|
* Function returns Contact fields for Lead Convert
|
|
* @return Array
|
|
*/
|
|
function getContactFieldsForLeadConvert() {
|
|
$contactsFields = array();
|
|
$privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
|
|
$moduleName = 'Contacts';
|
|
|
|
if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) {
|
|
return;
|
|
}
|
|
|
|
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
|
|
if ($moduleModel->isActive()) {
|
|
$fieldModels = $moduleModel->getFields();
|
|
$complusoryFields = array('firstname', 'email');
|
|
foreach($fieldModels as $fieldName => $fieldModel) {
|
|
if($fieldModel->isMandatory() && $fieldName != 'assigned_user_id' && $fieldName != 'account_id') {
|
|
$keyIndex = array_search($fieldName,$complusoryFields);
|
|
if($keyIndex !== false) {
|
|
unset($complusoryFields[$keyIndex]);
|
|
}
|
|
|
|
$leadMappedField = $this->getConvertLeadMappedField($fieldName, $moduleName);
|
|
$fieldValue = $this->get($leadMappedField);
|
|
if ($fieldName === 'account_id') {
|
|
$fieldValue = $this->get('company');
|
|
}
|
|
if($fieldValue) {
|
|
$fieldModel->set('fieldvalue', $fieldValue);
|
|
} else {
|
|
$fieldModel->set('fieldvalue', $fieldModel->getDefaultFieldValue());
|
|
}
|
|
$contactsFields[] = $fieldModel;
|
|
}
|
|
}
|
|
|
|
foreach($complusoryFields as $complusoryField) {
|
|
$fieldModel = Vtiger_Field_Model::getInstance($complusoryField, $moduleModel);
|
|
if($fieldModel->getPermissions('readwrite') && $fieldModel->isEditable()) {
|
|
$leadMappedField = $this->getConvertLeadMappedField($complusoryField, $moduleName);
|
|
$fieldModel = $moduleModel->getField($complusoryField);
|
|
if($this->get($leadMappedField)) {
|
|
$fieldModel->set('fieldvalue', $this->get($leadMappedField));
|
|
} else {
|
|
$fieldModel->set('fieldvalue', $fieldModel->getDefaultFieldValue());
|
|
}
|
|
$contactsFields[] = $fieldModel;
|
|
}
|
|
}
|
|
}
|
|
return $contactsFields;
|
|
}
|
|
|
|
/**
|
|
* Function returns Potential fields for Lead Convert
|
|
* @return Array
|
|
*/
|
|
function getPotentialsFieldsForLeadConvert() {
|
|
$potentialFields = array();
|
|
$privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
|
|
$moduleName = 'Potentials';
|
|
|
|
if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) {
|
|
return;
|
|
}
|
|
|
|
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
|
|
if ($moduleModel->isActive()) {
|
|
$fieldModels = $moduleModel->getFields();
|
|
|
|
$complusoryFields = array('amount');
|
|
foreach($fieldModels as $fieldName => $fieldModel) {
|
|
if($fieldModel->isMandatory() && $fieldName != 'assigned_user_id' && $fieldName != 'related_to'
|
|
&& $fieldName != 'contact_id') {
|
|
$keyIndex = array_search($fieldName,$complusoryFields);
|
|
if($keyIndex !== false) {
|
|
unset($complusoryFields[$keyIndex]);
|
|
}
|
|
$leadMappedField = $this->getConvertLeadMappedField($fieldName, $moduleName);
|
|
if($this->get($leadMappedField)) {
|
|
$fieldModel->set('fieldvalue', $this->get($leadMappedField));
|
|
} else {
|
|
$fieldModel->set('fieldvalue', $fieldModel->getDefaultFieldValue());
|
|
}
|
|
$potentialFields[] = $fieldModel;
|
|
}
|
|
}
|
|
foreach($complusoryFields as $complusoryField) {
|
|
$fieldModel = Vtiger_Field_Model::getInstance($complusoryField, $moduleModel);
|
|
if($fieldModel->getPermissions('readwrite') && $fieldModel->isEditable()) {
|
|
$fieldModel = $moduleModel->getField($complusoryField);
|
|
$amountLeadMappedField = $this->getConvertLeadMappedField($complusoryField, $moduleName);
|
|
if($this->get($amountLeadMappedField)) {
|
|
$fieldModel->set('fieldvalue', $this->get($amountLeadMappedField));
|
|
} else {
|
|
$fieldModel->set('fieldvalue', $fieldModel->getDefaultFieldValue());
|
|
}
|
|
$potentialFields[] = $fieldModel;
|
|
}
|
|
}
|
|
}
|
|
return $potentialFields;
|
|
}
|
|
|
|
/**
|
|
* Function returns field mapped to Leads field, used in Lead Convert for settings the field values
|
|
* @param <String> $fieldName
|
|
* @return <String>
|
|
*/
|
|
function getConvertLeadMappedField($fieldName, $moduleName) {
|
|
$mappingFields = $this->get('mappingFields');
|
|
|
|
if (!$mappingFields) {
|
|
$db = PearDatabase::getInstance();
|
|
$mappingFields = array();
|
|
|
|
$result = $db->pquery('SELECT * FROM vtiger_convertleadmapping', array());
|
|
$numOfRows = $db->num_rows($result);
|
|
|
|
$accountInstance = Vtiger_Module_Model::getInstance('Accounts');
|
|
$accountFieldInstances = $accountInstance->getFieldsById();
|
|
|
|
$contactInstance = Vtiger_Module_Model::getInstance('Contacts');
|
|
$contactFieldInstances = $contactInstance->getFieldsById();
|
|
|
|
$potentialInstance = Vtiger_Module_Model::getInstance('Potentials');
|
|
$potentialFieldInstances = $potentialInstance->getFieldsById();
|
|
|
|
$leadInstance = Vtiger_Module_Model::getInstance('Leads');
|
|
$leadFieldInstances = $leadInstance->getFieldsById();
|
|
|
|
for($i=0; $i<$numOfRows; $i++) {
|
|
$row = $db->query_result_rowdata($result,$i);
|
|
if(empty($row['leadfid'])) continue;
|
|
|
|
$leadFieldInstance = $leadFieldInstances[$row['leadfid']];
|
|
if(!$leadFieldInstance) continue;
|
|
|
|
$leadFieldName = $leadFieldInstance->getName();
|
|
$accountFieldInstance = $accountFieldInstances[$row['accountfid']];
|
|
if ($row['accountfid'] && $accountFieldInstance) {
|
|
$mappingFields['Accounts'][$accountFieldInstance->getName()] = $leadFieldName;
|
|
}
|
|
$contactFieldInstance = $contactFieldInstances[$row['contactfid']];
|
|
if ($row['contactfid'] && $contactFieldInstance) {
|
|
$mappingFields['Contacts'][$contactFieldInstance->getName()] = $leadFieldName;
|
|
}
|
|
$potentialFieldInstance = $potentialFieldInstances[$row['potentialfid']];
|
|
if ($row['potentialfid'] && $potentialFieldInstance) {
|
|
$mappingFields['Potentials'][$potentialFieldInstance->getName()] = $leadFieldName;
|
|
}
|
|
}
|
|
$this->set('mappingFields', $mappingFields);
|
|
}
|
|
return $mappingFields[$moduleName][$fieldName];
|
|
}
|
|
|
|
/**
|
|
* Function returns the fields required for Lead Convert
|
|
* @return <Array of Vtiger_Field_Model>
|
|
*/
|
|
function getConvertLeadFields() {
|
|
$convertFields = array();
|
|
$accountFields = $this->getAccountFieldsForLeadConvert();
|
|
if(!empty($accountFields)) {
|
|
$convertFields['Accounts'] = $accountFields;
|
|
}
|
|
|
|
$contactFields = $this->getContactFieldsForLeadConvert();
|
|
if(!empty($contactFields)) {
|
|
$convertFields['Contacts'] = $contactFields;
|
|
}
|
|
|
|
$potentialsFields = $this->getPotentialsFieldsForLeadConvert();
|
|
if(!empty($potentialsFields)) {
|
|
$convertFields['Potentials'] = $potentialsFields;
|
|
}
|
|
return $convertFields;
|
|
}
|
|
|
|
/**
|
|
* Function returns the url for create event
|
|
* @return <String>
|
|
*/
|
|
function getCreateEventUrl() {
|
|
$calendarModuleModel = Vtiger_Module_Model::getInstance('Calendar');
|
|
return $calendarModuleModel->getCreateEventRecordUrl().'&parent_id='.$this->getId();
|
|
}
|
|
|
|
/**
|
|
* Function returns the url for create todo
|
|
* @return <String>
|
|
*/
|
|
function getCreateTaskUrl() {
|
|
$calendarModuleModel = Vtiger_Module_Model::getInstance('Calendar');
|
|
return $calendarModuleModel->getCreateTaskRecordUrl().'&parent_id='.$this->getId();
|
|
}
|
|
|
|
/**
|
|
* Function to check whether the lead is converted or not
|
|
* @return True if the Lead is Converted false otherwise.
|
|
*/
|
|
function isLeadConverted() {
|
|
$db = PearDatabase::getInstance();
|
|
$id = $this->getId();
|
|
$sql = "select converted from vtiger_leaddetails where converted = 1 and leadid=?";
|
|
$result = $db->pquery($sql,array($id));
|
|
$rowCount = $db->num_rows($result);
|
|
if($rowCount > 0){
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
}
|