/** * Tests CRM_Volunteer_BAO_Assignment::createVolunteerActivity() to ensure * that the activity subject defaults to the project title. */ function testActivitySubject() { $need = $project = $volunteerContactId = NULL; extract($this->setUpProject(), EXTR_IF_EXISTS); $assignmentId = CRM_Volunteer_BAO_Assignment::createVolunteerActivity(array('assignee_contact_id' => $volunteerContactId, 'source_contact_id' => $volunteerContactId, 'volunteer_need_id' => $need->id)); $activitySubject = civicrm_api3('Activity', 'getvalue', array('activity_id' => $assignmentId, 'return' => 'subject')); $this->assertEquals($project->title, $activitySubject); }
/** * Create or update a volunteer assignment * * @param array $params Associative array of property * name/value pairs to insert in new 'assignment' * @example AssignmentCreate.php Std Create example * * @return array api result array * {@getfields volunteer_assignment create} * @access public */ function civicrm_api3_volunteer_assignment_create($params) { $result = CRM_Volunteer_BAO_Assignment::createVolunteerActivity($params); if ($result) { return civicrm_api3('volunteer_assignment', 'get', array('id' => $result)); } return civicrm_api3_create_error('unable to create activity'); }
/** * VOL-154: Verifies that an activity created in a project is tagged with the * project's campaign. */ function testCampaignInheritance() { // begin setup $campaign = CRM_Core_DAO::createTestObject('CRM_Campaign_BAO_Campaign'); $this->assertObjectHasAttribute('id', $campaign, 'Failed to prepopulate Campaign'); $project = CRM_Core_DAO::createTestObject('CRM_Volunteer_BAO_Project', array('campaign_id' => $campaign->id)); $this->assertObjectHasAttribute('id', $project, 'Failed to prepopulate Volunteer Project'); $need = CRM_Core_DAO::createTestObject('CRM_Volunteer_BAO_Need', array('project_id' => $project->id)); $this->assertObjectHasAttribute('id', $need, 'Failed to prepopulate Volunteer Need'); // end setup $activityId = CRM_Volunteer_BAO_Assignment::createVolunteerActivity(array('assignee_contact_id' => 1, 'source_contact_id' => 1, 'volunteer_need_id' => $need->id)); $this->assertNotSame(FALSE, $activityId, 'Failed to create Volunteer Activity'); $createdActivity = CRM_Volunteer_BAO_Assignment::findById($activityId); $this->assertEquals($campaign->id, $createdActivity->campaign_id, 'Activity did not inherit campaign from volunteer project'); }
/** * @todo per totten's suggestion, wrap all these writes in a transaction; * see http://wiki.civicrm.org/confluence/display/CRMDOC43/Transaction+Reference */ function postProcess() { $cid = CRM_Utils_Array::value('userID', $_SESSION['CiviCRM'], NULL); $values = $this->controller->exportValues(); $profileFields = array(); foreach ($this->getProfileIDs() as $profileID) { $profileFields += CRM_Core_BAO_UFGroup::getFields($profileID); } $profileValues = array_intersect_key($values, $profileFields); $activityValues = array_diff_key($values, $profileValues); // Search for duplicate if (!$cid) { $dedupeParams = CRM_Dedupe_Finder::formatParams($profileValues, 'Individual'); $dedupeParams['check_permission'] = FALSE; $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if ($ids) { $cid = $ids[0]; } } $cid = CRM_Contact_BAO_Contact::createProfileContact($profileValues, $profileFields, $cid); $activity_statuses = CRM_Activity_BAO_Activity::buildOptions('status_id', 'create'); $projectNeeds = array(); foreach ($this->_needs as $need) { $activityValues['volunteer_need_id'] = $need['id']; $activityValues['activity_date_time'] = CRM_Utils_Array::value('start_time', $need); $activityValues['assignee_contact_id'] = $cid; $activityValues['is_test'] = $this->_mode === 'test' ? 1 : 0; // below we assume that volunteers are always signing up only themselves; // for now this is a safe assumption, but we may need to revisit this. $activityValues['source_contact_id'] = $cid; // Set status to Available if user selected Flexible Need, else set to Scheduled. if (CRM_Utils_Array::value('is_flexible', $need)) { $activityValues['status_id'] = CRM_Utils_Array::key('Available', $activity_statuses); } else { $activityValues['status_id'] = CRM_Utils_Array::key('Scheduled', $activity_statuses); } $activityValues['time_scheduled_minutes'] = CRM_Utils_Array::value('duration', $need); CRM_Volunteer_BAO_Assignment::createVolunteerActivity($activityValues); if (!array_key_exists($need['project_id'], $projectNeeds)) { $projectNeeds[$need['project_id']] = array(); } $need['role'] = $need['role_label']; $need['description'] = $need['role_description']; $need['duration'] = CRM_Utils_Array::value('duration', $need); $projectNeeds[$need['project_id']][$need['id']] = $need; } // Send confirmation email to volunteer list($displayName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($cid); list($domainEmailName, $domainEmailAddress) = CRM_Core_BAO_Domain::getNameAndEmail(); if ($email) { $tplParams = $this->prepareTplParams($projectNeeds); $sendTemplateParams = array('contactId' => $cid, 'from' => "{$domainEmailName} <" . $domainEmailAddress . ">", 'groupName' => 'msg_tpl_workflow_volunteer', 'isTest' => $this->_mode === 'test', 'toName' => $displayName, 'toEmail' => $email, 'tplParams' => array("volunteer_projects" => $tplParams), 'valueName' => 'volunteer_registration'); $bcc = array(); foreach ($tplParams as $data) { foreach ($data['contacts'] as $manager) { $bcc[$manager['contact_id']] = "{$manager['display_name']} <{$manager['email']}>"; } } if (count($bcc)) { $sendTemplateParams['bcc'] = implode(', ', $bcc); } CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams); } $statusMsg = ts('You are scheduled to volunteer. Thank you!', array('domain' => 'org.civicrm.volunteer')); CRM_Core_Session::setStatus($statusMsg, '', 'success'); CRM_Utils_System::redirect($this->_destination); }
/** * process the form after the input has been submitted and validated * * @access public * * @return None */ public function postProcess() { $params = $this->controller->exportValues($this->_name); $validParams = self::getCompletedRows($params['field']); $count = 0; foreach ($validParams as $value) { if (!empty($value['activity_id'])) { // update the activity record $volunteer = array('status_id' => $value['volunteer_status'], 'id' => $value['activity_id'], 'time_completed_minutes' => CRM_Utils_Array::value('actual_duration', $value), 'time_scheduled_minutes' => CRM_Utils_Array::value('scheduled_duration', $value)); CRM_Volunteer_BAO_Assignment::createVolunteerActivity($volunteer); } else { $flexibleNeedId = CRM_Volunteer_BAO_Project::getFlexibleNeedID($this->_vid); // create new Volunteer activity records $volunteer = array('assignee_contact_id' => $value['contact_id'], 'status_id' => $value['volunteer_status'], 'subject' => $this->_title . ' Volunteering', 'volunteer_need_id' => $flexibleNeedId, 'volunteer_role_id' => CRM_Utils_Array::value('volunteer_role', $value), 'time_completed_minutes' => CRM_Utils_Array::value('actual_duration', $value), 'time_scheduled_minutes' => CRM_Utils_Array::value('scheduled_duration', $value)); if (!empty($value['start_date'])) { $volunteer['activity_date_time'] = CRM_Utils_Date::processDate($value['start_date'], $value['start_date_time'], TRUE); } CRM_Volunteer_BAO_Assignment::createVolunteerActivity($volunteer); } $count++; } $statusMsg = ts('Volunteer hours have been logged.', array('domain' => 'org.civicrm.volunteer')); CRM_Core_Session::setStatus($statusMsg, ts('Saved', array('domain' => 'org.civicrm.volunteer')), 'success'); }
/** * @todo per totten's suggestion, wrap all these writes in a transaction; * see http://wiki.civicrm.org/confluence/display/CRMDOC43/Transaction+Reference */ function postProcess() { $cid = CRM_Utils_Array::value('userID', $_SESSION['CiviCRM'], NULL); $values = $this->controller->exportValues(); $isFlexible = FALSE; // Role id is not present in form $values when the only public need is the flexible need. // So if role id is not set OR if it matches flexible role id constant then use the flexible need id if (!isset($values['volunteer_role_id']) || (int) CRM_Utils_Array::value('volunteer_role_id', $values) === CRM_Volunteer_BAO_Need::FLEXIBLE_ROLE_ID) { $isFlexible = TRUE; foreach ($this->_project->needs as $n) { if ($n['is_flexible'] === '1') { $values['volunteer_need_id'] = $n['id']; break; } } } unset($values['volunteer_role_id']); // we don't need this anymore $params = array('id' => CRM_Utils_Array::value('volunteer_need_id', $values), 'version' => 3); $need = civicrm_api('VolunteerNeed', 'getsingle', $params); $profile_fields = CRM_Core_BAO_UFGroup::getFields($this->_ufgroup_id); $profile_values = array_intersect_key($values, $profile_fields); $builtin_values = array_diff_key($values, $profile_values); // Search for duplicate if (!$cid) { $dedupeParams = CRM_Dedupe_Finder::formatParams($profile_values, 'Individual'); $dedupeParams['check_permission'] = FALSE; $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if ($ids) { $cid = $ids[0]; } } $cid = CRM_Contact_BAO_Contact::createProfileContact($profile_values, $profile_fields, $cid, NULL, $this->_ufgroup_id); $activity_statuses = CRM_Activity_BAO_Activity::buildOptions('status_id', 'create'); $builtin_values['activity_date_time'] = CRM_Utils_Array::value('start_time', $need); $builtin_values['assignee_contact_id'] = $cid; $builtin_values['is_test'] = $this->_mode === 'test' ? 1 : 0; // below we assume that volunteers are always signing up only themselves; // for now this is a safe assumption, but we may need to revisit this. $builtin_values['source_contact_id'] = $cid; // Set status to Available if user selected Flexible Need, else set to Scheduled. if ($isFlexible) { $builtin_values['status_id'] = CRM_Utils_Array::key('Available', $activity_statuses); } else { $builtin_values['status_id'] = CRM_Utils_Array::key('Scheduled', $activity_statuses); } $builtin_values['subject'] = $this->_project->title; $builtin_values['time_scheduled_minutes'] = CRM_Utils_Array::value('duration', $need); CRM_Volunteer_BAO_Assignment::createVolunteerActivity($builtin_values); // Send confirmation email to volunteer list($displayName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($cid); list($domainEmailName, $domainEmailAddress) = CRM_Core_BAO_Domain::getNameAndEmail(); if ($email) { $date = CRM_Utils_Date::customFormat($builtin_values['activity_date_time'], "%m/%E/%Y at %l:%M %P"); $html = "You are scheduled to volunteer at the " . $builtin_values["subject"] . " on " . $date . ". Thank You!"; $mailParams["from"] = "{$domainEmailName} <" . $domainEmailAddress . ">"; $mailParams["toName"] = $displayName; $mailParams["toEmail"] = $email; $mailParams["subject"] = "Volunteer Confirmation for {$builtin_values['subject']}"; $mailParams["text"] = $html; $mailParams["html"] = $html; $mailParams["replyTo"] = $domainEmailAddress; CRM_Utils_Mail::send($mailParams); } $statusMsg = ts('You are scheduled to volunteer. Thank you!', array('domain' => 'org.civicrm.volunteer')); CRM_Core_Session::setStatus($statusMsg, '', 'success'); CRM_Utils_System::redirect($this->_destination); }
/** * Facilitates propagatation of changes in a Project to associated Activities. * * This method takes no arguments because the Assignment BAO handles * propagation internally. * * @see CRM_Volunteer_BAO_Assignment::setActivityDefaults() */ public function updateAssociatedActivities() { $activities = CRM_Volunteer_BAO_Assignment::retrieve(array('project_id' => $this->id)); foreach ($activities as $activity) { CRM_Volunteer_BAO_Assignment::createVolunteerActivity(array('id' => $activity['id'])); } }
/** * @todo per totten's suggestion, wrap all these writes in a transaction; * see http://wiki.civicrm.org/confluence/display/CRMDOC43/Transaction+Reference */ function postProcess() { $cid = CRM_Utils_Array::value('userID', $_SESSION['CiviCRM'], NULL); $values = $this->controller->exportValues(); $profileFields = array(); foreach ($this->getProfileIDs() as $profileID) { $profileFields += CRM_Core_BAO_UFGroup::getFields($profileID); } $profileValues = array_intersect_key($values, $profileFields); $activityValues = array_diff_key($values, $profileValues); // Search for duplicate if (!$cid) { $dedupeParams = CRM_Dedupe_Finder::formatParams($profileValues, 'Individual'); $dedupeParams['check_permission'] = FALSE; $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); if ($ids) { $cid = $ids[0]; } } $cid = CRM_Contact_BAO_Contact::createProfileContact($profileValues, $profileFields, $cid); $activity_statuses = CRM_Activity_BAO_Activity::buildOptions('status_id', 'create'); foreach ($this->_needs as $need) { $activityValues['volunteer_need_id'] = $need['id']; $activityValues['activity_date_time'] = CRM_Utils_Array::value('start_time', $need); $activityValues['assignee_contact_id'] = $cid; $activityValues['is_test'] = $this->_mode === 'test' ? 1 : 0; // below we assume that volunteers are always signing up only themselves; // for now this is a safe assumption, but we may need to revisit this. $activityValues['source_contact_id'] = $cid; // Set status to Available if user selected Flexible Need, else set to Scheduled. if (CRM_Utils_Array::value('is_flexible', $need)) { $activityValues['status_id'] = CRM_Utils_Array::key('Available', $activity_statuses); } else { $activityValues['status_id'] = CRM_Utils_Array::key('Scheduled', $activity_statuses); } $activityValues['time_scheduled_minutes'] = CRM_Utils_Array::value('duration', $need); CRM_Volunteer_BAO_Assignment::createVolunteerActivity($activityValues); } $statusMsg = ts('You are scheduled to volunteer. Thank you!', array('domain' => 'org.civicrm.volunteer')); CRM_Core_Session::setStatus($statusMsg, '', 'success'); CRM_Utils_System::redirect($this->_destination); }
/** * This function Loops through the needs the user is signing up for * and creates activity records for them. * * @param int $cid * The contact ID for whom this activity is to be created * @param array $activityValues * An array of values corresponding to the data the user submitted minus the profile fields * @return array * Project needs data for use in sending confirmation email. */ private function createVolunteerActivity($cid, array $activityValues) { $projectNeeds = array(); $activity_statuses = CRM_Activity_BAO_Activity::buildOptions('status_id', 'create'); foreach ($this->_needs as $need) { $activityValues['volunteer_need_id'] = $need['id']; $activityValues['activity_date_time'] = CRM_Utils_Array::value('start_time', $need); $activityValues['assignee_contact_id'] = $cid; $activityValues['is_test'] = $this->_mode === 'test' ? 1 : 0; $activityValues['source_contact_id'] = $this->_primary_volunteer_id; // Set status to Available if user selected Flexible Need, else set to Scheduled. if (CRM_Utils_Array::value('is_flexible', $need)) { $activityValues['status_id'] = CRM_Utils_Array::key('Available', $activity_statuses); } else { $activityValues['status_id'] = CRM_Utils_Array::key('Scheduled', $activity_statuses); } $activityValues['time_scheduled_minutes'] = CRM_Utils_Array::value('duration', $need); CRM_Volunteer_BAO_Assignment::createVolunteerActivity($activityValues); if (!array_key_exists($need['project_id'], $projectNeeds)) { $projectNeeds[$need['project_id']] = array(); } $need['role'] = $need['role_label']; $need['description'] = $need['role_description']; $need['duration'] = CRM_Utils_Array::value('duration', $need); $projectNeeds[$need['project_id']][$need['id']] = $need; } return $projectNeeds; }