- 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.
321 lines
14 KiB
PHP
321 lines
14 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.
|
|
*************************************************************************************/
|
|
require_once 'modules/WSAPP/Handlers/vtigerCRMHandler.php';
|
|
require_once 'include/utils/GetUserGroups.php';
|
|
|
|
|
|
class OutlookVtigerCRMHandler extends vtigerCRMHandler{
|
|
|
|
public function translateReferenceFieldNamesToIds($entityRecords,$user){
|
|
$entityRecordList = array();
|
|
foreach($entityRecords as $index=>$record){
|
|
$entityRecordList[$record['module']][$index] = $record;
|
|
}
|
|
foreach($entityRecordList as $module=>$records){
|
|
$handler = vtws_getModuleHandlerFromName($module, $user);
|
|
$meta = $handler->getMeta();
|
|
$referenceFieldDetails = $meta->getReferenceFieldDetails();
|
|
|
|
foreach($referenceFieldDetails as $referenceFieldName=>$referenceModuleDetails){
|
|
$recordReferenceFieldNames = array();
|
|
foreach($records as $index=>$recordDetails){
|
|
if(!empty($recordDetails[$referenceFieldName])) {
|
|
$recordReferenceFieldNames[] = trim($recordDetails[$referenceFieldName]);
|
|
}
|
|
}
|
|
$entityNameIds = wsapp_getRecordEntityNameIds(array_values($recordReferenceFieldNames), $referenceModuleDetails, $user);
|
|
if(is_array($entityNameIds))
|
|
$entityNameIds = array_change_key_case($entityNameIds, CASE_LOWER);
|
|
foreach($records as $index=>$recordInfo){
|
|
$refFieldValue = strtolower(trim($recordInfo[$referenceFieldName]));
|
|
if(!empty($entityNameIds[$refFieldValue])){
|
|
$recordInfo[$referenceFieldName] = $entityNameIds[$refFieldValue];
|
|
} else {
|
|
if($referenceFieldName == 'account_id'){
|
|
if($recordInfo[$referenceFieldName]!=NULL){
|
|
$element['accountname'] = trim($recordInfo[$referenceFieldName]);
|
|
$element['assigned_user_id'] = vtws_getWebserviceEntityId('Users', $user->id);
|
|
$element['source'] = Vtiger_Cache::get('WSAPP','appName');
|
|
$element['module'] = "Accounts";
|
|
$createRecord= array($element);
|
|
$createRecord = $this->fillNonExistingMandatoryPicklistValues($createRecord);
|
|
$createRecord = $this->fillMandatoryFields($createRecord, $user);
|
|
/**
|
|
* It'll loop only once. Still we need to loop because to fill mandatory values we need
|
|
* array of records
|
|
*/
|
|
foreach ($createRecord as $key => $record) {
|
|
try {
|
|
$result = vtws_create($record['module'], $record, $user);
|
|
$entityNameIds[$refFieldValue] = $result['id'];
|
|
} catch (Exception $e) {
|
|
unset($entityNameIds[$refFieldValue]);
|
|
continue;
|
|
}
|
|
}
|
|
$recordInfo[$referenceFieldName] = $entityNameIds[$refFieldValue];
|
|
}
|
|
}
|
|
else{
|
|
$recordInfo[$referenceFieldName] = "";
|
|
}
|
|
}
|
|
$records[$index] = $recordInfo;
|
|
}
|
|
}
|
|
$entityRecordList[$module] = $records;
|
|
}
|
|
|
|
$crmRecords = array();
|
|
foreach($entityRecordList as $module=>$entityRecords){
|
|
foreach($entityRecords as $index=>$record){
|
|
$crmRecords[$index] = $record;
|
|
}
|
|
}
|
|
return $crmRecords;
|
|
}
|
|
|
|
|
|
public function translateTheReferenceFieldIdsToName($records, $module, $user) {
|
|
$db = PearDatabase::getInstance();
|
|
global $current_user;
|
|
$current_user = $user;
|
|
$handler = vtws_getModuleHandlerFromName($module, $user);
|
|
$meta = $handler->getMeta();
|
|
$referenceFieldDetails = $meta->getReferenceFieldDetails();
|
|
foreach ($referenceFieldDetails as $referenceFieldName => $referenceModuleDetails) {
|
|
if($module == 'Events' && $referenceFieldName == "contact_id"){
|
|
// to set all related Contacts of Event records
|
|
foreach($records as $index => $record){
|
|
$id = $record['id'];
|
|
$idComp = vtws_getIdComponents($id);
|
|
$recordIds[] = $idComp[1];
|
|
}
|
|
$eventRecordModel = new Events_Record_Model();
|
|
$contactsInfos = $eventRecordModel->getRelatedContactInfoFromIds($recordIds);
|
|
|
|
foreach($records as $index => $record){
|
|
$id = $record['id'];
|
|
$idComp = vtws_getIdComponents($id);
|
|
if($contactsInfos[$idComp[1]]){
|
|
$records[$index]['attendees'] = $contactsInfos[$idComp[1]];
|
|
}
|
|
}
|
|
}else{
|
|
$referenceFieldIds = array();
|
|
$referenceModuleIds = array();
|
|
$referenceIdsName = array();
|
|
foreach ($records as $recordDetails) {
|
|
$referenceWsId = $recordDetails[$referenceFieldName];
|
|
if (!empty($referenceWsId)) {
|
|
$referenceIdComp = vtws_getIdComponents($referenceWsId);
|
|
$webserviceObject = VtigerWebserviceObject::fromId($db, $referenceIdComp[0]);
|
|
if ($webserviceObject->getEntityName() == 'Currency') {
|
|
continue;
|
|
}
|
|
$referenceModuleIds[$webserviceObject->getEntityName()][] = $referenceIdComp[1];
|
|
$referenceFieldIds[] = $referenceIdComp[1];
|
|
}
|
|
}
|
|
|
|
foreach ($referenceModuleIds as $referenceModule => $idLists) {
|
|
$nameList = getEntityName($referenceModule, $idLists);
|
|
foreach ($nameList as $key => $value)
|
|
$referenceIdsName[$key] = $value;
|
|
}
|
|
$recordCount = count($records);
|
|
for ($i = 0; $i < $recordCount; $i++) {
|
|
$record = $records[$i];
|
|
if (!empty($record[$referenceFieldName])) {
|
|
$wsId = vtws_getIdComponents($record[$referenceFieldName]);
|
|
$record[$referenceFieldName] = decode_html($referenceIdsName[$wsId[1]]);
|
|
}
|
|
$records[$i] = $record;
|
|
}
|
|
}
|
|
}
|
|
return $records;
|
|
}
|
|
/*
|
|
* Function to attach outlook attendees to Contacts of Vtiger Event
|
|
*/
|
|
public function relateEventandContacts($Event){
|
|
$contactids = array();
|
|
foreach($Event['attendees'] as $attendee){
|
|
$searchModule = "Contacts";
|
|
$searchModuleLabel = vtranslate($searchModule, $searchModule);
|
|
$emailsModule = new Emails_Module_Model();
|
|
$result = $emailsModule->searchEmails($attendee,$searchModule);
|
|
if($result[$searchModuleLabel]){
|
|
$keys = array_keys($result[$searchModuleLabel]);
|
|
$contactids = array_merge($contactids, $keys);
|
|
}
|
|
}
|
|
$contactids = array_values(array_unique($contactids));
|
|
if($contactids){
|
|
$_REQUEST['contactidlist'] = implode(';', $contactids);
|
|
$Event['contact_id_display'] = implode(',',$contactids);
|
|
}
|
|
unset($Event['attendees']);
|
|
return $Event;
|
|
}
|
|
|
|
/*
|
|
* Function overriden to handle duplication
|
|
*/
|
|
public function put($recordDetails, $user) {
|
|
global $log;
|
|
$this->user = $user;
|
|
$recordDetails = $this->syncToNativeFormat($recordDetails);
|
|
$createdRecords = $recordDetails['created'];
|
|
$updatedRecords = $recordDetails['updated'];
|
|
$deletedRecords = $recordDetails['deleted'];
|
|
|
|
|
|
if (count($createdRecords) > 0) {
|
|
$createdRecords = $this->translateReferenceFieldNamesToIds($createdRecords, $user);
|
|
$createdRecords = $this->fillNonExistingMandatoryPicklistValues($createdRecords);
|
|
$createdRecords = $this->fillMandatoryFields($createdRecords, $user);
|
|
}
|
|
foreach ($createdRecords as $index => $record) {
|
|
if($record['module'] == "Events" && isset($record['attendees'])){
|
|
$record = $this->relateEventandContacts($record);
|
|
}
|
|
try {
|
|
$createdRecords[$index] = vtws_create($record['module'], $record, $this->user);
|
|
} catch (Exception $e) {
|
|
unset($createdRecords[$index]);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (count($updatedRecords) > 0) {
|
|
$updatedRecords = $this->translateReferenceFieldNamesToIds($updatedRecords, $user);
|
|
$updatedRecords = $this->removeMandatoryEmptyFields($updatedRecords, $user);
|
|
}
|
|
|
|
$crmIds = array();
|
|
|
|
foreach ($updatedRecords as $index => $record) {
|
|
$webserviceRecordId = $record["id"];
|
|
$recordIdComp = vtws_getIdComponents($webserviceRecordId);
|
|
$crmIds[] = $recordIdComp[1];
|
|
}
|
|
$assignedRecordIds = array();
|
|
if ($this->isClientUserSyncType()) {
|
|
$assignedRecordIds = wsapp_checkIfRecordsAssignToUser($crmIds, $this->user->id);
|
|
// To check if the record assigned to group
|
|
if ($this->isClientUserAndGroupSyncType()) {
|
|
$getUserGroups = new GetUserGroups();
|
|
$getUserGroups->getAllUserGroups($this->user->id);
|
|
$groupIds = $getUserGroups->user_groups;
|
|
if(!empty($groupIds)){
|
|
$groupRecordId = wsapp_checkIfRecordsAssignToUser($crmIds, $groupIds);
|
|
$assignedRecordIds = array_merge($assignedRecordIds, $groupRecordId);
|
|
}
|
|
}
|
|
// End
|
|
}
|
|
foreach ($updatedRecords as $index => $record) {
|
|
if($record['module'] == "Events" && isset($record['attendees'])){
|
|
$record = $this->relateEventandContacts($record);
|
|
}
|
|
$webserviceRecordId = $record["id"];
|
|
$recordIdComp = vtws_getIdComponents($webserviceRecordId);
|
|
try {
|
|
if (in_array($recordIdComp[1], $assignedRecordIds)) {
|
|
$updatedRecords[$index] = vtws_revise($record, $this->user);
|
|
} else if (!$this->isClientUserSyncType()) {
|
|
$updatedRecords[$index] = vtws_revise($record, $this->user);
|
|
} else {
|
|
$this->assignToChangedRecords[$index] = $record;
|
|
}
|
|
} catch (Exception $e) {
|
|
continue;
|
|
}
|
|
// Added to handle duplication
|
|
if($record['duplicate']){
|
|
$updatedRecords[$index]['duplicate'] = true;
|
|
}
|
|
// End
|
|
}
|
|
$hasDeleteAccess = null;
|
|
$deletedCrmIds = array();
|
|
foreach ($deletedRecords as $index => $record) {
|
|
$webserviceRecordId = $record;
|
|
$recordIdComp = vtws_getIdComponents($webserviceRecordId);
|
|
$deletedCrmIds[] = $recordIdComp[1];
|
|
}
|
|
$assignedDeletedRecordIds = wsapp_checkIfRecordsAssignToUser($deletedCrmIds, $this->user->id);
|
|
|
|
// To get record id's assigned to group of the current user
|
|
if ($this->isClientUserAndGroupSyncType()) {
|
|
if(!empty($groupIds)){
|
|
foreach ($groupIds as $group) {
|
|
$groupRecordId = wsapp_checkIfRecordsAssignToUser($deletedCrmIds, $group);
|
|
$assignedDeletedRecordIds = array_merge($assignedDeletedRecordIds, $groupRecordId);
|
|
}
|
|
}
|
|
}
|
|
// End
|
|
|
|
foreach ($deletedRecords as $index => $record) {
|
|
$idComp = vtws_getIdComponents($record);
|
|
if (empty($hasDeleteAccess)) {
|
|
$handler = vtws_getModuleHandlerFromId($idComp[0], $this->user);
|
|
$meta = $handler->getMeta();
|
|
$hasDeleteAccess = $meta->hasDeleteAccess();
|
|
}
|
|
if ($hasDeleteAccess) {
|
|
if (in_array($idComp[1], $assignedDeletedRecordIds)) {
|
|
try {
|
|
vtws_delete($record, $this->user);
|
|
} catch (Exception $e) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$recordDetails['created'] = $createdRecords;
|
|
$recordDetails['updated'] = $updatedRecords;
|
|
$recordDetails['deleted'] = $deletedRecords;
|
|
return $this->nativeToSyncFormat($recordDetails);
|
|
}
|
|
|
|
/**
|
|
* Function to remove empty mandatory fields from record as vtws_revise will
|
|
* fail if we have empty mandaoty fields in record
|
|
* @global type $adb
|
|
* @param type $records
|
|
* @param type $user
|
|
* @return $records
|
|
*/
|
|
function removeMandatoryEmptyFields($records,$user){
|
|
foreach ($records as $index => $record) {
|
|
$moduleHandler = vtws_getModuleHandlerFromName($record['module'],$user);
|
|
$meta = $moduleHandler->getMeta();
|
|
$mandatoryFields = $meta->getMandatoryFields();
|
|
$updateFields = array_keys($record);
|
|
$updateMandatoryFields = array_intersect($updateFields, $mandatoryFields);
|
|
if(!empty($updateMandatoryFields)){
|
|
foreach($updateMandatoryFields as $ind=>$field){
|
|
if( !isset($record[$field]) || $record[$field] === "" || $record[$field] === null ){
|
|
unset($records[$index][$field]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $records;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|