Esempio n. 1
0
/**
 * 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;
}
Esempio n. 2
0
    /**
     * @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}");
 }
Esempio n. 4
0
/**
 * 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');
}
Esempio n. 5
0
 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());
 }
Esempio n. 6
0
/**
 * 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');
}
Esempio n. 7
0
/**
 * 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');
}