function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $query = $request->get('query'); $nextPage = 0; $queryResult = false; if (preg_match("/(.*) LIMIT[^;]+;/i", $query)) { $queryResult = vtws_query($query, $current_user); } else { // Implicit limit and paging $query = rtrim($query, ";"); $currentPage = intval($request->get('page', 0)); $FETCH_LIMIT = Mobile::config('API_RECORD_FETCH_LIMIT'); $startLimit = $currentPage * $FETCH_LIMIT; $queryWithLimit = sprintf("%s LIMIT %u,%u;", $query, $startLimit, $FETCH_LIMIT + 1); $queryResult = vtws_query($queryWithLimit, $current_user); // Determine paging $hasNextPage = count($queryResult) > $FETCH_LIMIT; if ($hasNextPage) { array_pop($queryResult); // Avoid sending next page record now $nextPage = $currentPage + 1; } } $records = array(); if (!empty($queryResult)) { foreach ($queryResult as $recordValues) { $records[] = $this->processQueryResultRecord($recordValues, $current_user); } } $result = array('records' => $records, 'nextPage' => $nextPage); $response = new Mobile_API_Response(); $response->setResult($result); return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); $current_user = $this->getActiveUser(); $module = $request->get('module'); $moduleWSID = Mobile_WS_Utils::getEntityModuleWSId($module); if (empty($module)) { $response->setError(1501, "Module not specified."); return $response; } $records = array(); // Fetch the request parameters $idlist = $request->get('ids'); $alertid = $request->get('alertid'); // List of ids specified? if (!empty($idlist)) { $idlist = Zend_Json::decode($idlist); $records = $this->fetchRecordsWithId($module, $idlist, $current_user); } else { if (!empty($alertid)) { $alert = Mobile_WS_AlertModel::modelWithId($alertid); if ($alert === false) { $response->setError(1404, "Alert not found."); $records = false; } $alert->setUser($current_user); $records = $this->fetchAlertRecords($module, $alert); } } if ($records !== false) { $response->setResult(array('records' => $records)); } return $response; }
function process($templateName) { $smarty = $this->viewController(); $response = new Mobile_API_Response(); $response->setResult($smarty->fetch(vtlib_getModuleTemplate('Mobile', $templateName))); return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); $username = $request->get('username'); $password = $request->get('password'); $current_user = CRMEntity::getInstance('Users'); $current_user->column_fields['user_name'] = $username; if (vtlib_isModuleActive('Mobile') === false) { $response->setError(1501, 'Service not available'); return $response; } if (!$current_user->load_user($password) || !$current_user->authenticated) { global $mod_strings; $response->setError(1210, $mod_strings['ERR_INVALID_PASSWORD']); } else { // Start session now $sessionid = Mobile_API_Session::init(); if ($sessionid === false) { echo "Session init failed {$sessionid}\n"; } include_once 'config.php'; global $application_unique_key; $current_user->id = $current_user->retrieve_user_id($username); $this->setActiveUser($current_user); $_SESSION["authenticated_user_id"] = $current_user->id; $_SESSION["app_unique_key"] = $application_unique_key; $result = array(); $result['login'] = array('userid' => $current_user->id, 'crm_tz' => DateTimeField::getDBTimeZone(), 'user_tz' => $current_user->time_zone, 'session' => $sessionid, 'language' => $current_user->language, 'vtiger_version' => Mobile_WS_Utils::getVtigerVersion(), 'mobile_module_version' => Mobile_WS_Utils::getVersion()); $response->setResult($result); $this->postProcess($response); } return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); $username = $request->get('username'); $password = $request->get('password'); $current_user = CRMEntity::getInstance('Users'); $current_user->column_fields['user_name'] = $username; if (vtlib_isModuleActive('Mobile') === false) { $response->setError(1501, 'Service not available'); return $response; } if (!$current_user->doLogin($password)) { $response->setError(1210, 'Authentication Failed'); } else { // Start session now $sessionid = Mobile_API_Session::init(); if ($sessionid === false) { echo "Session init failed {$sessionid}\n"; } $current_user->id = $current_user->retrieve_user_id($username); $current_user->retrieveCurrentUserInfoFromFile($current_user->id); $this->setActiveUser($current_user); $result = array(); $result['login'] = array('userid' => $current_user->id, 'crm_tz' => DateTimeField::getDBTimeZone(), 'user_tz' => $current_user->time_zone, 'user_currency' => $current_user->currency_code, 'session' => $sessionid, 'vtiger_version' => Mobile_WS_Utils::getVtigerVersion(), 'date_format' => $current_user->date_format, 'mobile_module_version' => Mobile_WS_Utils::getVersion()); $response->setResult($result); $this->postProcess($response); } return $response; }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $module = $request->get('module'); $newrecord = self::transformToBlocks($module); $response = new Mobile_API_Response(); $response->setResult(array('record' => $newrecord)); return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); $current_user = $this->getActiveUser(); $result = array(); $result['alerts'] = $this->getAlertDetails(); $response->setResult($result); return $response; }
function postProcess(Mobile_API_Response $response) { $current_user = $this->getActiveUser(); if ($current_user) { $result = $response->getResult(); $result['modules'] = $this->getListing($current_user); $response->setResult($result); } }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $record = $this->processRetrieve($request); $this->resolveRecordValues($record, $current_user); $response = new Mobile_API_Response(); $response->setResult(array('record' => $record)); return $response; }
function process(Mobile_API_Request $request) { global $current_user; $response = new Mobile_API_Response(); $current_user = $this->getActiveUser(); $taxType = $request->get('taxType'); $result = $this->getTaxDetails($taxType); $response->setResult($result); return $response; }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $module = $request->get('module'); $describeInfo = vtws_describe($module, $current_user); Mobile_WS_Utils::fixDescribeFieldInfo($module, $describeInfo); $response = new Mobile_API_Response(); $response->setResult(array('describe' => $describeInfo)); return $response; }
function process(Mobile_API_Request $request) { global $current_user; $response = new Mobile_API_Response(); $filterid = $request->get('filterid'); $current_user = $this->getActiveUser(); $result = array(); $result['filter'] = $this->getModuleFilterDetails($filterid); $response->setResult($result); return $response; }
function getContent(Mobile_API_Request $request) { global $current_user, $adb; $current_user = $this->getActiveUser(); $module = $request->get('module'); $limit = $request->get('number'); $offset = $request->get('offset'); $search = isset($_REQUEST['src_str']) ? $request->get('src_str') : ''; $customView = new CustomView($module); if (!empty($_REQUEST['view'])) { $viewid = $_REQUEST['view']; } else { $viewid = $customView->getViewId($module); } $queryGenerator = new QueryGenerator($module, $current_user); if ($viewid != "0") { $queryGenerator->initForCustomViewById($viewid); } else { $queryGenerator->initForDefaultCustomView(); } $list_query = $queryGenerator->getQuery(); //get entity fields for each module $entity_sql = "select fieldname,tablename,entityidfield from vtiger_entityname where modulename =?"; $ws_entity = $adb->pquery($entity_sql, array($module)); $fieldname = $adb->query_result($ws_entity, 0, 'fieldname'); $tablename = $adb->query_result($ws_entity, 0, 'tablename'); //set the list and content order if ($module == 'Contacts' || $module == 'Leads') { $list_query .= " AND (lastname LIKE '%{$search}%' OR firstname LIKE '%{$search}%') ORDER BY lastname"; } elseif ($module != 'Calendar' and $module != 'Events') { $list_query .= " AND " . $tablename . "." . $fieldname . " LIKE '%{$search}%' ORDER BY " . $tablename . "." . $fieldname; } elseif ($module == 'Calendar' || $module == 'Events') { $calendarview_selected = $request->get('viewName'); $list_query .= " AND vtiger_activity.activitytype!='Emails'"; if ($calendarview_selected == 'week') { $list_query .= " AND week(date_start) = week(NOW()) AND year(date_start) = year(NOW())"; } elseif ($calendarview_selected == 'month') { $list_query .= " AND month(date_start) = month(NOW()) AND year(date_start) = year(NOW())"; } elseif ($calendarview_selected == 'year') { $list_query .= " AND year(date_start) = year(NOW())"; } elseif ($calendarview_selected == 'today') { $list_query .= " AND DATE(date_start) = DATE(NOW())"; } $list_query .= " AND subject LIKE '%{$search}%' ORDER BY date_start DESC"; } else { $list_query .= " AND " . $tablename . "." . $fieldname . " LIKE '%{$search}%' ORDER BY " . $tablename . "." . $fieldname; } $list_query .= " LIMIT {$offset}, {$limit};"; $listview_entries = $adb->pquery($list_query, array()); $response = new Mobile_API_Response(); $response->setResult(array('records' => $listview_entries, 'module' => $module)); return $response; }
function process(Mobile_API_Request $request) { global $current_user; $response = new Mobile_API_Response(); $current_user = $this->getActiveUser(); $currentUserModel = Users_Record_Model::getInstanceFromUserObject($current_user); $moduleName = $request->get('module'); $users = $this->getUsers($currentUserModel, $moduleName); $groups = $this->getGroups($currentUserModel, $moduleName); $result = array('users' => $users, 'groups' => $groups); $response->setResult($result); return $response; }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $page = intval($request->get('page', 0)); $module = $request->get('module', ''); $record = $request->get('record', ''); $mode = $request->get('mode', ''); $options = array('module' => $module, 'record' => $record, 'mode' => $mode, 'page' => $page); $historyItems = vtws_history($options, $current_user); $this->resolveReferences($historyItems, $current_user); $result = array('history' => $historyItems); $response = new Mobile_API_Response(); $response->setResult($result); return $response; }
function process(Mobile_API_Request $request) { global $current_user; $response = new Mobile_API_Response(); $alertid = $request->get('alertid'); $current_user = $this->getActiveUser(); $alert = $this->getAlertDetails($alertid); if (empty($alert)) { $response->setError(1401, 'Alert not found'); } else { $result = array(); $result['alert'] = $this->getAlertDetails($alertid); $response->setResult($result); } return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); global $adb; global $current_language; $current_language = Mobile_API_Session::get('language'); //never trust an entry $sSearch = vtlib_purify($request->get('term')); $sResult = ""; $arrayName = array(); $ModuleArray = explode(',', vtlib_purify($request->get('relmodule'))); $ModuleLabels = array(); foreach ($ModuleArray as $Module) { $translatedModule = getTranslatedString($Module, 'Mobile'); $arrayName[$translatedModule] = array(); $moduleWSID = Mobile_WS_Utils::getEntityModuleWSId($Module); // get related module fields $query = "SELECT tablename,fieldname,entityidfield FROM vtiger_entityname WHERE modulename = ?"; $result = $adb->pquery($query, array($Module)); if (!$result or $adb->num_rows($result) == 0) { $response->setError(1407, 'Error: Could not fetch entity info'); return $response; } $tablename = $adb->query_result($result, 0, 'tablename'); $fieldname = $adb->query_result($result, 0, 'fieldname'); $entityidfield = $adb->query_result($result, 0, 'entityidfield'); $fieldname = explode(',', $fieldname); $fieldname = $fieldname[0]; //START DATABASE ACCOUNT SEARCH $minhaquery = "SELECT " . $fieldname . "," . $entityidfield . " FROM " . $tablename . " \n\t\t\t\t\t\t\tINNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = " . $tablename . "." . $entityidfield . "\n\t\t\t\t\t\t\tWHERE deleted = 0 AND " . $fieldname . " LIKE ? ORDER BY " . $fieldname . ""; $params = $sSearch . "%"; $result = $adb->pquery($minhaquery, array($params)); if (!$result) { $response->setError(1408, 'Error: Could not fetch entity data'); return $response; } for ($i = 0; $i < $adb->num_rows($result); $i++) { $arrayName[$translatedModule][] = array($moduleWSID . 'x' . $adb->query_result($result, $i, $entityidfield), decode_html($adb->query_result($result, $i, $fieldname))); } } $sResult = $arrayName; $sResult = json_encode($sResult); $response->setResult($sResult); return $response; }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); //$module = $request->get('module'); $module = $this->detectModuleName($request->get('record')); $record = $this->processRetrieve($request); $this->resolveRecordValues($record, $current_user); $response = new Mobile_API_Response(); $ret_arr = array('record' => $record); if ($request->get('module')) { $module = $request->get('module'); $moduleWSFieldNames = Mobile_WS_Utils::getEntityFieldnames($module); foreach ($moduleWSFieldNames as $key => $value) { $relatedlistcontent[$key] = $record[$value]; } $relatedlistcontent['id'] = $record['id']; $ret_arr['relatedlistcontent'] = $relatedlistcontent; } elseif (vtlib_isModuleActive('ModComments') and $module != 'HelpDesk') { include_once 'include/Webservices/Query.php'; $comments = vtws_query("SELECT * FROM ModComments WHERE related_to = '" . $record['id'] . "' ORDER BY createdtime DESC LIMIT 5;", $current_user); if (count($comments) > 0) { foreach ($comments as &$comment) { $comment['assigned_user_id'] = vtws_getName($comment['assigned_user_id'], $current_user); $comment['createdtime'] = DateTimeField::convertToUserFormat($comment['createdtime']); } $ret_arr['comments'] = $comments; } else { $ret_arr['comments'] = array(); } } elseif ($module == 'HelpDesk') { //there is currently no vtws service for ticket comments $comments = Mobile_WS_Utils::getTicketComments($record); if (!empty($comments)) { foreach ($comments as &$comment) { $comment['assigned_user_id'] = vtws_getName($comment['assigned_user_id'], $current_user); $comment['createdtime'] = DateTimeField::convertToUserFormat($comment['createdtime']); } $ret_arr['comments'] = $comments; } else { $ret_arr['comments'] = array(); } } $response->setResult($ret_arr); return $response; }
function process(Mobile_API_Request $request) { global $app_strings, $mod_strings; $wsResponse = parent::process($request); $response = false; if ($wsResponse->hasError()) { $response = $wsResponse; } else { $wsResponseResult = $wsResponse->getResult(); $current_user = $this->getActiveUser(); $current_language = $this->sessionGet('language'); $app_strings = return_application_language($current_language); $relatedlistsmodule = array_keys($wsResponseResult); $relatedresponse = new Mobile_API_Response(); foreach ($relatedlistsmodule as $module) { $moduleWSId = Mobile_WS_Utils::getEntityModuleWSId($module); if ($module == 'Events' || $module == 'Calendar') { $fieldnames = Mobile_WS_Utils::getEntityFieldnames('Calendar'); } else { $fieldnames = Mobile_WS_Utils::getEntityFieldnames($module); } foreach ($wsResponseResult[$module] as $key => $shortrecordid) { $recordid = $moduleWSId . 'x' . $shortrecordid; $detailrequest = new Mobile_API_Request(); $detailrequest->set('record', $recordid); $detailrequest->set('_operation', 'fetchRecordWithGrouping'); $detailrequest->set('module', $module); $detailresponse = Mobile_WS_FetchRecordWithGrouping::process($detailrequest); $detailresponse_record[$module][$key] = $detailresponse->getResult(); } } $relatedresponse->setResult($detailresponse_record); $response = new Mobile_API_Response(); $current_language = $this->sessionGet('language'); include_once dirname(__FILE__) . '/../language/' . $current_language . '.lang.php'; $viewer = new Mobile_UI_Viewer(); $viewer->assign('LANGUAGE', $current_language); $viewer->assign('MOD', $mod_strings); $viewer->assign('_MODULE', $module); $viewer->assign('_RECORDS', $relatedresponse); $response = $viewer->process('generic/getRelatedLists.tpl'); } return $response; }
function process(Mobile_API_Request $request) { $response = new Mobile_API_Response(); $module = $request->get('module'); $current_user = $this->getActiveUser(); $result = array(); $filters = $this->getModuleFilters($module, $current_user); $yours = array(); $others = array(); if (!empty($filters)) { foreach ($filters as $filter) { if ($filter['userName'] == $current_user->column_fields['user_name']) { $yours[] = $filter; } else { $others[] = $filter; } } } $result['filters'] = array('yours' => $yours, 'others' => $others); $response->setResult($result); return $response; }
function getContent(Mobile_API_Request $request) { $comment = $request->get('comment'); $parentid = $request->get('parentid'); if (isset($comment) && !empty($comment)) { $parentmodule = Mobile_WS_Utils::detectModulenameFromRecordId($parentid); if ($parentmodule != 'HelpDesk') { include_once 'include/Webservices/Create.php'; $current_user = $this->getActiveUser(); $userid = Mobile_WS_Utils::getEntityModuleWSId('Users') . "x" . $current_user->id; $arr_comment = array('commentcontent' => $comment, 'related_to' => $parentid, 'creator' => $userid, 'assigned_user_id' => $userid); $ele = vtws_create('ModComments', $arr_comment, $current_user); } else { $parentrecordid = vtws_getIdComponents($parentid); $parentrecordid = $parentrecordid[1]; //there is currently no vtws service available for ticket comments $current_user = $this->getActiveUser(); $current_user_id = $current_user->id; $userrecordid = vtws_getIdComponents($current_user_id); $userrecordid = $userrecordid[1]; $arr_comment = array('commentcontent' => $comment, 'related_to' => $parentrecordid, 'creator' => $current_user_id); //$ele = vtws_create('ModComments', $arr_comment, $current_user); $saverecord = Mobile_WS_Utils::createTicketComment($arr_comment); if ($saverecord == true) { $userid = Mobile_WS_Utils::getEntityModuleWSId('Users') . "x" . $current_user_id; $ele['commentcontent'] = $arr_comment['commentcontent']; $ele['creator'] = $userid; $ele['assigned_user_id'] = $userid; $ele['related_to'] = $parentid; $ele['id'] = ''; $ele['createdtime'] = DateTimeField::convertToUserFormat(date('Y-m-d H:i:s')); } } } $response = new Mobile_API_Response(); $ele['assigned_user_id'] = vtws_getName($ele['creator'], $current_user); $response->setResult(array('comment' => $ele)); return $response; }
function process(Mobile_API_Request $request) { global $current_user, $adb, $currentModule; $current_user = $this->getActiveUser(); $response = new Mobile_API_Response(); $record = $request->get('record'); $currentPage = $request->get('page', 0); // Input validation if (empty($record)) { $response->setError(1001, 'Record id is empty'); return $response; } $recordid = vtws_getIdComponents($record); $recordid = $recordid[1]; $module = Mobile_WS_Utils::detectModulenameFromRecordId($record); // Initialize global variable $currentModule = $module; //related module currently supported $relatedmodule = array('Contacts', 'Potentials', 'HelpDesk'); $activemodule = $this->sessionGet('_MODULES'); foreach ($activemodule as $amodule) { if (in_array($amodule->name(), $relatedmodule)) { $active_related_module[] = $amodule->name(); } } foreach ($active_related_module as $relmod) { $functionHandler = Mobile_WS_Utils::getRelatedFunctionHandler($module, $relmod); $fieldmodel = new Mobile_UI_FieldModel(); if ($functionHandler) { $sourceFocus = CRMEntity::getInstance($module); $relationResult = call_user_func_array(array($sourceFocus, $functionHandler), array($recordid, getTabid($module), getTabid($relmod))); $relatedRecords[$relmod] = array_keys($relationResult['entries']); $response->setResult($relatedRecords); } else { $response->setError(1018, 'Function Handler for module ' . $module . ' for related Module ' . $relmod . ' not found.'); } } return $response; }
function process(Mobile_API_Request $request) { $current_user = vglobal('current_user'); $current_user = $this->getActiveUser(); $records = $request->get('records'); if (empty($records)) { $records = array($request->get('record')); } else { $records = Zend_Json::decode($records); } $deleted = array(); foreach ($records as $record) { try { vtws_delete($record, $current_user); $result = true; } catch (Exception $e) { $result = false; } $deleted[$record] = $result; } $response = new Mobile_API_Response(); $response->setResult(array('deleted' => $deleted)); return $response; }
function process(Mobile_API_Request $request) { require_once 'include/utils/utils.php'; require_once 'modules/Mobile/language/en_us.lang.php'; global $adb; //get scroll parameter $wsResponse = parent::process($request); if (is_numeric($request->get('offset'))) { $offset = $request->get('offset'); } else { //do nothing echo ''; return $wsResponse; } if (is_numeric($request->get('number'))) { $postnumbers = $request->get('number'); } else { //do nothing echo ''; return $wsResponse; } $wsResponseResult = $wsResponse->getResult(); $module = $wsResponseResult['module']; $records = $wsResponseResult['records']; $noofrows = $adb->num_rows($records); $tabid = getTabid($module); $fieldquery = "select fieldname,entityidfield from vtiger_entityname where tabid =?"; $ws_entity1 = $adb->pquery($fieldquery, array($tabid)); $fieldname = $adb->query_result($ws_entity1, 0, 'fieldname'); $entityidfield = $adb->query_result($ws_entity1, 0, 'entityidfield'); $fieldcontent = explode(',', $fieldname); if ($module == 'Calendar' || $module == 'Events') { $entity = "select id from vtiger_ws_entity where ismodule=1 and name = ? OR name = ? ORDER BY name"; $ws_entity = $adb->pquery($entity, array('Calendar', 'Events')); $arr_entity2[] = $adb->query_result($ws_entity, 0, 'id'); $arr_entity2[] = $adb->query_result($ws_entity, 1, 'id'); } else { $entity = "select id from vtiger_ws_entity where ismodule=1 and name =?"; $ws_entity = $adb->pquery($entity, array($wsResponseResult['module'])); $ws_entity2 = $adb->query_result($ws_entity, 0, 'id'); } $output = ""; for ($i = 0; $i < $noofrows; $i++) { $firstname = $adb->query_result($records, $i, $fieldcontent[0]); $lastname = $adb->query_result($records, $i, $fieldcontent[1]); if ($module == 'Calendar' || $module == 'Events') { //for calendar display date and time global $current_language; $activitytype = $adb->query_result($records, $i, 'status') == '' ? 'E' : ($current_language == 'ge_de' ? 'A' : 'T'); $ws_entity2 = $adb->query_result($records, $i, 'status') == '' ? $arr_entity2[1] : $arr_entity2[0]; $firstname = $activitytype . " | " . $firstname . " |"; $lastname = getValidDisplayDate($adb->query_result($records, $i, 'date_start')); $timequery = "select time_start from vtiger_activity where activityid =?"; $timequeryresult = $adb->pquery($timequery, array($adb->query_result($records, $i, $entityidfield))); $time_start = $adb->query_result($timequeryresult, 0, 'time_start'); //cut seconds if exist $time = strlen($time_start) > 5 ? substr($time_start, 0, 5) . '' : $time_start; $lastname .= " {$time}"; } $id = $ws_entity2 . "x" . $adb->query_result($records, $i, $entityidfield); $output .= ' <li><a class="ui-btn ui-btn-icon-right ui-icon-carat-r" target="_self" href="?_operation=fetchRecordWithGrouping&record=' . $id . '" target="_self">' . $firstname . ' ' . $lastname . '</a></li> '; /* <li class="ui-btn-inner ui-btn ui-btn-up-c ui-li ui-first-child" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="div" data-icon="false" data-theme="c" > <div class="ui-btn-inner ui-li"> <div class="ui-btn-text"> <a class="ui-link-inherit" target="_self" href="?_operation=fetchRecordWithGrouping&record='.$id.'" target="_self">'.$firstname.' '.$lastname.'</a> </div> <span class="ui-icon ui-icon-arrow-r ui-icon-shadow"> </span> </div> </li> */ } $response = new Mobile_API_Response(); $response->setResult($output); return $response; }
function process(Mobile_API_Request $request) { $current_user = $this->getActiveUser(); $current_user_wsid = sprintf("%sx%s", Mobile_WS_Utils::getEntityModuleWSId("Users"), $current_user->id); $module = $request->get('module'); $lastSyncTime = $request->get('syncToken', 0); $currentPage = intval($request->get('page', 0)); $isPrivateMode = $this->isModePrivate($request); $FETCH_LIMIT = Mobile::config('API_RECORD_FETCH_LIMIT'); $startLimit = $currentPage * $FETCH_LIMIT; // Keep track of sync-token for futher reference $maxSyncTime = $lastSyncTime; $describeInfo = vtws_describe($module, $current_user); $this->cacheDescribeInfo($describeInfo); $hasAssignedToField = false; foreach ($describeInfo['fields'] as $fieldinfo) { if ($fieldinfo['name'] == 'assigned_user_id') { $hasAssignedToField = true; break; } } ///////////////////////////// // MODIFIED RECORDS TRACKING ///////////////////////////// if (empty($lastSyncTime)) { // No previous state information available? Lookup records recently modified if ($hasAssignedToField && $isPrivateMode) { $queryActive = sprintf("SELECT * FROM %s WHERE assigned_user_id = '%s' ORDER BY modifiedtime DESC", $module, $current_user_wsid); } else { $queryActive = sprintf("SELECT * FROM %s ORDER BY modifiedtime DESC", $module); } } else { // Attempt to lookup records from previous state if ($hasAssignedToField && $isPrivateMode) { $queryActive = sprintf("SELECT * FROM %s WHERE assigned_user_id = '%s' AND modifiedtime > '%s'", $module, $current_user_wsid, date("Y-m-d H:i:s", $lastSyncTime)); } else { $queryActive = sprintf("SELECT * FROM %s WHERE modifiedtime > '%s'", $module, date("Y-m-d H:i:s", $lastSyncTime)); } } // Try to fetch record with paging (one extra record fetch is attempted to determine presence of next page) $activeQuery = sprintf("%s LIMIT %u,%u;", $queryActive, $startLimit, $FETCH_LIMIT + 1); $activeResult = vtws_query($activeQuery, $current_user); // Determine paging $hasNextPage = count($activeResult) > $FETCH_LIMIT; // Special case handling merge Events records if ($module == 'Calendar') { $activeResult2 = vtws_query(str_replace('Calendar', 'Events', $activeQuery), $current_user); if (!empty($activeResult2)) { $activeResult = array_merge($activeResult, $activeResult2); if (!$hasNextPage) { // If there was not Calendar next-page of records - check with Events $hasNextPage = count($activeResult) > $FETCH_LIMIT; } } // Indicator that we fetched both Calendar+Events $FETCH_LIMIT *= 2; } $nextPage = 0; if ($hasNextPage) { array_pop($activeResult); // Avoid sending next page record now $nextPage = $currentPage + 1; } // Resolved record details $resolvedModifiedRecords = array(); $resolvedDeletedRecords = array(); if (!empty($activeResult)) { foreach ($activeResult as $recordValues) { $this->resolveRecordValues($recordValues, $current_user); $transformedRecord = $this->transformRecordWithGrouping($recordValues, $module); // Update entity fieldnames $transformedRecord['labelFields'] = $this->cachedEntityFieldnames($module); $resolvedModifiedRecords[] = $transformedRecord; $modifiedTimeInSeconds = strtotime($recordValues['modifiedtime']); if ($maxSyncTime < $modifiedTimeInSeconds) { $maxSyncTime = $modifiedTimeInSeconds; } } } //////////////////////////// // DELETED RECORDS TRACKING //////////////////////////// // Only when there is previous state information and is first page if (!empty($lastSyncTime) && $currentPage === 0) { $adb = PearDatabase::getInstance(); $queryDeletedParameters = array($module, date('Y-m-d H:i:s', $lastSyncTime)); $andsmowneridequal = ""; if ($hasAssignedToField) { if ($isPrivateMode) { $queryDeletedParameters[] = $current_user->id; $andsmowneridequal = " AND vtiger_crmentity.smownerid=?"; } else { $andsmowneridequal = Mobile_WS_Utils::querySecurityFromSuffix($module, $current_user); } } // Since Calendar and Events are merged if ($module == 'Calendar') { $queryDeleted = $adb->pquery("SELECT activityid as crmid, activitytype as setype FROM vtiger_activity\n\t\t\t\t\tINNER JOIN vtiger_crmentity ON vtiger_activity.activityid=vtiger_crmentity.crmid\n\t\t\t\t\tAND vtiger_crmentity.deleted=1 AND vtiger_crmentity.setype=? AND vtiger_crmentity.modifiedtime > ?\n\t\t\t\t\tLEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid\n\t\t\t\t\tLEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid WHERE 1=1\t{$andsmowneridequal} ", $queryDeletedParameters); } else { if ($module == 'Leads') { $queryDeleted = $adb->pquery("SELECT crmid, modifiedtime, setype FROM vtiger_crmentity\n\t\t\t\tINNER JOIN vtiger_leaddetails ON vtiger_leaddetails.leadid=vtiger_crmentity.crmid\n\t\t\t\tLEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid\n\t\t\t\tLEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid\n\t\t\t\tWHERE (vtiger_crmentity.deleted=1 OR (vtiger_crmentity.deleted=0 AND vtiger_leaddetails.converted=1)) AND vtiger_crmentity.setype=? AND vtiger_crmentity.modifiedtime > ? {$andsmowneridequal}", $queryDeletedParameters); } else { $queryDeleted = $adb->pquery("SELECT crmid, modifiedtime, setype FROM vtiger_crmentity\n\t\t\t\tLEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid\n\t\t\t\tLEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid\n\t\t\t\tWHERE vtiger_crmentity.deleted=1 AND vtiger_crmentity.setype=? AND vtiger_crmentity.modifiedtime > ? {$andsmowneridequal}", $queryDeletedParameters); } } while ($row = $adb->fetch_array($queryDeleted)) { $recordModule = $row['setype']; if ($module == 'Calendar') { if ($row['setype'] != 'Task' && $row['setype'] != 'Emails') { $recordModule = 'Events'; } else { $recordModule = $module; } } $resolvedDeletedRecords[] = sprintf("%sx%s", Mobile_WS_Utils::getEntityModuleWSId($recordModule), $row['crmid']); $modifiedTimeInSeconds = strtotime($row['modifiedtime']); if ($maxSyncTime < $modifiedTimeInSeconds) { $maxSyncTime = $modifiedTimeInSeconds; } } } $result = array('nextSyncToken' => $maxSyncTime, 'deleted' => $resolvedDeletedRecords, 'updated' => $resolvedModifiedRecords, 'nextPage' => $nextPage); $response = new Mobile_API_Response(); $response->setResult(array('sync' => $result)); return $response; }
function processSearchRecordLabelForCalendar(Mobile_API_Request $request, $pagingModel = false) { $current_user = $this->getActiveUser(); // Fetch both Calendar (Todo) and Event information $moreMetaFields = array('date_start', 'time_start', 'activitytype', 'location'); $eventsRecords = $this->fetchRecordLabelsForModule('Events', $current_user, $moreMetaFields, false, $pagingModel); $calendarRecords = $this->fetchRecordLabelsForModule('Calendar', $current_user, $moreMetaFields, false, $pagingModel); // Merge the Calendar & Events information $records = array_merge($eventsRecords, $calendarRecords); $modifiedRecords = array(); foreach ($records as $record) { $modifiedRecord = array(); $modifiedRecord['id'] = $record['id']; unset($record['id']); $modifiedRecord['eventstartdate'] = $record['date_start']; unset($record['date_start']); $modifiedRecord['eventstarttime'] = $record['time_start']; unset($record['time_start']); $modifiedRecord['eventtype'] = $record['activitytype']; unset($record['activitytype']); $modifiedRecord['eventlocation'] = $record['location']; unset($record['location']); $modifiedRecord['label'] = implode(' ', array_values($record)); $modifiedRecords[] = $modifiedRecord; } $response = new Mobile_API_Response(); $response->setResult(array('records' => $modifiedRecords, 'module' => 'Calendar')); return $response; }
function process(Mobile_API_Request $request) { $operation = new Mobile_API_Request(); $operation = $request->getOperation(); if ($operation == 'create') { $newrecord = Mobile_WS_Describe::process($request); $response = new Mobile_API_Response(); $response->setResult(array('record' => $newrecord)); return $response; } else { $response = parent::process($request); return $this->processWithGrouping($request, $response); } }