Merge pull request #9960 from colemanw/CRM-20029
[civicrm-core.git] / api / v3 / Activity.php
index 20284c2bb29825783f111def950fc3c782052191..5815edc9e4b1eacef861ebe56aa45b520d1343ad 100644 (file)
@@ -230,23 +230,35 @@ function _civicrm_api3_activity_create_spec(&$params) {
  */
 function _civicrm_api3_activity_get_spec(&$params) {
   $params['tag_id'] = array(
-    'name' => 'tag_id',
     'title' => 'Tags',
     'description' => 'Find activities with specified tags.',
     'type' => 1,
     'FKClassName' => 'CRM_Core_DAO_Tag',
     'FKApiName' => 'Tag',
+    'supports_joins' => TRUE,
+  );
+  $params['file_id'] = array(
+    'title' => 'Attached Files',
+    'description' => 'Find activities with attached files.',
+    'type' => 1,
+    'FKClassName' => 'CRM_Core_DAO_File',
+    'FKApiName' => 'File',
   );
   $params['case_id'] = array(
-    'name' => 'case_id',
     'title' => 'Cases',
     'description' => 'Find activities within specified cases.',
     'type' => 1,
     'FKClassName' => 'CRM_Case_DAO_Case',
     'FKApiName' => 'Case',
   );
+  $params['contact_id'] = array(
+    'title' => 'Activity Contact ID',
+    'description' => 'Find activities involving this contact (as target, source, OR assignee).',
+    'type' => 1,
+    'FKClassName' => 'CRM_Contact_DAO_Contact',
+    'FKApiName' => 'Contact',
+  );
   $params['target_contact_id'] = array(
-    'name' => 'target_contact_id',
     'title' => 'Target Contact ID',
     'description' => 'Find activities with specified target contact.',
     'type' => 1,
@@ -254,7 +266,6 @@ function _civicrm_api3_activity_get_spec(&$params) {
     'FKApiName' => 'Contact',
   );
   $params['source_contact_id'] = array(
-    'name' => 'source_contact_id',
     'title' => 'Source Contact ID',
     'description' => 'Find activities with specified source contact.',
     'type' => 1,
@@ -262,7 +273,6 @@ function _civicrm_api3_activity_get_spec(&$params) {
     'FKApiName' => 'Contact',
   );
   $params['assignee_contact_id'] = array(
-    'name' => 'assignee_contact_id',
     'title' => 'Assignee Contact ID',
     'description' => 'Find activities with specified assignee contact.',
     'type' => 1,
@@ -304,61 +314,61 @@ function civicrm_api3_activity_get($params) {
     }
   }
 
-  if (!empty($params['contact_id'])) {
-    $activities = CRM_Activity_BAO_Activity::getContactActivity($params['contact_id']);
-    // BAO function doesn't actually return a contact ID - hack api for now & add to test so when api re-write
-    // happens it won't get missed.
-    foreach ($activities as $key => $activityArray) {
-      $activities[$key]['id'] = $key;
+  $sql = CRM_Utils_SQL_Select::fragment();
+  $recordTypes = civicrm_api3('ActivityContact', 'getoptions', array('field' => 'record_type_id'));
+  $recordTypes = $recordTypes['values'];
+  $activityContactOptions = array(
+    'contact_id' => NULL,
+    'target_contact_id' => array_search('Activity Targets', $recordTypes),
+    'source_contact_id' => array_search('Activity Source', $recordTypes),
+    'assignee_contact_id' => array_search('Activity Assignees', $recordTypes),
+  );
+  foreach ($activityContactOptions as $activityContactName => $activityContactValue) {
+    if (!empty($params[$activityContactName])) {
+      if (!is_array($params[$activityContactName])) {
+        $params[$activityContactName] = array('=' => $params[$activityContactName]);
+      }
+      $clause = \CRM_Core_DAO::createSQLFilter('contact_id', $params[$activityContactName]);
+      $typeClause = $activityContactValue ? 'record_type_id = #typeId AND ' : '';
+      $sql->where("a.id IN (SELECT activity_id FROM civicrm_activity_contact WHERE $typeClause !clause)",
+        array('#typeId' => $activityContactValue, '!clause' => $clause)
+      );
     }
   }
-  else {
-    $sql = CRM_Utils_SQL_Select::fragment();
-    // Support search by activity_contact
-    $options = civicrm_api3('ActivityContact', 'getoptions', array('field' => 'record_type_id'));
-    $options = $options['values'];
-    $activityContactOptions = array(
-      'target_contact_id' => array_search('Activity Targets', $options),
-      'source_contact_id' => array_search('Activity Source', $options),
-      'assignee_contact_id' => array_search('Activity Assignees', $options),
-    );
-    foreach ($activityContactOptions as $activityContactName => $activityContactValue) {
-      if (!empty($params[$activityContactName])) {
-        if (!is_array($params[$activityContactName])) {
-          $params[$activityContactName] = array('=' => $params[$activityContactName]);
-        }
-        $clause = \CRM_Core_DAO::createSQLFilter('contact_id', $params[$activityContactName]);
-        $sql->where('a.id IN (SELECT activity_id FROM civicrm_activity_contact WHERE record_type_id = #typeId AND !clause)',
-          array('#typeId' => $activityContactValue, '!clause' => $clause)
-        );
-      }
+  if (!empty($params['tag_id'])) {
+    if (!is_array($params['tag_id'])) {
+      $params['tag_id'] = array('=' => $params['tag_id']);
     }
-    if (!empty($params['tag_id'])) {
-      if (!is_array($params['tag_id'])) {
-        $params['tag_id'] = array('=' => $params['tag_id']);
-      }
-      $clause = \CRM_Core_DAO::createSQLFilter('tag_id', $params['tag_id']);
-      if ($clause) {
-        $sql->where('a.id IN (SELECT entity_id FROM civicrm_entity_tag WHERE entity_table = "civicrm_activity" AND !clause)', array('!clause' => $clause));
-      }
+    $clause = \CRM_Core_DAO::createSQLFilter('tag_id', $params['tag_id']);
+    if ($clause) {
+      $sql->where('a.id IN (SELECT entity_id FROM civicrm_entity_tag WHERE entity_table = "civicrm_activity" AND !clause)', array('!clause' => $clause));
     }
-    if (!empty($params['case_id'])) {
-      if (!is_array($params['case_id'])) {
-        $params['case_id'] = array('=' => $params['case_id']);
-      }
-      $clause = \CRM_Core_DAO::createSQLFilter('case_id', $params['case_id']);
-      if ($clause) {
-        $sql->where('a.id IN (SELECT activity_id FROM civicrm_case_activity WHERE !clause)', array('!clause' => $clause));
-      }
+  }
+  if (!empty($params['file_id'])) {
+    if (!is_array($params['file_id'])) {
+      $params['file_id'] = array('=' => $params['file_id']);
+    }
+    $clause = \CRM_Core_DAO::createSQLFilter('file_id', $params['file_id']);
+    if ($clause) {
+      $sql->where('a.id IN (SELECT entity_id FROM civicrm_entity_file WHERE entity_table = "civicrm_activity" AND !clause)', array('!clause' => $clause));
+    }
+  }
+  if (!empty($params['case_id'])) {
+    if (!is_array($params['case_id'])) {
+      $params['case_id'] = array('=' => $params['case_id']);
+    }
+    $clause = \CRM_Core_DAO::createSQLFilter('case_id', $params['case_id']);
+    if ($clause) {
+      $sql->where('a.id IN (SELECT activity_id FROM civicrm_case_activity WHERE !clause)', array('!clause' => $clause));
     }
-    $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity', $sql);
   }
+  $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity', $sql);
   $options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get');
   if ($options['is_count']) {
     return civicrm_api3_create_success($activities, $params, 'Activity', 'get');
   }
 
-  $activities = _civicrm_api3_activity_get_formatResult($params, $activities);
+  $activities = _civicrm_api3_activity_get_formatResult($params, $activities, $options);
   //legacy custom data get - so previous formatted response is still returned too
   return civicrm_api3_create_success($activities, $params, 'Activity', 'get');
 }
@@ -375,14 +385,12 @@ function civicrm_api3_activity_get($params) {
  * @return array
  *   new activities list
  */
-function _civicrm_api3_activity_get_formatResult($params, $activities) {
-  $returns = CRM_Utils_Array::value('return', $params, array());
-  if (!is_array($returns)) {
-    $returns = str_replace(' ', '', $returns);
-    $returns = explode(',', $returns);
+function _civicrm_api3_activity_get_formatResult($params, $activities, $options) {
+  if (!$activities) {
+    return $activities;
   }
-  $returns = array_fill_keys($returns, 1);
 
+  $returns = $options['return'];
   foreach ($params as $n => $v) {
     if (substr($n, 0, 7) == 'return.') {
       $returnkey = substr($n, 7);
@@ -398,6 +406,14 @@ function _civicrm_api3_activity_get_formatResult($params, $activities) {
     $returns['assignee_contact_id'] = 1;
   }
 
+  $tagGet = array('tag_id', 'entity_id');
+  foreach (array_keys($returns) as $key) {
+    if (strpos($key, 'tag_id.') === 0) {
+      $tagGet[] = $key;
+      $returns['tag_id'] = 1;
+    }
+  }
+
   foreach ($returns as $n => $v) {
     switch ($n) {
       case 'assignee_contact_id':
@@ -431,13 +447,58 @@ function _civicrm_api3_activity_get_formatResult($params, $activities) {
         }
         break;
 
+      case 'tag_id':
+        $tags = civicrm_api3('EntityTag', 'get', array(
+          'entity_table' => 'civicrm_activity',
+          'entity_id' => array('IN' => array_keys($activities)),
+          'return' => $tagGet,
+          'options' => array('limit' => 0),
+        ));
+        foreach ($tags['values'] as $tag) {
+          $key = (int) $tag['entity_id'];
+          unset($tag['entity_id'], $tag['id']);
+          $activities[$key]['tag_id'][$tag['tag_id']] = $tag;
+        }
+        break;
+
+      case 'file_id':
+        $dao = CRM_Core_DAO::executeQuery("SELECT entity_id, file_id FROM civicrm_entity_file WHERE entity_table = 'civicrm_activity' AND entity_id IN (%1)",
+          array(1 => array(implode(',', array_keys($activities)), 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES)));
+        while ($dao->fetch()) {
+          $activities[$dao->entity_id]['file_id'][] = $dao->file_id;
+        }
+        break;
+
+      case 'case_id':
+        $dao = CRM_Core_DAO::executeQuery("SELECT activity_id, case_id FROM civicrm_case_activity WHERE activity_id IN (%1)",
+          array(1 => array(implode(',', array_keys($activities)), 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES)));
+        while ($dao->fetch()) {
+          $activities[$dao->activity_id]['case_id'] = $dao->case_id;
+        }
+        break;
+
       default:
         if (substr($n, 0, 6) == 'custom') {
           $returnProperties[$n] = $v;
         }
     }
   }
-  if (!empty($activities) && (!empty($returnProperties) || !empty($params['contact_id']))) {
+
+  // Legacy extras
+  if (!empty($params['contact_id'])) {
+    $statusOptions = CRM_Activity_BAO_Activity::buildOptions('status_id', 'get');
+    $typeOptions = CRM_Activity_BAO_Activity::buildOptions('activity_type_id', 'validate');
+    foreach ($activities as $key => &$activityArray) {
+      if (!empty($activityArray['status_id'])) {
+        $activityArray['status'] = $statusOptions[$activityArray['status_id']];
+      }
+      if (!empty($activityArray['activity_type_id'])) {
+        $activityArray['activity_name'] = $typeOptions[$activityArray['activity_type_id']];
+      }
+    }
+  }
+
+  if (!empty($returnProperties) || !empty($params['contact_id'])) {
     foreach ($activities as $activityId => $values) {
       //@todo - should possibly load activity type id if not loaded (update with id)
       _civicrm_api3_custom_data_get($activities[$activityId], CRM_Utils_Array::value('check_permissions', $params), 'Activity', $activityId, NULL, CRM_Utils_Array::value('activity_type_id', $values));