/** * Get details of a particular case, or search for cases, depending on params. * * Please provide one (and only one) of the four get/search parameters: * * @param array $params * 'id' => if set, will get all available info about a case, including contacts and activities * * // if no case_id provided, this function will use one of the following search parameters: * 'client_id' => finds all cases with a specific client * 'activity_id' => returns the case containing a specific activity * 'contact_id' => finds all cases associated with a contact (in any role, not just client) * * @throws API_Exception * @return array * (get mode, case_id provided): Array with case details, case roles, case activity ids, (search mode, case_id not provided): Array of cases found */ function civicrm_api3_case_get($params) { $options = _civicrm_api3_get_options_from_params($params); $sql = CRM_Utils_SQL_Select::fragment(); // Add clause to search by client if (!empty($params['contact_id'])) { $contacts = array(); foreach ((array) $params['contact_id'] as $c) { if (!CRM_Utils_Rule::positiveInteger($c)) { throw new API_Exception('Invalid parameter: contact_id. Must provide numeric value(s).'); } $contacts[] = $c; } $sql->join('civicrm_case_contact', 'INNER JOIN civicrm_case_contact ON civicrm_case_contact.case_id = a.id')->where('civicrm_case_contact.contact_id IN (' . implode(',', $contacts) . ')'); } // Add clause to search by activity if (!empty($params['activity_id'])) { if (!CRM_Utils_Rule::positiveInteger($params['activity_id'])) { throw new API_Exception('Invalid parameter: activity_id. Must provide a numeric value.'); } $activityId = $params['activity_id']; $originalId = CRM_Core_DAO::getFieldValue('CRM_Activity_BAO_Activity', $activityId, 'original_id'); if ($originalId) { $activityId .= ',' . $originalId; } $sql->join('civicrm_case_activity', 'INNER JOIN civicrm_case_activity ON civicrm_case_activity.case_id = a.id')->where("civicrm_case_activity.activity_id IN ({$activityId})"); } $foundcases = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, TRUE, 'Case', $sql); if (empty($options['is_count'])) { // For historic reasons we return these by default only when fetching a case by id if (!empty($params['id']) && empty($options['return'])) { $options['return'] = array('contacts' => 1, 'activities' => 1, 'contact_id' => 1); } foreach ($foundcases['values'] as &$case) { _civicrm_api3_case_read($case, $options); } } return $foundcases; }
/** * @return array */ protected function prepareMembershipPermissionsFilter() { $query = ' SELECT cm.id AS owner_id, cm.contact_id AS owner_contact, m.id AS slave_id, m.contact_id AS slave_contact, cmt.relationship_type_id AS relation_type, rel.contact_id_a, rel.contact_id_b, rel.is_permission_a_b, rel.is_permission_b_a FROM civicrm_membership m LEFT JOIN civicrm_membership cm ON cm.id = m.owner_membership_id LEFT JOIN civicrm_membership_type cmt ON cmt.id = m.membership_type_id LEFT JOIN civicrm_relationship rel ON ( ( rel.contact_id_a = m.contact_id AND rel.contact_id_b = cm.contact_id AND rel.relationship_type_id = cmt.relationship_type_id ) OR ( rel.contact_id_a = cm.contact_id AND rel.contact_id_b = m.contact_id AND rel.relationship_type_id = cmt.relationship_type_id ) ) WHERE m.owner_membership_id IS NOT NULL AND ( rel.is_permission_a_b = 0 OR rel.is_permission_b_a = 0) '; $excludeIds = array(); $dao = \CRM_Core_DAO::executeQuery($query, array()); while ($dao->fetch()) { if ($dao->slave_contact == $dao->contact_id_a && $dao->is_permission_a_b == 0) { $excludeIds[] = $dao->slave_contact; } elseif ($dao->slave_contact == $dao->contact_id_b && $dao->is_permission_b_a == 0) { $excludeIds[] = $dao->slave_contact; } } if (!empty($excludeIds)) { return \CRM_Utils_SQL_Select::fragment()->where("!casContactIdField NOT IN (#excludeMemberIds)")->param(array('#excludeMemberIds' => $excludeIds)); } return NULL; }
/** * Add a JOIN clause like "INNER JOIN civicrm_action_log reminder ON...". * * @param string $joinType * Join type (eg INNER JOIN, LEFT JOIN). * @param string $for * Ex: 'rel', 'addl'. * @param \CRM_Utils_SQL_Select $query * @return \CRM_Utils_SQL_Select * @throws \CRM_Core_Exception */ protected function joinReminder($joinType, $for, $query) { switch ($for) { case 'rel': $contactIdField = $query['casContactIdField']; $entityName = $this->mapping->getEntity(); $entityIdField = $query['casEntityIdField']; break; case 'addl': $contactIdField = 'c.id'; $entityName = 'civicrm_contact'; $entityIdField = 'c.id'; break; default: throw new \CRM_Core_Exception("Unrecognized 'for': {$for}"); } $joinClause = "civicrm_action_log reminder ON reminder.contact_id = {$contactIdField} AND\nreminder.entity_id = {$entityIdField} AND\nreminder.entity_table = '{$entityName}' AND\nreminder.action_schedule_id = {$this->actionSchedule->id}"; // Why do we only include anniversary clause for 'rel' queries? if ($for === 'rel' && !empty($query['casAnniversaryMode'])) { // only consider reminders less than 11 months ago $joinClause .= " AND reminder.action_date_time > DATE_SUB(!casNow, INTERVAL 11 MONTH)"; } return \CRM_Utils_SQL_Select::fragment()->join("reminder", "{$joinType} {$joinClause}"); }
/** * 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'); }
public function testMerge() { $fragmentOutMode = CRM_Utils_SQL_Select::fragment()->select(array('a', 'b'))->where('a = #two')->param('two', 2); $fragmentAutoMode = CRM_Utils_SQL_Select::fragment()->select('e')->where('whipit()'); $query = CRM_Utils_SQL_Select::from('foo')->select(array('c', 'd'))->where('c = @four')->param('four', 4)->merge($fragmentOutMode)->merge($fragmentAutoMode); $this->assertLike('SELECT c, d, a, b, e FROM foo WHERE (c = "4") AND (a = 2) AND (whipit())', $query->toSQL()); }
/** * Get Event record. * * @param array $params * * @return array * Array of all found event property values. */ function civicrm_api3_event_get($params) { //legacy support for $params['return.sort'] if (!empty($params['return.sort'])) { $params['options']['sort'] = $params['return.sort']; unset($params['return.sort']); } //legacy support for $params['return.offset'] if (!empty($params['return.offset'])) { $params['options']['offset'] = $params['return.offset']; unset($params['return.offset']); } //legacy support for $params['return.max_results'] if (!empty($params['return.max_results'])) { $params['options']['limit'] = $params['return.max_results']; unset($params['return.max_results']); } $sql = CRM_Utils_SQL_Select::fragment(); if (!empty($params['isCurrent'])) { $sql->where('(start_date >= CURDATE() || end_date >= CURDATE())'); } $events = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, FALSE, 'Event', $sql, TRUE); $options = _civicrm_api3_get_options_from_params($params); if ($options['is_count']) { return civicrm_api3_create_success($events, $params, 'Event', 'get'); } foreach ($events as $id => $event) { if (!empty($params['return.is_full'])) { _civicrm_api3_event_getisfull($events, $id); } _civicrm_api3_event_get_legacy_support_42($events, $id); if (!empty($options['return'])) { $events[$id]['price_set_id'] = CRM_Price_BAO_PriceSet::getFor('civicrm_event', $id); } } return civicrm_api3_create_success($events, $params, 'Event', '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'); }