X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=api%2Fv3%2FActivity.php;h=784095e0e444c35fa2108d5b4457b440c8a48de6;hb=851aa40672c19c64d6a64cfcc6db776852c5f093;hp=f7a8e492f13c0d38d0d27edec7430615e90f09cd;hpb=adf139c32421cd278046b70608a7db0a4026dff2;p=civicrm-core.git diff --git a/api/v3/Activity.php b/api/v3/Activity.php index f7a8e492f1..784095e0e4 100644 --- a/api/v3/Activity.php +++ b/api/v3/Activity.php @@ -31,7 +31,6 @@ * @package CiviCRM_APIv3 */ - /** * Creates or updates an Activity. * @@ -49,11 +48,11 @@ function civicrm_api3_activity_create($params) { // an update does not require any mandatory parameters civicrm_api3_verify_one_mandatory($params, NULL, - array( + [ 'activity_name', 'activity_type_id', 'activity_label', - ) + ] ); } @@ -69,7 +68,7 @@ function civicrm_api3_activity_create($params) { } // processing for custom data - $values = $activityArray = array(); + $values = $activityArray = []; _civicrm_api3_custom_format_params($params, $values, 'Activity'); if (!empty($values['custom'])) { @@ -85,7 +84,7 @@ function civicrm_api3_activity_create($params) { // this handling should all be moved to the BAO layer $case_id = ''; $createRevision = FALSE; - $oldActivityValues = array(); + $oldActivityValues = []; // Lookup case id if not supplied if (!isset($params['case_id']) && !empty($params['id'])) { $params['case_id'] = CRM_Core_DAO::singleValueQuery("SELECT case_id FROM civicrm_case_activity WHERE activity_id = " . (int) $params['id']); @@ -93,7 +92,7 @@ function civicrm_api3_activity_create($params) { if (!empty($params['case_id'])) { $case_id = $params['case_id']; if (!empty($params['id']) && Civi::settings()->get('civicaseActivityRevisions')) { - $oldActivityParams = array('id' => $params['id']); + $oldActivityParams = ['id' => $params['id']]; if (!$oldActivityValues) { CRM_Activity_BAO_Activity::retrieve($oldActivityParams, $oldActivityValues); } @@ -159,7 +158,7 @@ function civicrm_api3_activity_create($params) { if ($case_id && $isNew && !$createRevision) { // If this is a brand new case activity, add to case(s) foreach ((array) $case_id as $singleCaseId) { - $caseActivityParams = array('activity_id' => $activityBAO->id, 'case_id' => $singleCaseId); + $caseActivityParams = ['activity_id' => $activityBAO->id, 'case_id' => $singleCaseId]; CRM_Case_BAO_Case::processCaseActivity($caseActivityParams); } } @@ -180,26 +179,26 @@ function civicrm_api3_activity_create($params) { */ function _civicrm_api3_activity_create_spec(&$params) { - $params['status_id']['api.aliases'] = array('activity_status'); + $params['status_id']['api.aliases'] = ['activity_status']; - $params['assignee_contact_id'] = array( + $params['assignee_contact_id'] = [ 'name' => 'assignee_id', 'title' => 'Activity Assignee', 'description' => 'Contact(s) assigned to this activity.', 'type' => 1, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); - $params['target_contact_id'] = array( + ]; + $params['target_contact_id'] = [ 'name' => 'target_id', 'title' => 'Activity Target', 'description' => 'Contact(s) participating in this activity.', 'type' => 1, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); + ]; - $params['source_contact_id'] = array( + $params['source_contact_id'] = [ 'name' => 'source_contact_id', 'title' => 'Activity Source Contact', 'description' => 'Person who created this activity. Defaults to current user.', @@ -208,16 +207,16 @@ function _civicrm_api3_activity_create_spec(&$params) { 'api.default' => 'user_contact_id', 'FKApiName' => 'Contact', 'api.required' => TRUE, - ); + ]; - $params['case_id'] = array( + $params['case_id'] = [ 'name' => 'case_id', 'title' => 'Case ID', 'description' => 'For creating an activity as part of a case.', 'type' => 1, 'FKClassName' => 'CRM_Case_DAO_Case', 'FKApiName' => 'Case', - ); + ]; } @@ -227,62 +226,62 @@ function _civicrm_api3_activity_create_spec(&$params) { * @param array $params */ function _civicrm_api3_activity_get_spec(&$params) { - $params['tag_id'] = array( + $params['tag_id'] = [ 'title' => 'Tags', 'description' => 'Find activities with specified tags.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Core_DAO_Tag', 'FKApiName' => 'Tag', 'supports_joins' => TRUE, - ); - $params['file_id'] = array( + ]; + $params['file_id'] = [ 'title' => 'Attached Files', 'description' => 'Find activities with attached files.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Core_DAO_File', 'FKApiName' => 'File', - ); - $params['case_id'] = array( + ]; + $params['case_id'] = [ 'title' => 'Cases', 'description' => 'Find activities within specified cases.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Case_DAO_Case', 'FKApiName' => 'Case', 'supports_joins' => TRUE, - ); - $params['contact_id'] = array( + ]; + $params['contact_id'] = [ 'title' => 'Activity Contact ID', 'description' => 'Find activities involving this contact (as target, source, OR assignee).', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); - $params['target_contact_id'] = array( + ]; + $params['target_contact_id'] = [ 'title' => 'Target Contact ID', 'description' => 'Find activities with specified target contact.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); - $params['source_contact_id'] = array( + ]; + $params['source_contact_id'] = [ 'title' => 'Source Contact ID', 'description' => 'Find activities with specified source contact.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); - $params['assignee_contact_id'] = array( + ]; + $params['assignee_contact_id'] = [ 'title' => 'Assignee Contact ID', 'description' => 'Find activities with specified assignee contact.', 'type' => CRM_Utils_Type::T_INT, 'FKClassName' => 'CRM_Contact_DAO_Contact', 'FKApiName' => 'Contact', - ); - $params['is_overdue'] = array( + ]; + $params['is_overdue'] = [ 'title' => 'Is Activity Overdue', 'description' => 'Incomplete activities with a past date.', 'type' => CRM_Utils_Type::T_BOOLEAN, - ); + ]; } /** @@ -291,7 +290,7 @@ function _civicrm_api3_activity_get_spec(&$params) { * @param array $params * Array per getfields documentation. * - * @return array API result array + * @return array * API result array * * @throws \API_Exception @@ -301,6 +300,7 @@ function _civicrm_api3_activity_get_spec(&$params) { function civicrm_api3_activity_get($params) { $options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get'); $sql = CRM_Utils_SQL_Select::fragment(); + _civicrm_activity_get_handleSourceContactNameOrderBy($params, $options, $sql); _civicrm_api3_activity_get_extraFilters($params, $sql); @@ -337,6 +337,42 @@ function civicrm_api3_activity_get($params) { return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); } +/** + * Handle source_contact_name as a sort parameter. + * + * This is passed from the activity selector - e.g search results or contact tab. + * + * It's a non-standard handling but this api already handles variations on handling source_contact + * as a filter & as a field so it's in keeping with that. Source contact has a one-one relationship + * with activity table. + * + * Test coverage in CRM_Activity_BAO_ActivtiyTest::testGetActivitiesforContactSummaryWithSortOptions + * + * @param array $params + * @param array $options + * @param CRM_Utils_SQL_Select $sql + */ +function _civicrm_activity_get_handleSourceContactNameOrderBy(&$params, &$options, $sql) { + $sourceContactID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source'); + if (!empty($options['sort']) + && in_array($options['sort'], [ + 'source_contact_name', + 'source_contact_name desc', + 'source_contact_name asc', + ])) { + $order = substr($options['sort'], -4) === 'desc' ? 'desc' : 'asc'; + $sql->join( + 'source_contact', + "LEFT JOIN + civicrm_activity_contact ac ON (ac.activity_id = a.id AND record_type_id = #sourceContactID) + LEFT JOIN civicrm_contact c ON c.id = ac.contact_id", + ['sourceContactID' => $sourceContactID] + ); + $sql->orderBy("c.display_name $order"); + unset($options['sort'], $params['options']['sort']); + } +} + /** * Support filters beyond what basic_get can do. * @@ -347,21 +383,21 @@ function civicrm_api3_activity_get($params) { */ function _civicrm_api3_activity_get_extraFilters(&$params, &$sql) { // Filter by activity contacts - $activityContactOptions = array( + $activityContactOptions = [ 'contact_id' => NULL, 'target_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Targets'), 'source_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source'), 'assignee_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Assignees'), - ); + ]; foreach ($activityContactOptions as $activityContactName => $activityContactValue) { if (!empty($params[$activityContactName])) { if (!is_array($params[$activityContactName])) { - $params[$activityContactName] = array('=' => $params[$activityContactName]); + $params[$activityContactName] = ['=' => $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) + ['#typeId' => $activityContactValue, '!clause' => $clause] ); } } @@ -383,41 +419,41 @@ function _civicrm_api3_activity_get_extraFilters(&$params, &$sql) { // Subqueries are nice in (a) avoiding duplicates and (b) when the result // list is expected to be bite-sized. Joins are nice (a) with larger // datasets and (b) checking for non-existent relations. - $rels = array( - 'tag_id' => array( + $rels = [ + 'tag_id' => [ 'subquery' => 'a.id IN (SELECT entity_id FROM civicrm_entity_tag WHERE entity_table = "civicrm_activity" AND !clause)', 'join' => '!joinType civicrm_entity_tag !alias ON (!alias.entity_table = "civicrm_activity" AND !alias.entity_id = a.id)', 'column' => 'tag_id', - ), - 'file_id' => array( + ], + 'file_id' => [ 'subquery' => 'a.id IN (SELECT entity_id FROM civicrm_entity_file WHERE entity_table = "civicrm_activity" AND !clause)', 'join' => '!joinType civicrm_entity_file !alias ON (!alias.entity_table = "civicrm_activity" AND !alias.entity_id = a.id)', 'column' => 'file_id', - ), - 'case_id' => array( + ], + 'case_id' => [ 'subquery' => 'a.id IN (SELECT activity_id FROM civicrm_case_activity WHERE !clause)', 'join' => '!joinType civicrm_case_activity !alias ON (!alias.activity_id = a.id)', 'column' => 'case_id', - ), - ); + ], + ]; foreach ($rels as $filter => $relSpec) { if (!empty($params[$filter])) { if (!is_array($params[$filter])) { - $params[$filter] = array('=' => $params[$filter]); + $params[$filter] = ['=' => $params[$filter]]; } // $mode is one of ('LEFT JOIN', 'INNER JOIN', 'SUBQUERY') $mode = isset($params[$filter]['IS NULL']) ? 'LEFT JOIN' : 'SUBQUERY'; if ($mode === 'SUBQUERY') { $clause = \CRM_Core_DAO::createSQLFilter($relSpec['column'], $params[$filter]); if ($clause) { - $sql->where($relSpec['subquery'], array('!clause' => $clause)); + $sql->where($relSpec['subquery'], ['!clause' => $clause]); } } else { $alias = 'actjoin_' . $filter; $clause = \CRM_Core_DAO::createSQLFilter($alias . "." . $relSpec['column'], $params[$filter]); if ($clause) { - $sql->join($alias, $relSpec['join'], array('!alias' => $alias, 'joinType' => $mode)); + $sql->join($alias, $relSpec['join'], ['!alias' => $alias, 'joinType' => $mode]); $sql->where($clause); } } @@ -455,8 +491,8 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options) _civicrm_api3_activity_fill_activity_contact_names($activities, $params, $returns); - $tagGet = array('tag_id', 'entity_id'); - $caseGet = $caseIds = array(); + $tagGet = ['tag_id', 'entity_id']; + $caseGet = $caseIds = []; foreach (array_keys($returns) as $key) { if (strpos($key, 'tag_id.') === 0) { $tagGet[] = $key; @@ -482,12 +518,12 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options) break; case 'tag_id': - $tags = civicrm_api3('EntityTag', 'get', array( + $tags = civicrm_api3('EntityTag', 'get', [ 'entity_table' => 'civicrm_activity', - 'entity_id' => array('IN' => array_keys($activities)), + 'entity_id' => ['IN' => array_keys($activities)], 'return' => $tagGet, - 'options' => array('limit' => 0), - )); + 'options' => ['limit' => 0], + ]); foreach ($tags['values'] as $tag) { $key = (int) $tag['entity_id']; unset($tag['entity_id'], $tag['id']); @@ -497,7 +533,7 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options) 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))); + [1 => [implode(',', array_keys($activities)), 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES]]); while ($dao->fetch()) { $activities[$dao->entity_id]['file_id'][] = $dao->file_id; } @@ -505,7 +541,7 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options) 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))); + [1 => [implode(',', array_keys($activities)), 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES]]); while ($dao->fetch()) { $activities[$dao->activity_id]['case_id'][] = $dao->case_id; $caseIds[$dao->case_id] = $dao->case_id; @@ -528,12 +564,12 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options) // Fetch case fields via the join syntax // Note this is limited to the first case if the activity belongs to more than one if ($caseGet && $caseIds) { - $cases = civicrm_api3('Case', 'get', array( - 'id' => array('IN' => $caseIds), - 'options' => array('limit' => 0), + $cases = civicrm_api3('Case', 'get', [ + 'id' => ['IN' => $caseIds], + 'options' => ['limit' => 0], 'check_permissions' => !empty($params['check_permissions']), 'return' => $caseGet, - )); + ]); foreach ($activities as &$activity) { if (!empty($activity['case_id'])) { $case = CRM_Utils_Array::value($activity['case_id'][0], $cases['values']); @@ -592,7 +628,7 @@ function _civicrm_api3_activity_fill_activity_contact_names(&$activities, $param $typeMap = [ $assigneeType => 'assignee', $sourceType => 'source', - $targetType => 'target' + $targetType => 'target', ]; $activityContactTypes = [$sourceType]; @@ -609,8 +645,10 @@ function _civicrm_api3_activity_fill_activity_contact_names(&$activities, $param 'activity_id', 'record_type_id', 'contact_id.display_name', - 'contact_id' + 'contact_id.sort_name', + 'contact_id', ], + 'options' => ['limit' => 0], 'check_permissions' => !empty($params['check_permissions']), ]; if (count($activityContactTypes) < 3) { @@ -623,15 +661,16 @@ function _civicrm_api3_activity_fill_activity_contact_names(&$activities, $param if (in_array($recordType, ['target', 'assignee'])) { $activities[$activityContact['activity_id']][$recordType . '_contact_id'][] = $contactID; $activities[$activityContact['activity_id']][$recordType . '_contact_name'][$contactID] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : ''; + $activities[$activityContact['activity_id']][$recordType . '_contact_sort_name'][$contactID] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : ''; } else { $activities[$activityContact['activity_id']]['source_contact_id'] = $contactID; $activities[$activityContact['activity_id']]['source_contact_name'] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : ''; + $activities[$activityContact['activity_id']]['source_contact_sort_name'] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : ''; } } } - /** * Delete a specified Activity. * @@ -665,11 +704,11 @@ function civicrm_api3_activity_delete($params) { * array with errors */ function _civicrm_api3_activity_check_params(&$params) { - $activityIds = array( + $activityIds = [ 'activity' => CRM_Utils_Array::value('id', $params), 'parent' => CRM_Utils_Array::value('parent_id', $params), 'original' => CRM_Utils_Array::value('original_id', $params), - ); + ]; foreach ($activityIds as $id => $value) { if ($value && @@ -735,18 +774,18 @@ function _civicrm_api3_activity_check_params(&$params) { * API request. */ function _civicrm_api3_activity_getlist_params(&$request) { - $fieldsToReturn = array( + $fieldsToReturn = [ 'activity_date_time', 'activity_type_id', 'subject', 'source_contact_id', - ); + ]; $request['params']['return'] = array_unique(array_merge($fieldsToReturn, $request['extra'])); $request['params']['options']['sort'] = 'activity_date_time DESC'; - $request['params'] += array( + $request['params'] += [ 'is_current_revision' => 1, 'is_deleted' => 0, - ); + ]; } /** @@ -760,29 +799,29 @@ function _civicrm_api3_activity_getlist_params(&$request) { * @return array */ function _civicrm_api3_activity_getlist_output($result, $request) { - $output = array(); + $output = []; if (!empty($result['values'])) { foreach ($result['values'] as $row) { - $data = array( + $data = [ 'id' => $row[$request['id_field']], 'label' => $row[$request['label_field']] ? $row[$request['label_field']] : ts('(no subject)'), - 'description' => array( - CRM_Core_Pseudoconstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $row['activity_type_id']), - ), - ); + 'description' => [ + CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $row['activity_type_id']), + ], + ]; if (!empty($row['activity_date_time'])) { $data['description'][0] .= ': ' . CRM_Utils_Date::customFormat($row['activity_date_time']); } if (!empty($row['source_contact_id'])) { - $data['description'][] = ts('By %1', array( + $data['description'][] = ts('By %1', [ 1 => CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $row['source_contact_id'], 'display_name'), - )); + ]); } // Add repeating info $repeat = CRM_Core_BAO_RecurringEntity::getPositionAndCount($row['id'], 'civicrm_activity'); $data['extra']['is_recur'] = FALSE; if ($repeat) { - $data['suffix'] = ts('(%1 of %2)', array(1 => $repeat[0], 2 => $repeat[1])); + $data['suffix'] = ts('(%1 of %2)', [1 => $repeat[0], 2 => $repeat[1]]); $data['extra']['is_recur'] = TRUE; } $output[] = $data;