From 69f9c5622bdfe3a7eb3165c355a778c1c5b44a3c Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Tue, 7 Mar 2017 21:15:31 -0500 Subject: [PATCH] CRM-20102 - Retrieve more case role info from api --- CRM/Case/BAO/Case.php | 22 ++++++++++++++++++++-- CRM/Utils/Array.php | 10 +++++----- api/v3/Case.php | 15 +++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/CRM/Case/BAO/Case.php b/CRM/Case/BAO/Case.php index e6a0fa129c..8a8ecc6606 100644 --- a/CRM/Case/BAO/Case.php +++ b/CRM/Case/BAO/Case.php @@ -1212,9 +1212,20 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c * */ public static function getRelatedContacts($caseID, $skipDetails = FALSE) { + $caseRoles = array(); + if (!$skipDetails) { + $caseInfo = civicrm_api('Case', 'getsingle', array( + 'id' => $caseID, + 'version' => 3, + 'return' => array('case_type_id', 'case_type_id.definition'), + )); + if (!empty($caseInfo['case_type_id.definition']['caseRoles'])) { + $caseRoles = CRM_Utils_Array::rekey($caseInfo['case_type_id.definition']['caseRoles'], 'name'); + } + } $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 + SELECT cc.display_name as name, cc.sort_name as sort_name, cc.id, cr.relationship_type_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 @@ -1233,13 +1244,20 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c $values[$dao->id] = 1; } else { - $values[] = array( + $details = array( 'contact_id' => $dao->id, 'display_name' => $dao->name, 'sort_name' => $dao->sort_name, + 'relationship_type_id' => $dao->relationship_type_id, 'role' => $dao->role, 'email' => $dao->email, ); + $role = CRM_Utils_Array::value($details['role'], $caseRoles); + if ($role) { + unset($role['name']); + $details += $role; + } + $values[] = $details; } } $dao->free(); diff --git a/CRM/Utils/Array.php b/CRM/Utils/Array.php index 54c567e9e1..3664a96477 100644 --- a/CRM/Utils/Array.php +++ b/CRM/Utils/Array.php @@ -925,17 +925,17 @@ class CRM_Utils_Array { } /** - * Rewrite the keys in an array by filtering through a function. + * Rewrite the keys in an array. * * @param array $array - * @param callable $func - * Function($key, $value). Returns the new key. + * @param string|callable $indexBy + * Either the value to key by, or a function($key, $value) that returns the new key. * @return array */ - public static function rekey($array, $func) { + public static function rekey($array, $indexBy) { $result = array(); foreach ($array as $key => $value) { - $newKey = $func($key, $value); + $newKey = is_callable($indexBy) ? $indexBy($key, $value) : $value[$indexBy]; $result[$newKey] = $value; } return $result; diff --git a/api/v3/Case.php b/api/v3/Case.php index a8bc1d832c..fe5e96c73b 100644 --- a/api/v3/Case.php +++ b/api/v3/Case.php @@ -419,6 +419,21 @@ function _civicrm_api3_case_read(&$case, $options) { $case['activities'][] = $dao->activity_id; } } + // Properly render this joined field + if (!empty($options['return']['case_type_id.definition'])) { + if (!empty($case['case_type_id.definition'])) { + list($xml) = CRM_Utils_XML::parseString($case['case_type_id.definition']); + } + else { + $caseType = !empty($case['case_type_id']) ? $case['case_type_id'] : CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $case['id'], 'case_type_id'); + $caseTypeName = !empty($case['case_type_id.name']) ? $case['case_type_id.name'] : CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseType', $caseType['id'], 'name'); + $xml = CRM_Case_XMLRepository::singleton()->retrieve($caseTypeName); + } + $case['case_type_id.definition'] = array(); + if ($xml) { + $case['case_type_id.definition'] = CRM_Case_BAO_CaseType::convertXmlToDefinition($xml); + } + } } /** -- 2.25.1