/** * @param $caseType * @param array $params * * @return bool * @throws Exception */ public function run($caseType, &$params) { $xml = $this->retrieve($caseType); if ($xml === FALSE) { $docLink = CRM_Utils_System::docURL2("user/case-management/setup"); CRM_Core_Error::fatal(ts("Configuration file could not be retrieved for case type = '%1' %2.", array(1 => $caseType, 2 => $docLink))); return FALSE; } $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process(); $this->_isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients(); $this->process($xml, $params); }
function run($caseType, &$params) { $xml = $this->retrieve($caseType); if ($xml === false) { require_once 'CRM/Utils/System.php'; $docLink = CRM_Utils_System::docURL2("CiviCase Configuration"); CRM_Core_Error::fatal(ts("Configuration file could not be retrieved for case type = '%1' %2.", array(1 => $caseType, 2 => $docLink))); return false; } require_once 'CRM/Case/XMLProcessor/Process.php'; $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process(); $this->_isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients(); $this->process($xml, $params); }
/** * Open a new case, add client and manager roles, and add standard timeline * * @param array( //REQUIRED: * 'case_type_id' => int OR * 'case_type' => str (provide one or the other) * 'contact_id' => int // case client * 'subject' => str * * //OPTIONAL * 'medium_id' => int // see civicrm option values for possibilities * 'creator_id' => int // case manager, default to the logged in user * 'status_id' => int // defaults to 1 "ongoing" * 'location' => str * 'start_date' => str datestamp // defaults to: date('YmdHis') * 'duration' => int // in minutes * 'details' => str // html format * * @return sucessfully opened case * * @access public * {@getfields case_create} */ function civicrm_api3_case_create($params) { if (!empty($params['id'])) { return civicrm_api3_case_update($params); } civicrm_api3_verify_mandatory($params, NULL, array('contact_id', 'subject', array('case_type', 'case_type_id'))); _civicrm_api3_case_format_params($params); // If format_params didn't find what it was looking for, return error if (empty($params['case_type_id'])) { return civicrm_api3_create_error('Invalid case_type. No such case type exists.'); } if (empty($params['case_type'])) { return civicrm_api3_create_error('Invalid case_type_id. No such case type exists.'); } // Fixme: can we safely pass raw params to the BAO? $newParams = array('case_type_id' => $params['case_type_id'], 'creator_id' => $params['creator_id'], 'status_id' => $params['status_id'], 'start_date' => $params['start_date'], 'end_date' => CRM_Utils_Array::value('end_date', $params), 'subject' => $params['subject']); $caseBAO = CRM_Case_BAO_Case::create($newParams); if (!$caseBAO) { return civicrm_api3_create_error('Case not created. Please check input params.'); } foreach ((array) $params['contact_id'] as $cid) { $contactParams = array('case_id' => $caseBAO->id, 'contact_id' => $cid); CRM_Case_BAO_Case::addCaseToContact($contactParams); } // Initialize XML processor with $params $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $params['contact_id'], 'creatorID' => $params['creator_id'], 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $caseBAO->id, 'subject' => $params['subject'], 'location' => CRM_Utils_Array::value('location', $params), 'activity_date_time' => $params['start_date'], 'duration' => CRM_Utils_Array::value('duration', $params), 'medium_id' => CRM_Utils_Array::value('medium_id', $params), 'details' => CRM_Utils_Array::value('details', $params), 'custom' => array()); // Do it! :-D $xmlProcessor->run($params['case_type'], $xmlProcessorParams); // return case $values = array(); _civicrm_api3_object_to_array($caseBAO, $values[$caseBAO->id]); return civicrm_api3_create_success($values, $params, 'case', 'create', $caseBAO); }
/** * Process the form * * @return void * @access public */ public function postProcess() { $params = $this->controller->exportValues($this->_name); $buttonName = $this->controller->getButtonName(); // user context $url = CRM_Utils_System::url('civicrm/contact/view/case', "reset=1&action=view&cid={$this->_contactID}&id={$this->_caseID}&show=1"); $session = CRM_Core_Session::singleton(); $session->pushUserContext($url); if (!empty($params['timeline_id']) && !empty($_POST['_qf_CaseView_next'])) { $session = CRM_Core_Session::singleton(); $this->_uid = $session->get('userID'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $this->_contactID, 'creatorID' => $this->_uid, 'standardTimeline' => 0, 'activity_date_time' => date('YmdHis'), 'caseID' => $this->_caseID, 'caseType' => $this->_caseType, 'activitySetName' => $params['timeline_id']); $xmlProcessor->run($this->_caseType, $xmlProcessorParams); $reports = $xmlProcessor->get($this->_caseType, 'ActivitySets'); CRM_Core_Session::setStatus(ts('Activities from the %1 activity set have been added to this case.', array(1 => $reports[$params['timeline_id']])), ts('Done'), 'success'); } elseif ($this->_mergeCases && $buttonName == '_qf_CaseView_next_merge_case') { $mainCaseId = $params['merge_case_id']; $otherCaseId = $this->_caseID; //merge two cases. CRM_Case_BAO_Case::mergeCases($this->_contactID, $mainCaseId, NULL, $otherCaseId); //redirect user to main case view. $url = CRM_Utils_System::url('civicrm/contact/view/case', "reset=1&action=view&cid={$this->_contactID}&id={$mainCaseId}&show=1"); $session = CRM_Core_Session::singleton(); $session->pushUserContext($url); } }
/** * Function to get case manger * contact which is assigned a case role of case manager. * * @param int $caseType case type * @param int $caseId case id * * @return array $caseManagerContact array of contact on success otherwise empty * * @static */ static function getCaseManagerContact($caseType, $caseId) { if (!$caseType || !$caseId) { return; } $caseManagerContact = array(); require_once 'CRM/Case/XMLProcessor/Process.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $managerRoleId = $xmlProcessor->getCaseManagerRoleId($caseType); if (!empty($managerRoleId)) { $managerRoleQuery = "\nSELECT civicrm_contact.id as casemanager_id, \n civicrm_contact.sort_name as casemanager\nFROM civicrm_contact \nLEFT JOIN civicrm_relationship ON (civicrm_relationship.contact_id_b = civicrm_contact.id AND civicrm_relationship.relationship_type_id = %1)\nLEFT JOIN civicrm_case ON civicrm_case.id = civicrm_relationship.case_id\nWHERE civicrm_case.id = %2"; $managerRoleParams = array(1 => array($managerRoleId, 'Integer'), 2 => array($caseId, 'Integer')); $dao = CRM_Core_DAO::executeQuery($managerRoleQuery, $managerRoleParams); if ($dao->fetch()) { $caseManagerContact['casemanager_id'] = $dao->casemanager_id; $caseManagerContact['casemanager'] = $dao->casemanager; } } return $caseManagerContact; }
/** * Function to process the form * * @access public * @return None */ public function endPostProcess(&$form, &$params, $activity) { if (CRM_Utils_Array::value('start_date', $params)) { $params['start_date'] = CRM_Utils_Date::processDate($params['start_date'], $params['start_date_time']); } $caseType = $form->_caseType; if (!$caseType && $form->_caseId) { $query = "\nSELECT cov_type.label as case_type FROM civicrm_case \nLEFT JOIN civicrm_option_group cog_type ON cog_type.name = 'case_type'\nLEFT JOIN civicrm_option_value cov_type ON \n( civicrm_case.case_type_id = cov_type.value AND cog_type.id = cov_type.option_group_id ) \nWHERE civicrm_case.id= %1"; $queryParams = array(1 => array($form->_caseId, 'Integer')); $caseType = CRM_Core_DAO::singleValueQuery($query, $queryParams); } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$form->_caseId || !$caseType) { CRM_Core_Error::fatal('Required parameter missing for ChangeCaseType - end post processing'); } $config =& CRM_Core_Config::singleton(); // 1. save activity subject with new start date $currentStartDate = CRM_Utils_Date::customFormat(CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $form->_caseId, 'start_date'), $config->dateformatFull); $newStartDate = CRM_Utils_Date::customFormat(CRM_Utils_Date::mysqlToIso($params['start_date']), $config->dateformatFull); $subject = 'Change Case Start Date from ' . $currentStartDate . ' to ' . $newStartDate; $activity->subject = $subject; $activity->save(); // 2. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 0, 'activity_date_time' => $params['start_date'], 'caseID' => $form->_caseId, 'caseType' => $caseType, 'activityTypeName' => 'Change Case Start Date', 'activitySetName' => 'standard_timeline', 'resetTimeline' => 1); $xmlProcessor->run($caseType, $xmlProcessorParams); // 2.5 Update open case activity date // Multiple steps since revisioned if ($form->openCaseActivityId) { require_once 'CRM/Activity/BAO/Activity.php'; $abao = new CRM_Activity_BAO_Activity(); $oldParams = array('id' => $form->openCaseActivityId); $oldActivityDefaults = array(); $oldActivity = $abao->retrieve($oldParams, $oldActivityDefaults); // save the old values require_once 'api/v2/utils.php'; $openCaseParams = array(); _civicrm_object_to_array($oldActivity, $openCaseParams); // update existing revision $oldParams = array('id' => $form->openCaseActivityId, 'is_current_revision' => 0); require_once 'CRM/Activity/DAO/Activity.php'; $oldActivity = new CRM_Activity_DAO_Activity(); $oldActivity->copyValues($oldParams); $oldActivity->save(); // change some params for the new one unset($openCaseParams['id']); $openCaseParams['activity_date_time'] = $params['start_date']; $openCaseParams['target_contact_id'] = $oldActivityDefaults['target_contact']; $openCaseParams['assignee_contact_id'] = $oldActivityDefaults['assignee_contact']; $session =& CRM_Core_Session::singleton(); $openCaseParams['source_contact_id'] = $session->get('userID'); // original_id always refers to the first activity, so only update if null (i.e. this is the second revision) $openCaseParams['original_id'] = $openCaseParams['original_id'] ? $openCaseParams['original_id'] : $form->openCaseActivityId; $newActivity = CRM_Activity_BAO_Activity::create($openCaseParams); if (is_a($newActivity, 'CRM_Core_Error')) { CRM_Core_Error::fatal('Unable to update Open Case activity'); } else { // Create linkage to case $caseActivityParams = array('activity_id' => $newActivity->id, 'case_id' => $form->_caseId); require_once "CRM/Case/BAO/Case.php"; CRM_Case_BAO_Case::processCaseActivity($caseActivityParams); } } // 3.status msg $params['statusMsg'] = ts('Case Start Date changed successfully.'); }
/** * Open a new case, add client and manager roles, and add standard timeline * * @param array( //REQUIRED: * 'case_type_id' => int OR 'case_type' => str (provide one or the other) * 'contact_id' => int // case client * 'creator_id' => int // case manager * 'subject' => str * 'medium_id' => int // see civicrm option values for possibilities * * //OPTIONAL * 'status_id' => int // defaults to 1 "ongoing" * 'location' => str * 'start_date' => str datestamp // defaults to: date('YmdHis') * 'duration' => int // in minutes * 'details' => str // html format * * @return sucessfully opened case * * @access public */ function civicrm_case_create(&$params) { _civicrm_initialize(); //check parameters $errors = _civicrm_case_check_params($params, 'create'); if ($errors) { return $errors; } _civicrm_case_format_params($params, 'create'); // If format_params didn't find what it was looking for, return error if (!$params['case_type_id']) { return civicrm_create_error(ts('Invalid case_type. No such case type exists.')); } if (!$params['case_type']) { return civicrm_create_error(ts('Invalid case_type_id. No such case type exists.')); } // format input with value separators $sep = CRM_Case_BAO_Case::VALUE_SEPERATOR; $newParams = array('case_type_id' => $sep . $params['case_type_id'] . $sep, 'creator_id' => $params['creator_id'], 'status_id' => $params['status_id'], 'start_date' => $params['start_date'], 'subject' => $params['subject']); $case =& CRM_Case_BAO_Case::create($newParams); if (!$case) { return civicrm_create_error(ts('Case not created. Please check your input params.')); } // Add client role $contactParams = array('case_id' => $case->id, 'contact_id' => $params['contact_id']); CRM_Case_BAO_Case::addCaseToContact($contactParams); // Initialize XML processor with $params require_once 'CRM/Case/XMLProcessor/Process.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $params['contact_id'], 'creatorID' => $params['creator_id'], 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $case->id, 'subject' => $params['subject'], 'location' => $params['location'], 'activity_date_time' => $params['start_date'], 'duration' => $params['duration'], 'medium_id' => $params['medium_id'], 'details' => $params['details'], 'custom' => array()); // Do it! :-D $xmlProcessor->run($params['case_type'], $xmlProcessorParams); // status msg $params['statusMsg'] = ts('Case opened successfully.'); // return case $details = _civicrm_case_read($case->id); return civicrm_create_success($details); }
/** * Process the form submission. * * * @param CRM_Core_Form $form * @param array $params * @param $activity */ public static function endPostProcess(&$form, &$params, $activity) { if (!empty($params['start_date'])) { $params['start_date'] = CRM_Utils_Date::processDate($params['start_date'], $params['start_date_time']); } $caseType = CRM_Utils_Array::first($form->_caseType); $caseId = CRM_Utils_Array::first($form->_caseId); if (!$caseType && $caseId) { $caseType = CRM_Case_BAO_Case::getCaseType($caseId, 'title'); } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$caseId || !$caseType) { CRM_Core_Error::fatal('Required parameter missing for ChangeCaseType - end post processing'); } $config = CRM_Core_Config::singleton(); $params['status_id'] = CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name'); $activity->status_id = $params['status_id']; $params['priority_id'] = CRM_Core_OptionGroup::getValue('priority', 'Normal', 'name'); $activity->priority_id = $params['priority_id']; // 1. save activity subject with new start date $currentStartDate = CRM_Utils_Date::customFormat(CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseId, 'start_date'), $config->dateformatFull); $newStartDate = CRM_Utils_Date::customFormat(CRM_Utils_Date::mysqlToIso($params['start_date']), $config->dateformatFull); $subject = 'Change Case Start Date from ' . $currentStartDate . ' to ' . $newStartDate; $activity->subject = $subject; $activity->save(); // 2. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 0, 'activity_date_time' => $params['start_date'], 'caseID' => $caseId, 'caseType' => $caseType, 'activityTypeName' => 'Change Case Start Date', 'activitySetName' => 'standard_timeline', 'resetTimeline' => 1); $xmlProcessor->run($caseType, $xmlProcessorParams); // 2.5 Update open case activity date // Multiple steps since revisioned if ($form->openCaseActivityId) { $abao = new CRM_Activity_BAO_Activity(); $oldParams = array('id' => $form->openCaseActivityId); $oldActivityDefaults = array(); $oldActivity = $abao->retrieve($oldParams, $oldActivityDefaults); // save the old values require_once 'api/v3/utils.php'; $openCaseParams = array(); //@todo calling api functions directly is not supported _civicrm_api3_object_to_array($oldActivity, $openCaseParams); // update existing revision $oldParams = array('id' => $form->openCaseActivityId, 'is_current_revision' => 0); $oldActivity = new CRM_Activity_DAO_Activity(); $oldActivity->copyValues($oldParams); $oldActivity->save(); // change some params for the new one unset($openCaseParams['id']); $openCaseParams['activity_date_time'] = $params['start_date']; $openCaseParams['target_contact_id'] = $oldActivityDefaults['target_contact']; $openCaseParams['assignee_contact_id'] = $oldActivityDefaults['assignee_contact']; $session = CRM_Core_Session::singleton(); $openCaseParams['source_contact_id'] = $session->get('userID'); // original_id always refers to the first activity, so only update if null (i.e. this is the second revision) $openCaseParams['original_id'] = $openCaseParams['original_id'] ? $openCaseParams['original_id'] : $form->openCaseActivityId; $newActivity = CRM_Activity_BAO_Activity::create($openCaseParams); if (is_a($newActivity, 'CRM_Core_Error')) { CRM_Core_Error::fatal('Unable to update Open Case activity'); } else { // Create linkage to case $caseActivityParams = array('activity_id' => $newActivity->id, 'case_id' => $caseId); CRM_Case_BAO_Case::processCaseActivity($caseActivityParams); $caseActivityParams = array('activityID' => $form->openCaseActivityId, 'mainActivityId' => $newActivity->id); CRM_Activity_BAO_Activity::copyExtendedActivityData($caseActivityParams); } } // 3.status msg $params['statusMsg'] = ts('Case Start Date changed successfully.'); }
public static function getCaseRoles() { $caseID = CRM_Utils_Type::escape($_GET['caseID'], 'Integer'); $contactID = CRM_Utils_Type::escape($_GET['cid'], 'Integer'); $params = CRM_Core_Page_AJAX::defaultSortAndPagerParams(); $caseRelationships = CRM_Case_BAO_Case::getCaseRoles($contactID, $caseID); $caseTypeName = CRM_Case_BAO_Case::getCaseType($caseID, 'name'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $caseRoles = $xmlProcessor->get($caseTypeName, 'CaseRoles'); $hasAccessToAllCases = CRM_Core_Permission::check('access all cases and activities'); $managerRoleId = $xmlProcessor->getCaseManagerRoleId($caseTypeName); foreach ($caseRelationships as $key => $value) { // This role has been filled unset($caseRoles[$value['relation_type']]); // mark original case relationships record to use on setting edit links below $caseRelationships[$key]['source'] = 'caseRel'; } $caseRoles['client'] = CRM_Case_BAO_Case::getContactNames($caseID); // move/transform caseRoles array data to caseRelationships // for sorting and display // CRM-14466 added cid to the non-client array to avoid php notice foreach ($caseRoles as $id => $value) { if ($id != "client") { $rel = array(); $rel['relation'] = $value; $rel['relation_type'] = $id; $rel['name'] = '(not assigned)'; $rel['phone'] = ''; $rel['email'] = ''; $rel['source'] = 'caseRoles'; $caseRelationships[] = $rel; } else { foreach ($value as $clientRole) { $relClient = array(); $relClient['relation'] = 'Client'; $relClient['name'] = $clientRole['sort_name']; $relClient['phone'] = $clientRole['phone']; $relClient['email'] = $clientRole['email']; $relClient['cid'] = $clientRole['contact_id']; $relClient['source'] = 'contact'; $caseRelationships[] = $relClient; } } } // sort clientRelationships array using jquery call params foreach ($caseRelationships as $key => $row) { $sortArray[$key] = $row[$params['_raw_values']['sort'][0]]; } $sort_type = "SORT_" . strtoupper($params['_raw_values']['order'][0]); array_multisort($sortArray, constant($sort_type), $caseRelationships); $relationships = array(); // set user name, email and edit columns links foreach ($caseRelationships as $key => &$row) { $typeLabel = $row['relation']; // Add "<br />(Case Manager)" to label if ($row['relation_type'] == $managerRoleId) { $row['relation'] .= '<br />' . '(' . ts('Case Manager') . ')'; } // view user links if (!empty($row['cid'])) { $row['name'] = '<a class="view-contact" title="' . ts('View Contact') . '" href=' . CRM_Utils_System::url('civicrm/contact/view', 'action=view&reset=1&cid=' . $row['cid']) . '>' . $row['name'] . '</a>'; } // email column links/icon if ($row['email']) { $row['email'] = '<a class="crm-hover-button crm-popup" href="' . CRM_Utils_System::url('civicrm/activity/email/add', 'reset=1&action=add&atype=3&cid=' . $row['cid']) . '&caseid=' . $caseID . '" title="' . ts('Send an Email') . '"><i class="crm-i fa-envelope"></i></a>'; } // edit links $row['actions'] = ''; if ($hasAccessToAllCases) { $contactType = empty($row['relation_type']) ? '' : (string) CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', $row['relation_type'], 'contact_type_b'); $contactType = $contactType == 'Contact' ? '' : $contactType; switch ($row['source']) { case 'caseRel': $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Reassign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '_' . $row['relationship_direction'] . '" data-cid="' . $row['cid'] . '" data-rel_id="' . $row['rel_id'] . '"data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' . '<i class="crm-i fa-pencil"></i>' . '</a>' . '<a href="#deleteCaseRoleDialog" title="' . ts('Remove %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '_' . $row['relationship_direction'] . '" data-cid="' . $row['cid'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/delcaserole') . '">' . '<span class="icon delete-icon"></span>' . '</a>'; break; case 'caseRoles': $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Assign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '_b_a" data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' . '<i class="crm-i fa-pencil"></i>' . '</a>'; break; } } unset($row['cid']); unset($row['relation_type']); unset($row['rel_id']); unset($row['client_id']); unset($row['source']); array_push($relationships, $row); } $params['total'] = count($relationships); $caseRelationshipsDT = array(); $caseRelationshipsDT['data'] = $relationships; $caseRelationshipsDT['recordsTotal'] = $params['total']; $caseRelationshipsDT['recordsFiltered'] = $params['total']; CRM_Utils_JSON::output($caseRelationshipsDT); }
public static function getCaseRoles() { $caseID = CRM_Utils_Type::escape($_GET['caseID'], 'Integer'); $contactID = CRM_Utils_Type::escape($_GET['cid'], 'Integer'); $sortMapper = array(0 => 'relation', 1 => 'name', 2 => 'phone', 3 => 'email', 4 => 'actions'); $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer'); $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0; $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25; $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : 'relation'; $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc'; $params = $_POST; if ($sort && $sortOrder) { $sortSQL = $sort . ' ' . $sortOrder; } $caseRelationships = CRM_Case_BAO_Case::getCaseRoles($contactID, $caseID); $caseTypeName = CRM_Case_BAO_Case::getCaseType($caseID, 'name'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $caseRoles = $xmlProcessor->get($caseTypeName, 'CaseRoles'); $hasAccessToAllCases = CRM_Core_Permission::check('access all cases and activities'); $managerRoleId = $xmlProcessor->getCaseManagerRoleId($caseTypeName); if (!empty($managerRoleId)) { $caseRoles[$managerRoleId] = $caseRoles[$managerRoleId] . '<br />' . '(' . ts('Case Manager') . ')'; } foreach ($caseRelationships as $key => $value) { //calculate roles that don't have relationships if (!empty($caseRoles[$value['relation_type']])) { //keep naming from careRoles array $caseRelationships[$key]['relation'] = $caseRoles[$value['relation_type']]; unset($caseRoles[$value['relation_type']]); } // mark orginal case relationships record to use on setting edit links below $caseRelationships[$key]['source'] = 'caseRel'; } $caseRoles['client'] = CRM_Case_BAO_Case::getContactNames($caseID); // move/transform caseRoles array data to caseRelationships // for sorting and display // CRM-14466 added cid to the non-client array to avoid php notice foreach ($caseRoles as $id => $value) { if ($id != "client") { $rel = array(); $rel['relation'] = $value; $rel['relation_type'] = $id; $rel['name'] = '(not assigned)'; $rel['phone'] = ''; $rel['email'] = ''; $rel['source'] = 'caseRoles'; $caseRelationships[] = $rel; } else { foreach ($value as $clientRole) { $relClient = array(); $relClient['relation'] = 'Client'; $relClient['name'] = $clientRole['sort_name']; $relClient['phone'] = $clientRole['phone']; $relClient['email'] = $clientRole['email']; $relClient['cid'] = $clientRole['contact_id']; $relClient['source'] = 'contact'; $caseRelationships[] = $relClient; } } } // sort clientRelationships array using jquery call params foreach ($caseRelationships as $key => $row) { $sortArray[$key] = $row[$sort]; } $sort_type = "SORT_" . strtoupper($sortOrder); array_multisort($sortArray, constant($sort_type), $caseRelationships); //limit rows display $allCaseRelationships = $caseRelationships; $caseRelationships = array_slice($allCaseRelationships, $offset, $rowCount, TRUE); // set user name, email and edit columns links // idx will count number of current row / needed by edit links $idx = 1; foreach ($caseRelationships as &$row) { // Get rid of the "<br />(Case Manager)" from label list($typeLabel) = explode('<', $row['relation']); // view user links if (!empty($row['cid'])) { $row['name'] = '<a class="view-contact" title="' . ts('View Contact') . '" href=' . CRM_Utils_System::url('civicrm/contact/view', 'action=view&reset=1&cid=' . $row['cid']) . '>' . $row['name'] . '</a>'; } // email column links/icon if ($row['email']) { $row['email'] = '<a class="crm-hover-button crm-popup" href="' . CRM_Utils_System::url('civicrm/activity/email/add', 'reset=1&action=add&atype=3&cid=' . $row['cid']) . '&caseid=' . $caseID . '" title="' . ts('Send an Email') . '"><span class="icon ui-icon-mail-closed"></span></a>'; } // edit links $row['actions'] = ''; if ($hasAccessToAllCases) { $contactType = empty($row['relation_type']) ? '' : (string) CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', $row['relation_type'], 'contact_type_b'); $contactType = $contactType == 'Contact' ? '' : $contactType; switch ($row['source']) { case 'caseRel': $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Reassign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-rel_id="' . $row['rel_id'] . '"data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' . '<span class="icon ui-icon-pencil"></span>' . '</a>' . '<a href="#deleteCaseRoleDialog" title="' . ts('Remove %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/delcaserole') . '">' . '<span class="icon delete-icon"></span>' . '</a>'; break; case 'caseRoles': $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Assign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' . '<span class="icon ui-icon-pencil"></span>' . '</a>'; break; } } $idx++; } $iFilteredTotal = $iTotal = $params['total'] = count($allCaseRelationships); $selectorElements = array('relation', 'name', 'phone', 'email', 'actions'); header('Content-Type: application/json'); echo CRM_Utils_JSON::encodeDataTableSelector($caseRelationships, $sEcho, $iTotal, $iFilteredTotal, $selectorElements); CRM_Utils_System::civiExit(); }
/** * Find any extra listeners declared in XML and pass the event along to them. * * @param \Civi\CCase\Event\CaseChangeEvent $event */ public static function delegateToXmlListeners(\Civi\CCase\Event\CaseChangeEvent $event) { $p = new \CRM_Case_XMLProcessor_Process(); $listeners = $p->getListeners($event->analyzer->getCaseType()); foreach ($listeners as $listener) { /** @var $listener \Civi\CCase\CaseChangeListener */ $listener->onCaseChange($event); } }
/** * Process the form * * @return void * @access public */ public function postProcess() { $params = $this->controller->exportValues($this->_name); // user context $url = CRM_Utils_System::url('civicrm/contact/view/case', "reset=1&action=view&cid={$this->_contactID}&id={$this->_caseID}&show=1"); $session =& CRM_Core_Session::singleton(); $session->pushUserContext($url); if (CRM_Utils_Array::value('timeline_id', $params) && CRM_Utils_Array::value('_qf_CaseView_next', $_POST)) { $session =& CRM_Core_Session::singleton(); $this->_uid = $session->get('userID'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $this->_contactID, 'creatorID' => $this->_uid, 'standardTimeline' => 0, 'activity_date_time' => date('YmdHis'), 'caseID' => $this->_caseID, 'caseType' => $this->_caseType, 'activitySetName' => $params['timeline_id']); $xmlProcessor->run($this->_caseType, $xmlProcessorParams); $reports = $xmlProcessor->get($this->_caseType, 'ActivitySets'); CRM_Core_Session::setStatus(ts('Activities from the %1 activity set have been added to this case.', array(1 => $reports[$params['timeline_id']]))); } }
static function getCaseRoles() { $caseID = CRM_Utils_Type::escape($_GET['caseID'], 'Integer'); $contactID = CRM_Utils_Type::escape($_GET['cid'], 'Integer'); $sortMapper = array(0 => 'relation', 1 => 'name', 2 => 'phone', 3 => 'email', 4 => 'actions'); $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer'); $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0; $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25; $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : 'relation'; $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc'; $params = $_POST; if ($sort && $sortOrder) { $sortSQL = $sort . ' ' . $sortOrder; } $caseRelationships = CRM_Case_BAO_Case::getCaseRoles($contactID, $caseID); $caseTypeName = CRM_Case_BAO_Case::getCaseType($caseID, 'name'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $caseRoles = $xmlProcessor->get($caseTypeName, 'CaseRoles'); $hasAccessToAllCases = CRM_Core_Permission::check('access all cases and activities'); $managerRoleId = $xmlProcessor->getCaseManagerRoleId($caseTypeName); if (!empty($managerRoleId)) { $caseRoles[$managerRoleId] = $caseRoles[$managerRoleId] . '<br />' . '(' . ts('Case Manager') . ')'; } foreach ($caseRelationships as $key => $value) { //calculate roles that don't have relationships if (CRM_Utils_Array::value($value['relation_type'], $caseRoles)) { //keep naming from careRoles array $caseRelationships[$key]['relation'] = $caseRoles[$value['relation_type']]; unset($caseRoles[$value['relation_type']]); } // mark orginal case relationships record to use on setting edit links below $caseRelationships[$key]['source'] = 'caseRel'; } $caseRoles['client'] = CRM_Case_BAO_Case::getContactNames($caseID); // move/transform caseRoles array data to caseRelationships // for sorting and display foreach ($caseRoles as $id => $value) { if ($id != "client") { $rel = array(); $rel['relation'] = $value; $rel['relation_type'] = $id; $rel['name'] = '(not assigned)'; $rel['phone'] = ''; $rel['email'] = ''; $rel['source'] = 'caseRoles'; $caseRelationships[] = $rel; } else { foreach ($value as $clientRole) { $relClient = array(); $relClient['relation'] = 'Client'; $relClient['name'] = $clientRole['sort_name']; $relClient['phone'] = $clientRole['phone']; $relClient['email'] = $clientRole['email']; $relClient['cid'] = $clientRole['contact_id']; $relClient['source'] = 'contact'; $caseRelationships[] = $relClient; } } } // sort clientRelationships array using jquery call params foreach ($caseRelationships as $key => $row) { $sortArray[$key] = $row[$sort]; } $sort_type = "SORT_" . strtoupper($sortOrder); array_multisort($sortArray, constant($sort_type), $caseRelationships); //limit rows display $allCaseRelationships = $caseRelationships; $caseRelationships = array_slice($allCaseRelationships, $offset, $rowCount, TRUE); // set user name, email and edit columns links // idx will count number of current row / needed by edit links $idx = 1; foreach ($caseRelationships as $key => $row) { // view user links if ($caseRelationships[$key]['cid']) { $caseRelationships[$key]['name'] = '<a href=' . CRM_Utils_System::url('civicrm/contact/view', 'action=view&reset=1&cid=' . $caseRelationships[$key]['cid']) . '>' . $caseRelationships[$key]['name'] . '</a>'; } // email column links/icon if ($caseRelationships[$key]['email']) { $caseRelationships[$key]['email'] = '<a href="' . CRM_Utils_System::url('civicrm/contact/view/activity', 'action=reset=1&action=add&atype=3&cid=' . $caseRelationships[$key]['cid']) . '&caseid=' . $caseID . '" title="compose and send an email"><div class="icon email-icon" title="compose and send an email"></div> </a>'; } // edit links if ($hasAccessToAllCases) { switch ($caseRelationships[$key]['source']) { case 'caseRel': $caseRelationships[$key]['actions'] = '<a href="#" title="edit case role" onclick="createRelationship( ' . $caseRelationships[$key]['relation_type'] . ', ' . $caseRelationships[$key]['cid'] . ', ' . $caseRelationships[$key]['rel_id'] . ', ' . $idx . ', \'' . $caseRelationships[$key]['relation'] . '\' );return false;"><div class="icon edit-icon" ></div></a> <a href="#" class="case-role-delete" case_id="' . $caseID . '" rel_type="' . $caseRelationships[$key]['relation_type'] . '"><div class="icon delete-icon" title="remove contact from case role"></div></a>'; break; case 'caseRoles': $caseRelationships[$key]['actions'] = '<a href="#" title="edit case role" onclick="createRelationship(' . $caseRelationships[$key]['relation_type'] . ', null, null, ' . $idx . ', \'' . $caseRelationships[$key]['relation'] . '\');return false;"><div class="icon edit-icon"></div></a>'; break; } } else { $caseRelationships[$key]['actions'] = ''; } $idx++; } $iFilteredTotal = $iTotal = $params['total'] = count($allCaseRelationships); $selectorElements = array('relation', 'name', 'phone', 'email', 'actions'); echo CRM_Utils_JSON::encodeDataTableSelector($caseRelationships, $sEcho, $iTotal, $iFilteredTotal, $selectorElements); CRM_Utils_System::civiExit(); }
/** * Open a new case, add client and manager roles, and add standard timeline * * @param array( //REQUIRED: * 'case_type_id' => int OR * 'case_type' => str (provide one or the other) * 'contact_id' => int // case client * 'subject' => str * * //OPTIONAL * 'medium_id' => int // see civicrm option values for possibilities * 'creator_id' => int // case manager, default to the logged in user * 'status_id' => int // defaults to 1 "ongoing" * 'location' => str * 'start_date' => str datestamp // defaults to: date('YmdHis') * 'duration' => int // in minutes * 'details' => str // html format * * @return sucessfully opened case * * @access public * {@getfields case_create} */ function civicrm_api3_case_create($params) { if (empty($params['contact_id']) && isset($params['client_id'])) { $params['contact_id'] = $params['client_id']; } if (isset($params['id']) || isset($params['case_id'])) { return _api_case_update($params); } // ongoing if (!CRM_Utils_Array::value('status_id', $params)) { $params['status_id'] = 1; } if (!array_key_exists('creator_id', $params)) { $session = CRM_Core_Session::singleton(); $params['creator_id'] = $session->get('userID'); } //check parameters $errors = _civicrm_api3_case_check_params($params, 'create'); if ($errors) { return $errors; } _civicrm_api3_case_format_params($params, 'create'); // If format_params didn't find what it was looking for, return error if (empty($params['case_type_id'])) { return civicrm_api3_create_error('Invalid case_type. No such case type exists.'); } if (empty($params['case_type'])) { return civicrm_api3_create_error('Invalid case_type_id. No such case type exists.'); } // format input with value separators $sep = CRM_Core_DAO::VALUE_SEPARATOR; $newParams = array('case_type_id' => $sep . $params['case_type_id'] . $sep, 'creator_id' => $params['creator_id'], 'status_id' => $params['status_id'], 'start_date' => $params['start_date'], 'subject' => $params['subject']); $caseBAO = CRM_Case_BAO_Case::create($newParams); if (!$caseBAO) { return civicrm_api3_create_error('Case not created. Please check input params.'); } foreach ((array) $params['contact_id'] as $cid) { $contactParams = array('case_id' => $caseBAO->id, 'contact_id' => $cid); CRM_Case_BAO_Case::addCaseToContact($contactParams); } // Initialize XML processor with $params require_once 'CRM/Case/XMLProcessor/Process.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $params['contact_id'], 'creatorID' => $params['creator_id'], 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $caseBAO->id, 'subject' => $params['subject'], 'location' => CRM_Utils_Array::value('location', $params), 'activity_date_time' => $params['start_date'], 'duration' => CRM_Utils_Array::value('duration', $params), 'medium_id' => CRM_Utils_Array::value('medium_id', $params), 'details' => CRM_Utils_Array::value('details', $params), 'custom' => array()); // Do it! :-D $xmlProcessor->run($params['case_type'], $xmlProcessorParams); // return case $values = array(); _civicrm_api3_object_to_array($caseBAO, $values[$caseBAO->id]); return civicrm_api3_create_success($values, $params, 'case', 'create', $caseBAO); }
/** * Function to process the form * * @access public * @return None */ public function endPostProcess(&$form, &$params) { if ($form->_context == 'caseActivity') { return; } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$params['case_id'] || !$params['case_type']) { CRM_Core_Error::fatal('Required parameter missing for OpenCase - end post processing'); } // 1. create case-contact $contactParams = array('case_id' => $params['case_id'], 'contact_id' => $form->_currentlyViewedContactId); CRM_Case_BAO_Case::addCaseToContact($contactParams); // 2. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $params['case_id'], 'subject' => $params['activity_subject'], 'location' => $params['location'], 'activity_date_time' => $params['start_date'], 'duration' => $params['duration'], 'medium_id' => $params['medium_id'], 'details' => $params['activity_details']); if (array_key_exists('custom', $params) && is_array($params['custom'])) { $xmlProcessorParams['custom'] = $params['custom']; } $xmlProcessor->run($params['case_type'], $xmlProcessorParams); // status msg $params['statusMsg'] = ts('Case opened successfully.'); $buttonName = $this->controller->getButtonName(); $session =& CRM_Core_Session::singleton(); if ($buttonName == $this->getButtonName('upload', 'new')) { if ($this->_context == 'standalone') { $session->replaceUserContext(CRM_Utils_System::url('civicrm/case/add', 'reset=1&action=add&context=standalone')); } else { $session->replaceUserContext(CRM_Utils_System::url('civicrm/contact/view/case', "reset=1&action=add&context=case&cid={$form->_contactID}")); } } }
public function buildQuickForm() { $this->_fields['source_contact_id']['label'] = ts('Reported By'); $this->_fields['status_id']['attributes'] = array('' => ts('- select -')) + CRM_Core_PseudoConstant::activityStatus(); if ($this->_caseType) { $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $aTypes = $xmlProcessor->get($this->_caseType, 'ActivityTypes', TRUE); // remove Open Case activity type since we're inside an existing case $openCaseID = CRM_Core_OptionGroup::getValue('activity_type', 'Open Case', 'name'); unset($aTypes[$openCaseID]); asort($aTypes); $this->_fields['followup_activity_type_id']['attributes'] = array('' => '- select activity type -') + $aTypes; } $result = parent::buildQuickForm(); if ($this->_action & (CRM_Core_Action::DELETE | CRM_Core_Action::DETACH | CRM_Core_Action::RENEW)) { return; } if ($this->_cdType) { return $result; } $this->assign('urlPath', 'civicrm/case/activity'); $encounterMediums = CRM_Case_PseudoConstant::encounterMedium(); if ($this->_activityTypeFile == 'OpenCase') { $this->_encounterMedium = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $this->_activityId, 'medium_id'); if (!array_key_exists($this->_encounterMedium, $encounterMediums)) { $encounterMediums[$this->_encounterMedium] = CRM_Core_OptionGroup::getLabel('encounter_medium', $this->_encounterMedium, FALSE); } } $this->add('select', 'medium_id', ts('Medium'), $encounterMediums, TRUE); $this->_relatedContacts = CRM_Case_BAO_Case::getRelatedAndGlobalContacts($this->_caseId); //add case client in send a copy selector.CRM-4438. $relatedContacts = CRM_Case_BAO_Case::getContactNames($this->_caseId); if (!empty($relatedContacts)) { foreach ($relatedContacts as $relatedContact) { $this->_relatedContacts[] = $relatedContact; } } if (!empty($this->_relatedContacts)) { $checkBoxes = array(); foreach ($this->_relatedContacts as $id => $row) { $checkBoxes[$id] = $this->addElement('checkbox', $id, NULL, ''); } $this->addGroup($checkBoxes, 'contact_check'); $this->addElement('checkbox', 'toggleSelect', NULL, NULL, array('onclick' => "return toggleCheckboxVals('contact_check',this);")); $this->assign('searchRows', $this->_relatedContacts); } $this->addFormRule(array('CRM_Case_Form_Activity', 'formRule'), $this); }
/** * Function to process the form * * @access public * * @return None */ static function endPostProcess(&$form, &$params) { if ($form->_context == 'caseActivity') { return; } $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process(); $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients(); if (!$isMultiClient && !$form->_currentlyViewedContactId) { CRM_Core_Error::fatal('Required parameter missing for OpenCase - end post processing'); } if (!$form->_currentUserId || !$params['case_id'] || !$params['case_type']) { CRM_Core_Error::fatal('Required parameter missing for OpenCase - end post processing'); } // 1. create case-contact if ($isMultiClient && $form->_context != 'case') { $client = explode(',', $params['contact'][1]); foreach ($client as $key => $cliId) { if (empty($cliId)) { CRM_Core_Error::fatal('contact_id cannot be empty'); } $contactParams = array('case_id' => $params['case_id'], 'contact_id' => $cliId); CRM_Case_BAO_Case::addCaseToContact($contactParams); } } else { $contactParams = array('case_id' => $params['case_id'], 'contact_id' => $form->_currentlyViewedContactId); CRM_Case_BAO_Case::addCaseToContact($contactParams); $client = $form->_currentlyViewedContactId; } // 2. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $client, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $params['case_id'], 'subject' => $params['activity_subject'], 'location' => $params['location'], 'activity_date_time' => $params['start_date'], 'duration' => CRM_Utils_Array::value('duration', $params), 'medium_id' => $params['medium_id'], 'details' => $params['activity_details']); if (array_key_exists('custom', $params) && is_array($params['custom'])) { $xmlProcessorParams['custom'] = $params['custom']; } // Add parameters for attachments $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments'); for ($i = 1; $i <= $numAttachments; $i++) { $attachName = "attachFile_{$i}"; if (isset($params[$attachName]) && !empty($params[$attachName])) { $xmlProcessorParams[$attachName] = $params[$attachName]; } } $xmlProcessor->run($params['case_type'], $xmlProcessorParams); // status msg $params['statusMsg'] = ts('Case opened successfully.'); $buttonName = $form->controller->getButtonName(); $session = CRM_Core_Session::singleton(); if ($buttonName == $form->getButtonName('upload', 'new')) { if ($form->_context == 'standalone') { $session->replaceUserContext(CRM_Utils_System::url('civicrm/case/add', 'reset=1&action=add&context=standalone')); } else { $session->replaceUserContext(CRM_Utils_System::url('civicrm/contact/view/case', "reset=1&action=add&context=case&cid={$form->_contactID}")); } } }
/** * Function to process the form * * @access public * * @return None */ public function postProcess() { $tx = new CRM_Core_Transaction(); if ($this->_action & CRM_Core_Action::DELETE) { $statusMsg = NULL; //block deleting activities which affects //case attributes.CRM-4543 $activityCondition = " AND v.name IN ('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date')"; $caseAttributeActivities = CRM_Core_OptionGroup::values('activity_type', FALSE, FALSE, FALSE, $activityCondition); if (!array_key_exists($this->_activityTypeId, $caseAttributeActivities)) { $params = array('id' => $this->_activityId); $activityDelete = CRM_Activity_BAO_Activity::deleteActivity($params, TRUE); if ($activityDelete) { $statusMsg = ts('The selected activity has been moved to the Trash. You can view and / or restore deleted activities by checking "Deleted Activities" from the Case Activities search filter (under Manage Case).<br />'); } } else { $statusMsg = ts("Selected Activity cannot be deleted."); } $tagParams = array('entity_table' => 'civicrm_activity', 'entity_id' => $this->_activityId); CRM_Core_BAO_EntityTag::del($tagParams); CRM_Core_Session::setStatus($statusMsg); return; } if ($this->_action & CRM_Core_Action::RENEW) { $statusMsg = NULL; $params = array('id' => $this->_activityId); $activityRestore = CRM_Activity_BAO_Activity::restoreActivity($params); if ($activityRestore) { $statusMsg = ts('The selected activity has been restored.<br />'); } CRM_Core_Session::setStatus($statusMsg); return; } // store the submitted values in an array $params = $this->controller->exportValues($this->_name); if ($params['source_contact_id']) { $params['source_contact_id'] = $params['source_contact_qid']; } //set parent id if its edit mode if ($parentId = CRM_Utils_Array::value('parent_id', $this->_defaults)) { $params['parent_id'] = $parentId; } // required for status msg $recordStatus = 'created'; // store the dates with proper format $params['activity_date_time'] = CRM_Utils_Date::processDate($params['activity_date_time'], $params['activity_date_time_time']); $params['activity_type_id'] = $this->_activityTypeId; $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process(); $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients(); $this->assign('multiClient', $isMultiClient); $targetContacts = array($this->_currentlyViewedContactId); if (CRM_Utils_Array::value('hidden_target_contact', $params) && CRM_Utils_Array::value('target_contact_id', $params)) { $targetContacts = array_unique(explode(',', $params['target_contact_id'])); } $params['target_contact_id'] = $targetContacts; // format activity custom data if (CRM_Utils_Array::value('hidden_custom', $params)) { if ($this->_activityId) { // unset custom fields-id from params since we want custom // fields to be saved for new activity. foreach ($params as $key => $value) { $match = array(); if (preg_match('/^(custom_\\d+_)(\\d+)$/', $key, $match)) { $params[$match[1] . '-1'] = $params[$key]; // for autocomplete transfer hidden value instead of label if ($params[$key] && isset($params[$key . '_id'])) { $params[$match[1] . '-1_id'] = $params[$key . '_id']; unset($params[$key . '_id']); } unset($params[$key]); } } } // build custom data getFields array $customFields = CRM_Core_BAO_CustomField::getFields('Activity', FALSE, FALSE, $this->_activityTypeId); $customFields = CRM_Utils_Array::crmArrayMerge($customFields, CRM_Core_BAO_CustomField::getFields('Activity', FALSE, FALSE, NULL, NULL, TRUE)); $params['custom'] = CRM_Core_BAO_CustomField::postProcess($params, $customFields, $this->_activityId, 'Activity'); } if (CRM_Utils_Array::value('assignee_contact_id', $params)) { $assineeContacts = explode(',', $params['assignee_contact_id']); $assineeContacts = array_unique($assineeContacts); unset($params['assignee_contact_id']); } else { $params['assignee_contact_id'] = $assineeContacts = array(); } if (isset($this->_activityId)) { // activity which hasn't been modified by a user yet if ($this->_defaults['is_auto'] == 1) { $params['is_auto'] = 0; } // always create a revision of an case activity. CRM-4533 $newActParams = $params; // add target contact values in update mode if (empty($params['target_contact_id']) && !empty($this->_defaults['target_contact'])) { $newActParams['target_contact_id'] = $this->_defaults['target_contact']; } // record status for status msg $recordStatus = 'updated'; } if (!isset($newActParams)) { // add more attachments if needed for old activity CRM_Core_BAO_File::formatAttachment($params, $params, 'civicrm_activity'); // call begin post process, before the activity is created/updated. $this->beginPostProcess($params); $params['case_id'] = $this->_caseId; // activity create/update $activity = CRM_Activity_BAO_Activity::create($params); // call end post process, after the activity has been created/updated. $this->endPostProcess($params, $activity); } else { // since the params we need to set are very few, and we don't want rest of the // work done by bao create method , lets use dao object to make the changes $params = array('id' => $this->_activityId); $params['is_current_revision'] = 0; $activity = new CRM_Activity_DAO_Activity(); $activity->copyValues($params); $activity->save(); } // create a new version of activity if activity was found to // have been modified/created by user if (isset($newActParams)) { // set proper original_id if (CRM_Utils_Array::value('original_id', $this->_defaults)) { $newActParams['original_id'] = $this->_defaults['original_id']; } else { $newActParams['original_id'] = $activity->id; } //is_current_revision will be set to 1 by default. // add attachments if any CRM_Core_BAO_File::formatAttachment($newActParams, $newActParams, 'civicrm_activity'); // call begin post process, before the activity is created/updated. $this->beginPostProcess($newActParams); $newActParams['case_id'] = $this->_caseId; $activity = CRM_Activity_BAO_Activity::create($newActParams); // call end post process, after the activity has been created/updated. $this->endPostProcess($newActParams, $activity); // copy files attached to old activity if any, to new one, // as long as users have not selected the 'delete attachment' option. if (!CRM_Utils_Array::value('is_delete_attachment', $newActParams)) { CRM_Core_BAO_File::copyEntityFile('civicrm_activity', $this->_activityId, 'civicrm_activity', $activity->id); } // copy back params to original var $params = $newActParams; } if ($activity->id) { // add tags if exists $tagParams = array(); if (!empty($params['tag'])) { foreach ($params['tag'] as $tag) { $tagParams[$tag] = 1; } } //save static tags CRM_Core_BAO_EntityTag::create($tagParams, 'civicrm_activity', $activity->id); //save free tags if (isset($params['taglist']) && !empty($params['taglist'])) { CRM_Core_Form_Tag::postProcess($params['taglist'], $activity->id, 'civicrm_activity', $this); } } $params['assignee_contact_id'] = $assineeContacts; // update existing case record if needed $caseParams = $params; $caseParams['id'] = $this->_caseId; if (CRM_Utils_Array::value('case_type_id', $caseParams)) { $caseParams['case_type_id'] = CRM_Core_DAO::VALUE_SEPARATOR . $caseParams['case_type_id'] . CRM_Core_DAO::VALUE_SEPARATOR; } if (CRM_Utils_Array::value('case_status_id', $caseParams)) { $caseParams['status_id'] = $caseParams['case_status_id']; } // unset params intended for activities only unset($caseParams['subject'], $caseParams['details'], $caseParams['status_id'], $caseParams['custom']); $case = CRM_Case_BAO_Case::create($caseParams); // create case activity record $caseParams = array('activity_id' => $activity->id, 'case_id' => $this->_caseId); CRM_Case_BAO_Case::processCaseActivity($caseParams); // create activity assignee records $assigneeParams = array('activity_id' => $activity->id); if (!CRM_Utils_Array::crmIsEmptyArray($params['assignee_contact_id'])) { //skip those assignee contacts which are already assigned //while sending a copy.CRM-4509. $activityAssigned = array_flip($params['assignee_contact_id']); $activityId = isset($this->_activityId) ? $this->_activityId : $activity->id; $assigneeContacts = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activityId); $activityAssigned = array_diff_key($activityAssigned, $assigneeContacts); foreach ($params['assignee_contact_id'] as $key => $id) { $assigneeParams['assignee_contact_id'] = $id; CRM_Activity_BAO_Activity::createActivityAssignment($assigneeParams); } //modify assigne_contact as per newly assigned contact before sending copy. CRM-4509. $params['assignee_contact_id'] = $activityAssigned; } // Insert civicrm_log record for the activity (e.g. store the // created / edited by contact id and date for the activity) // Note - civicrm_log is already created by CRM_Activity_BAO_Activity::create() // send copy to selected contacts. $mailStatus = ''; $mailToContacts = array(); //CRM-5695 //check for notification settings for assignee contacts $selectedContacts = array('contact_check'); if (CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'activity_assignee_notification')) { $selectedContacts[] = 'assignee_contact_id'; } foreach ($selectedContacts as $dnt => $val) { if (array_key_exists($val, $params) && !CRM_Utils_array::crmIsEmptyArray($params[$val])) { if ($val == 'contact_check') { $mailStatus = ts("A copy of the activity has also been sent to selected contacts(s)."); } else { $this->_relatedContacts = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id, TRUE, FALSE); $mailStatus .= ' ' . ts("A copy of the activity has also been sent to assignee contacts(s)."); } //build an associative array with unique email addresses. foreach ($params[$val] as $id => $dnc) { if (isset($id) && array_key_exists($id, $this->_relatedContacts)) { //if email already exists in array then append with ', ' another role only otherwise add it to array. if ($contactDetails = CRM_Utils_Array::value($this->_relatedContacts[$id]['email'], $mailToContacts)) { $caseRole = CRM_Utils_Array::value('role', $this->_relatedContacts[$id]); $mailToContacts[$this->_relatedContacts[$id]['email']]['role'] = $contactDetails['role'] . ', ' . $caseRole; } else { $mailToContacts[$this->_relatedContacts[$id]['email']] = $this->_relatedContacts[$id]; } } } } } if (!CRM_Utils_array::crmIsEmptyArray($mailToContacts)) { //include attachments while sendig a copy of activity. $attachments =& CRM_Core_BAO_File::getEntityFile('civicrm_activity', $activity->id); $result = CRM_Case_BAO_Case::sendActivityCopy($this->_currentlyViewedContactId, $activity->id, $mailToContacts, $attachments, $this->_caseId); if (empty($result)) { $mailStatus = ''; } } else { $mailStatus = ''; } // create follow up activity if needed $followupStatus = ''; if (CRM_Utils_Array::value('followup_activity_type_id', $params)) { $followupActivity = CRM_Activity_BAO_Activity::createFollowupActivity($activity->id, $params); if ($followupActivity) { $caseParams = array('activity_id' => $followupActivity->id, 'case_id' => $this->_caseId); CRM_Case_BAO_Case::processCaseActivity($caseParams); $followupStatus = ts("A followup activity has been scheduled."); } } CRM_Core_Session::setStatus(ts("'%1' activity has been %2. %3 %4", array(1 => $this->_activityTypeName, 2 => $recordStatus, 3 => $followupStatus, 4 => $mailStatus))); }
/** * Function to process the form * * @access public * @return None */ public function endPostProcess(&$form, &$params) { if (!$form->_caseId) { // always expecting a change, so case-id is a must. return; } $caseTypes = CRM_Case_PseudoConstant::caseType('name'); if (CRM_Utils_Array::value($params['case_type_id'], $caseTypes)) { $caseType = $caseTypes[$params['case_type_id']]; } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$params['case_type_id'] || !$caseType) { CRM_Core_Error::fatal('Required parameter missing for ChangeCaseType - end post processing'); } // 1. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 1, 'activityTypeName' => 'Change Case Type', 'activity_date_time' => CRM_Utils_Array::value('reset_date_time', $params), 'caseID' => $form->_caseId, 'resetTimeline' => CRM_Utils_Array::value('is_reset_timeline', $params)); $xmlProcessor->run($caseType, $xmlProcessorParams); // status msg $params['statusMsg'] = ts('Case Type changed successfully.'); }
/** * Function to process the form * * @access public * @return None */ public function endPostProcess(&$form, &$params, $activity) { if (CRM_Utils_Array::value('start_date', $params)) { $params['start_date'] = CRM_Utils_Date::processDate($params['start_date']); } $caseType = $form->_caseType; if (!$caseType && $form->_caseId) { $query = "\nSELECT cov_type.label as case_type FROM civicrm_case \nLEFT JOIN civicrm_option_group cog_type ON cog_type.name = 'case_type'\nLEFT JOIN civicrm_option_value cov_type ON \n( civicrm_case.case_type_id = cov_type.value AND cog_type.id = cov_type.option_group_id ) \nWHERE civicrm_case.id= %1"; $queryParams = array(1 => array($form->_caseId, 'Integer')); $caseType = CRM_Core_DAO::singleValueQuery($query, $queryParams); } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$form->_caseId || !$caseType) { CRM_Core_Error::fatal('Required parameter missing for ChangeCaseType - end post processing'); } // 1. save activity subject with new start date $currentStartDate = CRM_Utils_Date::customFormat(CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $form->_caseId, 'start_date')); $newStartDate = CRM_Utils_Date::customFormat(CRM_Utils_Date::mysqlToIso($params['start_date'])); $subject = 'Change Case Start Date from ' . $currentStartDate . ' to ' . $newStartDate; $activity->subject = $subject; $activity->save(); // 2. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 0, 'activity_date_time' => $params['start_date'], 'caseID' => $form->_caseId, 'caseType' => $caseType, 'activityTypeName' => 'Change Case Start Date', 'activitySetName' => 'standard_timeline', 'resetTimeline' => 1); $xmlProcessor->run($caseType, $xmlProcessorParams); // 3.status msg $params['statusMsg'] = ts('Case Start Date changed successfully.'); }
public function buildQuickForm() { $this->_fields['source_contact_id']['label'] = ts('Reported By'); unset($this->_fields['status_id']['attributes']['required']); if ($this->_caseType) { $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $aTypes = array(); foreach ($this->_caseType as $key => $val) { $activityTypes = $xmlProcessor->get($val, 'ActivityTypes', TRUE); $aTypes = $aTypes + $activityTypes; } // remove Open Case activity type since we're inside an existing case $openCaseID = CRM_Core_OptionGroup::getValue('activity_type', 'Open Case', 'name'); unset($aTypes[$openCaseID]); asort($aTypes); $this->_fields['followup_activity_type_id']['attributes'] = array('' => '- select activity type -') + $aTypes; } $result = parent::buildQuickForm(); if ($this->_action & (CRM_Core_Action::DELETE | CRM_Core_Action::DETACH | CRM_Core_Action::RENEW)) { return; } $this->assign('urlPath', 'civicrm/case/activity'); $encounterMediums = CRM_Case_PseudoConstant::encounterMedium(); // Fixme: what's the justification for this? It seems like it is just re-adding an option in case it is the default and disabled. // Is that really a big problem? if ($this->_activityTypeFile == 'OpenCase') { $this->_encounterMedium = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $this->_activityId, 'medium_id'); if (!array_key_exists($this->_encounterMedium, $encounterMediums)) { $encounterMediums[$this->_encounterMedium] = CRM_Core_OptionGroup::getLabel('encounter_medium', $this->_encounterMedium, FALSE); } } $this->add('select', 'medium_id', ts('Medium'), $encounterMediums, TRUE); $i = 0; foreach ($this->_caseId as $key => $val) { $this->_relatedContacts[] = $rgc = CRM_Case_BAO_Case::getRelatedAndGlobalContacts($val); $contName = CRM_Case_BAO_Case::getContactNames($val); foreach ($contName as $nkey => $nval) { array_push($this->_relatedContacts[$i][0], $this->_relatedContacts[$i][0]['managerOf'] = $nval['display_name']); } $i++; } //add case client in send a copy selector.CRM-4438. foreach ($this->_caseId as $key => $val) { $relatedContacts[] = $relCon = CRM_Case_BAO_Case::getContactNames($val); } if (!empty($relatedContacts)) { foreach ($relatedContacts as $relatedContact) { $this->_relatedContacts[] = $relatedContact; } } if (!empty($this->_relatedContacts)) { $checkBoxes = array(); foreach ($this->_relatedContacts as $id => $row) { $checkBoxes[$id] = $this->addElement('checkbox', $id, NULL, NULL, array('class' => 'select-row')); } $this->addGroup($checkBoxes, 'contact_check'); $this->addElement('checkbox', 'toggleSelect', NULL, NULL, array('class' => 'select-rows')); $this->assign('searchRows', $this->_relatedContacts); } $this->_relatedContacts = $rgc + $relCon; $this->addFormRule(array('CRM_Case_Form_Activity', 'formRule'), $this); }
public function buildQuickForm() { $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process(); $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients(); $this->assign('multiClient', $isMultiClient); if ($this->_action & CRM_Core_Action::DELETE || $this->_action & CRM_Core_Action::RENEW) { $title = 'Delete'; if ($this->_action & CRM_Core_Action::RENEW) { $title = 'Restore'; } $this->addButtons(array(array('type' => 'next', 'name' => $title, 'spacing' => ' ', 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); return; } if ($this->_cdType) { return CRM_Custom_Form_CustomData::buildQuickForm($this); } //need to assign custom data type and subtype to the template $this->assign('customDataType', 'Case'); CRM_Custom_Form_CustomData::buildQuickForm($this); // we don't want to show button on top of custom form $this->assign('noPreCustomButton', TRUE); $s = CRM_Core_DAO::getAttribute('CRM_Activity_DAO_Activity', 'subject'); if (!is_array($s)) { $s = array(); } $this->add('text', 'activity_subject', ts('Subject'), array_merge($s, array('maxlength' => '128')), TRUE); $tags = CRM_Core_BAO_Tag::getTags('civicrm_case'); if (!empty($tags)) { $this->add('select', 'tag', ts('Select Tags'), $tags, FALSE, array('id' => 'tags', 'multiple' => 'multiple', 'title' => ts('- select -'))); } // build tag widget $parentNames = CRM_Core_BAO_Tag::getTagSet('civicrm_case'); CRM_Core_Form_Tag::buildQuickForm($this, $parentNames, 'civicrm_case', NULL, FALSE, TRUE); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'spacing' => ' ', 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); eval("CRM_Case_Form_Activity_{$this->_activityTypeFile}::buildQuickForm( \$this );"); }
function printCaseReport() { $caseID = CRM_Utils_Request::retrieve('caseID', 'Positive', CRM_Core_DAO::$_nullObject); $clientID = CRM_Utils_Request::retrieve('cid', 'Positive', CRM_Core_DAO::$_nullObject); $activitySetName = CRM_Utils_Request::retrieve('asn', 'String', CRM_Core_DAO::$_nullObject); $isRedact = CRM_Utils_Request::retrieve('redact', 'Boolean', CRM_Core_DAO::$_nullObject); $includeActivities = CRM_Utils_Request::retrieve('all', 'Positive', CRM_Core_DAO::$_nullObject); $params = $otherRelationships = $globalGroupInfo = array(); $report = new CRM_Case_XMLProcessor_Report($isRedact); if ($includeActivities) { $params['include_activities'] = 1; } if ($isRedact) { $params['is_redact'] = 1; $report->_redactionStringRules = array(); } $template = CRM_Core_Smarty::singleton(); //get case related relationships (Case Role) $caseRelationships = CRM_Case_BAO_Case::getCaseRoles($clientID, $caseID); $caseType = CRM_Case_BAO_Case::getCaseType($caseID, 'name'); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $caseRoles = $xmlProcessor->get($caseType, 'CaseRoles'); foreach ($caseRelationships as $key => &$value) { if (!empty($caseRoles[$value['relation_type']])) { unset($caseRoles[$value['relation_type']]); } if ($isRedact) { if (!array_key_exists($value['name'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($value['name'] => 'name_' . rand(10000, 100000))); } $value['name'] = self::redact($value['name'], TRUE, $report->_redactionStringRules); if (!empty($value['email']) && !array_key_exists($value['email'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($value['email'] => 'email_' . rand(10000, 100000))); } $value['email'] = self::redact($value['email'], TRUE, $report->_redactionStringRules); if (!empty($value['phone']) && !array_key_exists($value['phone'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($value['phone'] => 'phone_' . rand(10000, 100000))); } $value['phone'] = self::redact($value['phone'], TRUE, $report->_redactionStringRules); } } $caseRoles['client'] = CRM_Case_BAO_Case::getContactNames($caseID); if ($isRedact) { if (!array_key_exists($caseRoles['client']['sort_name'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($caseRoles['client']['sort_name'] => 'name_' . rand(10000, 100000))); } if (!array_key_exists($caseRoles['client']['display_name'], $report->_redactionStringRules)) { $report->_redactionStringRules[$caseRoles['client']['display_name']] = $report->_redactionStringRules[$caseRoles['client']['sort_name']]; } $caseRoles['client']['sort_name'] = self::redact($caseRoles['client']['sort_name'], TRUE, $report->_redactionStringRules); if (!empty($caseRoles['client']['email']) && !array_key_exists($caseRoles['client']['email'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($caseRoles['client']['email'] => 'email_' . rand(10000, 100000))); } $caseRoles['client']['email'] = self::redact($caseRoles['client']['email'], TRUE, $report->_redactionStringRules); if (!empty($caseRoles['client']['phone']) && !array_key_exists($caseRoles['client']['phone'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($caseRoles['client']['phone'] => 'phone_' . rand(10000, 100000))); } $caseRoles['client']['phone'] = self::redact($caseRoles['client']['phone'], TRUE, $report->_redactionStringRules); } // Retrieve ALL client relationships $relClient = CRM_Contact_BAO_Relationship::getRelationship($clientID, CRM_Contact_BAO_Relationship::CURRENT, 0, 0, 0, NULL, NULL, FALSE); foreach ($relClient as $r) { if ($isRedact) { if (!array_key_exists($r['name'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['name'] => 'name_' . rand(10000, 100000))); } if (!array_key_exists($r['display_name'], $report->_redactionStringRules)) { $report->_redactionStringRules[$r['display_name']] = $report->_redactionStringRules[$r['name']]; } $r['name'] = self::redact($r['name'], TRUE, $report->_redactionStringRules); if (!empty($r['phone']) && !array_key_exists($r['phone'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['phone'] => 'phone_' . rand(10000, 100000))); } $r['phone'] = self::redact($r['phone'], TRUE, $report->_redactionStringRules); if (!empty($r['email']) && !array_key_exists($r['email'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['email'] => 'email_' . rand(10000, 100000))); } $r['email'] = self::redact($r['email'], TRUE, $report->_redactionStringRules); } if (!array_key_exists($r['id'], $caseRelationships)) { $otherRelationships[] = $r; } } // Now global contact list that appears on all cases. $relGlobal = CRM_Case_BAO_Case::getGlobalContacts($globalGroupInfo); foreach ($relGlobal as &$r) { if ($isRedact) { if (!array_key_exists($r['sort_name'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['sort_name'] => 'name_' . rand(10000, 100000))); } if (!array_key_exists($r['display_name'], $report->_redactionStringRules)) { $report->_redactionStringRules[$r['display_name']] = $report->_redactionStringRules[$r['sort_name']]; } $r['sort_name'] = self::redact($r['sort_name'], TRUE, $report->_redactionStringRules); if (!empty($r['phone']) && !array_key_exists($r['phone'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['phone'] => 'phone_' . rand(10000, 100000))); } $r['phone'] = self::redact($r['phone'], TRUE, $report->_redactionStringRules); if (!empty($r['email']) && !array_key_exists($r['email'], $report->_redactionStringRules)) { $report->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($report->_redactionStringRules, array($r['email'] => 'email_' . rand(10000, 100000))); } $r['email'] = self::redact($r['email'], TRUE, $report->_redactionStringRules); } } $template->assign('caseRelationships', $caseRelationships); $template->assign('caseRoles', $caseRoles); $template->assign('otherRelationships', $otherRelationships); $template->assign('globalRelationships', $relGlobal); $template->assign('globalGroupInfo', $globalGroupInfo); $contents = self::getCaseReport($clientID, $caseID, $activitySetName, $params, $report); $printReport = CRM_Case_Audit_Audit::run($contents, $clientID, $caseID, TRUE); echo $printReport; CRM_Utils_System::civiExit(); }
/** * Function to process the form * * @access public * @return void */ public function postProcess() { $params = $this->controller->exportValues($this->_name); //Check the contact provided in Application form is existing or new $profileContactType = CRM_Core_BAO_UFGroup::getContactType($this->_profileID); $dedupeParams = CRM_Dedupe_Finder::formatParams($params, $profileContactType); $dedupeParams['check_permission'] = FALSE; $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, $profileContactType); $applicantID = $this->_contactID; if (count($ids) && !$applicantID) { $applicantID = CRM_Utils_Array::value(0, $ids); } $applicantID = CRM_Contact_BAO_Contact::createProfileContact($params, CRM_Core_DAO::$_nullArray, $applicantID, NULL, $this->_profileID); if ($applicantID) { $params['start_date'] = date("YmdHis"); $dao = new CRM_HRRecruitment_DAO_HRVacancyStage(); $dao->vacancy_id = $this->_id; $dao->find(); while ($dao->fetch()) { $params['case_status_id'] = $dao->case_status_id; break; } //Create case of type Application against creator applicant and assignee as Vacancy creator $caseTypes = array_flip(CRM_Case_PseudoConstant::caseType('name', TRUE, 'AND filter = 1')); $cases = CRM_Case_BAO_Case::retrieveCaseIdsByContactId($applicantID, FALSE, 'Application'); foreach ($cases as $case) { $oldAppl = CRM_HRRecruitment_BAO_HRVacancy::getVacancyIDByCase($case); if ($oldAppl == $this->_id) { $params['id'] = $case; break; } } $params['case_type_id'] = $caseTypes['Application']; $caseObj = CRM_Case_BAO_Case::create($params); if (empty($params['id'])) { $contactParams = array('case_id' => $caseObj->id, 'contact_id' => $applicantID); CRM_Case_BAO_Case::addCaseToContact($contactParams); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $applicantID, 'creatorID' => $this->_creatorID, 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $caseObj->id, 'activity_date_time' => $params['start_date']); $xmlProcessor->run('Application', $xmlProcessorParams); } //process Custom data CRM_Core_BAO_CustomValueTable::postprocess($params, CRM_Core_DAO::$_nullArray, 'civicrm_case', $caseObj->id, 'Case'); //Process case to vacancy one-to-one mapping in custom table 'application_case' $cgID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', 'application_case', 'id', 'name'); $result = civicrm_api3('CustomField', 'get', array('custom_group_id' => $cgID, 'name' => 'vacancy_id')); civicrm_api3('custom_value', 'create', array("custom_{$result['id']}" => $this->_id, 'entity_id' => $caseObj->id)); } if ($this->controller->getButtonName('submit') == "_qf_Application_upload") { CRM_Core_Session::setStatus(ts("Application has been successfully submitted.")); CRM_Core_Session::singleton()->pushUserContext(CRM_Utils_System::url('civicrm/vacancy/publiclisting', 'reset=1')); } }
/** * Function to process the form * * @access public * * @return None */ static function endPostProcess(&$form, &$params, $activity) { if (!$form->_caseId) { // always expecting a change, so case-id is a must. return; } $caseTypes = CRM_Case_PseudoConstant::caseType('name'); $allCaseTypes = CRM_Case_PseudoConstant::caseType('label', FALSE); if (CRM_Utils_Array::value($params['case_type_id'], $caseTypes)) { $caseType = $caseTypes[$params['case_type_id']]; } if (!$form->_currentlyViewedContactId || !$form->_currentUserId || !$params['case_type_id'] || !$caseType) { CRM_Core_Error::fatal('Required parameter missing for ChangeCaseType - end post processing'); } $params['status_id'] = CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name'); $activity->status_id = $params['status_id']; $params['priority_id'] = CRM_Core_OptionGroup::getValue('priority', 'Normal', 'name'); $activity->priority_id = $params['priority_id']; if ($activity->subject == 'null') { $activity->subject = ts('Case type changed from %1 to %2', array(1 => CRM_Utils_Array::value($form->_defaults['case_type_id'], $allCaseTypes), 2 => CRM_Utils_Array::value($params['case_type_id'], $allCaseTypes))); $activity->save(); } // 1. initiate xml processor $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $form->_currentlyViewedContactId, 'creatorID' => $form->_currentUserId, 'standardTimeline' => 1, 'activityTypeName' => 'Change Case Type', 'activity_date_time' => CRM_Utils_Array::value('reset_date_time', $params), 'caseID' => $form->_caseId, 'resetTimeline' => CRM_Utils_Array::value('is_reset_timeline', $params)); $xmlProcessor->run($caseType, $xmlProcessorParams); // status msg $params['statusMsg'] = ts('Case Type changed successfully.'); }
<?php require_once '../civicrm.config.php'; require_once 'CRM/Core/Config.php'; require_once 'CRM/Core/Error.php'; $config = CRM_Core_Config::singleton(); require_once 'CRM/Case/XMLProcessor/Report.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Report(); $report = $xmlProcessor->getActivityInfo(102, 552); CRM_Core_Error::debug($report); exit; $xmlProcessor->run(104, 1, 'Substance Abuse', '15 Day Review'); $params = array('clientID' => 104, 'creatorID' => 108, 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'dueDateTime' => time(), 'caseID' => 1); require_once 'CRM/Case/XMLProcessor/Process.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $result = $xmlProcessor->get('Substance Abuse', 'CaseRoles'); CRM_Core_Error::debug('Case Roles', $result); $result = $xmlProcessor->get('Substance Abuse', 'ActivityTypes'); CRM_Core_Error::debug('Activity Types', $result); $result = $xmlProcessor->get('Substance Abuse', 'ActivitySets'); CRM_Core_Error::debug('Activity Sets', $result); $xmlProcessor->run('Substance Abuse', $params); exit;
function addVacancies($cid) { //sample data for HRRecruitment table $grpParams['name'] = 'vacancy_status'; $optionValues = $vacancyPermissionContactIds = array(); $caseStatuses = CRM_Core_OptionGroup::values('case_status', FALSE, FALSE, FALSE, " AND grouping = 'Vacancy'"); $vacancyStatuses = CRM_Core_OptionGroup::values('vacancy_status'); //Filterout Rejected and Cancelled status while creating vacancy foreach (array('Cancelled', 'Rejected') as $status) { $key = array_search($status, $vacancyStatuses); unset($vacancyStatuses[$key]); } $totalcount = 6; $setNewVacancy = FALSE; $templatePosition = array(); $randomVacancies = $this->randomVacancy(); for ($i = 1; $i <= $totalcount; $i++) { $jobCount = mt_rand(0, 2); $position = $randomVacancies[$jobCount]['position']; $vacanciesValues = array('salary' => $randomVacancies[$jobCount]['salary'], 'position' => $position, 'description' => $this->randomItem('vacancydescription'), 'benefits' => $randomVacancies[$jobCount]['benefits'], 'requirements' => $randomVacancies[$jobCount]['requirements'], 'location' => $this->randomItem('location'), 'is_template' => mt_rand(0, 1), 'status_id' => array_rand($vacancyStatuses, 1), 'start_date' => $this->randomDate('20130701', '20140101', 'YmdHis'), 'end_date' => $this->randomDate('20140102', '20151231', 'YmdHis'), 'created_id' => $cid, 'created_date' => $this->randomDate()); if ($vacanciesValues['is_template'] == 1) { unset($vacanciesValues['status_id']); if (array_key_exists($position, $templatePosition)) { //always create distict template continue; } $templatePosition[$position] = NULL; } else { $setNewVacancy = TRUE; } //ensure that atleast there is one vacancy not all template if (!$setNewVacancy && $i == $totalcount) { $totalcount++; } $hrVacancies[] = $this->insertVacancyData('CRM_HRRecruitment_DAO_HRVacancy', $vacanciesValues); } //There are 6 sample Vacancies created, next is to create Entities - VacancyStage, VacancyPermission, Cases foreach ($hrVacancies as $key => $hrVacanciesObj) { $selectedCaseStatuses = array(); $lastSelectedCaseStatus = NULL; $randCaseStatus = $caseStatuses; //Igonre Apply and Hired statuses while removing random status $ignoreCaseStatus = array(array_search('Apply', $randCaseStatus), array_search('Hired', $randCaseStatus)); for ($i = 1; $i <= mt_rand(1, 6); $i++) { $randomValue = array_rand($randCaseStatus, 1); if (in_array($randomValue, $ignoreCaseStatus)) { continue; } unset($randCaseStatus[$randomValue]); } $count = 1; foreach ($randCaseStatus as $caseStatus => $dontCare) { $vacancyStagesValues = array('case_status_id' => $caseStatus, 'vacancy_id' => $hrVacanciesObj->id, 'weight' => $count); $count++; $this->insertVacancyData('CRM_HRRecruitment_DAO_HRVacancyStage', $vacancyStagesValues); } //sample data for HRPermission table $vacancyPermissionContactIds[$hrVacanciesObj->id][] = $hrVacanciesObj->created_id; for ($i = 1; $i <= mt_rand(1, 4); $i++) { $vacancyPermissionValues = array('contact_id' => $this->randomContact(), 'vacancy_id' => $hrVacanciesObj->id, 'permission' => $this->randomItem('permission')); if ($vacancyPermissionValues['permission'] == 'manage Applicants' || $vacancyPermissionValues['permission'] == 'administer Vacancy') { $vacancyPermissionContactIds[$hrVacanciesObj->id][] = $vacancyPermissionValues['contact_id']; } $this->insertVacancyData('CRM_HRRecruitment_DAO_HRVacancyPermission', $vacancyPermissionValues); } foreach (array('application_profile', 'evaluation_profile') as $profileName) { $ufgID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFGroup', $profileName, 'id', 'name'); $vacancyUFJoinValues = array('module' => 'Vacancy', 'entity_id' => $hrVacanciesObj->id, 'entity_table' => 'civicrm_hrvacancy', 'uf_group_id' => $ufgID, 'module_data' => $profileName); $this->insertVacancyData('CRM_Core_DAO_UFJoin', $vacancyUFJoinValues); $caseTypes = CRM_Case_PseudoConstant::caseType('name', 1, 'AND filter = 1'); if (!$hrVacanciesObj->is_template) { for ($i = 1; $i <= mt_rand(1, 4); $i++) { $applicantID = $this->randomContact(); $caseParams['case_type_id'] = CRM_Utils_Array::key('Application', $caseTypes); $caseParams['start_date'] = $this->randomDate($hrVacanciesObj->start_date, $hrVacanciesObj->end_date); $caseParams['status_id'] = array_rand($randCaseStatus, 1); $caseObj = CRM_Case_BAO_Case::create($caseParams); $contactParams = array('case_id' => $caseObj->id, 'contact_id' => $applicantID); CRM_Case_BAO_Case::addCaseToContact($contactParams); $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $xmlProcessorParams = array('clientID' => $applicantID, 'creatorID' => $cid, 'standardTimeline' => 1, 'activityTypeName' => 'Open Case', 'caseID' => $caseObj->id, 'activity_date_time' => $caseParams['start_date']); $xmlProcessor->run('Application', $xmlProcessorParams); $aTypes = $xmlProcessor->get('Application', 'ActivityTypes'); $aTypes = array_rand(array_flip($aTypes), mt_rand(2, 5)); foreach ($aTypes as $aType) { if (in_array($aType, array('Open Case', 'Assign Case Role', 'Link Cases'))) { continue; } $index = array_rand($vacancyPermissionContactIds[$hrVacanciesObj->id], 1); $aParam = array('source_contact_id' => $vacancyPermissionContactIds[$hrVacanciesObj->id][$index], 'activity_date_time' => $this->randomDate($hrVacanciesObj->start_date, $hrVacanciesObj->end_date, 'YmdHis'), 'activity_type_id' => $aType, 'status_id' => CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name')); if ($aType == 'Change Case Status') { $aParam['last_status'] = $caseStatuses[$caseObj->status_id]; $caseObj->status_id = array_rand($caseStatuses, 1); $caseObj->save(); $aParam['new_status'] = $caseStatuses[$caseObj->status_id]; } $this->addActivityParamByType($aType, $aParam); $result = civicrm_api3('Activity', 'create', $aParam); $caseActivityParams = array('case_id' => $caseObj->id, 'activity_id' => $result['id']); CRM_Case_BAO_Case::processCaseActivity($caseActivityParams); } $cgID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', 'application_case', 'id', 'name'); $result = civicrm_api3('CustomField', 'get', array('custom_group_id' => $cgID, 'name' => 'vacancy_id')); civicrm_api3('custom_value', 'create', array("custom_{$result['id']}" => $hrVacanciesObj->id, 'entity_id' => $caseObj->id)); } } } } }
/** * Determine the number of times a particular activity-type is * referenced in CiviCase XML. * * @param string $relationshipTypeName symbolic-name of a relationship-type * @return int */ function getRelationshipReferenceCount($relationshipTypeName) { $p = new CRM_Case_XMLProcessor_Process(); $count = 0; foreach ($this->getAllCaseTypes() as $caseTypeName) { $caseTypeXML = $this->retrieve($caseTypeName); if (in_array($relationshipTypeName, $p->getDeclaredRelationshipTypes($caseTypeXML))) { $count++; } } return $count; }
/** * Validate contact permission for * given operation on activity record. * * @param int $activityId activity record id. * @param string $operation user operation. * @param int $actTypeId activity type id. * @param int $contactId contact id/if not pass consider logged in * @param boolean $checkComponent do we need to check component enabled. * * @return boolean $allow true/false * @static */ static function checkPermission($activityId, $operation, $actTypeId = NULL, $contactId = NULL, $checkComponent = TRUE) { $allow = FALSE; if (!$actTypeId && $activityId) { $actTypeId = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityId, 'activity_type_id'); } if (!$activityId || !$operation || !$actTypeId) { return $allow; } //do check for civicase component enabled. if ($checkComponent) { static $componentEnabled; if (!isset($componentEnabled)) { $config = CRM_Core_Config::singleton(); $componentEnabled = FALSE; if (in_array('CiviCase', $config->enableComponents)) { $componentEnabled = TRUE; } } if (!$componentEnabled) { return $allow; } } //do check for cases. $caseActOperations = array('File On Case', 'Link Cases', 'Move To Case', 'Copy To Case'); if (in_array($operation, $caseActOperations)) { static $unclosedCases; if (!is_array($unclosedCases)) { $unclosedCases = self::getUnclosedCases(); } if ($operation == 'File On Case') { $allow = empty($unclosedCases) ? FALSE : TRUE; } else { $allow = count($unclosedCases) > 1 ? TRUE : FALSE; } } $actionOperations = array('view', 'edit', 'delete'); if (in_array($operation, $actionOperations)) { //do cache when user has non/supper permission. static $allowOperations; if (!is_array($allowOperations) || !array_key_exists($operation, $allowOperations)) { if (!$contactId) { $session = CRM_Core_Session::singleton(); $contactId = $session->get('userID'); } //check for permissions. $permissions = array('view' => array('access my cases and activities', 'access all cases and activities'), 'edit' => array('access my cases and activities', 'access all cases and activities'), 'delete' => array('delete activities')); //check for core permission. $hasPermissions = array(); $checkPermissions = CRM_Utils_Array::value($operation, $permissions); if (is_array($checkPermissions)) { foreach ($checkPermissions as $per) { if (CRM_Core_Permission::check($per)) { $hasPermissions[$operation][] = $per; } } } //has permissions. if (!empty($hasPermissions)) { //need to check activity object specific. if (in_array($operation, array('view', 'edit'))) { //do we have supper permission. if (in_array('access all cases and activities', $hasPermissions[$operation])) { $allowOperations[$operation] = $allow = TRUE; } else { //user has only access to my cases and activity. //here object specific permmions come in picture. //edit - contact must be source or assignee //view - contact must be source/assignee/target $isTarget = $isAssignee = $isSource = FALSE; $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts); $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); $target = new CRM_Activity_DAO_ActivityContact(); $target->record_type_id = $targetID; $target->activity_id = $activityId; $target->contact_id = $contactId; if ($target->find(TRUE)) { $isTarget = TRUE; } $assignee = new CRM_Activity_DAO_ActivityContact(); $assignee->activity_id = $activityId; $assignee->record_type_id = $assigneeID; $assignee->contact_id = $contactId; if ($assignee->find(TRUE)) { $isAssignee = TRUE; } $source = new CRM_Activity_DAO_ActivityContact(); $source->activity_id = $activityId; $source->record_type_id = $sourceID; $source->contact_id = $contactId; if ($source->find(TRUE)) { $isSource = TRUE; } if ($operation == 'edit') { if ($isAssignee || $isSource) { $allow = TRUE; } } if ($operation == 'view') { if ($isTarget || $isAssignee || $isSource) { $allow = TRUE; } } } } elseif (is_array($hasPermissions[$operation])) { $allowOperations[$operation] = $allow = TRUE; } } else { //contact do not have permission. $allowOperations[$operation] = FALSE; } } else { //use cache. //here contact might have supper/non permission. $allow = $allowOperations[$operation]; } } //do further only when operation is granted. if ($allow) { $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'name'); //get the activity type name. $actTypeName = CRM_Utils_Array::value($actTypeId, $activityTypes); //do not allow multiple copy / edit action. $singletonNames = array('Open Case', 'Reassigned Case', 'Merge Case', 'Link Cases', 'Assign Case Role', 'Email', 'Inbound Email'); //do not allow to delete these activities, CRM-4543 $doNotDeleteNames = array('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date'); //allow edit operation. $allowEditNames = array('Open Case'); // do not allow File on Case $doNotFileNames = array('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date', 'Reassigned Case', 'Merge Case', 'Link Cases', 'Assign Case Role'); if (in_array($actTypeName, $singletonNames)) { $allow = FALSE; if ($operation == 'File On Case') { $allow = in_array($actTypeName, $doNotFileNames) ? FALSE : TRUE; } if (in_array($operation, $actionOperations)) { $allow = TRUE; if ($operation == 'edit') { $allow = in_array($actTypeName, $allowEditNames) ? TRUE : FALSE; } elseif ($operation == 'delete') { $allow = in_array($actTypeName, $doNotDeleteNames) ? FALSE : TRUE; } } } if ($allow && $operation == 'delete' && in_array($actTypeName, $doNotDeleteNames)) { $allow = FALSE; } if ($allow && $operation == 'File On Case' && in_array($actTypeName, $doNotFileNames)) { $allow = FALSE; } //check settings file for masking actions //on the basis the activity types //hide Edit link if activity type is NOT editable //(special case activities).CRM-5871 if ($allow && in_array($operation, $actionOperations)) { static $actionFilter = array(); if (!array_key_exists($operation, $actionFilter)) { $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $actionFilter[$operation] = $xmlProcessor->get('Settings', 'ActivityTypes', FALSE, $operation); } if (array_key_exists($operation, $actionFilter[$operation]) && in_array($actTypeId, $actionFilter[$operation][$operation])) { $allow = FALSE; } } } return $allow; }
/** * View a particular stage in a tab */ function viewStage() { // Data needed for contact list $contacts = CRM_HRRecruitment_BAO_HRVacancyStage::getCasesAtStage($this->_vid, $this->_statusId); $this->assign('contacts', $contacts); $this->ajaxResponse['tabCount'] = count($contacts); // Data needed for activity buttons/menu $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $activities = $xmlProcessor->get('Application', 'ActivityTypes', TRUE); // Special activities we don't want in the action menu foreach (array('Open Case', 'Comment', 'Email', 'Evaluation', 'Change Case Status', 'Link Cases', 'Assign Case Role') as $remove) { $type = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', $remove); if ($type) { // Assign to the tpl as camelCase $this->assign(str_replace(' ', '', lcfirst($remove . 'Activity')), $type); // And remove from the list unset($activities[$type]); } } $this->assign('activities', $activities); // Data needed for status menu $this->assign('statusId', $this->_statusId); $caseStatus = array(); foreach (CRM_HRRecruitment_BAO_HRVacancyStage::caseStage($this->_vid) as $id => $stage) { $caseStatus[$stage['weight']] = $stage + array('id' => $id); } ksort($caseStatus); $this->assign('caseStatus', $caseStatus); }