Удаляем связанные записи через вебсервисы Vtiger CRM

Удаляем связанные записи через вебсервисы Vtiger CRM

Часто в процессе разработки API с Vtiger CRM мне приходилось сталкиваться с одной очень неприятной ситуацией - мы удаляем какую-либо запись из CRM, при этой связанные записи не удаляются. Их приходится удалять отдельно через дополнительные запросы. А это делает процесс удаления всех записей очень долгим и муторным.

Часто в процессе разработки API с Vtiger CRM мне приходилось сталкиваться с одной очень неприятной ситуацией - мы удаляем какую-либо запись из CRM, при этой связанные записи не удаляются. Их приходится удалять отдельно через дополнительные запросы. А это делает процесс удаления всех записей очень долгим и муторным.

Поэтому я написал отдельную функцию, которая позволяла бы удалить все связаные записи. Функция называется vtws_delete_related и принимает два параметра - ID родительской и ID дочерней записи. В качестве третьего параметра приходит модель User для контроля за правами доступа.

Функция выглядит следующим образом (её вы можете поместить в файл include/Webservices/DeleteRelatedRecords.php):

 

function vtws_delete_related($sourceRecordId, $relatedRecordId, $user = false)

{

global $log,$adb;

 

//Get source record id

list($moduleSourceId, $elementSourceId) = vtws_getIdComponents($sourceRecordId);

$webserviceObject = VtigerWebserviceObject::fromId($adb, $moduleSourceId);

 

//Get instanes handlers

$handlerPath = $webserviceObject->getHandlerPath();

$handlerClass = $webserviceObject->getHandlerClass();

 

require_once $handlerPath;

$handler = new $handlerClass($webserviceObject, $user, $adb, $log);

$meta = $handler->getMeta();

 

//Get objet entity name from record Id.

$sourceModuleName = $meta->getObjectEntityName($sourceRecordId);

 

//Get module permssion for user.

$types = vtws_listtypes(null, $user);

 

//Check permissions for user

if (! in_array($sourceModuleName, $types['types'])) {

throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED, 'Permission to perform the operation is denied');

}

 

//Check equal entites

if ($sourceModuleName !== $webserviceObject->getEntityName()) {

throw new WebServiceException(WebServiceErrorCode::$INVALIDID, 'Id specified is incorrect');

}

 

if (! $meta->hasPermission(EntityMeta::$UPDATE, $sourceRecordId)) {

throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED, 'Permission to read given object is denied');

}

 

//Check exist record id

if (! $meta->exists($elementSourceId)) {

throw new WebServiceException(WebServiceErrorCode::$RECORDNOTFOUND, 'Record you are trying to access is not found');

}

 

//Check record access

if ($meta->hasWriteAccess() !== true) {

throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED, 'Permission to write is denied');

}

 

//Get related record Id

list($moduleRelatedId, $elementRelatedId) = vtws_getIdComponents($relatedRecordId);

 

//Get instance for record id

$relatedRecordInstance = Vtiger_Record_Model::getInstanceById($elementRelatedId);

$relatedModuleName = $relatedRecordInstance->getModuleName();

 

//Get instance for source module

$sourceModuleFocus = CRMEntity::getInstance($sourceModuleName);

 

if ($sourceModuleFocus && $relatedRecordInstance) {

//Check modules (source / related) and apply remove link

if ($sourceModuleName == 'Potentials' && $relatedModuleName == 'Products') {

$query = 'DELETE FROM vtiger_seproductsrel WHERE crmid=? AND productid=? AND setype=?';

$adb->pquery($query, [$elementSourceId, $elementRelatedId, 'Potentials']);

} elseif ($sourceModuleName == 'Potentials' && $relatedModuleName == 'Contacts') {

$query = 'DELETE FROM vtiger_contpotentialrel WHERE potentialid=? AND contactid=?';

$adb->pquery($query, [$elementSourceId, $elementRelatedId]);

} else {

//Default method to remove link

$sourceModuleFocus->delete_related_module($sourceModuleName, $elementSourceId, $relatedModuleName, $elementRelatedId);

}

}

 

//Buffer save

VTWS_PreserveGlobal::flush();

 

return true;

}