Merge pull request #13158 from elisseck/dev/core/544
[civicrm-core.git] / CRM / Case / Form / Search.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2019
32 */
33
34 /**
35 * This file is for Case search.
36 */
37 class CRM_Case_Form_Search extends CRM_Core_Form_Search {
38
39 /**
40 * The params that are sent to the query
41 *
42 * @var array
43 */
44 protected $_queryParams;
45
46 /**
47 * Are we restricting ourselves to a single contact
48 *
49 * @var boolean
50 */
51 protected $_single = FALSE;
52
53 /**
54 * Are we restricting ourselves to a single contact
55 *
56 * @var boolean
57 */
58 protected $_limit = NULL;
59
60 /**
61 * Prefix for the controller
62 */
63 protected $_prefix = 'case_';
64
65 /**
66 * Processing needed for buildForm and later.
67 */
68 public function preProcess() {
69 $this->set('searchFormName', 'Search');
70
71 //check for civicase access.
72 if (!CRM_Case_BAO_Case::accessCiviCase()) {
73 CRM_Core_Error::fatal(ts('You are not authorized to access this page.'));
74 }
75
76 //validate case configuration.
77 $configured = CRM_Case_BAO_Case::isCaseConfigured();
78 $this->assign('notConfigured', !$configured['configured']);
79 if (!$configured['configured']) {
80 return;
81 }
82
83 /**
84 * set the button names
85 */
86 $this->_searchButtonName = $this->getButtonName('refresh');
87 $this->_actionButtonName = $this->getButtonName('next', 'action');
88
89 $this->_done = FALSE;
90
91 $this->loadStandardSearchOptionsFromUrl();
92 $this->loadFormValues();
93
94 if ($this->_force) {
95 $this->postProcess();
96 $this->set('force', 0);
97 }
98
99 $sortID = NULL;
100 if ($this->get(CRM_Utils_Sort::SORT_ID)) {
101 $sortID = CRM_Utils_Sort::sortIDValue($this->get(CRM_Utils_Sort::SORT_ID),
102 $this->get(CRM_Utils_Sort::SORT_DIRECTION)
103 );
104 }
105
106 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
107 $selector = new CRM_Case_Selector_Search($this->_queryParams,
108 $this->_action,
109 NULL,
110 $this->_single,
111 $this->_limit,
112 $this->_context
113 );
114
115 $prefix = NULL;
116 if ($this->_context == 'user') {
117 $prefix = $this->_prefix;
118 }
119
120 $this->assign("{$prefix}limit", $this->_limit);
121 $this->assign("{$prefix}single", $this->_single);
122
123 $controller = new CRM_Core_Selector_Controller($selector,
124 $this->get(CRM_Utils_Pager::PAGE_ID),
125 $sortID,
126 CRM_Core_Action::VIEW,
127 $this,
128 CRM_Core_Selector_Controller::TRANSFER,
129 $prefix
130 );
131 $controller->setEmbedded(TRUE);
132 $controller->moveFromSessionToTemplate();
133
134 $this->assign('summary', $this->get('summary'));
135 }
136
137 /**
138 * Build the form object.
139 */
140 public function buildQuickForm() {
141 parent::buildQuickForm();
142 $this->addSortNameField();
143
144 CRM_Case_BAO_Query::buildSearchForm($this);
145
146 $rows = $this->get('rows');
147 if (is_array($rows)) {
148 if (!$this->_single) {
149 $this->addRowSelectors($rows);
150 }
151
152 $tasks = CRM_Case_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission());
153
154 if (!empty($this->_formValues['case_deleted'])) {
155 unset($tasks[CRM_Case_Task::TASK_DELETE]);
156 }
157 else {
158 unset($tasks[CRM_Case_Task::RESTORE_CASES]);
159 }
160
161 $this->addTaskMenu($tasks);
162 }
163
164 }
165
166 /**
167 * Get the label for the sortName field if email searching is on.
168 *
169 * (email searching is a setting under search preferences).
170 *
171 * @return string
172 */
173 protected function getSortNameLabelWithEmail() {
174 return ts('Client Name or Email');
175 }
176
177 /**
178 * Get the label for the sortName field if email searching is off.
179 *
180 * (email searching is a setting under search preferences).
181 *
182 * @return string
183 */
184 protected function getSortNameLabelWithOutEmail() {
185 return ts('Client Name');
186 }
187
188 /**
189 * The post processing of the form gets done here.
190 *
191 * Key things done during post processing are
192 * - check for reset or next request. if present, skip post procesing.
193 * - now check if user requested running a saved search, if so, then
194 * the form values associated with the saved search are used for searching.
195 * - if user has done a submit with new values the regular post submissing is
196 * done.
197 * The processing consists of using a Selector / Controller framework for getting the
198 * search results.
199 */
200 public function postProcess() {
201 if ($this->_done) {
202 return;
203 }
204
205 $this->_done = TRUE;
206 $this->_formValues = $this->controller->exportValues($this->_name);
207 $this->fixFormValues();
208
209 if (isset($this->_ssID) && empty($_POST)) {
210 // if we are editing / running a saved search and the form has not been posted
211 $this->_formValues = CRM_Contact_BAO_SavedSearch::getFormValues($this->_ssID);
212 }
213
214 //search for civicase
215 if (!$this->_force) {
216 if (array_key_exists('case_owner', $this->_formValues) && !$this->_formValues['case_owner']) {
217 $this->_formValues['case_owner'] = 0;
218 }
219 }
220
221 if (empty($this->_formValues['case_deleted'])) {
222 $this->_formValues['case_deleted'] = 0;
223 }
224 CRM_Core_BAO_CustomValue::fixCustomFieldValue($this->_formValues);
225
226 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
227
228 $this->set('formValues', $this->_formValues);
229 $this->set('queryParams', $this->_queryParams);
230
231 $buttonName = $this->controller->getButtonName();
232 if ($buttonName == $this->_actionButtonName) {
233 // check actionName and if next, then do not repeat a search, since we are going to the next page
234
235 // hack, make sure we reset the task values
236 $stateMachine = $this->controller->getStateMachine();
237 $formName = $stateMachine->getTaskFormName();
238 $this->controller->resetPage($formName);
239 return;
240 }
241
242 $sortID = NULL;
243 if ($this->get(CRM_Utils_Sort::SORT_ID)) {
244 $sortID = CRM_Utils_Sort::sortIDValue($this->get(CRM_Utils_Sort::SORT_ID),
245 $this->get(CRM_Utils_Sort::SORT_DIRECTION)
246 );
247 }
248
249 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
250
251 $selector = new CRM_Case_Selector_Search($this->_queryParams,
252 $this->_action,
253 NULL,
254 $this->_single,
255 $this->_limit,
256 $this->_context
257 );
258 $selector->setKey($this->controller->_key);
259
260 $prefix = NULL;
261 if ($this->_context == 'user') {
262 $prefix = $this->_prefix;
263 }
264
265 $this->assign("{$prefix}limit", $this->_limit);
266 $this->assign("{$prefix}single", $this->_single);
267
268 $controller = new CRM_Core_Selector_Controller($selector,
269 $this->get(CRM_Utils_Pager::PAGE_ID),
270 $sortID,
271 CRM_Core_Action::VIEW,
272 $this,
273 CRM_Core_Selector_Controller::SESSION,
274 $prefix
275 );
276 $controller->setEmbedded(TRUE);
277
278 $query = &$selector->getQuery();
279 if ($this->_context == 'user') {
280 $query->setSkipPermission(TRUE);
281 }
282 $controller->run();
283 }
284
285 /**
286 * Add the rules (mainly global rules) for form.
287 *
288 * All local rules are added near the element
289 *
290 * @see valid_date
291 */
292 public function addRules() {
293 $this->addFormRule(array('CRM_Case_Form_Search', 'formRule'));
294 }
295
296 /**
297 * Global validation rules for the form.
298 *
299 * @param array $fields
300 * Posted values of the form.
301 *
302 * @return array|bool
303 */
304 public static function formRule($fields) {
305 $errors = array();
306
307 if (!empty($errors)) {
308 return $errors;
309 }
310
311 return TRUE;
312 }
313
314 /**
315 * Set the default form values.
316 *
317 *
318 * @return array
319 * the default array reference
320 */
321 public function setDefaultValues() {
322 $defaults = array();
323 $defaults = $this->_formValues;
324 return $defaults;
325 }
326
327 public function fixFormValues() {
328 if (!$this->_force) {
329 return;
330 }
331
332 $caseStatus = CRM_Utils_Request::retrieve('status', 'Positive');
333 if ($caseStatus) {
334 $this->_formValues['case_status_id'] = $caseStatus;
335 $this->_defaults['case_status_id'] = $caseStatus;
336 }
337 $caseType = CRM_Utils_Request::retrieve('type', 'Positive');
338 if ($caseType) {
339 $this->_formValues['case_type_id'] = (array) $caseType;
340 $this->_defaults['case_type_id'] = (array) $caseType;
341 }
342
343 $caseFromDate = CRM_Utils_Request::retrieve('pstart', 'Date');
344 if ($caseFromDate) {
345 list($date) = CRM_Utils_Date::setDateDefaults($caseFromDate);
346 $this->_formValues['case_start_date_low'] = $date;
347 $this->_defaults['case_start_date_low'] = $date;
348 }
349
350 $caseToDate = CRM_Utils_Request::retrieve('pend', 'Date');
351 if ($caseToDate) {
352 list($date) = CRM_Utils_Date::setDateDefaults($caseToDate);
353 $this->_formValues['case_start_date_high'] = $date;
354 $this->_defaults['case_start_date_high'] = $date;
355 }
356
357 $cid = CRM_Utils_Request::retrieve('cid', 'Positive', $this);
358 if ($cid) {
359 $cid = CRM_Utils_Type::escape($cid, 'Integer');
360 if ($cid > 0) {
361 $this->_formValues['contact_id'] = $cid;
362 list($display, $image) = CRM_Contact_BAO_Contact::getDisplayAndImage($cid);
363 $this->_defaults['sort_name'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $cid,
364 'sort_name'
365 );
366 // also assign individual mode to the template
367 $this->_single = TRUE;
368 }
369 }
370 else {
371 // First, if "all" is stored in the session, default to all cases, otherwise default to no selection.
372 $session = CRM_Core_Session::singleton();
373 if (CRM_Utils_Request::retrieve('all', 'Positive', $session)) {
374 $this->_formValues['case_owner'] = 1;
375 $this->_defaults['case_owner'] = 1;
376 }
377 else {
378 $this->_formValues['case_owner'] = 0;
379 $this->_defaults['case_owner'] = 0;
380 }
381
382 // Now if case_owner is set in the url/post, use that instead.
383 $caseOwner = CRM_Utils_Request::retrieve('case_owner', 'Positive');
384 if ($caseOwner) {
385 $this->_formValues['case_owner'] = $caseOwner;
386 $this->_defaults['case_owner'] = $caseOwner;
387 }
388 }
389 }
390
391 /**
392 * @return null
393 */
394 public function getFormValues() {
395 return NULL;
396 }
397
398 /**
399 * Return a descriptive name for the page, used in wizard header
400 *
401 * @return string
402 */
403 public function getTitle() {
404 return ts('Find Cases');
405 }
406
407 }