function put($key, $element, $user)
 {
     global $log;
     $db = PearDatabase::getInstance();
     $appid = parent::appid_with_key($key);
     if (empty($appid)) {
         throw new WebServiceException('WSAPP04', "Access restricted to app");
     }
     if (!is_array($element)) {
         $records = array($element);
     } else {
         $records = $element;
     }
     //hardcoded since the destination handler will be vtigerCRM
     $serverKey = wsapp_getAppKey("vtigerCRM");
     $serverAppId = parent::appid_with_key($serverKey);
     $handlerDetails = $this->getDestinationHandleDetails();
     $clientApplicationSyncType = wsapp_getAppSyncType($key);
     require_once $handlerDetails['handlerpath'];
     $this->destHandler = new $handlerDetails['handlerclass']($serverKey);
     $this->destHandler->setClientSyncType($clientApplicationSyncType);
     $recordDetails = array();
     $createRecords = array();
     $updateRecords = array();
     $deleteRecords = array();
     $clientModifiedTimeList = array();
     foreach ($records as $record) {
         $recordDetails = array();
         $clientRecordId = $record['id'];
         // Missing client record id?
         if (empty($clientRecordId)) {
             continue;
         }
         $lookupRecordId = false;
         // Added for Duplication handling
         if (!empty($record['crmid'])) {
             $crmid = vtws_getIdComponents($record['crmid']);
             $lookupResult = $db->pquery("SELECT crmid,modifiedtime FROM vtiger_crmentity WHERE crmid=?", array($crmid[1]));
             if ($db->num_rows($lookupResult)) {
                 $lookupRecordId = $record['crmid'];
             }
             if (!empty($lookupRecordId)) {
                 $clientLastModifiedTime = $db->query_result($lookupResult, 0, 'modifiedtime');
                 $record['values']['id'] = $lookupRecordId;
                 $record['values']['duplicate'] = true;
                 $updateRecords[$clientRecordId] = $record['values'];
                 $updateRecords[$clientRecordId]['module'] = $record['module'];
                 $clientModifiedTimeList[$clientRecordId] = $record['values']['modifiedtime'];
             }
         } else {
             $lookupResult = $db->pquery("SELECT serverid,clientmodifiedtime FROM vtiger_wsapp_recordmapping WHERE appid=? AND clientid=?", array($appid, $clientRecordId));
             if ($db->num_rows($lookupResult)) {
                 $lookupRecordId = $db->query_result($lookupResult, 0, 'serverid');
             }
             if (empty($lookupRecordId) && $record['mode'] != "delete") {
                 $createRecords[$clientRecordId] = $record['values'];
                 $createRecords[$clientRecordId]['module'] = $record['module'];
                 $clientModifiedTimeList[$clientRecordId] = $record['values']['modifiedtime'];
             } else {
                 if (empty($record['values']) && !empty($lookupRecordId)) {
                     $deleteRecords[$clientRecordId] = $lookupRecordId;
                 } else {
                     if (!empty($lookupRecordId)) {
                         $clientLastModifiedTime = $db->query_result($lookupResult, 0, 'clientmodifiedtime');
                         if ($clientLastModifiedTime >= $record['values']['modifiedtime']) {
                             continue;
                         }
                         $record['values']['id'] = $lookupRecordId;
                         $updateRecords[$clientRecordId] = $record['values'];
                         $updateRecords[$clientRecordId]['module'] = $record['module'];
                         $clientModifiedTimeList[$clientRecordId] = $record['values']['modifiedtime'];
                     }
                 }
             }
         }
     }
     $recordDetails['created'] = $createRecords;
     $recordDetails['updated'] = $updateRecords;
     $recordDetails['deleted'] = $deleteRecords;
     $result = $this->destHandler->put($recordDetails, $user);
     $response = array();
     $response['created'] = array();
     $response['updated'] = array();
     $response['deleted'] = array();
     $log->fatal($result['updated']);
     $nextSyncDeleteRecords = $this->destHandler->getAssignToChangedRecords();
     foreach ($result['created'] as $clientRecordId => $record) {
         parent::idmap_put($appid, $record['id'], $clientRecordId, $clientModifiedTimeList[$clientRecordId], $record['modifiedtime'], $serverAppId, $this->create);
         $responseRecord = $record;
         $responseRecord['_id'] = $record['id'];
         $responseRecord['id'] = $clientRecordId;
         $responseRecord['_modifiedtime'] = $record['modifiedtime'];
         $responseRecord['modifiedtime'] = $clientModifiedTimeList[$clientRecordId];
         $response['created'][] = $responseRecord;
     }
     foreach ($result['updated'] as $clientRecordId => $record) {
         /*
          * If record is duplicate then it'll be in updated records. But, we should create a mapping instead of
          * updating
          */
         if ($record['duplicate']) {
             parent::idmap_put($appid, $record['id'], $clientRecordId, $clientModifiedTimeList[$clientRecordId], $record['modifiedtime'], $serverAppId, $this->create);
         } else {
             parent::idmap_put($appid, $record['id'], $clientRecordId, $clientModifiedTimeList[$clientRecordId], $record['modifiedtime'], $serverAppId, $this->update);
         }
         $responseRecord = $record;
         $responseRecord['_id'] = $record['id'];
         $responseRecord['id'] = $clientRecordId;
         $responseRecord['_modifiedtime'] = $record['modifiedtime'];
         $responseRecord['modifiedtime'] = $clientModifiedTimeList[$clientRecordId];
         $response['updated'][] = $responseRecord;
     }
     foreach ($result['deleted'] as $clientRecordId => $record) {
         parent::idmap_put($appid, $record, $clientRecordId, "", "", $serverAppId, $this->delete);
         $response['deleted'][] = $clientRecordId;
     }
     $queueRecordIds = array();
     $queueRecordDetails = array();
     foreach ($nextSyncDeleteRecords as $clientRecordId => $record) {
         $queueRecordIds[] = $record['id'];
         $queueRecordDetails[$record['id']] = parent::convertToQueueRecordFormat($record, $this->delete);
     }
     if (count($queueRecordIds > 0)) {
         $syncServerDetails = parent::idmap_get_clientmap($appid, $queueRecordIds);
         foreach ($queueRecordIds as $serverId) {
             $syncServerId = $syncServerDetails[$serverId]['id'];
             $recordValues = $queueRecordDetails[$serverId];
             if (!parent::checkIdExistInQueue($syncServerId)) {
                 parent::idmap_storeRecordsInQueue($syncServerId, $recordValues, $this->delete, $appid);
             }
         }
     }
     return $response;
 }
Example #2
0
 /**
  * Update the missing serverid-clientid map as requested from application
  */
 function map($key, $element, $user)
 {
     if (empty($element)) {
         return;
     }
     $db = PearDatabase::getInstance();
     $appid = $this->appid_with_key($key);
     $createDetails = $element["create"];
     $deleteDetails = $element["delete"];
     $updatedDetails = $element["update"];
     $deleteQueueSyncServerIds = array();
     $serverKey = wsapp_getAppKey("vtigerCRM");
     $serverAppId = $this->appid_with_key($serverKey);
     //$lookups = $this->idmap_get_clientmap($appid, array_values($createDetails));
     foreach ($createDetails as $clientid => $serverDetails) {
         $this->idmap_put($appid, $serverDetails['serverid'], $clientid, $serverDetails['modifiedtime'], $serverDetails['_modifiedtime'], $serverAppId, $this->create);
     }
     foreach ($updatedDetails as $clientid => $serverDetails) {
         $this->idmap_updateMapDetails($appid, $clientid, $serverDetails['modifiedtime'], $serverDetails['_modifiedtime'], $this->update);
         $syncServerId = $this->getSyncServerId($clientid, $serverDetails['serverid'], $appid);
         if (isset($syncServerId) && $syncServerId != NULL) {
             $deleteQueueSyncServerIds[] = $syncServerId;
         }
     }
     if (count($deleteDetails) > 0) {
         $deleteLookUps = $this->idmap_get_clientservermap($appid, array_values($deleteDetails));
         foreach ($deleteDetails as $clientid) {
             if (isset($deleteLookUps[$clientid])) {
                 $serverId = $deleteLookUps[$clientid];
                 $syncServerId = $this->getSyncServerId($clientid, $serverId, $appid);
                 if (isset($syncServerId) && $syncServerId != NULL) {
                     $deleteQueueSyncServerIds[] = $syncServerId;
                 }
                 $this->idmap_delete($appid, $serverId, $clientid, $serverAppId);
             }
         }
     }
     if (count($deleteQueueSyncServerIds) > 0) {
         $this->deleteQueueRecords($deleteQueueSyncServerIds);
     }
 }