// if the subject contains a ‘[case #…]’ string, file that activity on the related case (CRM-5916)
$matches = array();
- if (preg_match('/\[case #([0-9a-h]{7})\]/', CRM_Utils_Array::value('subject', $params), $matches)) {
+ $subjectToMatch = CRM_Utils_Array::value('subject', $params);
+ if (preg_match('/\[case #([0-9a-h]{7})\]/', $subjectToMatch, $matches)) {
$key = CRM_Core_DAO::escapeString(CIVICRM_SITE_KEY);
$hash = $matches[1];
- $query = "SELECT id FROM civicrm_case WHERE SUBSTR(SHA1(CONCAT('$key', id)), 1, 7) = '$hash'";
+ $query = "SELECT id FROM civicrm_case WHERE SUBSTR(SHA1(CONCAT('$key', id)), 1, 7) = '" . CRM_Core_DAO::escapeString($hash) . "'";
+ }
+ elseif (preg_match('/\[case #(\d+)\]/', $subjectToMatch, $matches)) {
+ $query = "SELECT id FROM civicrm_case WHERE id = '" . CRM_Core_DAO::escapeString($matches[1]) . "'";
+ }
+ if (!empty($matches)) {
$caseParams = array(
'activity_id' => $activity->id,
'case_id' => CRM_Core_DAO::singleValueQuery($query),
CRM_Case_BAO_Case::processCaseActivity($caseParams);
}
else {
- self::logActivityAction($activity, "unknown case hash encountered: $hash");
+ self::logActivityAction($activity, "Case details for {$matches[1]} not found while recording an activity on case.");
}
}
));
}
+ /**
+ * Test activity creation on case based
+ * on id or hash present in case subject.
+ */
+ public function testActivityCreateOnCase() {
+ $hash = substr(sha1(CIVICRM_SITE_KEY . $this->_case['id']), 0, 7);
+ $subjectArr = array(
+ "[case #{$this->_case['id']}] test activity recording under case with id",
+ "[case #{$hash}] test activity recording under case with id",
+ );
+ foreach ($subjectArr as $subject) {
+ $activity = $this->callAPISuccess('Activity', 'create', array(
+ 'source_contact_id' => $this->_cid,
+ 'activity_type_id' => 'Phone Call',
+ 'subject' => $subject,
+ ));
+ $case = $this->callAPISuccessGetSingle('Activity', array('return' => array("case_id"), 'id' => $activity['id']));
+ //Check if case id is present for the activity.
+ $this->assertEquals($this->_case['id'], $case['case_id'][0]);
+ }
+ }
+
public function testGet() {
$this->assertTrue(is_numeric($this->_case['id']));
$this->assertTrue(is_numeric($this->_otherActivity['id']));