PageRenderTime 59ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/features/cerberusweb.crm/api/rest/opps.php

https://github.com/rmiddle/cerb5
PHP | 376 lines | 247 code | 76 blank | 53 comment | 41 complexity | b12d89eded9e1c0abb55814e14035035 MD5 | raw file
  1. <?php
  2. /***********************************************************************
  3. | Cerberus Helpdesk(tm) developed by WebGroup Media, LLC.
  4. |-----------------------------------------------------------------------
  5. | All source code & content (c) Copyright 2012, WebGroup Media LLC
  6. | unless specifically noted otherwise.
  7. |
  8. | This source code is released under the Devblocks Public License.
  9. | The latest version of this license can be found here:
  10. | http://cerberusweb.com/license
  11. |
  12. | By using this software, you acknowledge having read this license
  13. | and agree to be bound thereby.
  14. | ______________________________________________________________________
  15. | http://www.cerberusweb.com http://www.webgroupmedia.com/
  16. ***********************************************************************/
  17. class ChRest_Opps extends Extension_RestController implements IExtensionRestController {
  18. function getAction($stack) {
  19. @$action = array_shift($stack);
  20. // Looking up a single ID?
  21. if(is_numeric($action)) {
  22. $this->getId(intval($action));
  23. } else { // actions
  24. switch($action) {
  25. }
  26. }
  27. $this->error(self::ERRNO_NOT_IMPLEMENTED);
  28. }
  29. function putAction($stack) {
  30. @$action = array_shift($stack);
  31. // Looking up a single ID?
  32. if(is_numeric($action)) {
  33. $this->putId(intval($action));
  34. } else { // actions
  35. switch($action) {
  36. }
  37. }
  38. $this->error(self::ERRNO_NOT_IMPLEMENTED);
  39. }
  40. function postAction($stack) {
  41. @$action = array_shift($stack);
  42. if(is_numeric($action) && !empty($stack)) {
  43. $id = intval($action);
  44. $action = array_shift($stack);
  45. switch($action) {
  46. case 'note':
  47. $this->postNote($id);
  48. break;
  49. }
  50. } else {
  51. switch($action) {
  52. case 'create':
  53. $this->postCreate();
  54. break;
  55. case 'search':
  56. $this->postSearch();
  57. break;
  58. }
  59. }
  60. $this->error(self::ERRNO_NOT_IMPLEMENTED);
  61. }
  62. function deleteAction($stack) {
  63. $this->error(self::ERRNO_NOT_IMPLEMENTED);
  64. }
  65. function getContext($id) {
  66. $labels = array();
  67. $values = array();
  68. $context = CerberusContexts::getContext(CerberusContexts::CONTEXT_OPPORTUNITY, $id, $labels, $values, null, true);
  69. // unset($values['initial_message_content']);
  70. return $values;
  71. }
  72. function translateToken($token, $type='dao') {
  73. $tokens = array();
  74. if('dao'==$type) {
  75. $tokens = array(
  76. 'amount' => DAO_CrmOpportunity::AMOUNT,
  77. // 'assignee_id' => DAO_CrmOpportunity::WORKER_ID,
  78. 'created' => DAO_CrmOpportunity::CREATED_DATE,
  79. 'email_id' => DAO_CrmOpportunity::PRIMARY_EMAIL_ID,
  80. 'is_closed' => DAO_CrmOpportunity::IS_CLOSED,
  81. 'is_won' => DAO_CrmOpportunity::IS_WON,
  82. 'title' => DAO_CrmOpportunity::NAME,
  83. 'updated' => DAO_CrmOpportunity::UPDATED_DATE,
  84. );
  85. } else {
  86. $tokens = array(
  87. 'amount' => SearchFields_CrmOpportunity::AMOUNT,
  88. 'created' => SearchFields_CrmOpportunity::CREATED_DATE,
  89. 'email_address' => SearchFields_CrmOpportunity::EMAIL_ADDRESS,
  90. 'email_id' => SearchFields_CrmOpportunity::PRIMARY_EMAIL_ID,
  91. 'id' => SearchFields_CrmOpportunity::ID,
  92. 'is_closed' => SearchFields_CrmOpportunity::IS_CLOSED,
  93. 'is_won' => SearchFields_CrmOpportunity::IS_WON,
  94. 'id' => SearchFields_CrmOpportunity::ID,
  95. 'title' => SearchFields_CrmOpportunity::NAME,
  96. 'updated' => SearchFields_CrmOpportunity::UPDATED_DATE,
  97. );
  98. }
  99. if(isset($tokens[$token]))
  100. return $tokens[$token];
  101. return NULL;
  102. }
  103. function getId($id) {
  104. $worker = $this->getActiveWorker();
  105. // ACL
  106. if(!$worker->hasPriv('plugin.cerberusweb.crm'))
  107. $this->error(self::ERRNO_ACL);
  108. $container = $this->search(array(
  109. array('id', '=', $id),
  110. ));
  111. if(is_array($container) && isset($container['results']) && isset($container['results'][$id]))
  112. $this->success($container['results'][$id]);
  113. // Error
  114. $this->error(self::ERRNO_CUSTOM, sprintf("Invalid opportunity id '%d'", $id));
  115. }
  116. function search($filters=array(), $sortToken='id', $sortAsc=1, $page=1, $limit=10) {
  117. $worker = $this->getActiveWorker();
  118. $params = $this->_handleSearchBuildParams($filters);
  119. // Sort
  120. $sortBy = $this->translateToken($sortToken, 'search');
  121. $sortAsc = !empty($sortAsc) ? true : false;
  122. // Search
  123. list($results, $total) = DAO_CrmOpportunity::search(
  124. !empty($sortBy) ? array($sortBy) : array(),
  125. $params,
  126. $limit,
  127. max(0,$page-1),
  128. $sortBy,
  129. $sortAsc,
  130. true
  131. );
  132. $objects = array();
  133. foreach($results as $id => $result) {
  134. $values = $this->getContext($id);
  135. $objects[$id] = $values;
  136. }
  137. $container = array(
  138. 'total' => $total,
  139. 'count' => count($objects),
  140. 'page' => $page,
  141. 'results' => $objects,
  142. );
  143. return $container;
  144. }
  145. function postSearch() {
  146. $worker = $this->getActiveWorker();
  147. // ACL
  148. if(!$worker->hasPriv('plugin.cerberusweb.crm'))
  149. $this->error(self::ERRNO_ACL);
  150. $container = $this->_handlePostSearch();
  151. $this->success($container);
  152. }
  153. function putId($id) {
  154. $worker = $this->getActiveWorker();
  155. // Validate the ID
  156. if(null == ($opp = DAO_CrmOpportunity::get($id)))
  157. $this->error(self::ERRNO_CUSTOM, sprintf("Invalid opportunity ID '%d'", $id));
  158. // ACL
  159. if(!($worker->hasPriv('crm.opp.actions.update_all') || $opp->worker_id==$worker->id))
  160. $this->error(self::ERRNO_ACL);
  161. $putfields = array(
  162. 'amount' => 'float',
  163. 'assignee_id' => 'integer',
  164. 'created' => 'timestamp',
  165. 'email_address' => 'string',
  166. 'email_id' => 'integer',
  167. 'is_closed' => 'bit',
  168. 'is_won' => 'bit',
  169. 'title' => 'string',
  170. 'updated' => 'timestamp',
  171. );
  172. $fields = array();
  173. foreach($putfields as $putfield => $type) {
  174. if(!isset($_POST[$putfield]))
  175. continue;
  176. @$value = DevblocksPlatform::importGPC($_POST[$putfield], 'string', '');
  177. // Sanitize
  178. $value = DevblocksPlatform::importVar($value, $type);
  179. // Pre-filter
  180. switch($putfield) {
  181. case 'email_address':
  182. if(null != ($lookup = DAO_Address::lookupAddress($value, true))) {
  183. unset($putfields['email_id']);
  184. $putfield = 'email_id';
  185. $value = $lookup->id;
  186. }
  187. break;
  188. }
  189. if(null == ($field = self::translateToken($putfield, 'dao'))) {
  190. $this->error(self::ERRNO_CUSTOM, sprintf("'%s' is not a valid field.", $putfield));
  191. }
  192. // Post-filter
  193. // switch($field) {
  194. // case DAO_Worker::PASSWORD:
  195. // $value = md5($value);
  196. // break;
  197. // }
  198. $fields[$field] = $value;
  199. }
  200. if(!isset($fields[DAO_CrmOpportunity::UPDATED_DATE]))
  201. $fields[DAO_CrmOpportunity::UPDATED_DATE] = time();
  202. // Handle custom fields
  203. $customfields = $this->_handleCustomFields($_POST);
  204. if(is_array($customfields))
  205. DAO_CustomFieldValue::formatAndSetFieldValues(CerberusContexts::CONTEXT_OPPORTUNITY, $id, $customfields, true, true, true);
  206. // Check required fields
  207. // $reqfields = array(DAO_Address::EMAIL);
  208. // $this->_handleRequiredFields($reqfields, $fields);
  209. // Update
  210. DAO_CrmOpportunity::update($id, $fields);
  211. $this->getId($id);
  212. }
  213. function postCreate() {
  214. $worker = $this->getActiveWorker();
  215. // ACL
  216. if(!$worker->hasPriv('crm.opp.actions.create'))
  217. $this->error(self::ERRNO_ACL);
  218. $postfields = array(
  219. 'amount' => 'float',
  220. 'assignee_id' => 'integer',
  221. 'created' => 'timestamp',
  222. 'email_address' => 'string',
  223. 'email_id' => 'integer',
  224. 'is_closed' => 'bit',
  225. 'is_won' => 'bit',
  226. 'title' => 'string',
  227. 'updated' => 'timestamp',
  228. );
  229. $fields = array();
  230. foreach($postfields as $postfield => $type) {
  231. if(!isset($_POST[$postfield]))
  232. continue;
  233. @$value = DevblocksPlatform::importGPC($_POST[$postfield], 'string', '');
  234. // Sanitize
  235. $value = DevblocksPlatform::importVar($value, $type);
  236. // Pre-filter
  237. switch($postfield) {
  238. case 'email_address':
  239. if(null != ($lookup = DAO_Address::lookupAddress($value, true))) {
  240. unset($postfields['email_id']);
  241. $postfield = 'email_id';
  242. $value = $lookup->id;
  243. }
  244. break;
  245. }
  246. if(null == ($field = self::translateToken($postfield, 'dao'))) {
  247. $this->error(self::ERRNO_CUSTOM, sprintf("'%s' is not a valid field.", $postfield));
  248. }
  249. // switch($field) {
  250. // case DAO_Worker::PASSWORD:
  251. // $value = md5($value);
  252. // break;
  253. // }
  254. $fields[$field] = $value;
  255. }
  256. if(!isset($fields[DAO_CrmOpportunity::CREATED_DATE]))
  257. $fields[DAO_CrmOpportunity::CREATED_DATE] = time();
  258. if(!isset($fields[DAO_CrmOpportunity::UPDATED_DATE]))
  259. $fields[DAO_CrmOpportunity::UPDATED_DATE] = time();
  260. // Check required fields
  261. $reqfields = array(
  262. DAO_CrmOpportunity::NAME,
  263. DAO_CrmOpportunity::PRIMARY_EMAIL_ID,
  264. );
  265. $this->_handleRequiredFields($reqfields, $fields);
  266. // Create
  267. if(false != ($id = DAO_CrmOpportunity::create($fields))) {
  268. // Handle custom fields
  269. $customfields = $this->_handleCustomFields($_POST);
  270. if(is_array($customfields))
  271. DAO_CustomFieldValue::formatAndSetFieldValues(CerberusContexts::CONTEXT_OPPORTUNITY, $id, $customfields, true, true, true);
  272. $this->getId($id);
  273. }
  274. }
  275. private function postNote($id) {
  276. $worker = $this->getActiveWorker();
  277. @$note = DevblocksPlatform::importGPC($_POST['note'],'string','');
  278. if(null == ($opp = DAO_CrmOpportunity::get($id)))
  279. $this->error(self::ERRNO_CUSTOM, sprintf("Invalid opp ID %d", $id));
  280. // ACL
  281. if(!$worker->hasPriv('core.addybook.org.actions.update'))
  282. $this->error(self::ERRNO_ACL);
  283. // Required fields
  284. if(empty($note))
  285. $this->error(self::ERRNO_CUSTOM, "The 'note' field is required.");
  286. // Post
  287. $fields = array(
  288. DAO_Comment::CONTEXT => CerberusContexts::CONTEXT_OPPORTUNITY,
  289. DAO_Comment::CONTEXT_ID => $opp->id,
  290. DAO_Comment::ADDRESS_ID => $worker->getAddress()->id,
  291. DAO_Comment::CREATED => time(),
  292. DAO_Comment::COMMENT => $note,
  293. );
  294. $note_id = DAO_Comment::create($fields);
  295. $this->success(array(
  296. 'opp_id' => $opp->id,
  297. 'note_id' => $note_id,
  298. ));
  299. }
  300. };