3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2017 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2017
35 * This class generates view mode for CiviCase.
37 class CRM_Case_Form_CaseView
extends CRM_Core_Form
{
39 * Check for merge cases.
42 private $_mergeCases = FALSE;
45 * Set variables up before form is built.
47 public function preProcess() {
48 $this->_showRelatedCases
= CRM_Utils_Array
::value('relatedCases', $_GET);
50 $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process();
51 $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients();
52 $this->assign('multiClient', $isMultiClient);
54 //pull the related cases.
55 $this->assign('showRelatedCases', FALSE);
56 if ($this->_showRelatedCases
) {
57 $relatedCases = $this->get('relatedCases');
58 if (!isset($relatedCases)) {
59 $cId = CRM_Utils_Request
::retrieve('cid', 'Integer');
60 $caseId = CRM_Utils_Request
::retrieve('id', 'Integer');
61 $relatedCases = CRM_Case_BAO_Case
::getRelatedCases($caseId);
63 $this->assign('relatedCases', $relatedCases);
64 $this->assign('showRelatedCases', TRUE);
65 CRM_Utils_System
::setTitle(ts('Related Cases'));
69 $this->_hasAccessToAllCases
= CRM_Core_Permission
::check('access all cases and activities');
70 $this->assign('hasAccessToAllCases', $this->_hasAccessToAllCases
);
72 $this->assign('contactID', $this->_contactID
= (int) $this->get('cid'));
73 $this->assign('caseID', $this->_caseID
= (int) $this->get('id'));
76 if (!CRM_Case_BAO_Case
::accessCase($this->_caseID
, FALSE)) {
77 CRM_Core_Error
::fatal(ts('You are not authorized to access this page.'));
80 $fulltext = CRM_Utils_Request
::retrieve('context', 'String');
81 if ($fulltext == 'fulltext') {
82 $this->assign('fulltext', $fulltext);
85 $this->assign('contactType', CRM_Core_DAO
::getFieldValue('CRM_Contact_DAO_Contact', $this->_contactID
, 'contact_type'));
86 $this->assign('userID', CRM_Core_Session
::getLoggedInContactID());
88 //retrieve details about case
89 $params = array('id' => $this->_caseID
);
91 $returnProperties = array('case_type_id', 'subject', 'status_id', 'start_date');
92 CRM_Core_DAO
::commonRetrieve('CRM_Case_BAO_Case', $params, $values, $returnProperties);
94 $statuses = CRM_Case_PseudoConstant
::caseStatus('label', FALSE);
95 $caseTypeName = CRM_Case_BAO_Case
::getCaseType($this->_caseID
, 'name');
96 $caseType = CRM_Case_BAO_Case
::getCaseType($this->_caseID
);
98 $this->_caseDetails
= array(
99 'case_type' => $caseType,
100 'case_status' => CRM_Utils_Array
::value($values['case_status_id'], $statuses),
101 'case_subject' => CRM_Utils_Array
::value('subject', $values),
102 'case_start_date' => $values['case_start_date'],
104 $this->_caseType
= $caseTypeName;
105 $this->assign('caseDetails', $this->_caseDetails
);
107 $reportUrl = CRM_Utils_System
::url('civicrm/case/report',
108 "reset=1&cid={$this->_contactID}&caseid={$this->_caseID}&asn=",
111 $this->assign('reportUrl', $reportUrl);
113 // add to recently viewed
115 $url = CRM_Utils_System
::url('civicrm/contact/view/case',
116 "action=view&reset=1&id={$this->_caseID}&cid={$this->_contactID}&context=home"
119 $displayName = CRM_Contact_BAO_Contact
::displayName($this->_contactID
);
120 $this->assign('displayName', $displayName);
122 CRM_Utils_System
::setTitle($displayName . ' - ' . $caseType);
124 $recentOther = array();
125 if (CRM_Core_Permission
::checkActionPermission('CiviCase', CRM_Core_Action
::DELETE
)) {
126 $recentOther['deleteUrl'] = CRM_Utils_System
::url('civicrm/contact/view/case',
127 "action=delete&reset=1&id={$this->_caseID}&cid={$this->_contactID}&context=home"
131 // Add the recently viewed case
132 CRM_Utils_Recent
::add($displayName . ' - ' . $caseType,
141 //get the related cases for given case.
142 $relatedCases = $this->get('relatedCases');
143 if (!isset($relatedCases)) {
144 $relatedCases = CRM_Case_BAO_Case
::getRelatedCases($this->_caseID
);
145 $relatedCases = empty($relatedCases) ?
FALSE : $relatedCases;
146 $this->set('relatedCases', $relatedCases);
148 $this->assign('hasRelatedCases', (bool) $relatedCases);
150 $this->assign('relatedCaseLabel', ts('%1 Related Case', array(
151 'count' => count($relatedCases),
152 'plural' => '%1 Related Cases',
154 $this->assign('relatedCaseUrl', CRM_Utils_System
::url('civicrm/contact/view/case', array(
155 'id' => $this->_caseID
,
156 'cid' => $this->_contactID
,
162 $entitySubType = !empty($values['case_type_id']) ?
$values['case_type_id'] : NULL;
163 $this->assign('caseTypeID', $entitySubType);
164 $groupTree = CRM_Core_BAO_CustomGroup
::getTree('Case',
170 CRM_Core_BAO_CustomGroup
::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_caseID
);
174 * Set default values for the form.
178 public function setDefaultValues() {
184 * Build the form object.
186 public function buildQuickForm() {
187 //this call is for show related cases.
188 if ($this->_showRelatedCases
) {
192 $allowedRelationshipTypes = CRM_Contact_BAO_Relationship
::getContactRelationshipType($this->_contactID
);
194 CRM_Core_Resources
::singleton()
195 ->addScriptFile('civicrm', 'js/crm.livePage.js', 1, 'html-header')
196 ->addScriptFile('civicrm', 'templates/CRM/Case/Form/CaseView.js', 2, 'html-header')
197 ->addVars('relationshipTypes', CRM_Contact_Form_Relationship
::getRelationshipTypeMetadata($allowedRelationshipTypes));
199 $xmlProcessor = new CRM_Case_XMLProcessor_Process();
200 $caseRoles = $xmlProcessor->get($this->_caseType
, 'CaseRoles');
201 $reports = $xmlProcessor->get($this->_caseType
, 'ActivitySets');
203 //adding case manager.CRM-4510.
204 $managerRoleId = $xmlProcessor->getCaseManagerRoleId($this->_caseType
);
205 if (!empty($managerRoleId)) {
206 $caseRoles[$managerRoleId] = $caseRoles[$managerRoleId] . '<br />' . '(' . ts('Case Manager') . ')';
209 $aTypes = $xmlProcessor->get($this->_caseType
, 'ActivityTypes', TRUE);
211 $allActTypes = CRM_Core_PseudoConstant
::activityType(TRUE, TRUE, FALSE, 'name');
213 $emailActivityType = array_search('Email', $allActTypes);
214 $pdfActivityType = array_search('Print PDF Letter', $allActTypes);
216 if ($pdfActivityType) {
217 $this->assign('exportDoc', CRM_Utils_System
::url('civicrm/activity/pdf/add',
218 "action=add&context=standalone&reset=1&cid={$this->_contactID}&caseid={$this->_caseID}&atype=$pdfActivityType"));
221 // remove Open Case activity type since we're inside an existing case
222 if ($openActTypeId = array_search('Open Case', $allActTypes)) {
223 unset($aTypes[$openActTypeId]);
226 // Only show "link cases" activity if other cases exist.
227 $linkActTypeId = array_search('Link Cases', $allActTypes);
228 if ($linkActTypeId) {
229 $count = civicrm_api3('Case', 'getcount', array(
230 'check_permissions' => TRUE,
231 'id' => array('!=' => $this->_caseID
),
235 unset($aTypes[$linkActTypeId]);
239 if (!$xmlProcessor->getNaturalActivityTypeSort()) {
243 $activityLinks = array('' => ts('Add Activity'));
244 foreach ($aTypes as $type => $label) {
245 if ($type == $emailActivityType) {
246 $url = CRM_Utils_System
::url('civicrm/activity/email/add',
247 "action=add&context=standalone&reset=1&caseid={$this->_caseID}&atype=$type",
251 elseif ($type == $pdfActivityType) {
252 $url = CRM_Utils_System
::url('civicrm/activity/pdf/add',
253 "action=add&context=standalone&reset=1&cid={$this->_contactID}&caseid={$this->_caseID}&atype=$type",
257 $url = CRM_Utils_System
::url('civicrm/case/activity',
258 "action=add&reset=1&cid={$this->_contactID}&caseid={$this->_caseID}&atype=$type",
262 $activityLinks[$url] = $label;
265 $this->add('select', 'add_activity_type_id', '', $activityLinks, FALSE, array('class' => 'crm-select2 crm-action-menu fa-calendar-check-o twenty'));
266 if ($this->_hasAccessToAllCases
) {
267 $this->add('select', 'report_id', '',
268 array('' => ts('Activity Audit')) +
$reports,
270 array('class' => 'crm-select2 crm-action-menu fa-list-alt')
272 $this->add('select', 'timeline_id', '',
273 array('' => ts('Add Timeline')) +
$reports,
275 array('class' => 'crm-select2 crm-action-menu fa-list-ol')
278 $this->addElement('submit', $this->getButtonName('next'), ' ', array('class' => 'hiddenElement'));
280 $this->buildMergeCaseForm();
283 self
::activityForm($this, $aTypes);
285 //get case related relationships (Case Role)
286 $caseRelationships = CRM_Case_BAO_Case
::getCaseRoles($this->_contactID
, $this->_caseID
);
288 //save special label because we unset it in the loop
289 $managerLabel = empty($managerRoleId) ?
'' : $caseRoles[$managerRoleId];
291 foreach ($caseRelationships as $key => & $value) {
292 if (!empty($managerRoleId)) {
293 if ($managerRoleId == $value['relation_type']) {
294 $value['relation'] = $managerLabel;
298 //calculate roles that don't have relationships
299 if (!empty($caseRoles[$value['relation_type']])) {
300 unset($caseRoles[$value['relation_type']]);
304 $this->assign('caseRelationships', $caseRelationships);
306 //also add client as role. CRM-4438
307 $caseRoles['client'] = CRM_Case_BAO_Case
::getContactNames($this->_caseID
);
309 $this->assign('caseRoles', $caseRoles);
311 // Retrieve ALL client relationships
312 $relClient = CRM_Contact_BAO_Relationship
::getRelationship($this->_contactID
,
313 CRM_Contact_BAO_Relationship
::CURRENT
,
314 0, 0, 0, NULL, NULL, FALSE
317 // Now build 'Other Relationships' array by removing relationships that are already listed under Case Roles
318 // so they don't show up twice.
319 $clientRelationships = array();
320 foreach ($relClient as $r) {
321 if (!array_key_exists($r['id'], $caseRelationships)) {
322 $clientRelationships[] = $r;
325 $this->assign('clientRelationships', $clientRelationships);
327 // Now global contact list that appears on all cases.
328 $globalGroupInfo = array();
329 CRM_Case_BAO_Case
::getGlobalContacts($globalGroupInfo);
330 $this->assign('globalGroupInfo', $globalGroupInfo);
332 // List relationship types for adding an arbitrary new role to the case
335 ts('Relationship Type'),
336 array('' => ts('- select type -')) +
$allowedRelationshipTypes,
338 array('class' => 'crm-select2 twenty', 'data-select-params' => '{"allowClear": false}')
341 $hookCaseSummary = CRM_Utils_Hook
::caseSummary($this->_caseID
);
342 if (is_array($hookCaseSummary)) {
343 $this->assign('hookCaseSummary', $hookCaseSummary);
346 $allTags = CRM_Core_BAO_Tag
::getColorTags('civicrm_case');
348 if (!empty($allTags)) {
349 $this->add('select2', 'case_tag', ts('Tags'), $allTags, FALSE,
350 array('id' => 'tags', 'multiple' => 'multiple')
353 $tags = CRM_Core_BAO_EntityTag
::getTag($this->_caseID
, 'civicrm_case');
355 foreach ($tags as $tid) {
356 $tagInfo = CRM_Utils_Array
::findInTree($tid, $allTags);
358 $tags[$tid] = $tagInfo;
365 $this->setDefaults(array('case_tag' => implode(',', array_keys($tags))));
367 $this->assign('tags', $tags);
368 $this->assign('showTags', TRUE);
371 $this->assign('showTags', FALSE);
374 // build tagset widget
376 // see if we have any tagsets which can be assigned to cases
377 $parentNames = CRM_Core_BAO_Tag
::getTagSet('civicrm_case');
378 $tagSetTags = array();
380 $this->assign('showTags', TRUE);
381 $tagSetItems = civicrm_api3('entityTag', 'get', array(
382 'entity_id' => $this->_caseID
,
383 'entity_table' => 'civicrm_case',
384 'tag_id.parent_id.is_tagset' => 1,
385 'options' => array('limit' => 0),
386 'return' => array("tag_id.parent_id", "tag_id.parent_id.name", "tag_id.name"),
388 foreach ($tagSetItems['values'] as $tag) {
389 $tagSetTags +
= array(
390 $tag['tag_id.parent_id'] => array(
391 'name' => $tag['tag_id.parent_id.name'],
395 $tagSetTags[$tag['tag_id.parent_id']]['items'][] = $tag['tag_id.name'];
398 $this->assign('tagSetTags', $tagSetTags);
399 CRM_Core_Form_Tag
::buildQuickForm($this, $parentNames, 'civicrm_case', $this->_caseID
, FALSE, TRUE);
401 $this->addButtons(array(
404 'name' => ts('Done'),
405 'spacing' => ' ',
415 public function postProcess() {
416 $params = $this->controller
->exportValues($this->_name
);
417 $buttonName = $this->controller
->getButtonName();
420 $url = CRM_Utils_System
::url('civicrm/contact/view/case',
421 "reset=1&action=view&cid={$this->_contactID}&id={$this->_caseID}&show=1"
423 $session = CRM_Core_Session
::singleton();
424 $session->pushUserContext($url);
426 if (!empty($params['timeline_id']) && !empty($_POST['_qf_CaseView_next'])) {
427 civicrm_api3('Case', 'addtimeline', array(
428 'case_id' => $this->_caseID
,
429 'timeline' => $params['timeline_id'],
432 $xmlProcessor = new CRM_Case_XMLProcessor_Process();
433 $reports = $xmlProcessor->get($this->_caseType
, 'ActivitySets');
434 CRM_Core_Session
::setStatus(ts('Activities from the %1 activity set have been added to this case.',
435 array(1 => $reports[$params['timeline_id']])
436 ), ts('Done'), 'success');
438 elseif ($this->_mergeCases
&&
439 $buttonName == '_qf_CaseView_next_merge_case'
442 $mainCaseId = $params['merge_case_id'];
443 $otherCaseId = $this->_caseID
;
446 CRM_Case_BAO_Case
::mergeCases($this->_contactID
, $mainCaseId, NULL, $otherCaseId);
448 //redirect user to main case view.
449 $url = CRM_Utils_System
::url('civicrm/contact/view/case',
450 "reset=1&action=view&cid={$this->_contactID}&id={$mainCaseId}&show=1"
452 $session = CRM_Core_Session
::singleton();
453 $session->pushUserContext($url);
458 * Build the activity selector/datatable
459 * @param CRM_Core_Form $form
460 * @param array $aTypes
461 * To include acivities related to current case id $form->_caseID.
463 public static function activityForm($form, $aTypes = array()) {
464 $caseRelationships = CRM_Case_BAO_Case
::getCaseRoles($form->_contactID
, $form->_caseID
);
465 //build reporter select
466 $reporters = array("" => ts(' - any reporter - '));
467 foreach ($caseRelationships as $key => & $value) {
468 $reporters[$value['cid']] = $value['name'] . " ( {$value['relation']} )";
470 $form->add('select', 'reporter_id', ts('Reporter/Role'), $reporters, FALSE, array('id' => 'reporter_id_' . $form->_caseID
));
472 // take all case activity types for search filter, CRM-7187
473 $aTypesFilter = array();
474 $allCaseActTypes = CRM_Case_PseudoConstant
::caseActivityType();
475 foreach ($allCaseActTypes as $typeDetails) {
476 if (!in_array($typeDetails['name'], array('Open Case'))) {
477 $aTypesFilter[$typeDetails['id']] = CRM_Utils_Array
::value('label', $typeDetails);
480 $aTypesFilter = $aTypesFilter +
$aTypes;
481 asort($aTypesFilter);
482 $form->add('select', 'activity_type_filter_id', ts('Activity Type'), array('' => ts('- select activity type -')) +
$aTypesFilter, FALSE, array('id' => 'activity_type_filter_id_' . $form->_caseID
));
484 $activityStatus = CRM_Core_PseudoConstant
::activityStatus();
485 $form->add('select', 'status_id', ts('Status'), array("" => ts(' - any status - ')) +
$activityStatus, FALSE, array('id' => 'status_id_' . $form->_caseID
));
488 $form->addDate('activity_date_low_' . $form->_caseID
, ts('Activity Dates - From'), FALSE, array('formatType' => 'searchDate'));
489 $form->addDate('activity_date_high_' . $form->_caseID
, ts('To'), FALSE, array('formatType' => 'searchDate'));
491 if (CRM_Core_Permission
::check('administer CiviCRM')) {
492 $form->add('checkbox', 'activity_deleted', ts('Deleted Activities'), '', FALSE, array('id' => 'activity_deleted_' . $form->_caseID
));
497 * Form elements for merging cases
499 public function buildMergeCaseForm() {
500 $otherCases = array();
501 $result = civicrm_api3('Case', 'get', array(
502 'check_permissions' => TRUE,
503 'contact_id' => $this->_contactID
,
505 'id' => array('!=' => $this->_caseID
),
506 'return' => array('id', 'start_date', 'case_type_id.title'),
508 foreach ($result['values'] as $id => $case) {
509 $otherCases[$id] = "#$id: {$case['case_type_id.title']} " . ts('(opened %1)', array(1 => $case['start_date']));
512 $this->assign('mergeCases', $this->_mergeCases
= (bool) $otherCases);
515 $this->add('select', 'merge_case_id',
516 ts('Select Case for Merge'),
518 '' => ts('- select case -'),
521 array('class' => 'crm-select2 huge')
523 $this->addElement('submit',
524 $this->getButtonName('next', 'merge_case'),
527 'class' => 'hiddenElement',