[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /*+*********************************************************************************** 3 * The contents of this file are subject to the vtiger CRM Public License Version 1.0 4 * ("License"); You may not use this file except in compliance with the License 5 * The Original Code is: vtiger CRM Open Source 6 * The Initial Developer of the Original Code is vtiger. 7 * Portions created by vtiger are Copyright (C) vtiger. 8 * All Rights Reserved. 9 *************************************************************************************/ 10 require_once 'include/Webservices/Utils.php'; 11 require_once 'include/Webservices/ModuleTypes.php'; 12 require_once 'include/utils/CommonUtils.php'; 13 require_once 'include/Webservices/DescribeObject.php'; 14 15 function vtws_sync($mtime,$elementType,$syncType,$user){ 16 global $adb, $recordString,$modifiedTimeString; 17 18 $numRecordsLimit = 100; 19 $ignoreModules = array("Users"); 20 $typed = true; 21 $dformat = "Y-m-d H:i:s"; 22 $datetime = date($dformat, $mtime); 23 $setypeArray = array(); 24 $setypeData = array(); 25 $setypeHandler = array(); 26 $setypeNoAccessArray = array(); 27 28 $output = array(); 29 $output["updated"] = array(); 30 $output["deleted"] = array(); 31 32 $applicationSync = false; 33 if(is_object($syncType) && ($syncType instanceof Users)){ 34 $user = $syncType; 35 } else if($syncType == 'application'){ 36 $applicationSync = true; 37 } else if($syncType == 'userandgroup'){ 38 $userAndGroupSync = true; 39 } 40 41 if($applicationSync && !is_admin($user)){ 42 throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED,"Only admin users can perform application sync"); 43 } 44 45 $ownerIds = array($user->id); 46 // To get groupids in which this user exist 47 if ($userAndGroupSync) { 48 $groupresult = $adb->pquery("select groupid from vtiger_users2group where userid=?", array($user->id)); 49 $numOfRows = $adb->num_rows($groupresult); 50 if ($numOfRows > 0) { 51 for ($i = 0; $i < $numOfRows; $i++) { 52 $ownerIds[count($ownerIds)] = $adb->query_result($groupresult, $i, "groupid"); 53 } 54 } 55 } 56 // End 57 58 59 if(!isset($elementType) || $elementType=='' || $elementType==null){ 60 $typed=false; 61 } 62 63 64 65 $adb->startTransaction(); 66 67 $accessableModules = array(); 68 $entityModules = array(); 69 $modulesDetails = vtws_listtypes(null,$user); 70 $moduleTypes = $modulesDetails['types']; 71 $modulesInformation = $modulesDetails["information"]; 72 73 foreach($modulesInformation as $moduleName=>$entityInformation){ 74 if($entityInformation["isEntity"]) 75 $entityModules[] = $moduleName; 76 } 77 if(!$typed){ 78 $accessableModules = $entityModules; 79 } 80 else{ 81 if(!in_array($elementType,$entityModules)) 82 throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED,"Permission to perform the operation is denied"); 83 $accessableModules[] = $elementType; 84 } 85 86 $accessableModules = array_diff($accessableModules,$ignoreModules); 87 88 if(count($accessableModules)<=0) 89 { 90 $output['lastModifiedTime'] = $mtime; 91 $output['more'] = false; 92 return $output; 93 } 94 95 if($typed){ 96 $handler = vtws_getModuleHandlerFromName($elementType, $user); 97 $moduleMeta = $handler->getMeta(); 98 $entityDefaultBaseTables = $moduleMeta->getEntityDefaultTableList(); 99 //since there will be only one base table for all entities 100 $baseCRMTable = $entityDefaultBaseTables[0]; 101 if($elementType=="Calendar" || $elementType=="Events" ){ 102 $baseCRMTable = getSyncQueryBaseTable($elementType); 103 } 104 } 105 else 106 $baseCRMTable = " vtiger_crmentity "; 107 108 //modifiedtime - next token 109 $q = "SELECT modifiedtime FROM $baseCRMTable WHERE modifiedtime>? and setype IN(".generateQuestionMarks($accessableModules).") "; 110 $params = array($datetime); 111 foreach($accessableModules as $entityModule){ 112 if($entityModule == "Events") 113 $entityModule = "Calendar"; 114 $params[] = $entityModule; 115 } 116 if(!$applicationSync){ 117 $q .= ' and smownerid IN('.generateQuestionMarks($ownerIds).')'; 118 $params = array_merge($params,$ownerIds); 119 } 120 121 $q .=" order by modifiedtime limit $numRecordsLimit"; 122 $result = $adb->pquery($q,$params); 123 124 $modTime = array(); 125 for($i=0;$i<$adb->num_rows($result);$i++){ 126 $modTime[] = $adb->query_result($result,$i,'modifiedtime'); 127 } 128 if(!empty($modTime)){ 129 $maxModifiedTime = max($modTime); 130 } 131 if(!$maxModifiedTime){ 132 $maxModifiedTime = $datetime; 133 } 134 foreach($accessableModules as $elementType){ 135 $handler = vtws_getModuleHandlerFromName($elementType, $user); 136 $moduleMeta = $handler->getMeta(); 137 $deletedQueryCondition = $moduleMeta->getEntityDeletedQuery(); 138 preg_match_all("/(?:\s+\w+[ \t\n\r]+)?([^=]+)\s*=([^\s]+|'[^']+')/",$deletedQueryCondition,$deletedFieldDetails); 139 $fieldNameDetails = $deletedFieldDetails[1]; 140 $deleteFieldValues = $deletedFieldDetails[2]; 141 $deleteColumnNames = array(); 142 foreach($fieldNameDetails as $tableName_fieldName){ 143 $fieldComp = explode(".",$tableName_fieldName); 144 $deleteColumnNames[$tableName_fieldName] = $fieldComp[1]; 145 } 146 $params = array($moduleMeta->getTabName(),$datetime,$maxModifiedTime); 147 148 149 $queryGenerator = new QueryGenerator($elementType, $user); 150 $fields = array(); 151 $moduleFields = $moduleMeta->getModuleFields(); 152 $moduleFieldNames = getSelectClauseFields($elementType,$moduleMeta,$user); 153 $moduleFieldNames[]='id'; 154 $queryGenerator->setFields($moduleFieldNames); 155 $selectClause = "SELECT ".$queryGenerator->getSelectClauseColumnSQL(); 156 // adding the fieldnames that are present in the delete condition to the select clause 157 // since not all fields present in delete condition will be present in the fieldnames of the module 158 foreach($deleteColumnNames as $table_fieldName=>$columnName){ 159 if(!in_array($columnName,$moduleFieldNames)){ 160 $selectClause .=", ".$table_fieldName; 161 } 162 } 163 if($elementType=="Emails") 164 $fromClause = vtws_getEmailFromClause(); 165 else 166 $fromClause = $queryGenerator->getFromClause(); 167 168 $fromClause .= " INNER JOIN (select modifiedtime, crmid,deleted,setype FROM $baseCRMTable WHERE setype=? and modifiedtime >? and modifiedtime<=?"; 169 if(!$applicationSync){ 170 $fromClause.= 'and smownerid IN('.generateQuestionMarks($ownerIds).')'; 171 $params = array_merge($params,$ownerIds); 172 } 173 $fromClause.= ' ) vtiger_ws_sync ON (vtiger_crmentity.crmid = vtiger_ws_sync.crmid)'; 174 $q = $selectClause." ".$fromClause; 175 $result = $adb->pquery($q, $params); 176 $recordDetails = array(); 177 $deleteRecordDetails = array(); 178 while($arre = $adb->fetchByAssoc($result)){ 179 $key = $arre[$moduleMeta->getIdColumn()]; 180 if(vtws_isRecordDeleted($arre,$deleteColumnNames,$deleteFieldValues)){ 181 if(!$moduleMeta->hasAccess()){ 182 continue; 183 } 184 $output["deleted"][] = vtws_getId($moduleMeta->getEntityId(), $key); 185 } 186 else{ 187 if(!$moduleMeta->hasAccess() ||!$moduleMeta->hasPermission(EntityMeta::$RETRIEVE,$key)){ 188 continue; 189 } 190 try{ 191 $output["updated"][] = DataTransform::sanitizeDataWithColumn($arre,$moduleMeta); 192 }catch(WebServiceException $e){ 193 //ignore records the user doesn't have access to. 194 continue; 195 }catch(Exception $e){ 196 throw new WebServiceException(WebServiceErrorCode::$INTERNALERROR,"Unknown Error while processing request"); 197 } 198 } 199 } 200 } 201 202 $q = "SELECT crmid FROM $baseCRMTable WHERE modifiedtime>? and setype IN(".generateQuestionMarks($accessableModules).")"; 203 $params = array($maxModifiedTime); 204 205 foreach($accessableModules as $entityModule){ 206 if($entityModule == "Events") 207 $entityModule = "Calendar"; 208 $params[] = $entityModule; 209 } 210 if(!$applicationSync){ 211 $q.='and smownerid IN('.generateQuestionMarks($ownerIds).')'; 212 $params = array_merge($params,$ownerIds); 213 } 214 215 $result = $adb->pquery($q,$params); 216 if($adb->num_rows($result)>0){ 217 $output['more'] = true; 218 } 219 else{ 220 $output['more'] = false; 221 } 222 if(!$maxModifiedTime){ 223 $modifiedtime = $mtime; 224 }else{ 225 $modifiedtime = vtws_getSeconds($maxModifiedTime); 226 } 227 if(is_string($modifiedtime)){ 228 $modifiedtime = intval($modifiedtime); 229 } 230 $output['lastModifiedTime'] = $modifiedtime; 231 232 $error = $adb->hasFailedTransaction(); 233 $adb->completeTransaction(); 234 235 if($error){ 236 throw new WebServiceException(WebServiceErrorCode::$DATABASEQUERYERROR, 237 vtws_getWebserviceTranslatedString('LBL_'. 238 WebServiceErrorCode::$DATABASEQUERYERROR)); 239 } 240 241 VTWS_PreserveGlobal::flush(); 242 return $output; 243 } 244 245 function vtws_getSeconds($mtimeString){ 246 //TODO handle timezone and change time to gmt. 247 return strtotime($mtimeString); 248 } 249 250 function vtws_isRecordDeleted($recordDetails,$deleteColumnDetails,$deletedValues){ 251 $deletedRecord = false; 252 $i=0; 253 foreach($deleteColumnDetails as $tableName_fieldName=>$columnName){ 254 if($recordDetails[$columnName]!=$deletedValues[$i++]){ 255 $deletedRecord = true; 256 break; 257 } 258 } 259 return $deletedRecord; 260 } 261 262 function vtws_getEmailFromClause(){ 263 $q = "FROM vtiger_activity 264 INNER JOIN vtiger_crmentity ON vtiger_activity.activityid = vtiger_crmentity.crmid 265 LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id 266 LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid 267 LEFT JOIN vtiger_seattachmentsrel ON vtiger_activity.activityid = vtiger_seattachmentsrel.crmid 268 LEFT JOIN vtiger_attachments ON vtiger_seattachmentsrel.attachmentsid = vtiger_attachments.attachmentsid 269 LEFT JOIN vtiger_email_track ON vtiger_activity.activityid = vtiger_email_track.mailid 270 INNER JOIN vtiger_emaildetails ON vtiger_activity.activityid = vtiger_emaildetails.emailid 271 LEFT JOIN vtiger_users vtiger_users2 ON vtiger_emaildetails.idlists = vtiger_users2.id 272 LEFT JOIN vtiger_groups vtiger_groups2 ON vtiger_emaildetails.idlists = vtiger_groups2.groupid"; 273 return $q; 274 } 275 276 function getSyncQueryBaseTable($elementType){ 277 if($elementType!="Calendar" && $elementType!="Events"){ 278 return "vtiger_crmentity"; 279 } 280 else{ 281 $activityCondition = getCalendarTypeCondition($elementType); 282 $query = "vtiger_crmentity INNER JOIN vtiger_activity ON (vtiger_crmentity.crmid = vtiger_activity.activityid and $activityCondition)"; 283 return $query; 284 } 285 } 286 287 function getCalendarTypeCondition($elementType){ 288 if($elementType == "Events") 289 $activityCondition = "vtiger_activity.activitytype !='Task' and vtiger_activity.activitytype !='Emails'"; 290 else 291 $activityCondition = "vtiger_activity.activitytype ='Task'"; 292 return $activityCondition; 293 } 294 295 function getSelectClauseFields($module,$moduleMeta,$user){ 296 $moduleFieldNames = $moduleMeta->getModuleFields(); 297 $inventoryModules = getInventoryModules(); 298 if(in_array($module, $inventoryModules)){ 299 300 $fields = vtws_describe('LineItem', $user); 301 foreach($fields['fields'] as $field){ 302 unset($moduleFieldNames[$field['name']]); 303 } 304 foreach ($moduleFieldNames as $field => $fieldObj){ 305 if(substr($field, 0, 5) == 'shtax'){ 306 unset($moduleFieldNames[$field]); 307 } 308 } 309 310 } 311 return array_keys($moduleFieldNames); 312 } 313 314 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |