/** * Activity.GetAbsences API * * This is a variation on Activity.get with additional filtering behavior suitable for activities. * * @param array $params * @return array API result descriptor * @see civicrm_api3_create_success * @see civicrm_api3_create_error * @throws API_Exception */ function civicrm_api3_activity_getabsences($params) { // activity_type_id: int|string|array(int|string) // period_id: int|array(int) // target_contact_id: int $activityTypes = CRM_Core_PseudoConstant::activityType(); // ****** Defaults ****** if (!isset($params['activity_type_id'])) { $params['activity_type_id'] = CRM_HRAbsence_BAO_HRAbsenceType::getActivityTypes(); } // ****** Build query ****** $select = new CRM_HRAbsence_DGWDIHTWT('civicrm_activity request'); $select->select('request.*')->groupBy('request.id')->join('absence', 'INNER JOIN civicrm_activity absence ON (absence.source_record_id = request.id AND absence.activity_type_id = #typeId)', array('#typeId' => array_search('Absence', $activityTypes))); if (!empty($params['period_id'])) { $periodIds = (array) $params['period_id']; $dateExprs = array(); // array(string $sqlExpression) foreach ($periodIds as $periodId) { $period = civicrm_api3('HRAbsencePeriod', 'getsingle', array('id' => $periodId)); $dateExprs[] = $select->interpolate('min(absence.activity_date_time) between @start and @end', array('@start' => $period['start_date'], '@end' => $period['end_date'])); } $select->having(implode(' or ', $dateExprs)); } if (!empty($params['activity_type_id'])) { $typeIds = (array) $params['activity_type_id']; foreach (array_keys($typeIds) as $key) { if (!is_numeric($typeIds[$key])) { $typeIds[$key] = array_search($typeIds[$key], $activityTypes); if ($typeIds[$key] === FALSE) { throw new API_Exception("Invalid activity type"); } } } $select->where('request.activity_type_id IN (#typeIds)', array('#typeIds' => $typeIds)); } if (!empty($params['target_contact_id'])) { $activityContactTypes = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $select->join('tgt', 'INNER JOIN civicrm_activity_contact tgt ON tgt.activity_id = request.id AND tgt.record_type_id = #tgt AND tgt.contact_id IN (#targetIds)', array('#tgt' => CRM_Utils_Array::key('Activity Targets', $activityContactTypes), '#targetIds' => (array) $params['target_contact_id'])); } // ****** Execute query ****** $entity = _civicrm_api3_get_BAO(__FUNCTION__); $bao = CRM_Core_DAO::executeQuery($select->toSQL(), array(), TRUE, 'CRM_Activity_BAO_Activity'); $activities = _civicrm_api3_dao_to_array($bao, $params, FALSE, $entity, FALSE); $activities = _civicrm_api3_activity_get_formatResult($params, $activities); return civicrm_api3_create_success($activities, $params, $entity, 'getAbsences'); }
/** * Gets a CiviCRM activity according to parameters. * * @param array $params * Array per getfields documentation. * * @return array * API result array */ 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; } } else { $sql = CRM_Utils_SQL_Select::fragment(); $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 the intent is to have multiple joins -- one for each relation -- then you would // need different table aliases. Consider replacing 'ac' and passing in a '!alias' param, // with a different value for each relation. $sql->join('activity_' . $activityContactName, 'LEFT JOIN civicrm_activity_contact ac ON a.id = ac.activity_id AND ac.record_type_id = #typeId', array('typeId' => $activityContactValue)); $sql->where('ac.contact_id IN (#cid)', array('cid' => $params[$activityContactName])); } } $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); //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); }
/** * Gets a CiviCRM activity according to parameters. * * @param array $params * Array per getfields documentation. * * @return array * API result array */ 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; } } else { $extraSql = array(); $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])) { $extraSql['join'][] = array('activity_' . $activityContactName => ' LEFT JOIN civicrm_activity_contact ac ON a.id = ac.activity_id AND ac.record_type_id = ' . (int) $activityContactValue); // Note that if we later need to change the int to an array we would need sql escaping. $extraSql['where'] = array('activity_' . $activityContactName => 'ac.contact_id = ' . (int) $params[$activityContactName]); } } $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity', $extraSql); } $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); //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); }
/** * Gets a CiviCRM activity according to parameters. * * @param array $params * Array per getfields documentation. * * @return array * API result array */ 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; } } else { $activities = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Activity'); } $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); //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); }
/** * Gets a CiviCRM activity according to parameters. * * @param array $params * Array per getfields documentation. * * @return array API result array * API result array * * @throws \API_Exception * @throws \CiviCRM_API3_Exception * @throws \Civi\API\Exception\UnauthorizedException */ function civicrm_api3_activity_get($params) { if (!empty($params['check_permissions']) && !CRM_Core_Permission::check('view all activities')) { // In absence of view all activities permission it's possible to see a specific activity by ACL. // Note still allowing view all activities to override ACLs is based on the 'don't change too much // if you are not sure principle' and it could be argued that the ACLs should always be applied. if (empty($params['id']) || !empty($params['contact_id'])) { // We fall back to the original blunt permissions if we don't have an id to check or we are about // to go to the weird place that the legacy 'contact_id' parameter takes us to. throw new \Civi\API\Exception\UnauthorizedException("Cannot access activities. Required permission: 'view all activities''"); } if (!CRM_Activity_BAO_Activity::checkPermission($params['id'], CRM_Core_Action::VIEW)) { throw new \Civi\API\Exception\UnauthorizedException('You do not have permission to view this activity'); } } 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; } } else { $sql = CRM_Utils_SQL_Select::fragment(); $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 the intent is to have multiple joins -- one for each relation -- then you would // need different table aliases. Consider replacing 'ac' and passing in a '!alias' param, // with a different value for each relation. $sql->join('activity_' . $activityContactName, 'LEFT JOIN civicrm_activity_contact ac ON a.id = ac.activity_id AND ac.record_type_id = #typeId', array('typeId' => $activityContactValue)); $sql->where('ac.contact_id IN (#cid)', array('cid' => $params[$activityContactName])); } } $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); //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); }