/**
  * Checks whether the logged in user has permission to perform an action
  * against a specified project.
  *
  * @param int $op
  *   See the constants in CRM_Core_Action.
  * @param int $projectId
  *   Required for some but not all operations.
  * @return boolean
  *   TRUE is the action is allowed; else FALSE.
  */
 public static function checkProjectPerms($op, $projectId = NULL)
 {
     $opsRequiringProjectId = array(CRM_Core_Action::UPDATE, CRM_Core_Action::DELETE);
     if (in_array($op, $opsRequiringProjectId) && empty($projectId)) {
         CRM_Core_Error::fatal('Missing required parameter Project ID');
     }
     $contactId = CRM_Core_Session::getLoggedInContactID();
     switch ($op) {
         case CRM_Core_Action::ADD:
             return self::check('create volunteer projects');
         case CRM_Core_Action::UPDATE:
             if (self::check('edit all volunteer projects')) {
                 return TRUE;
             }
             $projectOwners = CRM_Volunteer_BAO_Project::getContactsByRelationship($projectId, 'volunteer_owner');
             if (self::check('edit own volunteer projects') && in_array($contactId, $projectOwners)) {
                 return TRUE;
             }
             break;
         case CRM_Core_Action::DELETE:
             if (self::check('delete all volunteer projects')) {
                 return TRUE;
             }
             $projectOwners = CRM_Volunteer_BAO_Project::getContactsByRelationship($projectId, 'volunteer_owner');
             if (self::check('delete own volunteer projects') && in_array($contactId, $projectOwners)) {
                 return TRUE;
             }
             break;
         case CRM_Core_Action::VIEW:
             if (self::check('register to volunteer') || self::check('edit all volunteer projects')) {
                 return TRUE;
             }
     }
     return FALSE;
 }
 protected function getProject($params = NULL)
 {
     if ($this->_project === NULL) {
         $this->minimumProjectParams($params);
         $this->_project = current(CRM_Volunteer_BAO_Project::retrieve($params));
         if ($this->_project) {
             $beneficiaryIds = CRM_Volunteer_BAO_Project::getContactsByRelationship($this->_project->id, 'volunteer_beneficiary');
             $this->_project->target_contact_id = implode(',', $beneficiaryIds);
         }
     }
     return $this->_project;
 }
 function testGetContactsByRelationship()
 {
     $contactId = 1;
     $relType = CRM_Core_OptionGroup::getValue(CRM_Volunteer_BAO_ProjectContact::RELATIONSHIP_OPTION_GROUP, 'volunteer_owner', 'name');
     $project = CRM_Core_DAO::createTestObject('CRM_Volunteer_BAO_Project');
     $this->assertObjectHasAttribute('id', $project, 'Failed to prepopulate Volunteer Project');
     $projectContact = CRM_Core_DAO::createTestObject('CRM_Volunteer_BAO_ProjectContact', array('contact_id' => $contactId, 'project_id' => $project->id, 'relationship_type_id' => $relType));
     $this->assertObjectHasAttribute('id', $projectContact, 'Failed to prepopulate Volunteer Project Contact');
     $contacts = CRM_Volunteer_BAO_Project::getContactsByRelationship($project->id, $relType);
     $this->assertTrue(in_array($contactId, $contacts));
 }
 /**
  * Set default values for the Activity about to be created/updated.
  *
  * Called from self::createVolunteerActivity(), which checks for the existence
  * of necessary params; thus, no such checks are performed here.
  *
  * @param array $params
  *   @see self::createVolunteerActivity()
  * @return array
  *   Default parameters to use for api.activity.create
  */
 private static function setActivityDefaults(array $params)
 {
     $defaults = array();
     $op = empty($params['id']) ? CRM_Core_Action::ADD : CRM_Core_Action::UPDATE;
     $need = civicrm_api3('volunteer_need', 'getsingle', array('id' => $params['volunteer_need_id']));
     $project = CRM_Volunteer_BAO_Project::retrieveByID($need['project_id']);
     $defaults['campaign_id'] = $project ? $project->campaign_id : '';
     // Force NULL campaign ids to be empty strings, since the API ignores NULL values.
     if (empty($defaults['campaign_id'])) {
         $defaults['campaign_id'] = '';
     }
     if ($op === CRM_Core_Action::ADD) {
         $defaults['volunteer_role_id'] = CRM_Utils_Array::value('role_id', $need);
         $defaults['time_scheduled_minutes'] = CRM_Utils_Array::value('duration', $need);
         $defaults['target_contact_id'] = CRM_Volunteer_BAO_Project::getContactsByRelationship($project->id, 'volunteer_beneficiary');
         // If the related entity doesn't provide a good default, use tomorrow.
         if (empty($params['activity_date_time'])) {
             $tomorrow = date('Y-m-d H:i:s', strtotime('tomorrow'));
             $defaults['activity_date_time'] = CRM_Utils_Array::value('start_time', $project->getEntityAttributes(), $tomorrow);
         }
         if (empty($params['subject'])) {
             $defaults['subject'] = $project->title;
         }
     }
     return $defaults;
 }