From 27366ab5573ad60201d7cfa47dbaf2131b6c345d Mon Sep 17 00:00:00 2001
From: satish <satish.dvnk@vtiger.com>
Date: Fri, 10 Feb 2017 16:13:47 +0530
Subject: [PATCH] Mobile Module

---
 modules/Migration/schema/660_to_700.php       |  30 ++--
 packages/vtiger/mandatory/Mobile.zip          | Bin 1148605 -> 1151066 bytes
 .../modules/Mobile/modules/Mobile/api.v1.php  |  50 ++++---
 .../modules/Mobile/api/ws/Controller.php      |   2 +
 .../modules/Mobile/api/ws/DeleteRecords.php   |   5 +-
 .../Mobile/modules/Mobile/api/ws/Describe.php |  17 ++-
 .../Mobile/api/ws/FetchModuleFilters.php      |  27 ++--
 .../modules/Mobile/api/ws/FetchModules.php    |  27 ++++
 .../modules/Mobile/api/ws/FetchRecord.php     |  55 +++++---
 .../Mobile/api/ws/ListModuleRecords.php       | 132 +++++++++---------
 .../Mobile/modules/Mobile/api/ws/Logout.php   |  21 +++
 .../modules/Mobile/api/ws/SaveRecord.php      | 107 +++++++-------
 .../Mobile/modules/Mobile/api/ws/UserInfo.php |  49 +++++++
 13 files changed, 325 insertions(+), 197 deletions(-)
 create mode 100644 pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModules.php
 create mode 100644 pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Logout.php
 create mode 100644 pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/UserInfo.php

diff --git a/modules/Migration/schema/660_to_700.php b/modules/Migration/schema/660_to_700.php
index 9aa09702e..0d2b26b1b 100644
--- a/modules/Migration/schema/660_to_700.php
+++ b/modules/Migration/schema/660_to_700.php
@@ -1943,9 +1943,12 @@ if(defined('VTIGER_UPGRADE')) {
 
 	$marketingSequence = 1;
 	foreach ($marketingSalesFields as $fieldName => $linkTo) {
-		$updateQuery = 'INSERT INTO vtiger_settings_field(fieldid,blockid,name,iconpath,description,linkto,sequence,active,pinned) VALUES(?,?,?,?,?,?,?,?,?)';
-		$params = array($db->getUniqueID('vtiger_settings_field'), $marketingSalesBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $marketingSequence++, 0, 1);
-		$db->pquery($updateQuery, $params);
+		$marketingFieldResult = $db->pquery('SELECT 1 FROM vtiger_settings_field WHERE name=?', array($fieldName));
+		if (!$db->num_rows($marketingFieldResult)) {
+			$updateQuery = 'INSERT INTO vtiger_settings_field(fieldid,blockid,name,iconpath,description,linkto,sequence,active,pinned) VALUES(?,?,?,?,?,?,?,?,?)';
+			$params = array($db->getUniqueID('vtiger_settings_field'), $marketingSalesBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $marketingSequence++, 0, 1);
+			$db->pquery($updateQuery, $params);
+		}
 	}
 	//End:: marketing sales block
 
@@ -1964,10 +1967,7 @@ if(defined('VTIGER_UPGRADE')) {
 
 	$inventorySequence = 1;
 	foreach ($inventoryFields as $fieldName => $linkTo) {
-		$updateQuery = 'UPDATE vtiger_settings_field SET sequence=?, linkto=?, blockid=? WHERE name=?';
-		$params = array($inventorySequence, $linkTo, $inventoryBlockId, $fieldName);
 		$db->pquery('UPDATE vtiger_settings_field SET sequence=?, linkto=?, blockid=? WHERE name=?', array($inventorySequence++, $linkTo, $inventoryBlockId, $fieldName));
-		$inventorySequence = $inventorySequence+1;
 	}
 	//End:: inventory block
 
@@ -1987,9 +1987,12 @@ if(defined('VTIGER_UPGRADE')) {
 
 	$myPreferenceSequence = 1;
 	foreach ($myPreferenceFields as $fieldName => $linkTo) {
-		$fieldQuery = 'INSERT INTO vtiger_settings_field(fieldid,blockid,name,iconpath,description,linkto,sequence,active,pinned) VALUES(?,?,?,?,?,?,?,?,?)';
-		$params = array($db->getUniqueID('vtiger_settings_field'), $myPreferenceBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $myPreferenceSequence++, 0, 1);
-		$db->pquery($fieldQuery, $params);
+		$myPrefFieldResult = $db->pquery('SELECT 1 FROM vtiger_settings_field WHERE name=?', array($fieldName));
+		if (!$db->num_rows($myPrefFieldResult)) {
+			$fieldQuery = 'INSERT INTO vtiger_settings_field(fieldid,blockid,name,iconpath,description,linkto,sequence,active,pinned) VALUES(?,?,?,?,?,?,?,?,?)';
+			$params = array($db->getUniqueID('vtiger_settings_field'), $myPreferenceBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $myPreferenceSequence++, 0, 1);
+			$db->pquery($fieldQuery, $params);
+		}
 	}
 	//End:: mypreference block
 
@@ -2019,9 +2022,12 @@ if(defined('VTIGER_UPGRADE')) {
 
 	$extSequence = 1;
 	foreach ($extensionFields as $fieldName => $linkTo) {
-		$fieldQuery = 'INSERT INTO vtiger_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence, active, pinned) VALUES(?,?,?,?,?,?,?,?,?)';
-		$params = array($db->getUniqueID('vtiger_settings_field'), $extensionsBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $extSequence++, 0, 1);
-		$db->pquery($fieldQuery, $params);
+		$extFieldResult = $db->pquery('SELECT 1 FROM vtiger_settings_field WHERE name=?', array($fieldName));
+		if (!$db->num_rows($extFieldResult)) {
+			$fieldQuery = 'INSERT INTO vtiger_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence, active, pinned) VALUES(?,?,?,?,?,?,?,?,?)';
+			$params = array($db->getUniqueID('vtiger_settings_field'), $extensionsBlockId, $fieldName, 'NULL', 'NULL', $linkTo, $extSequence++, 0, 1);
+			$db->pquery($fieldQuery, $params);
+		}
 	}
 	//End:: extensions block
 
diff --git a/packages/vtiger/mandatory/Mobile.zip b/packages/vtiger/mandatory/Mobile.zip
index ff87287f49ed87e0e7e3db01e1382a601260a1c1..319e22a4ef7ca2e0e28aad7fa5b1e145016f01f7 100644
GIT binary patch
delta 25801
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

delta 23552
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%0D6T7P+K)!mkzYNWip{{3@A
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
a5?(B&k`=hk7|a+>I?&TCQ6s@o?Ee6=8nZkA

diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api.v1.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api.v1.php
index 59e4d270a..543da0e3e 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api.v1.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api.v1.php
@@ -11,32 +11,30 @@
 class Mobile_APIV1_Controller {
 
 	static $opControllers = array(
-		'login'                   => array('file' => '/api/ws/Login.php', 'class' => 'Mobile_WS_Login'),
-		'loginAndFetchModules'    => array('file' => '/api/ws/LoginAndFetchModules.php', 'class' => 'Mobile_WS_LoginAndFetchModules'),
-		'fetchModuleFilters'      => array('file' => '/api/ws/FetchModuleFilters.php'  , 'class' => 'Mobile_WS_FetchModuleFilters'),
-		'filterDetailsWithCount'  => array('file' => '/api/ws/FilterDetailsWithCount.php', 'class' => 'Mobile_WS_FilterDetailsWithCount'),
-		'fetchAllAlerts'          => array('file' => '/api/ws/FetchAllAlerts.php', 'class' => 'Mobile_WS_FetchAllAlerts'),
-		'alertDetailsWithMessage' => array('file' => '/api/ws/AlertDetailsWithMessage.php', 'class' => 'Mobile_WS_AlertDetailsWithMessage'),
-		'listModuleRecords'       => array('file' => '/api/ws/ListModuleRecords.php', 'class' => 'Mobile_WS_ListModuleRecords'),
-		'fetchRecord'             => array('file' => '/api/ws/FetchRecord.php', 'class' => 'Mobile_WS_FetchRecord'),
-		'fetchRecordWithGrouping' => array('file' => '/api/ws/FetchRecordWithGrouping.php', 'class' => 'Mobile_WS_FetchRecordWithGrouping'),
-		'fetchRecordsWithGrouping' => array('file' => '/api/ws/FetchRecordsWithGrouping.php', 'class' => 'Mobile_WS_FetchRecordsWithGrouping'),
-		'describe'                => array('file' => '/api/ws/Describe.php', 'class' => 'Mobile_WS_Describe'),
-		'saveRecord'              => array('file' => '/api/ws/SaveRecord.php', 'class' => 'Mobile_WS_SaveRecord'),
-		'syncModuleRecords'       => array('file' => '/api/ws/SyncModuleRecords.php', 'class' => 'Mobile_WS_SyncModuleRecords'),
-
-		'query'                   => array('file' => '/api/ws/Query.php', 'class' => 'Mobile_WS_Query'),
-		'queryWithGrouping'       => array('file' => '/api/ws/QueryWithGrouping.php', 'class' => 'Mobile_WS_QueryWithGrouping'),
-
-		'relatedRecordsWithGrouping' => array('file' => '/api/ws/RelatedRecordsWithGrouping.php', 'class' => 'Mobile_WS_RelatedRecordsWithGrouping'),
-		'deleteRecords'              => array('file' => '/api/ws/DeleteRecords.php', 'class' => 'Mobile_WS_DeleteRecords'),
-
-		'addRecordComment'           => array('file' => '/api/ws/AddRecordComment.php', 'class' => 'Mobile_WS_AddRecordComment'),
-		'history'                    => array('file' => '/api/ws/History.php', 'class' => 'Mobile_WS_History'),
-        'taxByType'                  => array('file'=>'/api/ws/TaxByType.php','class'=>'Mobile_WS_TaxByType'),
-		'pushNotificationSubscription' => array('file' => '/api/pushnotification/PushNotificationSubscription.php', 'class'=>'Mobile_WS_PushNotificationSubscription'),
-        'fetchModuleOwners'          => array('file' => '/api/ws/FetchModuleOwners.php', 'class'=>'Mobile_WS_FetchModuleOwners'),
-        'fetchCompanyDetails'        => array('file' => '/api/ws/FetchCompanyDetails.php', 'class'=>'Mobile_WS_FetchCompanyDetails')
+		'login'						=> array('file' => '/api/ws/Login.php',						'class' => 'Mobile_WS_Login'),
+		'loginAndFetchModules'		=> array('file' => '/api/ws/LoginAndFetchModules.php',		'class' => 'Mobile_WS_LoginAndFetchModules'),
+		'fetchModuleFilters'		=> array('file' => '/api/ws/FetchModuleFilters.php'  ,		'class' => 'Mobile_WS_FetchModuleFilters'),
+		'filterDetailsWithCount'	=> array('file' => '/api/ws/FilterDetailsWithCount.php',	'class' => 'Mobile_WS_FilterDetailsWithCount'),
+		'fetchAllAlerts'			=> array('file' => '/api/ws/FetchAllAlerts.php',			'class' => 'Mobile_WS_FetchAllAlerts'),
+		'alertDetailsWithMessage'	=> array('file' => '/api/ws/AlertDetailsWithMessage.php',	'class' => 'Mobile_WS_AlertDetailsWithMessage'),
+		'listModuleRecords'			=> array('file' => '/api/ws/ListModuleRecords.php',			'class' => 'Mobile_WS_ListModuleRecords'),
+		'fetchRecord'				=> array('file' => '/api/ws/FetchRecord.php',				'class' => 'Mobile_WS_FetchRecord'),
+		'fetchRecordWithGrouping'	=> array('file' => '/api/ws/FetchRecordWithGrouping.php',	'class' => 'Mobile_WS_FetchRecordWithGrouping'),
+		'fetchRecordsWithGrouping'	=> array('file' => '/api/ws/FetchRecordsWithGrouping.php',	'class' => 'Mobile_WS_FetchRecordsWithGrouping'),
+		'describe'					=> array('file' => '/api/ws/Describe.php',					'class' => 'Mobile_WS_Describe'),
+		'saveRecord'				=> array('file' => '/api/ws/SaveRecord.php',				'class' => 'Mobile_WS_SaveRecord'),
+		'syncModuleRecords'			=> array('file' => '/api/ws/SyncModuleRecords.php',			'class' => 'Mobile_WS_SyncModuleRecords'),
+		'query'						=> array('file' => '/api/ws/Query.php',						'class' => 'Mobile_WS_Query'),
+		'queryWithGrouping'			=> array('file' => '/api/ws/QueryWithGrouping.php',			'class' => 'Mobile_WS_QueryWithGrouping'),
+		'relatedRecordsWithGrouping'=> array('file' => '/api/ws/RelatedRecordsWithGrouping.php','class' => 'Mobile_WS_RelatedRecordsWithGrouping'),
+		'deleteRecords'				=> array('file' => '/api/ws/DeleteRecords.php',				'class' => 'Mobile_WS_DeleteRecords'),
+		'logout'					=> array('file' => '/api/ws/Logout.php',					'class' => 'Mobile_WS_Logout'),
+		'fetchModules'				=> array('file' => '/api/ws/FetchModules.php',				'class' => 'Mobile_WS_FetchModules'),
+		'userInfo'					=> array('file' => '/api/ws/UserInfo.php',					'class' => 'Mobile_WS_UserInfo'),
+		'addRecordComment'			=> array('file' => '/api/ws/AddRecordComment.php',			'class' => 'Mobile_WS_AddRecordComment'),
+		'history'					=> array('file' => '/api/ws/History.php',					'class' => 'Mobile_WS_History'),
+		'taxByType'					=> array('file' => '/api/ws/TaxByType.php',					'class' => 'Mobile_WS_TaxByType'),
+		'fetchModuleOwners'			=> array('file' => '/api/ws/FetchModuleOwners.php',			'class' => 'Mobile_WS_FetchModuleOwners'),
 	);
 
 	protected function initSession(Mobile_API_Request $request) {
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Controller.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Controller.php
index c6eb578f4..36d478974 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Controller.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Controller.php
@@ -32,6 +32,8 @@ class Mobile_WS_Controller {
 			if(!empty($userid)) {
 				$this->activeUser = CRMEntity::getInstance('Users');
 				$this->activeUser->retrieveCurrentUserInfoFromFile($userid);
+				global $current_user;
+				$current_user = $this->activeUser;
 			}
 		}
 		return $this->activeUser;
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/DeleteRecords.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/DeleteRecords.php
index 694aa1dac..0e63306f1 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/DeleteRecords.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/DeleteRecords.php
@@ -15,18 +15,17 @@ class Mobile_WS_DeleteRecords extends Mobile_WS_Controller {
 		global $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);
+				$recordModel = Vtiger_Record_Model::getInstanceById($record);
+				$recordModel->delete();
 				$result = true;
 			} catch(Exception $e) {
 				$result = false;
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Describe.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Describe.php
index 84e134ae4..f6a6bcc8b 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Describe.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Describe.php
@@ -13,10 +13,23 @@ class Mobile_WS_Describe extends Mobile_WS_Controller {
 	
 	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);
+
+		$fields = $describeInfo['fields'];
+		
+		$moduleModel = Vtiger_Module_Model::getInstance($module);
+		$fieldModels = $moduleModel->getFields();
+		foreach($fields as $index=>$field) {
+			$fieldModel = $fieldModels[$field['name']];
+			if($fieldModel) {
+				$field['headerfield'] = $fieldModel->get('headerfield');
+				$field['summaryfield'] = $fieldModel->get('summaryfield');
+			}
+			$newFields[] = $field;
+		}
+		$fields=null;
+		$describeInfo['fields'] = $newFields;
 		
 		$response = new Mobile_API_Response();
 		$response->setResult(array('describe' => $describeInfo));
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModuleFilters.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModuleFilters.php
index e27e17597..c064c1809 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModuleFilters.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModuleFilters.php
@@ -10,29 +10,22 @@
 class Mobile_WS_FetchModuleFilters extends Mobile_WS_Controller {
 	
 	function process(Mobile_API_Request $request) {
-		$response = new Mobile_API_Response();
-
 		$module = $request->get('module');
 		$current_user = $this->getActiveUser();
-		
+
+		$allFilters = CustomView_Record_Model::getAllByGroup($module);
+		unset($allFilters['Public']);
 		$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;
+		if($allFilters) {
+			foreach($allFilters as $group => $filters) {
+				$result[$group] = array();
+				foreach($filters as $filter) {
+					$result[$group][] = array('id'=>$filter->get('cvid'), 'name'=>$filter->get('viewname'), 'default'=>$filter->isDefault()); 
 				}
 			}
 		}
-		
-		$result['filters'] = array('yours' => $yours, 'others' => $others);
-		$response->setResult($result);
-
+		$response = new Mobile_API_Response();
+		$response->setResult(array('filters'=>$result));
 		return $response;
 	}
 
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModules.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModules.php
new file mode 100644
index 000000000..edc12351a
--- /dev/null
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchModules.php
@@ -0,0 +1,27 @@
+<?php
+/*+**********************************************************************************
+ * The contents of this file are subject to the vtiger CRM Public License Version 1.0
+ * ("License"); You may not use this file except in compliance with the License
+ * The Original Code is:  vtiger CRM Open Source
+ * The Initial Developer of the Original Code is vtiger.
+ * Portions created by vtiger are Copyright (C) vtiger.
+ * All Rights Reserved.
+ ************************************************************************************/
+include_once dirname(__FILE__) . '/../../api/ws/LoginAndFetchModules.php';
+
+class Mobile_WS_FetchModules extends Mobile_WS_LoginAndFetchModules {
+
+	function requireLogin() {
+		return true;
+	}
+	
+	function process(Mobile_API_Request $request) {
+		$current_user = $this->getActiveUser();
+		
+		$response = new Mobile_API_Response();
+		$result = array();
+		$result['modules'] = $this->getListing($current_user);
+		$response->setResult($result);
+		return $response;
+	}
+}
\ No newline at end of file
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchRecord.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchRecord.php
index fdb64a546..57bdf53f5 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchRecord.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/FetchRecord.php
@@ -10,9 +10,9 @@
 include_once 'include/Webservices/Retrieve.php';
 
 class Mobile_WS_FetchRecord extends Mobile_WS_Controller {
-	
+
 	private $module = false;
-	
+
 	protected $resolvedValueCache = array();
 	
 	protected function detectModuleName($recordid) {
@@ -30,36 +30,53 @@ class Mobile_WS_FetchRecord extends Mobile_WS_Controller {
 		
 		return $record;
 	}
-	
+
 	function process(Mobile_API_Request $request) {
 		$current_user = $this->getActiveUser();
-		$record = $this->processRetrieve($request);
+		$record = $request->get('record');
+		$module = $request->get('module');
 		
-		$this->resolveRecordValues($record, $current_user);
+		$moduleModel = Vtiger_Module_Model::getInstance($module);
+		$recordModel = Vtiger_Record_Model::getInstanceById($record, $moduleModel);
+		$data = $recordModel->getData();
+		
+		$data = $this->resolveRecordValues($data, $moduleModel);
 		
 		$response = new Mobile_API_Response();
-		$response->setResult(array('record' => $record));
+		$response->setResult(array('record' => $data));
 		
 		return $response;
 	}
-	
-	function resolveRecordValues(&$record, $user, $ignoreUnsetFields=false) {
-		if(empty($record)) return $record;
-		
-		$fieldnamesToResolve = Mobile_WS_Utils::detectFieldnamesToResolve(
-			$this->detectModuleName($record['id']) );
+
+	function resolveRecordValues($data, $moduleModel) {
+		$fields = $moduleModel->getFields();
 		
-		if(!empty($fieldnamesToResolve)) {
-			foreach($fieldnamesToResolve as $resolveFieldname) {
-				if ($ignoreUnsetFields === false || isset($record[$resolveFieldname])) {
-					$fieldvalueid = $record[$resolveFieldname];
-					$fieldvalue = $this->fetchRecordLabelForId($fieldvalueid, $user);
-					$record[$resolveFieldname] = array('value' => $fieldvalueid, 'label'=>$fieldvalue);
+		foreach ($data as $fieldName => $value) {
+			if ($fields[$fieldName]) {
+				$fieldModel = $fields[$fieldName];
+				$fieldType = $fieldModel->getFieldDataType();
+				$referenceModules = $fieldModel->getReferenceList();
+				if ($fieldType == 'reference' && !in_array('Users', $referenceModules)) {
+					$data[$fieldName] = array('value' => $value, 'label' => decode_html(Vtiger_Functions::getCRMRecordLabel($value)));
+				} else if ($fieldType == 'reference' && in_array('Users', $referenceModules)) {
+					$data[$fieldName] = array('value' => $value, 'label' => decode_html(Vtiger_Functions::getUserRecordLabel($value)));
+				} else if ($fieldType == 'url') {
+					$data[$fieldName] = array('value' => $value, 'label' => $value);
+				} else if ($fieldType == 'owner') {
+					$ownerName = Vtiger_Functions::getUserRecordLabel($value);
+					if (!empty($ownerName)) {
+						$data[$fieldName] = array('value' => $value, 'label' => decode_html($ownerName));
+					} else {
+						$data[$fieldName] = array('value' => $value, 'label' => decode_html(Vtiger_Functions::getGroupRecordLabel($value)));
+					}
+				} else {
+					$data[$fieldName] = array('value' => $value, 'label' => decode_html($fieldModel->getDisplayValue($value)));
 				}
 			}
 		}
+		return $data;
 	}
-	
+
 	function fetchRecordLabelForId($id, $user) {
 		$value = null;
 		
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/ListModuleRecords.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/ListModuleRecords.php
index 3a438f3cf..afb585f29 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/ListModuleRecords.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/ListModuleRecords.php
@@ -12,7 +12,7 @@ include_once dirname(__FILE__) . '/models/SearchFilter.php';
 include_once dirname(__FILE__) . '/models/Paging.php';
 
 class Mobile_WS_ListModuleRecords extends Mobile_WS_Controller {
-	
+
 	function isCalendarModule($module) {
 		return ($module == 'Events' || $module == 'Calendar');
 	}
@@ -25,87 +25,89 @@ class Mobile_WS_ListModuleRecords extends Mobile_WS_Controller {
 		$page = $request->get('page', 0);
 		return Mobile_WS_PagingModel::modelWithPageStart($page);
 	}
-	
+
 	function process(Mobile_API_Request $request) {
-		return $this->processSearchRecordLabel($request);
-	}
-	
-	function processSearchRecordLabel(Mobile_API_Request $request) {
-		global $current_user; // Few core API assumes this variable availability
-		
 		$current_user = $this->getActiveUser();
 		$module = $request->get('module');
-		$alertid = $request->get('alertid');
-		$filterid = $request->get('filterid');
-		$search = $request->get('search');
-		
-		$filterOrAlertInstance = false;
-		if(!empty($alertid)) {
-			$filterOrAlertInstance = Mobile_WS_AlertModel::modelWithId($alertid);
-		}
-		else if(!empty($filterid)) {
-			$filterOrAlertInstance = Mobile_WS_FilterModel::modelWithId($module, $filterid);
-		}
-		else if(!empty($search)) {
-			$filterOrAlertInstance = $this->getSearchFilterModel($module, $search);
+		$filterId = $request->get('filterid');
+		$page = $request->get('page','1');
+		$orderBy = $request->getForSql('orderBy');
+		$sortOrder = $request->getForSql('sortOrder');
+		
+		$moduleModel = Vtiger_Module_Model::getInstance($module);
+		$headerFieldModels = $moduleModel->getHeaderViewFieldsList();
+		
+		$headerFields = array();
+		$fields = array();
+		
+		$nameFields = $moduleModel->getNameFields();
+		if(is_string($nameFields)) {
+			$nameFieldModel = $moduleModel->getField($nameFields);
+			$headerFields[] = $nameFields;
+			$fields = array('name'=>$nameFieldModel->get('name'), 'label'=>$nameFieldModel->get('label'), 'fieldType'=>$nameFieldModel->getFieldDataType());
+		} else if(is_array($nameFields)) {
+			foreach($nameFields as $nameField) {
+				$nameFieldModel = $moduleModel->getField($nameField);
+				$headerFields[] = $nameField;
+				$fields[] = array('name'=>$nameFieldModel->get('name'), 'label'=>$nameFieldModel->get('label'), 'fieldType'=>$nameFieldModel->getFieldDataType());
+			}
 		}
 		
-		if($filterOrAlertInstance && strcmp($module, $filterOrAlertInstance->moduleName)) {
-			$response = new Mobile_API_Response();
-			$response->setError(1001, 'Mistached module information.');
-			return $response;
+		foreach($headerFieldModels as $fieldName => $fieldModel) {
+			$headerFields[] = $fieldName;
+			$fields[] = array('name'=>$fieldName, 'label'=>$fieldModel->get('label'), 'fieldType'=>$fieldModel->getFieldDataType());
 		}
-
-		// Initialize with more information
-		if($filterOrAlertInstance) {
-			$filterOrAlertInstance->setUser($current_user);
+		
+		$listViewModel = Vtiger_ListView_Model::getInstance($module, $filterId, $headerFields);
+		
+		if(!empty($sortOrder)) {
+			$listViewModel->set('orderby', $orderBy);
+			$listViewModel->set('sortorder',$sortOrder);
 		}
 		
-		// Paging model
-		$pagingModel = $this->getPagingModel($request);
-
-		if($this->isCalendarModule($module)) {
-			return $this->processSearchRecordLabelForCalendar($request, $pagingModel);
+		$pagingModel = new Vtiger_Paging_Model();
+		$pageLimit = $pagingModel->getPageLimit();
+		$pagingModel->set('page', $page);
+		$pagingModel->set('limit', $pageLimit+1);
+		
+		$listViewEntries = $listViewModel->getListViewEntries($pagingModel);
+		
+		if(empty($filterId)) {
+			$customView = new CustomView($module);
+			$filterId = $customView->getViewId($module);
 		}
-		$records = $this->fetchRecordLabelsForModule($module, $current_user, array(), $filterOrAlertInstance, $pagingModel);
-
-		$modifiedRecords = array();
-		foreach($records as $record) {
-			if ($record instanceof SqlResultIteratorRow) {
-				$record = $record->data;
-				// Remove all integer indexed mappings
-				for($index = count($record); $index > -1; --$index) {
-					if(isset($record[$index])) {
-						unset($record[$index]);
+		
+		if($listViewEntries) {
+			foreach($listViewEntries as $index => $listViewEntryModel) {
+				$data = $listViewEntryModel->getRawData();
+				$record = array('id'=>$listViewEntryModel->getId());
+				foreach($data as $i => $value) {
+					if(is_string($i)) {
+						$record[$i]= decode_html($value); 
 					}
 				}
+				$records[] = $record;
 			}
-			
-			$recordid = $record['id'];
-			unset($record['id']);
-			
-			$eventstart = '';
-			if($this->isCalendarModule($module)) {
-				$eventstart = $record['date_start'];
-				unset($record['date_start']);
-			}
-
-			$values = array_values($record);
-			$label = implode(' ', $values);
-			
-			$modifiedRecord = array('id' => $recordid, 'label'=>$label); 
-			if(!empty($eventstart)) {
-				$modifiedRecord['eventstart'] = $eventstart;
-			}
-			$modifiedRecords[] = $modifiedRecord;
 		}
 		
+		$moreRecords = false;
+		if(count($listViewEntries) > $pageLimit) {
+			$moreRecords = true;
+			array_pop($records);
+		}
+
 		$response = new Mobile_API_Response();
-		$response->setResult(array('records'=>$modifiedRecords, 'module'=>$module));
-		
+		$response->setResult(array(	'records'=>$records, 
+									'headers'=>$fields, 
+									'selectedFilter'=>$filterId, 
+									'nameFields'=>$nameFields,
+									'moreRecords'=>$moreRecords,
+									'orderBy'=>$orderBy,
+									'sortOrder'=>$sortOrder,
+									'page'=>$page));
 		return $response;
 	}
-	
+
 	function processSearchRecordLabelForCalendar(Mobile_API_Request $request, $pagingModel = false) {
 		$current_user = $this->getActiveUser();
 		
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Logout.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Logout.php
new file mode 100644
index 000000000..cd20246dc
--- /dev/null
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/Logout.php
@@ -0,0 +1,21 @@
+<?php
+/*+**********************************************************************************
+ * The contents of this file are subject to the vtiger CRM Public License Version 1.0
+ * ("License"); You may not use this file except in compliance with the License
+ * The Original Code is:  vtiger CRM Open Source
+ * The Initial Developer of the Original Code is vtiger.
+ * Portions created by vtiger are Copyright (C) vtiger.
+ * All Rights Reserved.
+ ************************************************************************************/
+class Mobile_WS_Logout extends Mobile_WS_Controller {
+
+	function process(Mobile_API_Request $request) {
+		Mobile_API_Session::destroy();
+		
+		$response = new Mobile_API_Response();
+		$result = array( 'logout' => true );
+		$response->setResult($result);
+		return $response;
+	}
+	
+}
\ No newline at end of file
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/SaveRecord.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/SaveRecord.php
index f34648968..1ef7ad42c 100644
--- a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/SaveRecord.php
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/SaveRecord.php
@@ -30,63 +30,64 @@ class Mobile_WS_SaveRecord extends Mobile_WS_FetchRecordWithGrouping {
 		
 		$values = "";
 		if(!empty($valuesJSONString) && is_string($valuesJSONString)) {
-            $values = Zend_Json::decode($valuesJSONString);
-        } else {
-            $values = $valuesJSONString; // Either empty or already decoded.
-        }
+			$values = Zend_Json::decode($valuesJSONString);
+		} else {
+			$values = $valuesJSONString; // Either empty or already decoded.
+		}
 
-        $response = new Mobile_API_Response();
+		$response = new Mobile_API_Response();
 
-        if (empty($values)) {
-            $response->setError(1501, "Values cannot be empty!");
-            return $response;
-        }
+		if (empty($values)) {
+			$response->setError(1501, "Values cannot be empty!");
+			return $response;
+		}
 
+		try {
+			if (vtws_recordExists($recordid)) {
+				// Retrieve or Initalize
+				if (!empty($recordid)) {
+					$recordModel = Vtiger_Record_Model::getInstanceById($recordid, $module);
+				} else {
+					$recordModel = Vtiger_Record_Model::getCleanInstance($module);
+				}
 
-        try {
-           if (vtws_recordExists($recordid)) {
-                // Retrieve or Initalize
-                if (!empty($recordid) && !$this->isTemplateRecordRequest($request)) {
-                    $this->recordValues = vtws_retrieve($recordid, $current_user);
-                } else {
-                    $this->recordValues = array();
-                }
+				// Set the modified values
+				foreach($values as $name => $value) {
+					$recordModel->set($name, $value);
+				}
 
-                // Set the modified values
-                foreach($values as $name => $value) {
-                    $this->recordValues[$name] = $value;
-                }
-
-                // Update or Create
-                if (isset($this->recordValues['id'])) {
-                    $this->recordValues = vtws_update($this->recordValues, $current_user);
-                } else {
-
-                    // Set right target module name for Calendar/Event record
-                    if ($module == 'Calendar') {
-                        if (!empty($this->recordValues['eventstatus']) && $this->recordValues['activitytype'] != 'Task') {
-                            $module = 'Events';
-                        }
-                    }
-					// to save Source of Record while Creating
-                    $this->recordValues['source'] = 'MOBILE';
-                    $this->recordValues = vtws_create($module, $this->recordValues, $current_user);
-                }
-
-                // Update the record id
-                $request->set('record', $this->recordValues['id']);
-
-                // Gather response with full details
-                $response = parent::process($request);
-            } else {
-                $response->setError("RECORD_NOT_FOUND", "Record does not exist");
-                return $response;
-            }
-            
-        } catch(Exception $e) {
-            $response->setError($e->getCode(), $e->getMessage());
-        }
-        return $response;
-    }
+				$moduleModel = Vtiger_Module_Model::getInstance($module);
+				$fieldModelList = $moduleModel->getFields();
+				foreach ($fieldModelList as $fieldName => $fieldModel) {
+					$fieldValue = $values[$fieldName];
+					$fieldDataType = $fieldModel->getFieldDataType();
+					if($fieldDataType == 'time'){
+						$fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue);
+					}
+					if($fieldValue !== null) {
+						if(!is_array($fieldValue) && $fieldDataType != 'currency') {
+							$fieldValue = trim($fieldValue);
+						}
+						$recordModel->set($fieldName, $fieldValue);
+					}
+				}
+				// Update or Create
+				if (!empty($recordid)) {
+					$recordModel->set('id', $recordid);
+					$recordModel->set('mode', 'edit');
+					$recordModel->save();
+				} else {
+					$recordModel->save();
+				}
+				$response->setResult($recordModel->getData());
+			} else {
+				$response->setError("RECORD_NOT_FOUND", "Record does not exist");
+				return $response;
+			}
+		} catch(Exception $e) {
+			$response->setError($e->getCode(), $e->getMessage());
+		}
+		return $response;
+	}
 
 }
\ No newline at end of file
diff --git a/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/UserInfo.php b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/UserInfo.php
new file mode 100644
index 000000000..09f5c77c4
--- /dev/null
+++ b/pkg/vtiger/modules/Mobile/modules/Mobile/api/ws/UserInfo.php
@@ -0,0 +1,49 @@
+<?php
+/*+**********************************************************************************
+ * The contents of this file are subject to the vtiger CRM Public License Version 1.0
+ * ("License"); You may not use this file except in compliance with the License
+ * The Original Code is:  vtiger CRM Open Source
+ * The Initial Developer of the Original Code is vtiger.
+ * Portions created by vtiger are Copyright (C) vtiger.
+ * All Rights Reserved.
+ ************************************************************************************/
+include_once dirname(__FILE__) . '/../../api/ws/LoginAndFetchModules.php';
+
+class Mobile_WS_UserInfo extends Mobile_WS_Controller {
+
+	function process(Mobile_API_Request $request) {
+		$current_user = $this->getActiveUser();
+		
+		$userinfo = array(
+			'username' => $current_user->user_name,
+			'id'       => $current_user->id,
+			'first_name' => $current_user->first_name,
+			'last_name' => $current_user->last_name,
+			'email' => $current_user->email1
+		);
+		
+		$allVisibleModules = Settings_MenuEditor_Module_Model::getAllVisibleModules();
+		$appModulesMap = array();
+		
+		foreach($allVisibleModules as $app => $moduleModels) {
+            $moduleInfo = array();
+			foreach($moduleModels as $moduleModel) {
+				$moduleInfo[] = array('name' => $moduleModel->get('name'), 'label'=>vtranslate($moduleModel->get('label'), $moduleModel->get('name')));
+			}
+			$appModulesMap[$app] = $moduleInfo;
+		}
+		
+		$response = new Mobile_API_Response();
+		$result['userinfo'] = $userinfo;
+		$result['menus'] = $appModulesMap;
+		$result['apps'] = Vtiger_MenuStructure_Model::getAppMenuList();
+		$result['defaultApp'] = $this->_getDefaultApp();
+		
+		$response->setResult($result);
+		return $response;
+	}
+	
+	function _getDefaultApp() {
+		return '';
+	}
+}
\ No newline at end of file
-- 
GitLab