3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2018 |
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-2018
35 * This class generates form components for case activity.
37 class CRM_Case_Form_Case
extends CRM_Core_Form
{
44 public $_context = 'case';
49 public $_caseId = NULL;
54 public $_currentlyViewedContactId = NULL;
59 public $_activityTypeFile = NULL;
62 * Logged in contact Id
64 public $_currentUserId = NULL;
69 public $_activityTypeId = NULL;
74 public $_activityId = NULL;
84 public $_caseTypeId = NULL;
87 * Build the form object.
89 public function preProcess() {
91 $this->_caseId
= CRM_Utils_Request
::retrieve('id', 'Positive', $this);
93 $this->_currentlyViewedContactId
= CRM_Utils_Request
::retrieve('cid', 'Positive', $this);
95 if ($this->_action
& CRM_Core_Action
::ADD
&& !$this->_currentlyViewedContactId
) {
96 // check for add contacts permissions
97 if (!CRM_Core_Permission
::check('add contacts')) {
98 CRM_Utils_System
::permissionDenied();
104 if (!CRM_Core_Permission
::checkActionPermission('CiviCase', $this->_action
)) {
105 CRM_Core_Error
::fatal(ts('You do not have permission to access this page.'));
108 if ($this->_action
& CRM_Core_Action
::DELETE ||
$this->_action
& CRM_Core_Action
::RENEW
) {
112 if (!$this->_caseId
) {
113 $caseAttributes = array(
114 'case_type_id' => ts('Case Type'),
115 'status_id' => ts('Case Status'),
116 'medium_id' => ts('Activity Medium'),
119 foreach ($caseAttributes as $key => $label) {
120 if (!CRM_Case_BAO_Case
::buildOptions($key, 'create')) {
121 CRM_Core_Error
::fatal(ts('You do not have any active %1', array(1 => $label)));
126 if ($this->_action
& CRM_Core_Action
::ADD
) {
127 $this->_activityTypeId
= CRM_Core_PseudoConstant
::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Open Case');
128 if (!$this->_activityTypeId
) {
129 CRM_Core_Error
::fatal(ts('The Open Case activity type is missing or disabled. Please have your site administrator check Administer > Option Lists > Activity Types for the CiviCase component.'));
133 //check for case permissions.
134 if (!CRM_Case_BAO_Case
::accessCiviCase()) {
135 CRM_Core_Error
::fatal(ts('You are not authorized to access this page.'));
137 if (($this->_action
& CRM_Core_Action
::ADD
) &&
138 (!CRM_Core_Permission
::check('access all cases and activities') &&
139 !CRM_Core_Permission
::check('add cases')
142 CRM_Core_Error
::fatal(ts('You are not authorized to access this page.'));
145 if ($this->_activityTypeFile
= CRM_Activity_BAO_Activity
::getFileForActivityTypeId($this->_activityTypeId
,
149 $this->assign('activityTypeFile', $this->_activityTypeFile
);
152 $details = CRM_Case_PseudoConstant
::caseActivityType(FALSE);
154 CRM_Utils_System
::setTitle($details[$this->_activityTypeId
]['label']);
155 $this->assign('activityType', $details[$this->_activityTypeId
]['label']);
156 $this->assign('activityTypeDescription', $details[$this->_activityTypeId
]['description']);
158 if (isset($this->_currentlyViewedContactId
)) {
159 $contact = new CRM_Contact_DAO_Contact();
160 $contact->id
= $this->_currentlyViewedContactId
;
161 if (!$contact->find(TRUE)) {
162 CRM_Core_Error
::statusBounce(ts('Client contact does not exist: %1', array(1 => $this->_currentlyViewedContactId
)));
164 $this->assign('clientName', $contact->display_name
);
167 $session = CRM_Core_Session
::singleton();
168 $this->_currentUserId
= $session->get('userID');
170 //when custom data is included in this page
171 CRM_Custom_Form_CustomData
::preProcess($this, NULL, $this->_activityTypeId
, 1, 'Activity');
172 $className = "CRM_Case_Form_Activity_{$this->_activityTypeFile}";
173 $className::preProcess($this);
174 $activityGroupTree = $this->_groupTree
;
176 // for case custom fields to populate with defaults
177 if (!empty($_POST['hidden_custom'])) {
178 $params = CRM_Utils_Request
::exportValues();
179 CRM_Custom_Form_CustomData
::preProcess($this, NULL, CRM_Utils_Array
::value('case_type_id', $params, $this->_caseTypeId
), 1, 'Case', $this->_caseId
);
180 CRM_Custom_Form_CustomData
::buildQuickForm($this);
183 // so that grouptree is not populated with case fields, since the grouptree is used
184 // for populating activity custom fields.
185 $this->_groupTree
= $activityGroupTree;
189 * Set default values for the form.
191 public function setDefaultValues() {
192 if ($this->_action
& CRM_Core_Action
::DELETE ||
$this->_action
& CRM_Core_Action
::RENEW
) {
195 $className = "CRM_Case_Form_Activity_{$this->_activityTypeFile}";
196 $defaults = $className::setDefaultValues($this);
197 $defaults = array_merge($defaults, CRM_Custom_Form_CustomData
::setDefaultValues($this));
201 public function buildQuickForm() {
202 $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process();
203 $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients();
204 $this->assign('multiClient', $isMultiClient);
206 if ($this->_action
& CRM_Core_Action
::DELETE ||
$this->_action
& CRM_Core_Action
::RENEW
) {
207 $title = ts('Delete');
208 if ($this->_action
& CRM_Core_Action
::RENEW
) {
209 $title = ts('Restore');
211 $this->addButtons(array(
215 'spacing' => ' ',
220 'name' => ts('Cancel'),
227 //need to assign custom data type and subtype to the template
228 $this->assign('customDataType', 'Case');
230 CRM_Custom_Form_CustomData
::buildQuickForm($this);
231 // we don't want to show button on top of custom form
232 $this->assign('noPreCustomButton', TRUE);
234 $s = CRM_Core_DAO
::getAttribute('CRM_Activity_DAO_Activity', 'subject');
238 $this->add('text', 'activity_subject', ts('Subject'),
239 array_merge($s, array(
240 'maxlength' => '128',
244 $tags = CRM_Core_BAO_Tag
::getColorTags('civicrm_case');
247 $this->add('select2', 'tag', ts('Tags'), $tags, FALSE,
248 array('class' => 'huge', 'multiple' => 'multiple')
253 $parentNames = CRM_Core_BAO_Tag
::getTagSet('civicrm_case');
254 CRM_Core_Form_Tag
::buildQuickForm($this, $parentNames, 'civicrm_case', NULL, FALSE, TRUE);
256 $this->addButtons(array(
259 'name' => ts('Save'),
260 'spacing' => ' ',
265 'name' => ts('Cancel'),
270 $className = "CRM_Case_Form_Activity_{$this->_activityTypeFile}";
271 $className::buildQuickForm($this);
275 * Add local and global form rules.
279 public function addRules() {
280 if ($this->_action
& CRM_Core_Action
::DELETE ||
$this->_action
& CRM_Core_Action
::RENEW
) {
283 $className = "CRM_Case_Form_Activity_{$this->_activityTypeFile}";
284 $this->addFormRule(array($className, 'formRule'), $this);
285 $this->addFormRule(array('CRM_Case_Form_Case', 'formRule'), $this);
289 * Global validation rules for the form.
291 * @param array $values
292 * Posted values of the form.
295 * @param CRM_Core_Form $form
298 * list of errors to be posted back to the form
300 public static function formRule($values, $files, $form) {
305 * Process the form submission.
307 public function postProcess() {
308 $transaction = new CRM_Core_Transaction();
310 // check if dedupe button, if so return.
311 $buttonName = $this->controller
->getButtonName();
312 if (isset($this->_dedupeButtonName
) && $buttonName == $this->_dedupeButtonName
) {
316 if ($this->_action
& CRM_Core_Action
::DELETE
) {
317 $caseDelete = CRM_Case_BAO_Case
::deleteCase($this->_caseId
, TRUE);
319 CRM_Core_Session
::setStatus(ts('You can view and / or restore deleted cases by checking the "Deleted Cases" option under Find Cases.'), ts('Case Deleted'), 'success');
324 if ($this->_action
& CRM_Core_Action
::RENEW
) {
325 $caseRestore = CRM_Case_BAO_Case
::restoreCase($this->_caseId
);
327 CRM_Core_Session
::setStatus(ts('The selected case has been restored.'), ts('Restored'), 'success');
331 // store the submitted values in an array
332 $params = $this->controller
->exportValues($this->_name
);
333 $params['now'] = date("Ymd");
335 // 1. call begin post process
336 if ($this->_activityTypeFile
) {
337 $className = "CRM_Case_Form_Activity_{$this->_activityTypeFile}";
338 $className::beginPostProcess($this, $params);
341 if (!empty($params['hidden_custom']) &&
342 !isset($params['custom'])
344 $params['custom'] = CRM_Core_BAO_CustomField
::postProcess(
351 // 2. create/edit case
352 if (!empty($params['case_type_id'])) {
353 $params['case_type'] = CRM_Core_DAO
::getFieldValue('CRM_Case_DAO_CaseType', $params['case_type_id'], 'name', 'id');
354 $params['subject'] = $params['activity_subject'];
356 $caseObj = CRM_Case_BAO_Case
::create($params);
357 $this->_caseId
= $params['case_id'] = $caseObj->id
;
358 // unset any ids, custom data
359 unset($params['id'], $params['custom']);
361 // add tags if exists
362 $tagParams = array();
363 if (!empty($params['tag'])) {
364 $tagParams = array();
365 if (!is_array($params['tag'])) {
366 $params['tag'] = explode(',', $params['tag']);
368 foreach ($params['tag'] as $tag) {
369 $tagParams[$tag] = 1;
372 CRM_Core_BAO_EntityTag
::create($tagParams, 'civicrm_case', $caseObj->id
);
375 if (isset($params['case_taglist']) && !empty($params['case_taglist'])) {
376 CRM_Core_Form_Tag
::postProcess($params['case_taglist'], $caseObj->id
, 'civicrm_case', $this);
380 $url = CRM_Utils_System
::url('civicrm/contact/view/case',
381 "reset=1&action=view&cid={$this->_currentlyViewedContactId}&id={$caseObj->id}"
383 CRM_Core_Session
::singleton()->pushUserContext($url);
385 // 3. format activity custom data
386 if (!empty($params['hidden_custom'])) {
387 $customFields = CRM_Core_BAO_CustomField
::getFields('Activity', FALSE, FALSE, $this->_activityTypeId
);
388 $customFields = CRM_Utils_Array
::crmArrayMerge($customFields,
389 CRM_Core_BAO_CustomField
::getFields('Activity', FALSE, FALSE,
393 $params['custom'] = CRM_Core_BAO_CustomField
::postProcess($params,
399 // 4. call end post process
400 if ($this->_activityTypeFile
) {
401 $className::endPostProcess($this, $params);
404 CRM_Core_Session
::setStatus($params['statusMsg'], ts('Saved'), 'success');