diff --git a/CRM/Core/Permission.php b/CRM/Core/Permission.php index 5152a7010b74..e7190cc6ae89 100644 --- a/CRM/Core/Permission.php +++ b/CRM/Core/Permission.php @@ -1019,6 +1019,9 @@ public static function getEntityActionPermissions() { 'restore' => array( 'administer CiviCase', ), + 'merge' => array( + 'administer CiviCase', + ), 'default' => array( // At minimum the user needs one of the following. Finer-grained access is controlled by CRM_Case_BAO_Case::addSelectWhereClause array('access my cases and activities', 'access all cases and activities'), diff --git a/api/v3/Case.php b/api/v3/Case.php index 9d2edfd7541b..df6332a3eb25 100644 --- a/api/v3/Case.php +++ b/api/v3/Case.php @@ -398,6 +398,42 @@ function _civicrm_api3_case_addtimeline_spec(&$params) { ); } +/** + * Merge 2 cases. + * + * @param array $params + * + * @throws API_Exception + * @return array + */ +function civicrm_api3_case_merge($params) { + $clients1 = CRM_Case_BAO_Case::getCaseClients($params['case_id_1']); + $clients2 = CRM_Case_BAO_Case::getCaseClients($params['case_id_2']); + CRM_Case_BAO_Case::mergeCases($clients1[0], $params['case_id_1'], $clients2[0], $params['case_id_2']); + return civicrm_api3_create_success(); +} + +/** + * Adjust Metadata for merge action. + * + * @param array $params + * Array of parameters determined by getfields. + */ +function _civicrm_api3_case_merge_spec(&$params) { + $params['case_id_1'] = array( + 'title' => 'Case ID 1', + 'description' => 'Id of main case', + 'type' => CRM_Utils_Type::T_INT, + 'api.required' => 1, + ); + $params['case_id_2'] = array( + 'title' => 'Case ID 2', + 'description' => 'Id of second case', + 'type' => CRM_Utils_Type::T_INT, + 'api.required' => 1, + ); +} + /** * Declare deprecated api functions. * diff --git a/tests/phpunit/api/v3/CaseTest.php b/tests/phpunit/api/v3/CaseTest.php index 712f706b7620..c4ce84537b89 100644 --- a/tests/phpunit/api/v3/CaseTest.php +++ b/tests/phpunit/api/v3/CaseTest.php @@ -704,4 +704,33 @@ public function testCaseAddtimeline() { $this->assertEquals('Follow up', $result['values'][1]['activity_type_id.name']); } + + /** + * Test the case merge function. + * + * 2 cases should be mergeable into 1 + * + * @throws \Exception + */ + public function testCaseMerge() { + $contact1 = $this->individualCreate(array(), 1); + $case1 = $this->callAPISuccess('Case', 'create', array( + 'contact_id' => $contact1, + 'subject' => "Test case 1", + 'case_type_id' => $this->caseTypeId, + )); + $case2 = $this->callAPISuccess('Case', 'create', array( + 'contact_id' => $contact1, + 'subject' => "Test case 2", + 'case_type_id' => $this->caseTypeId, + )); + $result = $this->callAPISuccess('Case', 'getcount', array('contact_id' => $contact1)); + $this->assertEquals(2, $result); + + $this->callAPISuccess('Case', 'merge', array('case_id_1' => $case1['id'], 'case_id_2' => $case2['id'])); + + $result = $this->callAPISuccess('Case', 'getsingle', array('id' => $case2['id'])); + $this->assertEquals(1, $result['is_deleted']); + } + }