[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/include/Webservices/ -> GetUpdates.php (source)

   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  ?>


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1