/** * class constructor */ function __construct() { parent::__construct(); }
/** * Validate contact permission for * given operation on activity record. * * @param int $activityId activity record id. * @param string $operation user operation. * @param int $actTypeId activity type id. * @param int $contactId contact id/if not pass consider logged in * @param boolean $checkComponent do we need to check component enabled. * * @return boolean $allow true/false * @static */ function checkPermission($activityId, $operation, $actTypeId = NULL, $contactId = NULL, $checkComponent = TRUE) { $allow = FALSE; if (!$actTypeId && $activityId) { $actTypeId = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activityId, 'activity_type_id'); } if (!$activityId || !$operation || !$actTypeId) { return $allow; } //do check for civicase component enabled. if ($checkComponent) { static $componentEnabled; if (!isset($componentEnabled)) { $config = CRM_Core_Config::singleton(); $componentEnabled = FALSE; if (in_array('CiviCase', $config->enableComponents)) { $componentEnabled = TRUE; } } if (!$componentEnabled) { return $allow; } } //do check for cases. $caseActOperations = array('File On Case', 'Link Cases', 'Move To Case', 'Copy To Case'); if (in_array($operation, $caseActOperations)) { static $unclosedCases; if (!is_array($unclosedCases)) { $unclosedCases = self::getUnclosedCases(); } if ($operation == 'File On Case') { $allow = empty($unclosedCases) ? FALSE : TRUE; } else { $allow = count($unclosedCases) > 1 ? TRUE : FALSE; } } $actionOperations = array('view', 'edit', 'delete'); if (in_array($operation, $actionOperations)) { //do cache when user has non/supper permission. static $allowOperations; if (!is_array($allowOperations) || !array_key_exists($operation, $allowOperations)) { if (!$contactId) { $session = CRM_Core_Session::singleton(); $contactId = $session->get('userID'); } //check for permissions. $permissions = array('view' => array('access my cases and activities', 'access all cases and activities'), 'edit' => array('access my cases and activities', 'access all cases and activities'), 'delete' => array('delete activities')); //check for core permission. $hasPermissions = array(); $checkPermissions = CRM_Utils_Array::value($operation, $permissions); if (is_array($checkPermissions)) { foreach ($checkPermissions as $per) { if (CRM_Core_Permission::check($per)) { $hasPermissions[$operation][] = $per; } } } //has permissions. if (!empty($hasPermissions)) { //need to check activity object specific. if (in_array($operation, array('view', 'edit'))) { //do we have supper permission. if (in_array('access all cases and activities', $hasPermissions[$operation])) { $allowOperations[$operation] = $allow = TRUE; } else { //user has only access to my cases and activity. //here object specific permmions come in picture. //edit - contact must be source or assignee //view - contact must be source/assignee/target $isTarget = $isAssignee = $isSource = FALSE; $target = new CRM_Activity_DAO_ActivityTarget(); $target->activity_id = $activityId; $target->target_contact_id = $contactId; if ($target->find(TRUE)) { $isTarget = TRUE; } $assignee = new CRM_Activity_DAO_ActivityAssignment(); $assignee->activity_id = $activityId; $assignee->assignee_contact_id = $contactId; if ($assignee->find(TRUE)) { $isAssignee = TRUE; } $activity = new CRM_Activity_DAO_Activity(); $activity->id = $activityId; $activity->source_contact_id = $contactId; if ($activity->find(TRUE)) { $isSource = TRUE; } if ($operation == 'edit') { if ($isAssignee || $isSource) { $allow = TRUE; } } if ($operation == 'view') { if ($isTarget || $isAssignee || $isSource) { $allow = TRUE; } } } } elseif (is_array($hasPermissions[$operation])) { $allowOperations[$operation] = $allow = TRUE; } } else { //contact do not have permission. $allowOperations[$operation] = FALSE; } } else { //use cache. //here contact might have supper/non permission. $allow = $allowOperations[$operation]; } } //do further only when operation is granted. if ($allow) { $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'name'); //get the activity type name. $actTypeName = CRM_Utils_Array::value($actTypeId, $activityTypes); //do not allow multiple copy / edit action. $singletonNames = array('Open Case', 'Reassigned Case', 'Merge Case', 'Link Cases', 'Assign Case Role', 'Email', 'Inbound Email'); //do not allow to delete these activities, CRM-4543 $doNotDeleteNames = array('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date'); //allow edit operation. $allowEditNames = array('Open Case'); // do not allow File on Case $doNotFileNames = array('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date', 'Reassigned Case', 'Merge Case', 'Link Cases', 'Assign Case Role'); if (in_array($actTypeName, $singletonNames)) { $allow = FALSE; if ($operation == 'File On Case') { $allow = in_array($actTypeName, $doNotFileNames) ? FALSE : TRUE; } if (in_array($operation, $actionOperations)) { $allow = TRUE; if ($operation == 'edit') { $allow = in_array($actTypeName, $allowEditNames) ? TRUE : FALSE; } elseif ($operation == 'delete') { $allow = in_array($actTypeName, $doNotDeleteNames) ? FALSE : TRUE; } } } if ($allow && $operation == 'delete' && in_array($actTypeName, $doNotDeleteNames)) { $allow = FALSE; } if ($allow && $operation == 'File On Case' && in_array($actTypeName, $doNotFileNames)) { $allow = FALSE; } //check settings file for masking actions //on the basis the activity types //hide Edit link if activity type is NOT editable //(special case activities).CRM-5871 if ($allow && in_array($operation, $actionOperations)) { static $actionFilter = array(); if (!array_key_exists($operation, $actionFilter)) { $xmlProcessor = new CRM_Case_XMLProcessor_Process(); $actionFilter[$operation] = $xmlProcessor->get('Settings', 'ActivityTypes', FALSE, $operation); } if (array_key_exists($operation, $actionFilter[$operation]) && in_array($actTypeId, $actionFilter[$operation][$operation])) { $allow = FALSE; } } } return $allow; }
/** * returns the list of fields that can be exported * * @access public * return array */ function &export($prefix = false) { if (!self::$_export) { self::$_export = array(); $fields =& self::fields(); foreach ($fields as $name => $field) { if (CRM_Utils_Array::value('export', $field)) { if ($prefix) { self::$_export['activity_assignment'] =& $fields[$name]; } else { self::$_export[$name] =& $fields[$name]; } } } } return self::$_export; }
/** * This function delete activity record related to contact record, * when there are no target and assignee record w/ other contact. * * @param int $contactId contactId * * @return true/null * @access public */ public function cleanupActivity($contactId) { $result = null; if (!$contactId) { return $result; } require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); // delete activity if there are no record in // civicrm_activity_assignment or civicrm_activity_target // pointing to any other contact record. require_once 'CRM/Activity/DAO/ActivityTarget.php'; require_once 'CRM/Activity/DAO/ActivityAssignment.php'; $activity = new CRM_Activity_DAO_Activity(); $activity->source_contact_id = $contactId; $activity->find(); while ($activity->fetch()) { $noTarget = $noAssignee = true; // check for target activity record. $target = new CRM_Activity_DAO_ActivityTarget(); $target->activity_id = $activity->id; $target->find(); while ($target->fetch()) { if ($target->target_contact_id != $contactId) { $noTarget = false; break; } } $target->free(); // check for assignee activity record. $assignee = new CRM_Activity_DAO_ActivityAssignment(); $assignee->activity_id = $activity->id; $assignee->find(); while ($assignee->fetch()) { if ($assignee->assignee_contact_id != $contactId) { $noAssignee = false; break; } } $assignee->free(); // finally delete activity. if ($noTarget && $noAssignee) { $activityParams = array('id' => $activity->id); $result = self::deleteActivity($activityParams); } } $activity->free(); $transaction->commit(); return $result; }
static function createConference($adminID, $teacherID, $activityTypeID, $activityDateTime, $subject, $location, $statusID, $duration = 30) { require_once 'CRM/Activity/DAO/Activity.php'; $activity = new CRM_Activity_DAO_Activity(); $activity->source_contact_id = $adminID; $activity->activity_type_id = $activityTypeID; $activity->activity_date_time = $activityDateTime; $activity->status_id = $statusID; $activity->subject = $subject; $activity->duration = $duration; $activity->location = $location; $activity->save(); require_once 'CRM/Activity/DAO/ActivityAssignment.php'; $assignment = new CRM_Activity_DAO_ActivityAssignment(); $assignment->activity_id = $activity->id; $assignment->assignee_contact_id = $teacherID; $assignment->save(); return $activity->id; }