PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/Calendar/actions/Feed.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 340 lines | 269 code | 45 blank | 26 comment | 22 complexity | aba363d6d101890a07d183d2276c21bd MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
  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. vimport ('~~/include/Webservices/Query.php');
  11. class Calendar_Feed_Action extends Vtiger_BasicAjax_Action {
  12. public function process(Vtiger_Request $request) {
  13. try {
  14. $result = array();
  15. $start = $request->get('start');
  16. $end = $request->get('end');
  17. $type = $request->get('type');
  18. $userid = $request->get('userid');
  19. switch ($type) {
  20. case 'Events': $this->pullEvents($start, $end, $result, $request->get('cssClass'),$userid,$request->get('color')); break;
  21. case 'Tasks': $this->pullTasks($start, $end, $result, $request->get('cssClass')); break;
  22. case 'Potentials': $this->pullPotentials($start, $end, $result, $request->get('cssClass')); break;
  23. case 'Contacts':
  24. if($request->get('fieldname') == 'support_end_date') {
  25. $this->pullContactsBySupportEndDate($start, $end, $result, $request->get('cssClass'));
  26. }else{
  27. $this->pullContactsByBirthday($start, $end, $result, $request->get('cssClass'));
  28. }
  29. break;
  30. case 'Invoice': $this->pullInvoice($start, $end, $result, $request->get('cssClass')); break;
  31. case 'MultipleEvents' : $this->pullMultipleEvents($start,$end, $result,$request->get('mapping'));break;
  32. case 'Project': $this->pullProjects($start, $end, $result, $request->get('cssClass')); break;
  33. case 'ProjectTask': $this->pullProjectTasks($start, $end, $result, $request->get('cssClass')); break;
  34. }
  35. echo json_encode($result);
  36. } catch (Exception $ex) {
  37. echo $ex->getMessage();
  38. }
  39. }
  40. protected function queryForRecords($query, $onlymine=true) {
  41. $user = Users_Record_Model::getCurrentUserModel();
  42. if ($onlymine) {
  43. $userwsid = vtws_getWebserviceEntityId('Users', $user->getId());
  44. $query .= " AND assigned_user_id='{$userwsid}'";
  45. }
  46. // TODO take care of pulling 100+ records
  47. return vtws_query($query.';', $user);
  48. }
  49. protected function pullEvents($start, $end, &$result, $cssClass,$userid = false,$color = null) {
  50. $currentUser = Users_Record_Model::getCurrentUserModel();
  51. $db = PearDatabase::getInstance();
  52. $moduleModel = Vtiger_Module_Model::getInstance('Events');
  53. if($userid){
  54. $focus = new Users();
  55. $focus->id = $userid;
  56. $focus->retrieve_entity_info($userid, 'Users');
  57. $user = Users_Record_Model::getInstanceFromUserObject($focus);
  58. $groupIds = Users_Record_Model::getUserGroups($userid);
  59. $userName = $user->getName();
  60. $queryGenerator = new QueryGenerator($moduleModel->get('name'), $user);
  61. }else{
  62. $queryGenerator = new QueryGenerator($moduleModel->get('name'), $currentUser);
  63. $currentUsergroupIds = Users_Record_Model::getUserGroups($currentUser->id);
  64. }
  65. $queryGenerator->setFields(array('subject', 'eventstatus', 'visibility','date_start','time_start','due_date','time_end','assigned_user_id','id'));
  66. $query = $queryGenerator->getQuery();
  67. $query.= " AND vtiger_activity.activitytype NOT IN ('Emails','Task') AND ";
  68. $query.= " ((date_start >= ? AND due_date < ?) OR ( due_date >= ?))";
  69. $params = array($start, $end, $start);
  70. if($userid){
  71. $query .= " AND (vtiger_crmentity.smownerid='$userid' ";
  72. if(!empty($groupIds)) {
  73. $query .= " OR vtiger_crmentity.smownerid IN (".generateQuestionMarks($groupIds).") ";
  74. $params = array_merge($params, $groupIds);
  75. }
  76. $query .= ")";
  77. } else {
  78. if(!empty($currentUsergroupIds)) {
  79. $query .= " AND (vtiger_crmentity.smownerid='$currentUser->id' ".
  80. " OR vtiger_crmentity.smownerid IN (".generateQuestionMarks($currentUsergroupIds).")) ";
  81. $params = array_merge($params, $currentUsergroupIds);
  82. } else {
  83. $query .= " AND vtiger_crmentity.smownerid='$currentUser->id' ";
  84. }
  85. }
  86. $queryResult = $db->pquery($query, $params);
  87. while($record = $db->fetchByAssoc($queryResult)){
  88. $item = array();
  89. $crmid = $record['activityid'];
  90. $visibility = $record['visibility'];
  91. $item['id'] = $crmid;
  92. $item['visibility'] = $visibility;
  93. if($visibility == 'Private' && $userid && $userid != $currentUser->getId()) {
  94. $item['title'] = decode_html($userName).' - '.decode_html(vtranslate('Busy','Events')).'*';
  95. $item['url'] = '';
  96. } else {
  97. $item['title'] = decode_html($record['subject']) . ' - (' . vtranslate($record['eventstatus'],'Calendar') . ')';
  98. $item['url'] = sprintf('index.php?module=Calendar&view=Detail&record=%s', $crmid);
  99. }
  100. $dateTimeFieldInstance = new DateTimeField($record['date_start'] . ' ' . $record['time_start']);
  101. $userDateTimeString = $dateTimeFieldInstance->getDisplayDateTimeValue($currentUser);
  102. $dateTimeComponents = explode(' ',$userDateTimeString);
  103. $dateComponent = $dateTimeComponents[0];
  104. //Conveting the date format in to Y-m-d . since full calendar expects in the same format
  105. $dataBaseDateFormatedString = DateTimeField::__convertToDBFormat($dateComponent, $currentUser->get('date_format'));
  106. $item['start'] = $dataBaseDateFormatedString.' '. $dateTimeComponents[1];
  107. $dateTimeFieldInstance = new DateTimeField($record['due_date'] . ' ' . $record['time_end']);
  108. $userDateTimeString = $dateTimeFieldInstance->getDisplayDateTimeValue($currentUser);
  109. $dateTimeComponents = explode(' ',$userDateTimeString);
  110. $dateComponent = $dateTimeComponents[0];
  111. //Conveting the date format in to Y-m-d . since full calendar expects in the same format
  112. $dataBaseDateFormatedString = DateTimeField::__convertToDBFormat($dateComponent, $currentUser->get('date_format'));
  113. $item['end'] = $dataBaseDateFormatedString.' '. $dateTimeComponents[1];
  114. $item['className'] = $cssClass;
  115. $item['allDay'] = false;
  116. $item['color'] = $color;
  117. $result[] = $item;
  118. }
  119. }
  120. protected function pullMultipleEvents($start, $end, &$result, $data) {
  121. foreach ($data as $id=>$color) {
  122. $userEvents = array();
  123. $this->pullEvents($start, $end, $userEvents ,null,$id, $color);
  124. $result[$id] = $userEvents;
  125. }
  126. }
  127. protected function pullTasks($start, $end, &$result, $cssClass) {
  128. $user = Users_Record_Model::getCurrentUserModel();
  129. $db = PearDatabase::getInstance();
  130. $moduleModel = Vtiger_Module_Model::getInstance('Calendar');
  131. $queryGenerator = new QueryGenerator($moduleModel->get('name'), $user);
  132. $queryGenerator->setFields(array('subject', 'taskstatus', 'date_start','time_start','due_date','time_end','id'));
  133. $query = $queryGenerator->getQuery();
  134. $query.= " AND vtiger_activity.activitytype = 'Task' AND ";
  135. $query.= " ((date_start >= '$start' AND due_date < '$end') OR ( due_date >= '$start'))";
  136. $query.= " AND vtiger_crmentity.smownerid='{$user->getId()}'";
  137. $queryResult = $db->pquery($query, array());
  138. while($record = $db->fetchByAssoc($queryResult)){
  139. $item = array();
  140. $crmid = $record['activityid'];
  141. $item['title'] = decode_html($record['subject']) . ' - (' . vtranslate($record['status'],'Calendar') . ')';
  142. $dateTimeFieldInstance = new DateTimeField($record['date_start'] . ' ' . $record['time_start']);
  143. $userDateTimeString = $dateTimeFieldInstance->getDisplayDateTimeValue();
  144. $dateTimeComponents = explode(' ',$userDateTimeString);
  145. $dateComponent = $dateTimeComponents[0];
  146. //Conveting the date format in to Y-m-d . since full calendar expects in the same format
  147. $dataBaseDateFormatedString = DateTimeField::__convertToDBFormat($dateComponent, $user->get('date_format'));
  148. $item['start'] = $dataBaseDateFormatedString.' '. $dateTimeComponents[1];
  149. $item['end'] = $record['due_date'];
  150. $item['url'] = sprintf('index.php?module=Calendar&view=Detail&record=%s', $crmid);
  151. $item['className'] = $cssClass;
  152. $result[] = $item;
  153. }
  154. }
  155. protected function pullPotentials($start, $end, &$result, $cssClass) {
  156. $query = "SELECT potentialname,closingdate FROM Potentials";
  157. $query.= " WHERE closingdate >= '$start' AND closingdate <= '$end'";
  158. $records = $this->queryForRecords($query);
  159. foreach ($records as $record) {
  160. $item = array();
  161. list ($modid, $crmid) = vtws_getIdComponents($record['id']);
  162. $item['id'] = $crmid;
  163. $item['title'] = decode_html($record['potentialname']);
  164. $item['start'] = $record['closingdate'];
  165. $item['url'] = sprintf('index.php?module=Potentials&view=Detail&record=%s', $crmid);
  166. $item['className'] = $cssClass;
  167. $result[] = $item;
  168. }
  169. }
  170. protected function pullContacts($start, $end, &$result, $cssClass) {
  171. $this->pullContactsBySupportEndDate($start, $end, $result, $cssClass);
  172. $this->pullContactsByBirthday($start, $end, $result, $cssClass);
  173. }
  174. protected function pullContactsBySupportEndDate($start, $end, &$result, $cssClass) {
  175. $query = "SELECT firstname,lastname,support_end_date FROM Contacts";
  176. $query.= " WHERE support_end_date >= '$start' AND support_end_date <= '$end'";
  177. $records = $this->queryForRecords($query);
  178. foreach ($records as $record) {
  179. $item = array();
  180. list ($modid, $crmid) = vtws_getIdComponents($record['id']);
  181. $item['id'] = $crmid;
  182. $item['title'] = decode_html(trim($record['firstname'] . ' ' . $record['lastname']));
  183. $item['start'] = $record['support_end_date'];
  184. $item['url'] = sprintf('index.php?module=Contacts&view=Detail&record=%s', $crmid);
  185. $item['className'] = $cssClass;
  186. $result[] = $item;
  187. }
  188. }
  189. protected function pullContactsByBirthday($start, $end, &$result, $cssClass) {
  190. $db = PearDatabase::getInstance();
  191. $user = Users_Record_Model::getCurrentUserModel();
  192. $startDateComponents = split('-', $start);
  193. $endDateComponents = split('-', $end);
  194. $year = $startDateComponents[0];
  195. $query = "SELECT firstname,lastname,birthday,crmid FROM vtiger_contactdetails";
  196. $query.= " INNER JOIN vtiger_contactsubdetails ON vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid";
  197. $query.= " INNER JOIN vtiger_crmentity ON vtiger_contactdetails.contactid = vtiger_crmentity.crmid";
  198. $query.= " WHERE vtiger_crmentity.deleted=0 AND smownerid='{$user->getId()}' AND";
  199. $query.= " (('$year-' || to_char(birthday,'%m-%d') >= '$start'
  200. AND '$year-' || to_char(birthday,'%m-%d') <= '$end')";
  201. $endDateYear = $endDateComponents[0];
  202. if ($year !== $endDateYear) {
  203. $query .= " OR
  204. ('$endDateYear-' || to_char(birthday,'%m-%d') >= '$start'
  205. AND '$endDateYear-' || to_char(birthday,'%m-%d') <= '$end')";
  206. }
  207. $query .= ")";
  208. $queryResult = $db->pquery($query, array());
  209. while($record = $db->fetchByAssoc($queryResult)){
  210. $item = array();
  211. $crmid = $record['crmid'];
  212. $recordDateTime = new DateTime($record['birthday']);
  213. $calendarYear = $year;
  214. if($recordDateTime->format('m') < $startDateComponents[1]) {
  215. $calendarYear = $endDateYear;
  216. }
  217. $recordDateTime->setDate($calendarYear, $recordDateTime->format('m'), $recordDateTime->format('d'));
  218. $item['id'] = $crmid;
  219. $item['title'] = decode_html(trim($record['firstname'] . ' ' . $record['lastname']));
  220. $item['start'] = $recordDateTime->format('Y-m-d');
  221. $item['url'] = sprintf('index.php?module=Contacts&view=Detail&record=%s', $crmid);
  222. $item['className'] = $cssClass;
  223. $result[] = $item;
  224. }
  225. }
  226. protected function pullInvoice($start, $end, &$result, $cssClass) {
  227. $query = "SELECT subject,duedate FROM Invoice";
  228. $query.= " WHERE duedate >= '$start' AND duedate <= '$end'";
  229. $records = $this->queryForRecords($query);
  230. foreach ($records as $record) {
  231. $item = array();
  232. list ($modid, $crmid) = vtws_getIdComponents($record['id']);
  233. $item['id'] = $crmid;
  234. $item['title'] = decode_html($record['subject']);
  235. $item['start'] = $record['duedate'];
  236. $item['url'] = sprintf('index.php?module=Invoice&view=Detail&record=%s', $crmid);
  237. $item['className'] = $cssClass;
  238. $result[] = $item;
  239. }
  240. }
  241. /**
  242. * Function to pull all the current user projects
  243. * @param type $startdate
  244. * @param type $actualenddate
  245. * @param type $result
  246. * @param type $cssClass
  247. */
  248. protected function pullProjects($start, $end, &$result, $cssClass) {
  249. $db = PearDatabase::getInstance();
  250. $user = Users_Record_Model::getCurrentUserModel();
  251. $query = "SELECT projectname, startdate, targetenddate, crmid FROM vtiger_project";
  252. $query.= " INNER JOIN vtiger_crmentity ON vtiger_project.projectid = vtiger_crmentity.crmid";
  253. $query.= " WHERE vtiger_crmentity.deleted=0 AND smownerid='{$user->getId()}' AND ";
  254. $query.= " ((startdate >= '$start' AND targetenddate < '$end') OR ( targetenddate >= '$start'))";
  255. $queryResult = $db->pquery($query, array());
  256. while($record = $db->fetchByAssoc($queryResult)){
  257. $item = array();
  258. $crmid = $record['crmid'];
  259. $item['id'] = $crmid;
  260. $item['title'] = decode_html($record['projectname']);
  261. $item['start'] = $record['startdate'];
  262. $item['end'] = $record['targetenddate'];
  263. $item['url'] = sprintf('index.php?module=Project&view=Detail&record=%s', $crmid);
  264. $item['className'] = $cssClass;
  265. $result[] = $item;
  266. }
  267. }
  268. /**
  269. * Function to pull all the current user porjecttasks
  270. * @param type $startdate
  271. * @param type $enddate
  272. * @param type $result
  273. * @param type $cssClass
  274. */
  275. protected function pullProjectTasks($start, $end, &$result, $cssClass) {
  276. $db = PearDatabase::getInstance();
  277. $user = Users_Record_Model::getCurrentUserModel();
  278. $query = "SELECT projecttaskname, startdate, enddate, crmid FROM vtiger_projecttask";
  279. $query.= " INNER JOIN vtiger_crmentity ON vtiger_projecttask.projecttaskid = vtiger_crmentity.crmid";
  280. $query.= " WHERE vtiger_crmentity.deleted=0 AND smownerid='{$user->getId()}' AND ";
  281. $query.= " ((startdate >= '$start' AND enddate < '$end') OR ( enddate >= '$start'))";
  282. $queryResult = $db->pquery($query, array());
  283. while($record = $db->fetchByAssoc($queryResult)){
  284. $item = array();
  285. $crmid = $record['crmid'];
  286. $item['id'] = $crmid;
  287. $item['title'] = decode_html($record['projecttaskname']);
  288. $item['start'] = $record['startdate'];
  289. $item['end'] = $record['enddate'];
  290. $item['url'] = sprintf('index.php?module=ProjectTask&view=Detail&record=%s', $crmid);
  291. $item['className'] = $cssClass;
  292. $result[] = $item;
  293. }
  294. }
  295. }