/**
  * 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;
 }