CRM-15759 - Use crmEditable for changing case activity status
[civicrm-core.git] / CRM / Case / BAO / Case.php
index e66d30d684ebd72cc494960b7ba194b2d1b97a4d..7df56b3dc3ed493b59e6f98c6574d96cabf2af15 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.4                                                |
+ | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013                                |
+ | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
  | This file is a part of CiviCRM.                                    |
  |                                                                    |
  | GNU Affero General Public License or the licensing of CiviCRM,     |
  | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
  +--------------------------------------------------------------------+
-*/
+ */
 
 /**
  *
  * @package CRM
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
  * $Id$
  *
  */
 class CRM_Case_BAO_Case extends CRM_Case_DAO_Case {
 
   /**
-   * static field for all the case information that we can potentially export
+   * Static field for all the case information that we can potentially export
    *
    * @var array
-   * @static
    */
   static $_exportableFields = NULL;
 
-  function __construct() {
+  /**
+   */
+  public function __construct() {
     parent::__construct();
   }
 
   /**
-   * takes an associative array and creates a case object
+   * Is CiviCase enabled?
+   *
+   * @return bool
+   */
+  public static function enabled() {
+    $config = CRM_Core_Config::singleton();
+    return in_array('CiviCase', $config->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 = '<a href="javascript:' . $type . 'viewActivity(' . $dao->id . ',' . $contactID . ',' . '\'' . $type . '\' );" title=\'' . $viewTitle . '\'>' . $subject . '</a>';
+        $url = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $dao->id));
+        $subject = '<a class="crm-popup medium-popup" href="' . $url . '" title="' . $viewTitle . '">' . $subject . '</a>';
       }
       $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 = '<a href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> ';
+            $url = '<a ' . $css . ' href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> ';
           }
         }
         if ($allowDelete) {
-          if (!empty($url)) {
-            $url .= " | ";
-          }
-          $url .= '<a href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>';
+          $url .= ' <a ' . str_replace('action-item', 'action-item small-popup', $css) . ' href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>';
         }
       }
       elseif (!$caseDeleted) {
-        $url = '<a href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
+        $url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
         $values[$dao->id]['status'] = $values[$dao->id]['status'] . '<br /> (deleted)';
       }
 
       //check for operations.
       if (self::checkPermission($dao->id, 'Move To Case', $dao->activity_type_id)) {
-        $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ' ); return false;">' . ts('Move To Case') . '</a> ';
+        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> ';
       }
       if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) {
-        $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ' ); return false;">' . ts('Copy To Case') . '</a> ';
+        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> ';
       }
       // 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 .= " | " . "<a href=$attachmentViewUrl >" . ts('View Attachment') . '</a> ';
+          $url .= " <a href='$attachmentViewUrl' ><span class='icon paper-icon'></span></a>";
         }
       }
 
-
       $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'] = '<a class="crm-activity-status crm-activity-status-' . $dao->id . ' ' . $values[$dao->id]['class'] . ' crm-activity-change-status crm-editable-enabled" activity_id=' . $dao->id . ' current_status=' . $dao->status . ' case_id=' . $caseID . ' href="#" title=\'' . $statusTitle . '\'>' . $values[$dao->id]['status'] . '</a>';
+        $values[$dao->id]['status'] = '<div class="crmf-status_id crm-activity-status-' . $dao->id . ' ' . $values[$dao->id]['class'] . ' crm-editable" data-type="select" data-action="create" data-refresh="true">' . $values[$dao->id]['status'] . '</div>';
       }
     }
     $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'] = '<a href="' . $contactViewUrl . $contact['contact_id'] . '">' . $contact['sort_name'] . '</a>';
+              $globalContacts[$idx]['sort_name'] = '<a href="' . CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$contact['contact_id']}") . '">' . $contact['sort_name'] . '</a>';
             }
           }
         }
@@ -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 = "<a href='{$caseViewUrl}'>" . ts('View Case') . "</a>";
+        $caseView = "<a class='action-item no-popup crm-hover-button' href='{$caseViewUrl}'>" . ts('View Case') . "</a>";
       }
       $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);
   }
-}
 
+}