X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCase%2FBAO%2FCase.php;h=caac6b3c11e6c76ca259598a3b90fdbf68bf0241;hb=e96d5fa3b3b73b9854c9082ac73701965ed314d3;hp=e66d30d684ebd72cc494960b7ba194b2d1b97a4d;hpb=1ddee35559d1f2bae7f97373c95d13b7e8add94e;p=civicrm-core.git diff --git a/CRM/Case/BAO/Case.php b/CRM/Case/BAO/Case.php index e66d30d684..7df56b3dc3 100644 --- a/CRM/Case/BAO/Case.php +++ b/CRM/Case/BAO/Case.php @@ -1,9 +1,9 @@ enableComponents); + } + + /** + * Takes an associative array and creates a case object * * the function extract all the params it needs to initialize the create a * case object. the params array could contain additional unused name/value * pairs * - * @param array $params (reference ) an assoc array of name/value pairs - * @param array $ids the array that holds all the db ids + * @param array $params + * (reference ) an assoc array of name/value pairs. * - * @return object CRM_Case_BAO_Case object - * @access public - * @static + * @return CRM_Case_BAO_Case */ - static function add(&$params) { + public static function add(&$params) { $caseDAO = new CRM_Case_DAO_Case(); $caseDAO->copyValues($params); return $caseDAO->save(); @@ -75,15 +84,16 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { * Given the list of params in the params array, fetch the object * and store the values in the values array * - * @param array $params input parameters to find object - * @param array $values output values of the object - * @param array $ids the array that holds all the db ids + * @param array $params + * Input parameters to find object. + * @param array $values + * Output values of the object. + * @param array $ids + * The array that holds all the db ids. * * @return CRM_Case_BAO_Case|null the found object or null - * @access public - * @static */ - static function &getValues(&$params, &$values, &$ids) { + public static function &getValues(&$params, &$values, &$ids) { $case = new CRM_Case_BAO_Case(); $case->copyValues($params); @@ -97,19 +107,17 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { } /** - * takes an associative array and creates a case object + * Takes an associative array and creates a case object * - * @param array $params (reference ) an assoc array of name/value pairs - * @param array $ids the array that holds all the db ids + * @param array $params + * (reference ) an assoc array of name/value pairs. * - * @return object CRM_Case_BAO_Case object - * @access public - * @static + * @return CRM_Case_BAO_Case */ - static function &create(&$params) { + public static function &create(&$params) { $transaction = new CRM_Core_Transaction(); - if (CRM_Utils_Array::value('id', $params)) { + if (!empty($params['id'])) { CRM_Utils_Hook::pre('edit', 'Case', $params['id'], $params); } else { @@ -118,7 +126,7 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { $case = self::add($params); - if (CRM_Utils_Array::value('custom', $params) && + if (!empty($params['custom']) && is_array($params['custom']) ) { CRM_Core_BAO_CustomValueTable::store($params['custom'], 'civicrm_case', $case->id); @@ -129,7 +137,7 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { return $case; } - if (CRM_Utils_Array::value('id', $params)) { + if (!empty($params['id'])) { CRM_Utils_Hook::post('edit', 'Case', $case->id, $case); } else { @@ -145,12 +153,12 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Create case contact record * - * @param array case_id, contact_id + * @param array $params + * case_id, contact_id * * @return object - * @access public */ - static function addCaseToContact($params) { + public static function addCaseToContact($params) { $caseContact = new CRM_Case_DAO_CaseContact(); $caseContact->case_id = $params['case_id']; $caseContact->contact_id = $params['contact_id']; @@ -158,12 +166,12 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { $caseContact->save(); // add to recently viewed - $caseType = CRM_Case_PseudoConstant::caseTypeName($caseContact->case_id, 'label'); + $caseType = CRM_Case_BAO_Case::getCaseType($caseContact->case_id); $url = CRM_Utils_System::url('civicrm/contact/view/case', "action=view&reset=1&id={$caseContact->case_id}&cid={$caseContact->contact_id}&context=home" ); - $title = CRM_Contact_BAO_Contact::displayName($caseContact->contact_id) . ' - ' . $caseType['name']; + $title = CRM_Contact_BAO_Contact::displayName($caseContact->contact_id) . ' - ' . $caseType; $recentOther = array(); if (CRM_Core_Permission::checkActionPermission('CiviCase', CRM_Core_Action::DELETE)) { @@ -188,12 +196,11 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Delet case contact record * - * @param int case_id + * @param int $caseID * - * @return Void - * @access public + * @return void */ - static function deleteCaseContact($caseID) { + public static function deleteCaseContact($caseID) { $caseContact = new CRM_Case_DAO_CaseContact(); $caseContact->case_id = $caseID; $caseContact->delete(); @@ -207,14 +214,14 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { } /** - * This function is used to convert associative array names to values + * convert associative array names to values * and vice-versa. * * This function is used by both the web form layer and the api. Note that * the api needs the name => value conversion, also the view layer typically * requires value => name conversion */ - static function lookupValue(&$defaults, $property, &$lookup, $reverse) { + public static function lookupValue(&$defaults, $property, &$lookup, $reverse) { $id = $property . '_id'; $src = $reverse ? $property : $id; @@ -241,30 +248,30 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { * full featured over a period of time. This is the inverse function of * create. It also stores all the retrieved values in the default array * - * @param array $params (reference ) an assoc array of name/value pairs - * @param array $defaults (reference ) an assoc array to hold the name / value pairs + * @param array $params + * (reference ) an assoc array of name/value pairs. + * @param array $defaults + * (reference ) an assoc array to hold the name / value pairs. * in a hierarchical manner - * @param array $ids (reference) the array that holds all the db ids + * @param array $ids + * (reference) the array that holds all the db ids. * - * @return object CRM_Case_BAO_Case object - * @access public - * @static + * @return CRM_Case_BAO_Case */ - static function retrieve(&$params, &$defaults, &$ids) { + public static function retrieve(&$params, &$defaults, &$ids) { $case = CRM_Case_BAO_Case::getValues($params, $defaults, $ids); return $case; } /** - * Function to process case activity add/delete + * Process case activity add/delete * takes an associative array and * - * @param array $params (reference ) an assoc array of name/value pairs + * @param array $params + * (reference ) an assoc array of name/value pairs. * - * @access public - * @static */ - static function processCaseActivity(&$params) { + public static function processCaseActivity(&$params) { $caseActivityDAO = new CRM_Case_DAO_CaseActivity(); $caseActivityDAO->activity_id = $params['activity_id']; $caseActivityDAO->case_id = $params['case_id']; @@ -274,15 +281,14 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { } /** - * Function to get the case subject for Activity + * Get the case subject for Activity * - * @param int $activityId activity id + * @param int $activityId + * Activity id. * - * @return case subject or null - * @access public - * @static + * @return string|null */ - static function getCaseSubject($activityId) { + public static function getCaseSubject($activityId) { $caseActivity = new CRM_Case_DAO_CaseActivity(); $caseActivity->activity_id = $activityId; if ($caseActivity->find(TRUE)) { @@ -292,43 +298,39 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { } /** - * Function to get the case type. + * Get the case type. * * @param int $caseId + * @param string $colName * - * @return case type - * @access public - * @static + * @return string + * case type */ - static function getCaseType($caseId, $colName = 'label') { - $caseType = NULL; - if (!$caseId) { - return $caseType; - } - - $sql = " - SELECT ov.{$colName} - FROM civicrm_case ca - INNER JOIN civicrm_option_group og ON og.name='case_type' - INNER JOIN civicrm_option_value ov ON ( ca.case_type_id=ov.value AND ov.option_group_id=og.id ) - WHERE ca.id = %1"; + public static function getCaseType($caseId, $colName = 'title') { + $query = " +SELECT civicrm_case_type.{$colName} FROM civicrm_case +LEFT JOIN civicrm_case_type ON + civicrm_case.case_type_id = civicrm_case_type.id +WHERE civicrm_case.id = %1"; - $params = array(1 => array($caseId, 'Integer')); + $queryParams = array(1 => array($caseId, 'Integer')); - return CRM_Core_DAO::singleValueQuery($sql, $params); + return CRM_Core_DAO::singleValueQuery($query, $queryParams); } /** * Delete the record that are associated with this case * record are deleted from case * - * @param int $caseId id of the case to delete + * @param int $caseId + * Id of the case to delete. * - * @return void - * @access public - * @static + * @param bool $moveToTrash + * + * @return bool + * is successful */ - static function deleteCase($caseId, $moveToTrash = FALSE) { + public static function deleteCase($caseId, $moveToTrash = FALSE) { CRM_Utils_Hook::pre('delete', 'Case', $caseId, CRM_Core_DAO::$_nullArray); //delete activities @@ -372,16 +374,16 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { } /** - * Function to enable disable case related relationships + * Enable disable case related relationships * - * @param int $caseId case id - * @param boolean $enable action + * @param int $caseId + * Case id. + * @param bool $enable + * Action. * * @return void - * @access public - * @static */ - static function enableDisableCaseRelationships($caseId, $enable) { + public static function enableDisableCaseRelationships($caseId, $enable) { $contactIds = self::retrieveContactIdsByCaseId($caseId); if (!empty($contactIds)) { foreach ($contactIds as $cid) { @@ -400,13 +402,12 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Delete the activities related to case * - * @param int $activityId id of the activity + * @param int $activityId + * Id of the activity. * * @return void - * @access public - * @static */ - static function deleteCaseActivity($activityId) { + public static function deleteCaseActivity($activityId) { $case = new CRM_Case_DAO_CaseActivity(); $case->activity_id = $activityId; $case->delete(); @@ -415,13 +416,14 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Retrieve contact_id by case_id * - * @param int $caseId ID of the case + * @param int $caseId + * ID of the case. * - * @return array - * @access public + * @param int $contactID * + * @return array */ - static function retrieveContactIdsByCaseId($caseId, $contactID = NULL) { + public static function retrieveContactIdsByCaseId($caseId, $contactID = NULL) { $caseContact = new CRM_Case_DAO_CaseContact(); $caseContact->case_id = $caseId; $caseContact->find(); @@ -440,11 +442,11 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Look up a case using an activity ID * - * @param $activity_id + * @param int $activityId * * @return int, case ID */ - static function getCaseIdByActivityId($activityId) { + public static function getCaseIdByActivityId($activityId) { $originalId = CRM_Core_DAO::singleValueQuery( 'SELECT original_id FROM civicrm_activity WHERE id = %1', array('1' => array($activityId, 'Integer')) @@ -462,14 +464,12 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Retrieve contact names by caseId * - * @param int $caseId ID of the case + * @param int $caseId + * ID of the case. * * @return array - * - * @access public - * */ - static function getContactNames($caseId) { + public static function getContactNames($caseId) { $contactNames = array(); if (!$caseId) { return $contactNames; @@ -507,21 +507,27 @@ class CRM_Case_BAO_Case extends CRM_Case_DAO_Case { /** * Retrieve case_id by contact_id * - * @param int $contactId ID of the contact - * @param boolean $includeDeleted include the deleted cases in result + * @param int $contactID + * @param bool $includeDeleted + * Include the deleted cases in result. + * @param null $caseType * * @return array - * - * @access public - * */ - static function retrieveCaseIdsByContactId($contactID, $includeDeleted = FALSE) { + public static function retrieveCaseIdsByContactId($contactID, $includeDeleted = FALSE, $caseType = NULL) { $query = " SELECT ca.id as id FROM civicrm_case_contact cc INNER JOIN civicrm_case ca ON cc.case_id = ca.id -WHERE cc.contact_id = %1 "; + if (isset($caseType)) { + $query .= + "INNER JOIN civicrm_case_type ON civicrm_case_type.id = ca.case_type_id +WHERE cc.contact_id = %1 AND civicrm_case_type.name = '{$caseType}'"; + } + if (!isset($caseType)) { + $query .= "WHERE cc.contact_id = %1"; + } if (!$includeDeleted) { $query .= " AND ca.is_deleted = 0"; } @@ -538,7 +544,15 @@ WHERE cc.contact_id = %1 return $caseArray; } - static function getCaseActivityQuery($type = 'upcoming', $userID = NULL, $condition = NULL, $isDeleted = 0) { + /** + * @param string $type + * @param int $userID + * @param null $condition + * @param int $isDeleted + * + * @return string + */ + public static function getCaseActivityQuery($type = 'upcoming', $userID = NULL, $condition = NULL, $isDeleted = 0) { if (!$userID) { $session = CRM_Core_Session::singleton(); $userID = $session->get('userID'); @@ -556,8 +570,8 @@ civicrm_phone.phone as phone, civicrm_contact.contact_type as contact_type, civicrm_contact.contact_sub_type as contact_sub_type, t_act.activity_type_id, -cov_type.label as case_type, -cov_type.name as case_type_name, +c_type.title as case_type, +civicrm_case.case_type_id as case_type_id, cov_status.label as case_status, cov_status.label as case_status_name, t_act.status_id, @@ -578,8 +592,8 @@ t_act.id as case_recent_activity_id, t_act.act_type_name as case_recent_activity_type_name, t_act.act_type AS case_recent_activity_type "; } - elseif ( $type == 'any' ) { - $query .= " + elseif ($type == 'any') { + $query .= " t_act.desired_date as case_activity_date, t_act.id as case_activity_id, t_act.act_type_name as case_activity_type_name, @@ -631,7 +645,7 @@ LEFT JOIN civicrm_option_group aog ON aog.name='activity_type' LEFT JOIN civicrm_option_value aov ON ( aov.option_group_id = aog.id AND aov.value = act.activity_type_id ) ) AS t_act "; } - elseif ( $type == 'any' ) { + elseif ($type == 'any') { $query .= " LEFT JOIN ( SELECT ca4.case_id, act4.id AS id, act4.activity_date_time AS desired_date, act4.activity_type_id, act4.status_id, aov.name AS act_type_name, aov.label AS act_type @@ -658,12 +672,8 @@ LEFT JOIN civicrm_option_group aog ON aog.name='activity_type' ON ( case_relation_type.id = case_relationship.relationship_type_id AND case_relation_type.id = case_relationship.relationship_type_id ) - LEFT JOIN civicrm_option_group cog_type - ON cog_type.name = 'case_type' - - LEFT JOIN civicrm_option_value cov_type - ON ( civicrm_case.case_type_id = cov_type.value - AND cog_type.id = cov_type.option_group_id ) + LEFT JOIN civicrm_case_type c_type + ON civicrm_case.case_type_id = c_type.id LEFT JOIN civicrm_option_group cog_status ON cog_status.name = 'case_status' @@ -684,7 +694,7 @@ LEFT JOIN civicrm_option_group aog ON aog.name='activity_type' elseif ($type == 'recent') { $query .= " ORDER BY case_recent_activity_date ASC "; } - elseif ( $type == 'any' ) { + elseif ($type == 'any') { $query .= " ORDER BY case_activity_date ASC "; } @@ -695,18 +705,19 @@ LEFT JOIN civicrm_option_group aog ON aog.name='activity_type' * Retrieve cases related to particular contact or whole contact * used in Dashboad and Tab * - * @param boolean $allCases + * @param bool $allCases * * @param int $userID * - * @param String $type /upcoming,recent,all/ + * @param string $type + * /upcoming,recent,all/. * - * @return array Array of Cases - * - * @access public + * @param string $context * + * @return array + * Array of Cases */ - static function getCases($allCases = TRUE, $userID = NULL, $type = 'upcoming', $context = 'dashboard') { + public static function getCases($allCases = TRUE, $userID = NULL, $type = 'upcoming', $context = 'dashboard') { $condition = NULL; $casesList = array(); @@ -725,13 +736,12 @@ LEFT JOIN civicrm_option_group aog ON aog.name='activity_type' $allCases = FALSE; } - $condition = " AND civicrm_case.is_deleted = 0 "; if (!$allCases) { $condition .= " AND case_relationship.contact_id_b = {$userID} "; } - if ( $type == 'upcoming' || $type == 'any' ) { + if ($type == 'upcoming' || $type == 'any') { $closedId = CRM_Core_OptionGroup::getValue('case_status', 'Closed', 'name'); $condition .= " AND civicrm_case.status_id != $closedId"; @@ -754,7 +764,7 @@ AND civicrm_case.status_id != $closedId"; 'case_id', 'case_subject', 'case_type', - 'case_type_name', + 'case_type_id', 'status_id', 'case_status', 'case_status_name', @@ -775,7 +785,7 @@ AND civicrm_case.status_id != $closedId"; $resultFields[] = 'case_recent_activity_type'; $resultFields[] = 'case_recent_activity_id'; } - elseif ( $type == 'any' ) { + elseif ($type == 'any') { $resultFields[] = 'case_activity_date'; $resultFields[] = 'case_activity_type_name'; $resultFields[] = 'case_activity_type'; @@ -785,7 +795,6 @@ AND civicrm_case.status_id != $closedId"; // we're going to use the usual actions, so doesn't make sense to duplicate definitions $actions = CRM_Case_Selector_Search::links(); - // check is the user has view/edit signer permission $permissions = array(CRM_Core_Permission::VIEW); if (CRM_Core_Permission::check('access all cases and activities') || @@ -802,15 +811,19 @@ AND civicrm_case.status_id != $closedId"; foreach ($resultFields as $donCare => $field) { $casesList[$result->case_id][$field] = $result->$field; if ($field == 'contact_type') { - $casesList[$result->case_id]['contact_type_icon'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? - $result->contact_sub_type : $result->contact_type + $casesList[$result->case_id]['contact_type_icon'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? $result->contact_sub_type : $result->contact_type ); $casesList[$result->case_id]['action'] = CRM_Core_Action::formLink($actions['primaryActions'], $mask, array( 'id' => $result->case_id, 'cid' => $result->contact_id, 'cxt' => $context, - ) + ), + ts('more'), + FALSE, + 'case.actions.primary', + 'Case', + $result->case_id ); $casesList[$result->case_id]['moreActions'] = CRM_Core_Action::formLink($actions['moreActions'], $mask, @@ -820,7 +833,10 @@ AND civicrm_case.status_id != $closedId"; 'cxt' => $context, ), ts('more'), - TRUE + TRUE, + 'case.actions.more', + 'Case', + $result->case_id ); } elseif ($field == 'case_status') { @@ -833,7 +849,8 @@ AND civicrm_case.status_id != $closedId"; } } //CRM-4510. - $caseManagerContact = self::getCaseManagerContact($result->case_type_name, $result->case_id); + $caseTypes = CRM_Case_PseudoConstant::caseType('name'); + $caseManagerContact = self::getCaseManagerContact($caseTypes[$result->case_type_id], $result->case_id); if (!empty($caseManagerContact)) { $casesList[$result->case_id]['casemanager_id'] = CRM_Utils_Array::value('casemanager_id', $caseManagerContact); $casesList[$result->case_id]['casemanager'] = CRM_Utils_Array::value('casemanager', $caseManagerContact); @@ -858,9 +875,13 @@ AND civicrm_case.status_id != $closedId"; } /** - * Function to get the summary of cases counts by type and status. + * Get the summary of cases counts by type and status. + * + * @param bool $allCases + * @param int $userID + * @return array */ - static function getCasesSummary($allCases = TRUE, $userID) { + public static function getCasesSummary($allCases = TRUE, $userID) { $caseSummary = array(); //validate access for civicase. @@ -900,15 +921,11 @@ AND civicrm_case.status_id != $closedId"; $myGroupByClause = " GROUP BY CONCAT(case_relationship.case_id,'-',case_relationship.contact_id_b)"; } - $seperator = CRM_Core_DAO::VALUE_SEPARATOR; - $query = " -SELECT case_status.label AS case_status, status_id, case_type.label AS case_type, - REPLACE(case_type_id,'{$seperator}','') AS case_type_id, case_relationship.contact_id_b +SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS case_type, + case_type_id, case_relationship.contact_id_b FROM civicrm_case - LEFT JOIN civicrm_option_group option_group_case_type ON ( option_group_case_type.name = 'case_type' ) - LEFT JOIN civicrm_option_value case_type ON ( civicrm_case.case_type_id = case_type.value - AND option_group_case_type.id = case_type.option_group_id ) + LEFT JOIN civicrm_case_type ON civicrm_case.case_type_id = civicrm_case_type.id LEFT JOIN civicrm_option_group option_group_case_status ON ( option_group_case_status.name = 'case_status' ) LEFT JOIN civicrm_option_value case_status ON ( civicrm_case.status_id = case_status.value AND option_group_case_status.id = case_status.option_group_id ) @@ -919,7 +936,7 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type $res = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray); while ($res->fetch()) { - if (CRM_Utils_Array::value($res->case_type, $rows) && CRM_Utils_Array::value($res->case_status, $rows[$res->case_type])) { + if (!empty($rows[$res->case_type]) && !empty($rows[$res->case_type][$res->case_status])) { $rows[$res->case_type][$res->case_status]['count'] = $rows[$res->case_type][$res->case_status]['count'] + 1; } else { @@ -937,15 +954,19 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to get Case roles + * Get Case roles * - * @param int $contactID contact id - * @param int $caseID case id - * @return returns case role / relationships + * @param int $contactID + * Contact id. + * @param int $caseID + * Case id. + * @param int $relationshipID + * + * @return array + * case role / relationships * - * @static */ - static function getCaseRoles($contactID, $caseID, $relationshipID = NULL) { + public static function getCaseRoles($contactID, $caseID, $relationshipID = NULL) { $query = ' SELECT civicrm_relationship.id as civicrm_relationship_id, civicrm_contact.sort_name as sort_name, @@ -962,7 +983,6 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type LEFT JOIN civicrm_email ON (civicrm_email.contact_id = civicrm_contact.id ) WHERE civicrm_relationship.contact_id_a = %1 AND civicrm_relationship.case_id = %2'; - $params = array( 1 => array($contactID, 'Positive'), 2 => array($caseID, 'Positive'), @@ -992,17 +1012,24 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to get Case Activities + * Get Case Activities * - * @param int $caseID case id - * @param array $params posted params - * @param int $contactID contact id + * @param int $caseID + * Case id. + * @param array $params + * Posted params. + * @param int $contactID + * Contact id. * - * @return returns case activities + * @param null $context + * @param int $userID + * @param null $type + * + * @return array + * Array of case activities * - * @static */ - static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL) { + public static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL) { $values = array(); $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); @@ -1049,29 +1076,29 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type $where = 'WHERE cca.case_id= %1 AND ca.is_current_revision = 1'; - if (CRM_Utils_Array::value('reporter_id', $params)) { + if (!empty($params['reporter_id'])) { $where .= " AND cac.contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer'); } - if (CRM_Utils_Array::value('status_id', $params)) { + if (!empty($params['status_id'])) { $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer'); } - if (CRM_Utils_Array::value('activity_deleted', $params)) { + if (!empty($params['activity_deleted'])) { $where .= " AND ca.is_deleted = 1"; } else { $where .= " AND ca.is_deleted = 0"; } - if (CRM_Utils_Array::value('activity_type_id', $params)) { + if (!empty($params['activity_type_id'])) { $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer'); } - if (CRM_Utils_Array::value('activity_date_low', $params)) { + if (!empty($params['activity_date_low'])) { $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date'); } - if (CRM_Utils_Array::value('activity_date_high', $params)) { + if (!empty($params['activity_date_high'])) { $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date'); $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : NULL; } @@ -1135,7 +1162,6 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type //EXIT; $dao = CRM_Core_DAO::executeQuery($query, $params); - $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $activityPriority = CRM_Core_PseudoConstant::get('CRM_Activity_DAO_Activity', 'priority_id'); @@ -1151,8 +1177,8 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type $editUrl = "{$url}&action=update{$contextUrl}"; $deleteUrl = "{$url}&action=delete{$contextUrl}"; $restoreUrl = "{$url}&action=renew{$contextUrl}"; - $viewTitle = ts('View this activity.'); - $statusTitle = ts('Edit status'); + $viewTitle = ts('View activity'); + $statusTitle = ts('Edit Status'); $emailActivityTypeIDs = array( 'Email' => CRM_Core_OptionGroup::getValue('activity_type', @@ -1236,7 +1262,8 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type //check for view activity. $subject = (empty($dao->subject)) ? '(' . ts('no subject') . ')' : $dao->subject; if ($allowView) { - $subject = '' . $subject . ''; + $url = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $dao->id)); + $subject = '' . $subject . ''; } $values[$dao->id]['subject'] = $subject; @@ -1252,34 +1279,33 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type $values[$dao->id]['reporter'] .= ' / ' . ts('(multiple)'); } } + // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup. $url = ""; + $css = 'class="action-item crm-hover-button"'; $additionalUrl = "&id={$dao->id}"; if (!$dao->deleted) { //hide edit link of activity type email.CRM-4530. if (!in_array($dao->type, $emailActivityTypeIDs)) { //hide Edit link if activity type is NOT editable (special case activities).CRM-5871 if ($allowEdit) { - $url = '' . ts('Edit') . ' '; + $url = '' . ts('Edit') . ' '; } } if ($allowDelete) { - if (!empty($url)) { - $url .= " | "; - } - $url .= '' . ts('Delete') . ''; + $url .= ' ' . ts('Delete') . ''; } } elseif (!$caseDeleted) { - $url = '' . ts('Restore') . ''; + $url = ' ' . ts('Restore') . ''; $values[$dao->id]['status'] = $values[$dao->id]['status'] . '
(deleted)'; } //check for operations. if (self::checkPermission($dao->id, 'Move To Case', $dao->activity_type_id)) { - $url .= " | " . '' . ts('Move To Case') . ' '; + $url .= ' ' . ts('Move To Case') . ' '; } if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) { - $url .= " | " . '' . ts('Copy To Case') . ' '; + $url .= ' ' . ts('Copy To Case') . ' '; } // if there are file attachments we will return how many and, if only one, add a link to it if (!empty($dao->attachment_ids)) { @@ -1294,11 +1320,10 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type NULL, FALSE ); - $url .= " | " . "" . ts('View Attachment') . ' '; + $url .= " "; } } - $values[$dao->id]['links'] = $url; $values[$dao->id]['class'] = ""; @@ -1324,7 +1349,7 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } if ($allowEdit) { - $values[$dao->id]['status'] = '' . $values[$dao->id]['status'] . ''; + $values[$dao->id]['status'] = '
' . $values[$dao->id]['status'] . '
'; } } $dao->free(); @@ -1333,24 +1358,31 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to get Case Related Contacts + * Get Case Related Contacts * - * @param int $caseID case id - * @param boolean $skipDetails if true include details of contacts + * @param int $caseID + * Case id. + * @param bool $skipDetails + * If true include details of contacts. * - * @return returns $searchRows array of returnproperties + * @return array + * array of return properties * - * @static */ - static function getRelatedContacts($caseID, $skipDetails = FALSE) { + public static function getRelatedContacts($caseID, $skipDetails = FALSE) { $values = array(); - $query = 'SELECT cc.display_name as name, cc.sort_name as sort_name, cc.id, crt.label_b_a as role, ce.email - FROM civicrm_relationship cr - LEFT JOIN civicrm_relationship_type crt ON crt.id = cr.relationship_type_id - LEFT JOIN civicrm_contact cc ON cc.id = cr.contact_id_b - LEFT JOIN civicrm_email ce ON ce.contact_id = cc.id - WHERE cr.case_id = %1 AND ce.is_primary= 1 - GROUP BY cc.id'; + $query = ' + SELECT cc.display_name as name, cc.sort_name as sort_name, cc.id, crt.label_b_a as role, ce.email + FROM civicrm_relationship cr + LEFT JOIN civicrm_relationship_type crt + ON crt.id = cr.relationship_type_id + LEFT JOIN civicrm_contact cc + ON cc.id = cr.contact_id_b + LEFT JOIN civicrm_email ce + ON ce.contact_id = cc.id + AND ce.is_primary= 1 + WHERE cr.case_id = %1 + GROUP BY cc.id'; $params = array(1 => array($caseID, 'Integer')); $dao = CRM_Core_DAO::executeQuery($query, $params); @@ -1375,15 +1407,20 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function that sends e-mail copy of activity + * Send e-mail copy of activity * - * @param int $activityId activity Id - * @param array $contacts array of related contact + * @param int $clientId + * @param int $activityId + * Activity Id. + * @param array $contacts + * Array of related contact. + * + * @param null $attachments + * @param int $caseId * * @return void - * @access public */ - static function sendActivityCopy($clientId, $activityId, $contacts, $attachments = NULL, $caseId) { + public static function sendActivityCopy($clientId, $activityId, $contacts, $attachments = NULL, $caseId) { if (!$activityId) { return; } @@ -1393,7 +1430,7 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type if ($caseId) { $activityTypeId = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityId, 'activity_type_id'); $nonCaseActivityTypes = CRM_Core_PseudoConstant::activityType(); - if (CRM_Utils_Array::value($activityTypeId, $nonCaseActivityTypes)) { + if (!empty($nonCaseActivityTypes[$activityTypeId])) { $anyActivity = TRUE; } else { @@ -1516,15 +1553,14 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type * Retrieve count of activities having a particular type, and * associated with a particular case. * - * @param int $caseId ID of the case - * @param int $activityTypeId ID of the activity type + * @param int $caseId + * ID of the case. + * @param int $activityTypeId + * ID of the activity type. * * @return array - * - * @access public - * */ - static function getCaseActivityCount($caseId, $activityTypeId) { + public static function getCaseActivityCount($caseId, $activityTypeId) { $queryParam = array( 1 => array($caseId, 'Integer'), 2 => array($activityTypeId, 'Integer'), @@ -1547,14 +1583,13 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type /** * Create an activity for a case via email * - * @param int $file email sent - * - * @return $activity object of newly creted activity via email - * - * @access public + * @param int $file + * Email sent. * + * @return array|void + * $activity object of newly creted activity via email */ - static function recordActivityViaEmail($file) { + public static function recordActivityViaEmail($file) { if (!file_exists($file) || !is_readable($file) ) { @@ -1591,7 +1626,7 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type // (Or for efficiency call the global one outside the loop and then union with this each time.) $contactDetails = self::getRelatedContacts($caseId, TRUE); - if (CRM_Utils_Array::value($result['from']['id'], $contactDetails)) { + if (!empty($contactDetails[$result['from']['id']])) { $params = array(); $params['subject'] = $result['subject']; $params['activity_date_time'] = $result['date']; @@ -1636,17 +1671,19 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to retrieve the scheduled activity type and date + * Retrieve the scheduled activity type and date + * + * @param array $cases + * Array of contact and case id. * - * @param array $cases Array of contact and case id + * @param string $type * - * @return array $activityInfo Array of scheduled activity type and date + * @return array + * Array of scheduled activity type and date * - * @access public * - * @static */ - static function getNextScheduledActivity($cases, $type = 'upcoming') { + public static function getNextScheduledActivity($cases, $type = 'upcoming') { $session = CRM_Core_Session::singleton(); $userID = $session->get('userID'); @@ -1678,13 +1715,12 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * combine all the exportable fields from the lower levels object + * Combine all the exportable fields from the lower levels object * - * @return array array of exportable Fields - * @access public - * @static + * @return array + * array of exportable Fields */ - static function &exportableFields() { + public static function &exportableFields() { if (!self::$_exportableFields) { if (!self::$_exportableFields) { self::$_exportableFields = array(); @@ -1709,13 +1745,12 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type /** * Restore the record that are associated with this case * - * @param int $caseId id of the case to restore + * @param int $caseId + * Id of the case to restore. * - * @return true if success. - * @access public - * @static + * @return bool */ - static function restoreCase($caseId) { + public static function restoreCase($caseId) { //restore activities $activities = self::getCaseActivityDates($caseId); if ($activities) { @@ -1734,7 +1769,17 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type return TRUE; } - static function getGlobalContacts(&$groupInfo, $sort = NULL, $showLinks = NULL, $returnOnlyCount = FALSE, $offset = 0, $rowCount = 25) { + /** + * @param $groupInfo + * @param null $sort + * @param null $showLinks + * @param bool $returnOnlyCount + * @param int $offset + * @param int $rowCount + * + * @return array + */ + public static function getGlobalContacts(&$groupInfo, $sort = NULL, $showLinks = NULL, $returnOnlyCount = FALSE, $offset = 0, $rowCount = 25) { $globalContacts = array(); $settingsProcessor = new CRM_Case_XMLProcessor_Settings(); @@ -1749,9 +1794,8 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type $groupInfo['id'] = $results['id']; $groupInfo['title'] = $results['title']; $params = array(array('group', 'IN', array($groupInfo['id'] => 1), 0, 0)); - $return = array('sort_name' => 1, 'display_name' => 1, 'email' => 1, 'phone' => 1); $return = array('contact_id' => 1, 'sort_name' => 1, 'display_name' => 1, 'email' => 1, 'phone' => 1); - list($globalContacts, $_) = CRM_Contact_BAO_Query::apiQuery($params, $return, NULL, $sort, $offset, $rowCount, TRUE, $returnOnlyCount); + list($globalContacts) = CRM_Contact_BAO_Query::apiQuery($params, $return, NULL, $sort, $offset, $rowCount, TRUE, $returnOnlyCount); if ($returnOnlyCount) { return $globalContacts; @@ -1759,7 +1803,7 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type if ($showLinks) { foreach ($globalContacts as $idx => $contact) { - $globalContacts[$idx]['sort_name'] = '' . $contact['sort_name'] . ''; + $globalContacts[$idx]['sort_name'] = '' . $contact['sort_name'] . ''; } } } @@ -1768,10 +1812,13 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type return $globalContacts; } - /* + /** * Convenience function to get both case contacts and global in one array + * @param int $caseId + * + * @return array */ - static function getRelatedAndGlobalContacts($caseId) { + public static function getRelatedAndGlobalContacts($caseId) { $relatedContacts = self::getRelatedContacts($caseId); $groupInfo = array(); @@ -1791,33 +1838,36 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to get Case ActivitiesDueDates with given criteria. + * Get Case ActivitiesDueDates with given criteria. * - * @param int $caseID case id - * @param array $criteriaParams given criteria - * @param boolean $latestDate if set newest or oldest date is selceted. + * @param int $caseID + * Case id. + * @param array $criteriaParams + * Given criteria. + * @param bool $latestDate + * If set newest or oldest date is selected. * - * @return returns case activities due dates + * @return array + * case activities due dates * - * @static */ - static function getCaseActivityDates($caseID, $criteriaParams = array(), $latestDate = FALSE) { + public static function getCaseActivityDates($caseID, $criteriaParams = array(), $latestDate = FALSE) { $values = array(); $selectDate = " ca.activity_date_time"; $where = $groupBy = ' '; if (!$caseID) { - return; + return NULL; } if ($latestDate) { - if (CRM_Utils_Array::value('activity_type_id', $criteriaParams)) { + if (!empty($criteriaParams['activity_type_id'])) { $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($criteriaParams['activity_type_id'], 'Integer'); $where .= " AND ca.is_current_revision = 1"; $groupBy .= " GROUP BY ca.activity_type_id"; } - if (CRM_Utils_Array::value('newest', $criteriaParams)) { + if (!empty($criteriaParams['newest'])) { $selectDate = " max(ca.activity_date_time) "; } else { @@ -1842,17 +1892,20 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to create activities when Case or Other roles assigned/modified/deleted. + * Create activities when Case or Other roles assigned/modified/deleted. * - * @param int $caseID case id - * @param int $relationshipId relationship id - * @param int $relContactId case role assignee contactId. + * @param int $caseId + * @param int $relationshipId + * Relationship id. + * @param int $relContactId + * Case role assignee contactId. + * @param int $contactId * - * @return void on success creates activity and case activity + * @return void + * on success creates activity and case activity * - * @static */ - static function createCaseRoleActivity($caseId, $relationshipId, $relContactId = NULL, $contactId = NULL) { + public static function createCaseRoleActivity($caseId, $relationshipId, $relContactId = NULL, $contactId = NULL) { if (!$caseId || !$relationshipId || empty($relationshipId)) { return; } @@ -1934,19 +1987,21 @@ SELECT case_status.label AS case_status, status_id, case_type.label AS case_type } /** - * Function to get case manger + * Get case manger * contact which is assigned a case role of case manager. * - * @param int $caseType case type - * @param int $caseId case id + * @param int $caseType + * Case type. + * @param int $caseId + * Case id. * - * @return array $caseManagerContact array of contact on success otherwise empty + * @return array + * array of contact on success otherwise empty * - * @static */ - static function getCaseManagerContact($caseType, $caseId) { + public static function getCaseManagerContact($caseType, $caseId) { if (!$caseType || !$caseId) { - return; + return NULL; } $caseManagerContact = array(); @@ -1981,19 +2036,27 @@ SELECT civicrm_contact.id as casemanager_id, /** * Get all cases with no end dates * - * @return array of case and related data keyed on case id + * @param array $params + * @param array $excludeCaseIds + * @param bool $excludeDeleted + * + * @return array + * case and related data keyed on case id */ - static function getUnclosedCases($params = array(), $excludeCaseIds = array(), $excludeDeleted = TRUE) { + public static function getUnclosedCases($params = array(), $excludeCaseIds = array(), $excludeDeleted = TRUE, $includeClosed = FALSE) { //params from ajax call. - $where = array('( ca.end_date is null )'); + $where = array($includeClosed ? '(1)' : '(ca.end_date is null)'); if ($caseType = CRM_Utils_Array::value('case_type', $params)) { - $where[] = "( ov.label LIKE '%$caseType%' )"; + $where[] = "( civicrm_case_type.title LIKE '%$caseType%' )"; } if ($sortName = CRM_Utils_Array::value('sort_name', $params)) { $config = CRM_Core_Config::singleton(); $search = ($config->includeWildCardInName) ? "%$sortName%" : "$sortName%"; $where[] = "( sort_name LIKE '$search' )"; } + if ($cid = CRM_Utils_Array::value('contact_id', $params)) { + $where[] = " c.id = $cid "; + } if (is_array($excludeCaseIds) && !CRM_Utils_System::isNull($excludeCaseIds) ) { @@ -2023,17 +2086,20 @@ SELECT civicrm_contact.id as casemanager_id, c.sort_name, ca.id, ca.subject as case_subject, - ov.label as case_type, - ca.start_date as start_date + civicrm_case_type.title as case_type, + ca.start_date as start_date, + ca.end_date as end_date, + ca.status_id FROM civicrm_case ca INNER JOIN civicrm_case_contact cc ON ca.id=cc.case_id INNER JOIN civicrm_contact c ON cc.contact_id=c.id - INNER JOIN civicrm_option_group og ON og.name='case_type' - INNER JOIN civicrm_option_value ov ON (ca.case_type_id=ov.value AND ov.option_group_id=og.id) + INNER JOIN civicrm_case_type ON ca.case_type_id = civicrm_case_type.id WHERE {$whereClause} - ORDER BY c.sort_name + ORDER BY c.sort_name, ca.end_date {$limitClause} "; $dao = CRM_Core_DAO::executeQuery($query); + $statuses = CRM_Case_BAO_Case::buildOptions('status_id', 'create'); + $unclosedCases = array(); while ($dao->fetch()) { if ($doFilterCases && !array_key_exists($dao->id, $filterCases)) { @@ -2044,7 +2110,9 @@ SELECT civicrm_contact.id as casemanager_id, 'case_type' => $dao->case_type, 'contact_id' => $dao->contact_id, 'start_date' => $dao->start_date, + 'end_date' => $dao->end_date, 'case_subject' => $dao->case_subject, + 'case_status' => $statuses[$dao->status_id], ); } $dao->free(); @@ -2052,7 +2120,13 @@ SELECT civicrm_contact.id as casemanager_id, return $unclosedCases; } - static function caseCount($contactId = NULL, $excludeDeleted = TRUE) { + /** + * @param int $contactId + * @param bool $excludeDeleted + * + * @return null|string + */ + public static function caseCount($contactId = NULL, $excludeDeleted = TRUE) { $whereConditions = array(); if ($excludeDeleted) { $whereConditions[] = "( civicrm_case.is_deleted = 0 OR civicrm_case.is_deleted IS NULL )"; @@ -2090,14 +2164,14 @@ LEFT JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.case /** * Retrieve cases related to particular contact. * - * @param int $contactId contact id - * @param boolean $excludeDeleted do not include deleted cases. - * - * @return an array of cases. + * @param int $contactId + * Contact id. + * @param bool $excludeDeleted + * Do not include deleted cases. * - * @access public + * @return array */ - static function getContactCases($contactId, $excludeDeleted = TRUE) { + public static function getContactCases($contactId, $excludeDeleted = TRUE) { $cases = array(); if (!$contactId) { return $cases; @@ -2109,12 +2183,10 @@ LEFT JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.case } $query = " - SELECT civicrm_case.id, case_type_ov.label as case_type, civicrm_case.start_date + SELECT civicrm_case.id, civicrm_case_type.title as case_type, civicrm_case.start_date FROM civicrm_case INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.case_id ) - LEFT JOIN civicrm_option_group case_type_og ON ( case_type_og.name = 'case_type' ) - LEFT JOIN civicrm_option_value case_type_ov ON ( civicrm_case.case_type_id = case_type_ov.value - AND case_type_og.id = case_type_ov.option_group_id ) + LEFT JOIN civicrm_case_type ON civicrm_case.case_type_id = civicrm_case_type.id WHERE {$whereClause}"; $dao = CRM_Core_DAO::executeQuery($query, array(1 => array($contactId, 'Integer'))); @@ -2133,15 +2205,16 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas /** * Retrieve related cases for give case. * - * @param int $mainCaseId id of main case - * @param int $contactId id of contact - * @param boolean $excludeDeleted do not include deleted cases. - * - * @return an array of related cases. + * @param int $mainCaseId + * Id of main case. + * @param int $contactId + * Id of contact. + * @param bool $excludeDeleted + * Do not include deleted cases. * - * @access public + * @return array */ - static function getRelatedCases($mainCaseId, $contactId, $excludeDeleted = TRUE) { + public static function getRelatedCases($mainCaseId, $contactId, $excludeDeleted = TRUE) { //FIXME : do check for permissions. $relatedCases = array(); @@ -2203,15 +2276,13 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas //2. fetch the details of related cases. $query = " SELECT relCase.id as id, - case_type_ov.label as case_type, + civicrm_case_type.title as case_type, client.display_name as client_name, client.id as client_id FROM civicrm_case relCase INNER JOIN civicrm_case_contact relCaseContact ON ( relCase.id = relCaseContact.case_id ) INNER JOIN civicrm_contact client ON ( client.id = relCaseContact.contact_id ) - LEFT JOIN civicrm_option_group case_type_og ON ( case_type_og.name = 'case_type' ) - LEFT JOIN civicrm_option_value case_type_ov ON ( relCase.case_type_id = case_type_ov.value - AND case_type_og.id = case_type_ov.option_group_id ) + LEFT JOIN civicrm_case_type ON relCase.case_type_id = civicrm_case_type.id WHERE {$whereClause}"; $dao = CRM_Core_DAO::executeQuery($query); @@ -2223,7 +2294,7 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas if (!$doFilterCases || array_key_exists($dao->id, $filterCases)) { $caseViewStr = "reset=1&id={$dao->id}&cid={$dao->client_id}&action=view&context=case&selectedChild=case"; $caseViewUrl = CRM_Utils_System::url("civicrm/contact/view/case", $caseViewStr); - $caseView = "" . ts('View Case') . ""; + $caseView = "" . ts('View Case') . ""; } $clientView = $dao->client_name; if ($hasViewContact) { @@ -2249,7 +2320,7 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas * * TODO: use the 3rd $sqls param to append sql statements rather than executing them here */ - static function mergeContacts($mainContactId, $otherContactId) { + public static function mergeContacts($mainContactId, $otherContactId) { self::mergeCases($mainContactId, NULL, $otherContactId); } @@ -2258,16 +2329,22 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas * 1. Merge two duplicate contacts cases - follow CRM-5758 rules. * 2. Merge two cases of same contact - follow CRM-5598 rules. * - * @param int $mainContactId contact id of main contact record. - * @param int $mainCaseId case id of main case record. - * @param int $otherContactId contact id of record which is going to merge. - * @param int $otherCaseId case id of record which is going to merge. + * @param int $mainContactId + * Contact id of main contact record. + * @param int $mainCaseId + * Case id of main case record. + * @param int $otherContactId + * Contact id of record which is going to merge. + * @param int $otherCaseId + * Case id of record which is going to merge. + * + * @param bool $changeClient * - * @return void. - * @static + * @return int|NULL */ - static function mergeCases($mainContactId, $mainCaseId = NULL, $otherContactId = NULL, - $otherCaseId = NULL, $changeClient = FALSE) { + public static function mergeCases( + $mainContactId, $mainCaseId = NULL, $otherContactId = NULL, + $otherCaseId = NULL, $changeClient = FALSE) { $moveToTrash = TRUE; $duplicateContacts = FALSE; @@ -2313,6 +2390,8 @@ INNER JOIN civicrm_case_contact ON ( civicrm_case.id = civicrm_case_contact.cas $session = CRM_Core_Session::singleton(); $currentUserId = $session->get('userID'); + CRM_Utils_Hook::pre_case_merge($mainContactId, $mainCaseId, $otherContactId, $otherCaseId, $changeClient); + // copy all cases and connect to main contact id. foreach ($processCaseIds as $otherCaseId) { if ($duplicateContacts) { @@ -2602,7 +2681,7 @@ SELECT id 1 => $otherCaseId, 2 => $otherContactDisplayName, 3 => $mainContactDisplayName, - 4 => $mainCaseId + 4 => $mainCaseId, ) ); } @@ -2613,7 +2692,7 @@ SELECT id 1 => $otherCaseId, 2 => $otherContactId, 3 => $mainContactId, - 4 => $mainCaseId + 4 => $mainCaseId, ) ); } @@ -2661,6 +2740,9 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; self::processCaseActivity($mergeCaseAct); } + + CRM_Utils_Hook::post_case_merge($mainContactId, $mainCaseId, $otherContactId, $otherCaseId, $changeClient); + return $mainCaseIds; } @@ -2668,18 +2750,19 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; * Validate contact permission for * edit/view on activity record and build links. * - * @param array $tplParams params to be sent to template for sending email. - * @param array $activityParams info of the activity. + * @param array $tplParams + * Params to be sent to template for sending email. + * @param array $activityParams + * Info of the activity. * * @return void - * @static */ - static function buildPermissionLinks(&$tplParams, $activityParams) { + public static function buildPermissionLinks(&$tplParams, $activityParams) { $activityTypeId = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityParams['source_record_id'], 'activity_type_id', 'id' ); - if (CRM_Utils_Array::value('isCaseActivity', $tplParams)) { + if (!empty($tplParams['isCaseActivity'])) { $tplParams['editActURL'] = CRM_Utils_System::url('civicrm/case/activity', "reset=1&cid={$activityParams['target_id']}&caseid={$activityParams['case_id']}&action=update&id={$activityParams['source_record_id']}", TRUE ); @@ -2707,16 +2790,20 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; * 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 + * @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 bool $checkComponent + * Do we need to check component enabled. + * + * @return bool */ - static function checkPermission($activityId, $operation, $actTypeId = NULL, $contactId = NULL, $checkComponent = TRUE) { + public 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'); @@ -2727,18 +2814,8 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } //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; - } + if ($checkComponent && !self::enabled()) { + return $allow; } //do check for cases. @@ -2806,7 +2883,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; //need to check activity object specific. if (in_array($operation, array( 'view', - 'edit' + 'edit', )) ) { //do we have supper permission. @@ -2892,7 +2969,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; 'Link Cases', 'Assign Case Role', 'Email', - 'Inbound Email' + 'Inbound Email', ); //do not allow to delete these activities, CRM-4543 @@ -2910,7 +2987,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; 'Reassigned Case', 'Merge Case', 'Link Cases', - 'Assign Case Role' + 'Assign Case Role', ); if (in_array($actTypeName, $singletonNames)) { @@ -2962,20 +3039,12 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * since we drop 'access CiviCase', allow access + * Since we drop 'access CiviCase', allow access * if user has 'access my cases and activities' * or 'access all cases and activities' */ - static function accessCiviCase() { - static $componentEnabled; - if (!isset($componentEnabled)) { - $componentEnabled = FALSE; - $config = CRM_Core_Config::singleton(); - if (in_array('CiviCase', $config->enableComponents)) { - $componentEnabled = TRUE; - } - } - if (!$componentEnabled) { + public static function accessCiviCase() { + if (!self::enabled()) { return FALSE; } @@ -2989,13 +3058,63 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to check whether activity is a case Activity + * Verify user has permission to access a case + * + * @param int $caseId + * @param bool $denyClosed + * Set TRUE if one wants closed cases to be treated as inaccessible. + * + * @return bool + */ + public static function accessCase($caseId, $denyClosed = TRUE) { + if (!$caseId || !self::enabled()) { + return FALSE; + } + + // This permission always has access + if (CRM_Core_Permission::check('access all cases and activities')) { + return TRUE; + } + + // This permission is required at minimum + if (!CRM_Core_Permission::check('access my cases and activities')) { + return FALSE; + } + + $session = CRM_Core_Session::singleton(); + $userID = CRM_Utils_Type::validate($session->get('userID'), 'Positive'); + $caseId = CRM_Utils_Type::validate($caseId, 'Positive'); + + $condition = " AND civicrm_case.is_deleted = 0 "; + $condition .= " AND case_relationship.contact_id_b = {$userID} "; + $condition .= " AND civicrm_case.id = {$caseId}"; + + if ($denyClosed) { + $closedId = CRM_Core_OptionGroup::getValue('case_status', 'Closed', 'name'); + $condition .= " AND civicrm_case.status_id != $closedId"; + } + + // We don't actually care about activities in the case, but the underlying + // query is verbose, and this allows us to share the basic query with + // getCases(). $type=='any' means that activities will be left-joined. + $query = self::getCaseActivityQuery('any', $userID, $condition); + $queryParams = array(); + $dao = CRM_Core_DAO::executeQuery($query, + $queryParams + ); + + return (bool) $dao->fetch(); + } + + /** + * Check whether activity is a case Activity * - * @param int $activityID activity id + * @param int $activityID + * Activity id. * - * @return boolean $isCaseActivity true/false + * @return bool */ - static function isCaseActivity($activityID) { + public static function isCaseActivity($activityID) { $isCaseActivity = FALSE; if ($activityID) { $params = array(1 => array($activityID, 'Integer')); @@ -3009,12 +3128,11 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to get all the case type ids currently in use - * + * Get all the case type ids currently in use * - * @return array $caseTypeIds + * @return array */ - static function getUsedCaseType() { + public static function getUsedCaseType() { static $caseTypeIds; if (!is_array($caseTypeIds)) { @@ -3034,12 +3152,11 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to get all the case status ids currently in use - * + * Get all the case status ids currently in use * - * @return array $caseStatusIds + * @return array */ - static function getUsedCaseStatuses() { + public static function getUsedCaseStatuses() { static $caseStatusIds; if (!is_array($caseStatusIds)) { @@ -3056,10 +3173,11 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to get all the encounter medium ids currently in use + * Get all the encounter medium ids currently in use + * * @return array */ - static function getUsedEncounterMediums() { + public static function getUsedEncounterMediums() { static $mediumIds; if (!is_array($mediumIds)) { @@ -3076,11 +3194,13 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to check case configuration. + * Check case configuration. * - * @return array $configured + * @param int $contactId + * + * @return array */ - static function isCaseConfigured($contactId = NULL) { + public static function isCaseConfigured($contactId = NULL) { $configured = array_fill_keys(array('configured', 'allowToAddNewCase', 'redirectToCaseAdmin'), FALSE); //lets check for case configured. @@ -3088,7 +3208,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; $configured['configured'] = ($allCasesCount) ? TRUE : FALSE; if (!$configured['configured']) { //do check for case type and case status. - $caseTypes = CRM_Case_PseudoConstant::caseType('label', FALSE); + $caseTypes = CRM_Case_PseudoConstant::caseType('title', FALSE); if (!empty($caseTypes)) { $configured['configured'] = TRUE; if (!$configured['configured']) { @@ -3125,38 +3245,33 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; /** * Used during case component enablement and during ugprade + * + * @return bool */ - static function createCaseViews() { + public static function createCaseViews() { + $errorScope = CRM_Core_TemporaryErrorScope::ignoreException(); $dao = new CRM_Core_DAO(); $sql = self::createCaseViewsQuery('upcoming'); - CRM_Core_Error::ignoreException(); $dao->query($sql); - CRM_Core_Error::setCallback(); if (PEAR::getStaticProperty('DB_DataObject', 'lastError')) { return FALSE; } // Above error doesn't get caught? - CRM_Core_Error::ignoreException(); $doublecheck = $dao->singleValueQuery("SELECT count(id) FROM civicrm_view_case_activity_upcoming"); - CRM_Core_Error::setCallback(); if (is_null($doublecheck)) { return FALSE; } $sql = self::createCaseViewsQuery('recent'); - CRM_Core_Error::ignoreException(); $dao->query($sql); - CRM_Core_Error::setCallback(); if (PEAR::getStaticProperty('DB_DataObject', 'lastError')) { return FALSE; } // Above error doesn't get caught? - CRM_Core_Error::ignoreException(); $doublecheck = $dao->singleValueQuery("SELECT count(id) FROM civicrm_view_case_activity_recent"); - CRM_Core_Error::setCallback(); if (is_null($doublecheck)) { return FALSE; } @@ -3165,9 +3280,11 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * helper function, also used by the upgrade in case of error + * Helper function, also used by the upgrade in case of error + * + * @return string */ - static function createCaseViewsQuery($section = 'upcoming') { + public static function createCaseViewsQuery($section = 'upcoming') { $sql = ""; $scheduled_id = CRM_Core_OptionGroup::getValue('activity_status', 'Scheduled', 'name'); switch ($section) { @@ -3194,14 +3311,16 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to add/copy relationships, when new client is added for a case + * Add/copy relationships, when new client is added for a case * - * @param int $caseId case id - * @param int $contactId contact id / new client id + * @param int $caseId + * Case id. + * @param int $contactId + * Contact id / new client id. * * @return void */ - static function addCaseRelationships($caseId, $contactId) { + public static function addCaseRelationships($caseId, $contactId) { // get the case role / relationships for the case $caseRelationships = new CRM_Contact_DAO_Relationship(); $caseRelationships->case_id = $caseId; @@ -3234,14 +3353,14 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } /** - * Function to get the list of clients for a case + * Get the list of clients for a case * * @param int $caseId * - * @return array $clients associated array with client ids - * @static + * @return array + * associated array with client ids */ - static function getCaseClients($caseId) { + public static function getCaseClients($caseId) { $clients = array(); $caseContact = new CRM_Case_DAO_CaseContact(); $caseContact->case_id = $caseId; @@ -3258,9 +3377,13 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; * Get options for a given case field. * @see CRM_Core_DAO::buildOptions * - * @param String $fieldName - * @param String $context: @see CRM_Core_DAO::buildOptionsContext - * @param Array $props: whatever is known about this dao object + * @param string $fieldName + * @param string $context + * @see CRM_Core_DAO::buildOptionsContext + * @param array $props + * Whatever is known about this dao object. + * + * @return array|bool */ public static function buildOptions($fieldName, $context = NULL, $props = array()) { $className = __CLASS__; @@ -3273,5 +3396,5 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')'; } return CRM_Core_PseudoConstant::get($className, $fieldName, $params, $context); } -} +}