public function testRetrieveTargetIdsByActivityIdOneID() { $activity = $this->activityCreate(); $targetIDs = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity['id']); // assert that we have at least one targetID $this->assertEquals(count($targetIDs), 1, 'One target ID match for activity'); $this->assertEquals($targetIDs[0], $activity['target_contact_id'], 'The returned target contacts ids match'); }
/** * Fix a "new houshold member" problem by connecting * the new contact to the household, unless he's already * connected */ public static function fixHMNW($problem) { $activity_id = $problem->getActivityID(); if (empty($activity_id)) { return FALSE; } // get all target contacts $contact_ids = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity_id); if (empty($contact_ids)) { return FALSE; } // load all contacts $new_contact_id = NULL; $contact_data = civicrm_api3('Contact', 'get', array('id' => array('IN' => $contact_ids))); foreach ($contact_data['values'] as $contact_id => $contact) { if ($contact['contact_type'] == 'Individual') { if ($new_contact_id === NULL) { $new_contact_id = $contact['id']; } else { // there are multiple new contacts here... return FALSE; } } } if (empty($new_contact_id)) { // no contact found return FALSE; } // check if there is already a relationship $relation_ids[] = CRM_Householdmerge_Logic_Configuration::getMemberRelationID(); $relation_ids[] = CRM_Householdmerge_Logic_Configuration::getHeadRelationID(); $existing_relationship = civicrm_api3('Relationship', 'get', array('contact_id_a' => $new_contact_id, 'contact_id_b' => $problem->getHouseholdID(), 'relationship_type_id' => array('IN' => $relation_ids), 'is_active' => 1)); if ($existing_relationship['count']) { // there already is a relationship, the problem IS fixed already... } else { // create a new relationship civicrm_api3('Relationship', 'create', array('contact_id_a' => $new_contact_id, 'contact_id_b' => $problem->getHouseholdID(), 'relationship_type_id' => CRM_Householdmerge_Logic_Configuration::getMemberRelationID(), 'is_active' => 1)); } return TRUE; }
/** * Given a list of activities, append any extra data requested about the activities. * * @note Called by civicrm-core and CiviHR * * @param array $params * API request parameters. * @param array $activities * * @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); } $returns = array_fill_keys($returns, 1); foreach ($params as $n => $v) { if (substr($n, 0, 7) == 'return.') { $returnkey = substr($n, 7); $returns[$returnkey] = $v; } } $returns['source_contact_id'] = 1; foreach ($returns as $n => $v) { switch ($n) { case 'assignee_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['assignee_contact_id'] = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activityArray['id']); } break; case 'target_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['target_contact_id'] = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activityArray['id']); } break; case 'source_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['source_contact_id'] = CRM_Activity_BAO_Activity::getSourceContactID($activityArray['id']); } break; default: if (substr($n, 0, 6) == 'custom') { $returnProperties[$n] = $v; } } } if (!empty($activities) && (!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)); } } return $activities; }
/** * Takes a bunch of params that are needed to match certain criteria and * retrieves the relevant objects. Typically the valid params are only * contact_id. We'll tweak this function to be more full featured over a period * of time. This is the inverse function of create. It also stores all the retrieved * values in the default array * * @param array $params (reference ) an assoc array of name/value pairs * @param array $defaults (reference ) an assoc array to hold the flattened values * @param string $activityType activity type * * @return object CRM_Core_BAO_Meeting object * @access public */ public function retrieve(&$params, &$defaults) { $activity =& new CRM_Activity_DAO_Activity(); $activity->copyValues($params); if ($activity->find(true)) { require_once "CRM/Contact/BAO/Contact.php"; // TODO: at some stage we'll have to deal // TODO: with multiple values for assignees and targets, but // TODO: for now, let's just fetch first row $defaults['assignee_contact'] = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activity->id); $assignee_contact_names = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id); $defaults['assignee_contact_value'] = null; foreach ($assignee_contact_names as $key => $name) { $defaults['assignee_contact_value'] .= $defaults['assignee_contact_value'] ? "; {$name}" : "{$name}"; } if ($activity->activity_type_id != CRM_Core_OptionGroup::getValue('activity_type', 'Bulk Email', 'name')) { require_once 'CRM/Activity/BAO/ActivityTarget.php'; $defaults['target_contact'] = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity->id); $target_contact_names = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id); $defaults['target_contact_value'] = null; foreach ($target_contact_names as $key => $name) { $defaults['target_contact_value'] .= $defaults['target_contact_value'] ? "; {$name}" : "{$name}"; } } else { if (CRM_Core_Permission::check('access CiviMail')) { $defaults['mailingId'] = CRM_Utils_System::url('civicrm/mailing/report', "mid={$activity->source_record_id}&reset=1&atype={$activity->activity_type_id}&aid={$activity->id}&cid={$activity->source_contact_id}&context=activity"); } else { $defaults['target_contact_value'] = ts('(recipients)'); } } if ($activity->source_contact_id) { $defaults['source_contact'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $activity->source_contact_id, 'sort_name'); } //get case subject require_once "CRM/Case/BAO/Case.php"; $defaults['case_subject'] = CRM_Case_BAO_Case::getCaseSubject($activity->id); CRM_Core_DAO::storeValues($activity, $defaults); return $activity; } return null; }
/** * Gets a CiviCRM activity according to parameters * * @param array $params Associative array of property name/value * pairs for the activity. * * @return array * * {@getfields activity_get} * @example ActivityGet.php Basic example * @example Activity/DateTimeHigh.php Example get with date filtering * {@example ActivityGet.php 0} */ 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); } $returns = CRM_Utils_Array::value('return', $params, array()); if (!is_array($returns)) { $returns = str_replace(' ', '', $returns); $returns = explode(',', $returns); } $returns = array_fill_keys($returns, 1); foreach ($params as $n => $v) { if (substr($n, 0, 7) == 'return.') { $returnkey = substr($n, 7); $returns[$returnkey] = $v; } } $returns['source_contact_id'] = 1; foreach ($returns as $n => $v) { switch ($n) { case 'assignee_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['assignee_contact_id'] = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activityArray['id']); } break; case 'target_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['target_contact_id'] = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activityArray['id']); } break; case 'source_contact_id': foreach ($activities as $key => $activityArray) { $activities[$key]['source_contact_id'] = CRM_Activity_BAO_Activity::getSourceContactID($activityArray['id']); } break; default: if (substr($n, 0, 6) == 'custom') { $returnProperties[$n] = $v; } } } if (!empty($activities) && (!empty($returnProperties) || !empty($params['contact_id']))) { foreach ($activities as $activityId => $values) { _civicrm_api3_custom_data_get($activities[$activityId], 'Activity', $activityId, NULL, $values['activity_type_id']); } } //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'activity', 'get'); }
/** * Function to process the view * * @access public * * @return None */ public function preProcess() { $contactID = CRM_Utils_Request::retrieve('cid', 'Integer', $this, TRUE); $activityID = CRM_Utils_Request::retrieve('aid', 'Integer', $this, TRUE); $revs = CRM_Utils_Request::retrieve('revs', 'Boolean', CRM_Core_DAO::$_nullObject); $caseID = CRM_Utils_Request::retrieve('caseID', 'Boolean', CRM_Core_DAO::$_nullObject); $activitySubject = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityID, 'subject'); $type = CRM_Utils_Request::retrieve('type', 'String', CRM_Core_DAO::$_nullObject); //check for required permissions, CRM-6264 if ($activityID && !CRM_Activity_BAO_Activity::checkPermission($activityID, CRM_Core_Action::VIEW)) { CRM_Core_Error::fatal(ts('You do not have permission to access this page.')); } $this->assign('contactID', $contactID); $this->assign('caseID', $caseID); $this->assign('type', $type); // CRM-9145 $this->assign('activityID', $activityID); $xmlProcessor = new CRM_Case_XMLProcessor_Report(); $report = $xmlProcessor->getActivityInfo($contactID, $activityID, TRUE); $attachmentUrl = CRM_Core_BAO_File::attachmentInfo('civicrm_activity', $activityID); if ($attachmentUrl) { $report['fields'][] = array('label' => 'Attachment(s)', 'value' => $attachmentUrl, 'type' => 'Link'); } $tags = CRM_Core_BAO_EntityTag::getTag($activityID, 'civicrm_activity'); if (!empty($tags)) { $allTag = CRM_Core_PseudoConstant::tag(); foreach ($tags as $tid) { $tags[$tid] = $allTag[$tid]; } $report['fields'][] = array('label' => 'Tags', 'value' => implode('<br />', $tags), 'type' => 'String'); } $this->assign('report', $report); $latestRevisionID = CRM_Activity_BAO_Activity::getLatestActivityId($activityID); $viewPriorActivities = array(); $priorActivities = CRM_Activity_BAO_Activity::getPriorAcitivities($activityID); foreach ($priorActivities as $activityId => $activityValues) { if (CRM_Case_BAO_Case::checkPermission($activityId, 'view', NULL, $contactID)) { $viewPriorActivities[$activityId] = $activityValues; } } if ($revs) { $this->assign('revs', $revs); $this->assign('result', $viewPriorActivities); $this->assign('subject', $activitySubject); $this->assign('latestRevisionID', $latestRevisionID); } else { if (count($viewPriorActivities) > 1) { $this->assign('activityID', $activityID); } if ($latestRevisionID != $activityID) { $this->assign('latestRevisionID', $latestRevisionID); } } $parentID = CRM_Activity_BAO_Activity::getParentActivity($activityID); if ($parentID) { $this->assign('parentID', $parentID); } //viewing activity should get diplayed in recent list.CRM-4670 $activityTypeID = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityID, 'activity_type_id'); $activityTargetContacts = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activityID); if (!empty($activityTargetContacts)) { $recentContactId = $activityTargetContacts[0]; } else { $recentContactId = $contactID; } if (!isset($caseID)) { $caseID = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseActivity', $activityID, 'case_id', 'activity_id'); } $url = CRM_Utils_System::url('civicrm/case/activity/view', "reset=1&aid={$activityID}&cid={$recentContactId}&caseID={$caseID}&context=home"); $recentContactDisplay = CRM_Contact_BAO_Contact::displayName($recentContactId); // add the recently created Activity $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE); $title = ""; if (isset($activitySubject)) { $title = $activitySubject . ' - '; } $title = $title . $recentContactDisplay . ' (' . $activityTypes[$activityTypeID] . ')'; $recentOther = array(); if (CRM_Case_BAO_Case::checkPermission($activityID, 'edit')) { $recentOther['editUrl'] = CRM_Utils_System::url('civicrm/case/activity', "reset=1&action=update&id={$activityID}&cid={$recentContactId}&caseid={$caseID}&context=home"); } if (CRM_Case_BAO_Case::checkPermission($activityID, 'delete')) { $recentOther['deleteUrl'] = CRM_Utils_System::url('civicrm/case/activity', "reset=1&action=delete&id={$activityID}&cid={$recentContactId}&caseid={$caseID}&context=home"); } CRM_Utils_Recent::add($title, $url, $activityID, 'Activity', $recentContactId, $recentContactDisplay, $recentOther); }
/** * Gets a CiviCRM activity according to parameters * * @param array $params Associative array of property name/value * pairs for the activity. * * @return array * * {@getfields activity_get} * @example ActivityGet.php Basic example * @example Activity/DateTimeHigh.php Example get with date filtering * {@example ActivityGet.php 0} */ 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); } if (CRM_Utils_Array::value('return.assignee_contact_id', $params)) { foreach ($activities as $key => $activityArray) { $activities[$key]['assignee_contact_id'] = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activityArray['id']); } } if (CRM_Utils_Array::value('return.target_contact_id', $params)) { foreach ($activities as $key => $activityArray) { $activities[$key]['target_contact_id'] = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activityArray['id']); } } foreach ($params as $n => $v) { // handle the format return.sort_name=1,return.display_name=1 if (substr($n, 0, 13) == 'return.custom') { $returnProperties[substr($n, 7)] = $v; } } if (!empty($activities) && (!empty($returnProperties) || !empty($params['contact_id']))) { foreach ($activities as $activityId => $values) { _civicrm_api3_custom_data_get($activities[$activityId], 'Activity', $activityId, NULL, $values['activity_type_id']); } } //legacy custom data get - so previous formatted response is still returned too return civicrm_api3_create_success($activities, $params, 'activity', 'get'); }
/** * Function to process the view * * @access public * @return None */ public function preProcess() { $contactID = CRM_Utils_Request::retrieve('cid', 'Integer', $this, true); $activityID = CRM_Utils_Request::retrieve('aid', 'Integer', $this, true); $revs = CRM_Utils_Request::retrieve('revs', 'Boolean', CRM_Core_DAO::$_nullObject); $caseID = CRM_Utils_Request::retrieve('caseID', 'Boolean', CRM_Core_DAO::$_nullObject); $activitySubject = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityID, 'subject'); $this->assign('contactID', $contactID); $this->assign('caseID', $caseID); require_once 'CRM/Case/XMLProcessor/Report.php'; $xmlProcessor = new CRM_Case_XMLProcessor_Report(); $report = $xmlProcessor->getActivityInfo($contactID, $activityID, true); require_once 'CRM/Core/BAO/File.php'; $attachmentUrl = CRM_Core_BAO_File::attachmentInfo('civicrm_activity', $activityID); if ($attachmentUrl) { $report['fields'][] = array('label' => 'Attachment(s)', 'value' => $attachmentUrl, 'type' => 'Link'); } $this->assign('report', $report); $latestRevisionID = CRM_Activity_BAO_Activity::getLatestActivityId($activityID); if ($revs) { $this->assign('revs', $revs); $priorActivities = CRM_Activity_BAO_Activity::getPriorAcitivities($activityID); $this->assign('result', $priorActivities); $this->assign('subject', $activitySubject); $this->assign('latestRevisionID', $latestRevisionID); } else { $countPriorActivities = CRM_Activity_BAO_Activity::getPriorCount($activityID); if ($countPriorActivities >= 1) { $this->assign('activityID', $activityID); } if ($latestRevisionID != $activityID) { $this->assign('latestRevisionID', $latestRevisionID); } } $parentID = CRM_Activity_BAO_Activity::getParentActivity($activityID); if ($parentID) { $this->assign('parentID', $parentID); } //viewing activity should get diplayed in recent list.CRM-4670 $activityTypeID = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityID, 'activity_type_id'); $activityTargetContacts = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activityID); if (!empty($activityTargetContacts)) { $recentContactId = $activityTargetContacts[1]; } else { $recentContactId = $contactID; } if (!isset($caseID)) { $caseID = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseActivity', $activityID, 'case_id', 'activity_id'); } require_once 'CRM/Utils/Recent.php'; $url = CRM_Utils_System::url('civicrm/case/activity/view', "reset=1&aid={$activityID}&cid={$recentContactId}&caseID={$caseID}"); require_once 'CRM/Contact/BAO/Contact.php'; $recentContactDisplay = CRM_Contact_BAO_Contact::displayName($recentContactId); // add the recently created Activity $activityTypes = CRM_Core_Pseudoconstant::activityType(true, true); $title = ""; if (isset($activitySubject)) { $title = $activitySubject . ' - '; } $title = $title . $recentContactDisplay . ' (' . $activityTypes[$activityTypeID] . ')'; CRM_Utils_Recent::add($title, $url, $activityID, 'Activity', $recentContactId, $recentContactDisplay); }
/** * Does user has sufficient permission for view/edit activity record. * * @param int $activityId activity record id. * @param int $action edit/view * * @return boolean $allow true/false * @access public */ public static function checkPermission($activityId, $action) { $allow = FALSE; if (!$activityId || !in_array($action, array(CRM_Core_Action::UPDATE, CRM_Core_Action::VIEW))) { return $allow; } $activity = new CRM_Activity_DAO_Activity(); $activity->id = $activityId; if (!$activity->find(TRUE)) { return $allow; } //component related permissions. $compPermissions = array('CiviCase' => array('administer CiviCase', 'access my cases and activities', 'access all cases and activities'), 'CiviMail' => array('access CiviMail'), 'CiviEvent' => array('access CiviEvent'), 'CiviGrant' => array('access CiviGrant'), 'CiviPledge' => array('access CiviPledge'), 'CiviMember' => array('access CiviMember'), 'CiviReport' => array('access CiviReport'), 'CiviContribute' => array('access CiviContribute'), 'CiviCampaign' => array('administer CiviCampaign')); //return early when it is case activity. $isCaseActivity = CRM_Case_BAO_Case::isCaseActivity($activityId); //check for civicase related permission. if ($isCaseActivity) { $allow = FALSE; foreach ($compPermissions['CiviCase'] as $per) { if (CRM_Core_Permission::check($per)) { $allow = TRUE; break; } } //check for case specific permissions. if ($allow) { $oper = 'view'; if ($action == CRM_Core_Action::UPDATE) { $oper = 'edit'; } $allow = CRM_Case_BAO_Case::checkPermission($activityId, $oper, $activity->activity_type_id); } return $allow; } //first check the component permission. $sql = "\n SELECT component_id\n FROM civicrm_option_value val\nINNER JOIN civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.name = %1 )\n WHERE val.value = %2"; $params = array(1 => array('activity_type', 'String'), 2 => array($activity->activity_type_id, 'Integer')); $componentId = CRM_Core_DAO::singleValueQuery($sql, $params); if ($componentId) { $componentName = CRM_Core_Component::getComponentName($componentId); $compPermission = CRM_Utils_Array::value($componentName, $compPermissions); //here we are interesting in any single permission. if (is_array($compPermission)) { foreach ($compPermission as $per) { if (CRM_Core_Permission::check($per)) { $allow = TRUE; break; } } } } //check for this permission related to contact. $permission = CRM_Core_Permission::VIEW; if ($action == CRM_Core_Action::UPDATE) { $permission = CRM_Core_Permission::EDIT; } //check for source contact. if (!$componentId || $allow) { $allow = CRM_Contact_BAO_Contact_Permission::allow($activity->source_contact_id, $permission); } //check for target and assignee contacts. if ($allow) { //first check for supper permission. $supPermission = 'view all contacts'; if ($action == CRM_Core_Action::UPDATE) { $supPermission = 'edit all contacts'; } $allow = CRM_Core_Permission::check($supPermission); //user might have sufficient permission, through acls. if (!$allow) { $allow = TRUE; //get the target contacts. $targetContacts = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity->id); foreach ($targetContacts as $cnt => $contactId) { if (!CRM_Contact_BAO_Contact_Permission::allow($contactId, $permission)) { $allow = FALSE; break; } } //get the assignee contacts. if ($allow) { $assigneeContacts = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activity->id); foreach ($assigneeContacts as $cnt => $contactId) { if (!CRM_Contact_BAO_Contact_Permission::allow($contactId, $permission)) { $allow = FALSE; break; } } } } } return $allow; }