/** * Function to add activity contact. * * @param array $params * The values for this table: activity id, contact id, record type. * * @return object * activity_contact object */ public static function create(&$params) { $activityContact = new CRM_Activity_DAO_ActivityContact(); $activityContact->copyValues($params); if (!$activityContact->find(TRUE)) { return $activityContact->save(); } return $activityContact; }
/** * 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 */ 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; $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts); $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); $target = new CRM_Activity_DAO_ActivityContact(); $target->record_type_id = $targetID; $target->activity_id = $activityId; $target->contact_id = $contactId; if ($target->find(TRUE)) { $isTarget = TRUE; } $assignee = new CRM_Activity_DAO_ActivityContact(); $assignee->activity_id = $activityId; $assignee->record_type_id = $assigneeID; $assignee->contact_id = $contactId; if ($assignee->find(TRUE)) { $isAssignee = TRUE; } $source = new CRM_Activity_DAO_ActivityContact(); $source->activity_id = $activityId; $source->record_type_id = $sourceID; $source->contact_id = $contactId; if ($source->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; }
/** * This function deletes the activity record related to contact record. * * This is conditional on there being no target and assignee record * with other contacts. * * @param int $contactId * ContactId. * * @return true/null */ public static function cleanupActivity($contactId) { $result = NULL; if (!$contactId) { return $result; } $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts); $transaction = new CRM_Core_Transaction(); // delete activity if there is no record in civicrm_activity_contact // pointing to any other contact record $activityContact = new CRM_Activity_DAO_ActivityContact(); $activityContact->contact_id = $contactId; $activityContact->record_type_id = $sourceID; $activityContact->find(); while ($activityContact->fetch()) { // delete activity_contact record for the deleted contact $activityContact->delete(); $activityContactOther = new CRM_Activity_DAO_ActivityContact(); $activityContactOther->activity_id = $activityContact->activity_id; // delete activity only if no other contacts connected if (!$activityContactOther->find(TRUE)) { $activityParams = array('id' => $activityContact->activity_id); $result = self::deleteActivity($activityParams); } $activityContactOther->free(); } $activityContact->free(); $transaction->commit(); return $result; }
/** * class constructor */ function __construct() { parent::__construct(); }
/** * Takes an associative array and creates a friend object. * * @param array $params * (reference ) an assoc array of name/value pairs. * * @return void */ public static function create(&$params) { $transaction = new CRM_Core_Transaction(); $mailParams = array(); //create contact corresponding to each friend foreach ($params['friend'] as $key => $details) { if ($details["first_name"]) { $contactParams[$key] = array('first_name' => $details["first_name"], 'last_name' => $details["last_name"], 'contact_source' => ts('Tell a Friend') . ": {$params['title']}", 'email-Primary' => $details["email"]); $displayName = $details["first_name"] . " " . $details["last_name"]; $mailParams['email'][$displayName] = $details["email"]; } } $frndParams = array(); $frndParams['entity_id'] = $params['entity_id']; $frndParams['entity_table'] = $params['entity_table']; self::getValues($frndParams); $activityTypeId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionValue', 'Tell a Friend', 'value', 'name'); //create activity $activityParams = array('source_contact_id' => $params['source_contact_id'], 'source_record_id' => NULL, 'activity_type_id' => $activityTypeId, 'title' => $params['title'], 'activity_date_time' => date("YmdHis"), 'subject' => ts('Tell a Friend') . ": {$params['title']}", 'details' => $params['suggested_message'], 'status_id' => 2, 'is_test' => $params['is_test'], 'campaign_id' => CRM_Utils_Array::value('campaign_id', $params)); //activity creation $activity = CRM_Activity_BAO_Activity::create($activityParams); $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); //friend contacts creation foreach ($contactParams as $key => $value) { //create contact only if it does not exits in db $value['email'] = $value['email-Primary']; $value['check_permission'] = FALSE; $contact = CRM_Core_BAO_UFGroup::findContact($value, NULL, 'Individual'); if (!$contact) { $contact = self::add($value); } // attempt to save activity targets $targetParams = array('activity_id' => $activity->id, 'contact_id' => $contact, 'record_type_id' => $targetID); // See if it already exists $activityContact = new CRM_Activity_DAO_ActivityContact(); $activityContact->activity_id = $activity->id; $activityContact->contact_id = $contact; $activityContact->find(TRUE); if (empty($activityContact->id)) { $resultTarget = CRM_Activity_BAO_ActivityContact::create($targetParams); } } $transaction->commit(); //process sending of mails $mailParams['title'] = CRM_Utils_Array::value('title', $params); $mailParams['general_link'] = CRM_Utils_Array::value('general_link', $frndParams); $mailParams['message'] = CRM_Utils_Array::value('suggested_message', $params); // get domain $domainDetails = CRM_Core_BAO_Domain::getNameAndEmail(); list($username, $mailParams['domain']) = explode('@', $domainDetails[1]); $default = array(); $findProperties = array('id' => $params['entity_id']); if ($params['entity_table'] == 'civicrm_contribution_page') { $returnProperties = array('receipt_from_email', 'is_email_receipt'); CRM_Core_DAO::commonRetrieve('CRM_Contribute_DAO_ContributionPage', $findProperties, $default, $returnProperties); //if is_email_receipt is set then take receipt_from_email //as from_email if (!empty($default['is_email_receipt']) && !empty($default['receipt_from_email'])) { $mailParams['email_from'] = $default['receipt_from_email']; } $urlPath = 'civicrm/contribute/transact'; $mailParams['module'] = 'contribute'; } elseif ($params['entity_table'] == 'civicrm_event') { $returnProperties = array('confirm_from_email', 'is_email_confirm'); CRM_Core_DAO::commonRetrieve('CRM_Event_DAO_Event', $findProperties, $default, $returnProperties); $mailParams['email_from'] = $domainDetails['1']; //if is_email_confirm is set then take confirm_from_email //as from_email if (!empty($default['is_email_confirm']) && !empty($default['confirm_from_email'])) { $mailParams['email_from'] = $default['confirm_from_email']; } $urlPath = 'civicrm/event/info'; $mailParams['module'] = 'event'; } elseif ($params['entity_table'] == 'civicrm_pcp') { $mailParams['email_from'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Email', $params['source_contact_id'], 'email', 'contact_id'); $urlPath = 'civicrm/pcp/info'; $mailParams['module'] = 'contribute'; } $mailParams['page_url'] = CRM_Utils_System::url($urlPath, "reset=1&id={$params['entity_id']}", TRUE, NULL, FALSE, TRUE); //send mail self::sendMail($params['source_contact_id'], $mailParams); }
/** * Test activity api create for case activities */ function testCaseActivityCreate() { // Create a case first $params = $this->_params; $result = $this->callAPISuccess('case', 'create', $params); $params = array('case_id' => 1, 'activity_type_id' => $this->followup_activity_type_value, 'subject' => 'Test followup', 'source_contact_id' => $this->_loggedInUser, 'target_contact_id' => $this->_params['contact_id']); $result = $this->callAPISuccess('activity', 'create', $params); $this->assertEquals($result['values'][$result['id']]['activity_type_id'], $params['activity_type_id'], 'in line ' . __LINE__); // might need this for other tests that piggyback on this one $this->_caseActivityId = $result['values'][$result['id']]['id']; // Check other DB tables populated properly - is there a better way to do this? assertDBState() requires that we know the id already. $dao = new CRM_Case_DAO_CaseActivity(); $dao->case_id = 1; $dao->activity_id = $this->_caseActivityId; $this->assertEquals($dao->find(), 1, 'case_activity table not populated correctly in line ' . __LINE__); $dao->free(); $dao = new CRM_Activity_DAO_ActivityContact(); $dao->activity_id = $this->_caseActivityId; $dao->contact_id = $this->_params['contact_id']; $dao->record_type_id = 3; $this->assertEquals($dao->find(), 1, 'activity_contact table not populated correctly in line ' . __LINE__); $dao->free(); // TODO: There's more things we could check }
/** * Returns the list of fields that can be exported * * @param bool $prefix * * @return array */ static 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_contact'] =& $fields[$name]; } else { self::$_export[$name] =& $fields[$name]; } } } } return self::$_export; }
static function sendInviteEmail($message_template, $contact_id, $emailParams = array(), $teampcpId, $activityId) { $mailParams = array(); $contactParams = array(); if (isset($emailParams['tplParams'])) { $mailParams['tplParams'] = $emailParams['tplParams']; } //create contact corresponding to each friend foreach ($emailParams['friend'] as $key => $details) { if ($details["first_name"]) { $displayName = $details["first_name"] . " " . $details["last_name"]; $contactParams[$key] = array('first_name' => $details["first_name"], 'last_name' => $details["last_name"], 'contact_source' => ts('PCP Team Invite'), 'email-Primary' => $details["email"], 'display_name' => $displayName); $mailParams['email'][$displayName] = $contactParams[$key]; } } if (empty($mailParams)) { return NULL; } $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); //friend contacts creation foreach ($contactParams as $key => $value) { //create contact only if it does not exits in db $value['email'] = $value['email-Primary']; $value['check_permission'] = FALSE; $contact = CRM_Core_BAO_UFGroup::findContact($value, NULL, 'Individual'); if (!$contact) { $contact = CRM_Contact_BAO_Contact::createProfileContact($value, CRM_Core_DAO::$_nullArray); } // attempt to save activity targets $targetParams = array('activity_id' => $activityId, 'contact_id' => $contact, 'record_type_id' => $targetID); // See if it already exists $activityContact = new CRM_Activity_DAO_ActivityContact(); $activityContact->activity_id = $activityId; $activityContact->contact_id = $contact; $activityContact->find(TRUE); if (empty($activityContact->id)) { CRM_Activity_BAO_ActivityContact::create($targetParams); } } $mailParams['valueName'] = $message_template; return self::sendMail($contact_id, $mailParams); }