/** * Function to get Case Activities * * @param int $caseID case id * @param array $params posted params * @param int $contactID contact id * * @return returns case activities * * @static */ static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL) { $values = array(); // CRM-5081 - formatting the dates to omit seconds. // Note the 00 in the date format string is needed otherwise later on it thinks scheduled ones are overdue. $select = "SELECT count(ca.id) as ismultiple, ca.id as id, \n ca.activity_type_id as type,\n ca.activity_type_id as activity_type_id, \n cc.sort_name as reporter,\n cc.id as reporter_id,\n acc.sort_name AS assignee,\n acc.id AS assignee_id,\n DATE_FORMAT(IF(ca.activity_date_time < NOW() AND ca.status_id=ov.value,\n ca.activity_date_time,\n DATE_ADD(NOW(), INTERVAL 1 YEAR)\n ), '%Y%m%d%H%i00') as overdue_date,\n DATE_FORMAT(ca.activity_date_time, '%Y%m%d%H%i00') as display_date,\n ca.status_id as status, \n ca.subject as subject, \n ca.is_deleted as deleted,\n ca.priority_id as priority,\n ca.weight as weight "; $from = 'FROM civicrm_case_activity cca INNER JOIN civicrm_activity ca ON ca.id = cca.activity_id INNER JOIN civicrm_contact cc ON cc.id = ca.source_contact_id INNER JOIN civicrm_option_group cog ON cog.name = "activity_type" INNER JOIN civicrm_option_value cov ON cov.option_group_id = cog.id AND cov.value = ca.activity_type_id AND cov.is_active = 1 LEFT OUTER JOIN civicrm_option_group og ON og.name="activity_status" LEFT OUTER JOIN civicrm_option_value ov ON ov.option_group_id=og.id AND ov.name="Scheduled" LEFT JOIN civicrm_activity_assignment caa ON caa.activity_id = ca.id LEFT JOIN civicrm_contact acc ON acc.id = caa.assignee_contact_id '; $where = 'WHERE cca.case_id= %1 AND ca.is_current_revision = 1'; if (CRM_Utils_Array::value('reporter_id', $params)) { $where .= " AND ca.source_contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer'); } if (CRM_Utils_Array::value('status_id', $params)) { $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer'); } if (CRM_Utils_Array::value('activity_deleted', $params)) { $where .= " AND ca.is_deleted = 1"; } else { $where .= " AND ca.is_deleted = 0"; } if (CRM_Utils_Array::value('activity_type_id', $params)) { $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer'); } if (CRM_Utils_Array::value('activity_date_low', $params)) { $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date'); } if (CRM_Utils_Array::value('activity_date_high', $params)) { $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date'); $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : NULL; } if (!empty($fromActivityDate)) { $where .= " AND ca.activity_date_time >= '{$fromActivityDate}'"; } if (!empty($toActivityDate)) { $where .= " AND ca.activity_date_time <= '{$toActivityDate}'"; } // hack to handle to allow initial sorting to be done by query if (CRM_Utils_Array::value('sortname', $params) == 'undefined') { $params['sortname'] = NULL; } if (CRM_Utils_Array::value('sortorder', $params) == 'undefined') { $params['sortorder'] = NULL; } $sortname = CRM_Utils_Array::value('sortname', $params); $sortorder = CRM_Utils_Array::value('sortorder', $params); $groupBy = " GROUP BY ca.id "; if (!$sortname and !$sortorder) { // CRM-5081 - added id to act like creation date $orderBy = " ORDER BY overdue_date ASC, display_date DESC, weight DESC"; } else { $orderBy = " ORDER BY {$sortname} {$sortorder}"; if ($sortname != 'display_date') { $orderBy .= ', display_date DESC'; } } $page = CRM_Utils_Array::value('page', $params); $rp = CRM_Utils_Array::value('rp', $params); if (!$page) { $page = 1; } if (!$rp) { $rp = 10; } $start = ($page - 1) * $rp; $query = $select . $from . $where . $groupBy . $orderBy; $params = array(1 => array($caseID, 'Integer')); $dao = CRM_Core_DAO::executeQuery($query, $params); $params['total'] = $dao->N; //FIXME: need to optimize/cache these queries $limit = " LIMIT {$start}, {$rp}"; $query .= $limit; $dao = CRM_Core_DAO::executeQuery($query, $params); $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $activityPriority = CRM_Core_PseudoConstant::priority(); $url = CRM_Utils_System::url("civicrm/case/activity", "reset=1&cid={$contactID}&caseid={$caseID}", FALSE, NULL, FALSE); $contextUrl = ''; if ($context == 'fulltext') { $contextUrl = "&context={$context}"; } $editUrl = "{$url}&action=update{$contextUrl}"; $deleteUrl = "{$url}&action=delete{$contextUrl}"; $restoreUrl = "{$url}&action=renew{$contextUrl}"; $viewTitle = ts('View this activity.'); $statusTitle = ts('Edit status'); $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name')); $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name')); $caseDeleted = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseID, 'is_deleted'); // define statuses which are handled like Completed status (others are assumed to be handled like Scheduled status) $compStatusValues = array(); $compStatusNames = array('Completed', 'Left Message', 'Cancelled', 'Unreachable', 'Not Required'); foreach ($compStatusNames as $name) { $compStatusValues[] = CRM_Core_OptionGroup::getValue('activity_status', $name, 'name'); } $contactViewUrl = CRM_Utils_System::url("civicrm/contact/view", "reset=1&cid=", FALSE, NULL, FALSE); $hasViewContact = CRM_Core_Permission::giveMeAllACLs(); $clientIds = self::retrieveContactIdsByCaseId($caseID); if (!$userID) { $session = CRM_Core_Session::singleton(); $userID = $session->get('userID'); } while ($dao->fetch()) { $allowView = self::checkPermission($dao->id, 'view', $dao->activity_type_id, $userID); $allowEdit = self::checkPermission($dao->id, 'edit', $dao->activity_type_id, $userID); $allowDelete = self::checkPermission($dao->id, 'delete', $dao->activity_type_id, $userID); //do not have sufficient permission //to access given case activity record. if (!$allowView && !$allowEdit && !$allowDelete) { continue; } $values[$dao->id]['id'] = $dao->id; $values[$dao->id]['type'] = $activityTypes[$dao->type]['label']; $reporterName = $dao->reporter; if ($hasViewContact) { $reporterName = '<a href="' . $contactViewUrl . $dao->reporter_id . '">' . $dao->reporter . '</a>'; } $values[$dao->id]['reporter'] = $reporterName; $targetNames = CRM_Activity_BAO_ActivityTarget::getTargetNames($dao->id); $targetContactUrls = $withContacts = array(); foreach ($targetNames as $targetId => $targetName) { if (!in_array($targetId, $clientIds)) { $withContacts[$targetId] = $targetName; } } foreach ($withContacts as $cid => $name) { if ($hasViewContact) { $name = '<a href="' . $contactViewUrl . $cid . '">' . $name . '</a>'; } $targetContactUrls[] = $name; } $values[$dao->id]['with_contacts'] = implode('; ', $targetContactUrls); $values[$dao->id]['display_date'] = CRM_Utils_Date::customFormat($dao->display_date); $values[$dao->id]['status'] = $activityStatus[$dao->status]; //check for view activity. $subject = empty($dao->subject) ? '(' . ts('no subject') . ')' : $dao->subject; if ($allowView) { $subject = '<a href="javascript:' . $type . 'viewActivity(' . $dao->id . ',' . $contactID . ',' . '\'' . $type . '\' );" title=\'' . $viewTitle . '\'>' . $subject . '</a>'; } $values[$dao->id]['subject'] = $subject; // add activity assignee to activity selector. CRM-4485. if (isset($dao->assignee)) { if ($dao->ismultiple == 1) { if ($dao->reporter_id != $dao->assignee_id) { $values[$dao->id]['reporter'] .= $hasViewContact ? ' / ' . "<a href='{$contactViewUrl}{$dao->assignee_id}'>{$dao->assignee}</a>" : ' / ' . $dao->assignee; } $values[$dao->id]['assignee'] = $dao->assignee; } else { $values[$dao->id]['reporter'] .= ' / ' . ts('(multiple)'); } } $url = ""; $additionalUrl = "&id={$dao->id}"; if (!$dao->deleted) { //hide edit link of activity type email.CRM-4530. if (!in_array($dao->type, $emailActivityTypeIDs)) { //hide Edit link if activity type is NOT editable (special case activities).CRM-5871 if ($allowEdit) { $url = '<a href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> '; } } if ($allowDelete) { if (!empty($url)) { $url .= " | "; } $url .= '<a href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>'; } } elseif (!$caseDeleted) { $url = '<a href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>'; $values[$dao->id]['status'] = $values[$dao->id]['status'] . '<br /> (deleted)'; } //check for operations. if (self::checkPermission($dao->id, 'Move To Case', $dao->activity_type_id)) { $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ' ); return false;">' . ts('Move To Case') . '</a> '; } if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) { $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ' ); return false;">' . ts('Copy To Case') . '</a> '; } $values[$dao->id]['links'] = $url; $values[$dao->id]['class'] = ""; if (!empty($dao->priority)) { if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) { $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-urgent "; } elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) { $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-low "; } } if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) { $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-completed"; } else { if (CRM_Utils_Date::overdue($dao->display_date)) { $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-overdue"; } else { $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-scheduled"; } } if ($allowEdit) { $values[$dao->id]['status'] = '<a class="crm-activity-status crm-activity-status-' . $dao->id . ' ' . $values[$dao->id]['class'] . '" href="javascript:changeActivityStatus(' . $dao->id . ',' . $contactID . ',' . $dao->status . ');" title=\'' . $statusTitle . '\'>' . $values[$dao->id]['status'] . '</a>'; } } $dao->free(); return $values; }
function &getActivity($clientID, $activityDAO, &$activityTypeInfo) { require_once 'CRM/Core/OptionGroup.php'; if (empty($this->_redactionStringRules)) { $this->_redactionStringRules = array(); } $activity = array(); $activity['fields'] = array(); if ($clientID) { $clientID = CRM_Utils_Type::escape($clientID, 'Integer'); if (!in_array($activityTypeInfo['name'], array('Email', 'Inbound Email'))) { $activity['editURL'] = CRM_Utils_System::url('civicrm/case/activity', "reset=1&cid={$clientID}&caseid={$activityDAO->caseID}&action=update&atype={$activityDAO->activity_type_id}&id={$activityDAO->id}"); } else { $activity['editURL'] = ''; } $client = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $clientID, 'display_name'); // add Client SortName as well as Display to the strings to be redacted across the case session // suffixed with a randomly generated 4-digit number if (!array_key_exists($client, $this->_redactionStringRules)) { $this->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($this->_redactionStringRules, array($client => 'name_' . rand(10000, 100000))); $clientSortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $clientID, 'sort_name'); if (!array_key_exists($clientSortName, $this->_redactionStringRules)) { $this->_redactionStringRules[$clientSortName] = $this->_redactionStringRules[$client]; } } $activity['fields'][] = array('label' => 'Client', 'value' => $this->redact($client), 'type' => 'String'); } if ($activityDAO->targetID) { // Re-lookup the target ID since the DAO only has the first recipient if there are multiple. // Maybe not the best solution. require_once 'CRM/Activity/BAO/ActivityTarget.php'; $targetNames = CRM_Activity_BAO_ActivityTarget::getTargetNames($activityDAO->id); $processTarget = false; $label = ts('With Contact(s)'); if (in_array($activityTypeInfo['name'], array('Email', 'Inbound Email'))) { $processTarget = true; $label = ts('Recipient'); } if (!$processTarget) { foreach ($targetNames as $targetID => $targetName) { if ($targetID != $clientID) { $processTarget = true; break; } } } if ($processTarget) { $targetRedacted = array(); foreach ($targetNames as $targetID => $target) { // add Recipient SortName as well as Display to the strings to be redacted across the case session // suffixed with a randomly generated 4-digit number if (!array_key_exists($target, $this->_redactionStringRules)) { $this->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($this->_redactionStringRules, array($target => 'name_' . rand(10000, 100000))); $targetSortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $targetID, 'sort_name'); if (!array_key_exists($targetSortName, $this->_redactionStringRules)) { $this->_redactionStringRules[$targetSortName] = $this->_redactionStringRules[$target]; } } $targetRedacted[] = $this->redact($target); } $activity['fields'][] = array('label' => $label, 'value' => implode('; ', $targetRedacted), 'type' => 'String'); } } // Activity Type info is a special field $activity['fields'][] = array('label' => 'Activity Type', 'value' => $activityTypeInfo['label'], 'type' => 'String'); $activity['fields'][] = array('label' => 'Subject', 'value' => htmlspecialchars($this->redact($activityDAO->subject)), 'type' => 'Memo'); $creator = $this->getCreatedBy($activityDAO->id); // add Creator to the strings to be redacted across the case session if (!array_key_exists($creator, $this->_redactionStringRules)) { $this->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($this->_redactionStringRules, array($creator => 'name_' . rand(10000, 100000))); } $activity['fields'][] = array('label' => 'Created By', 'value' => $this->redact($creator), 'type' => 'String'); $reporter = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $activityDAO->source_contact_id, 'display_name'); // add Reporter SortName as well as Display to the strings to be redacted across the case session // suffixed with a randomly generated 4-digit number if (!array_key_exists($reporter, $this->_redactionStringRules)) { $this->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($this->_redactionStringRules, array($reporter => 'name_' . rand(10000, 100000))); $reporterSortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $activityDAO->source_contact_id, 'sort_name'); if (!array_key_exists($reporterSortName, $this->_redactionStringRules)) { $this->_redactionStringRules[$reporterSortName] = $this->_redactionStringRules[$reporter]; } } $activity['fields'][] = array('label' => 'Reported By', 'value' => $this->redact($reporter), 'type' => 'String'); if ($activityDAO->assigneeID) { //allow multiple assignee contacts.CRM-4503. require_once 'CRM/Activity/BAO/ActivityAssignment.php'; $assignee_contact_names = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activityDAO->id, true); foreach ($assignee_contact_names as &$assignee) { // add Assignee to the strings to be redacted across the case session $this->_redactionStringRules = CRM_Utils_Array::crmArrayMerge($this->_redactionStringRules, array($assignee => 'name_' . rand(10000, 100000))); $assignee = $this->redact($assignee); } $assigneeContacts = implode(', ', $assignee_contact_names); $activity['fields'][] = array('label' => 'Assigned To', 'value' => $assigneeContacts, 'type' => 'String'); } if ($activityDAO->medium_id) { $activity['fields'][] = array('label' => 'Medium', 'value' => CRM_Core_OptionGroup::getLabel('encounter_medium', $activityDAO->medium_id, false), 'type' => 'String'); } $activity['fields'][] = array('label' => 'Location', 'value' => $activityDAO->location, 'type' => 'String'); $activity['fields'][] = array('label' => 'Date and Time', 'value' => $activityDAO->activity_date_time, 'type' => 'Date'); require_once 'CRM/Utils/String.php'; $activity['fields'][] = array('label' => 'Details', 'value' => $this->redact(CRM_Utils_String::stripAlternatives($activityDAO->details)), 'type' => 'Memo'); // Skip Duration field if empty (to avoid " minutes" output). Might want to do this for all fields at some point. dgg if ($activityDAO->duration) { $activity['fields'][] = array('label' => 'Duration', 'value' => $activityDAO->duration . ' ' . ts('minutes'), 'type' => 'Int'); } $activity['fields'][] = array('label' => 'Status', 'value' => CRM_Core_OptionGroup::getLabel('activity_status', $activityDAO->status_id), 'type' => 'String'); $activity['fields'][] = array('label' => 'Priority', 'value' => CRM_Core_OptionGroup::getLabel('priority', $activityDAO->priority_id), 'type' => 'String'); //for now empty custom groups $activity['customGroups'] = $this->getCustomData($clientID, $activityDAO, $activityTypeInfo); return $activity; }
/** * Function to delete the activity * @param array $params associated array * * @return void * @access public * */ public function deleteActivity(&$params, $moveToTrash = false) { require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); if (!$moveToTrash) { if (!isset($params['id'])) { if (is_array($params['activity_type_id'])) { $activityTypes = implode(',', $params['activity_type_id']); } else { $activityTypes = $params['activity_type_id']; } $query = "DELETE FROM civicrm_activity WHERE source_record_id = {$params['source_record_id']} AND activity_type_id IN ( {$activityTypes} )"; $dao = CRM_Core_DAO::executeQuery($query); } else { $activity = new CRM_Activity_DAO_Activity(); $activity->copyValues($params); $result = $activity->delete(); } } else { $activity = new CRM_Activity_DAO_Activity(); $activity->copyValues($params); $activity->is_deleted = 1; $result = $activity->save(); //log activty delete.CRM-4525. $logMsg = "Case Activity deleted for"; $msgs = array(); $sourceContactId = CRM_Core_DAO::getfieldValue('CRM_Activity_DAO_Activity', $activity->id, 'source_contact_id'); if ($sourceContactId) { $msgs[] = " source={$sourceContactId}"; } //get target contacts. $targetContactIds = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id); if (!empty($targetContactIds)) { $msgs[] = " target =" . implode(',', array_keys($targetContactIds)); } //get assignee contacts. $assigneeContactIds = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id); if (!empty($assigneeContactIds)) { $msgs[] = " assignee =" . implode(',', array_keys($assigneeContactIds)); } $logMsg .= implode(', ', $msgs); self::logActivityAction($activity, $logMsg); } // delete the recently created Activity require_once 'CRM/Utils/Recent.php'; if ($result) { $activityRecent = array('id' => $activity->id, 'type' => 'Activity'); CRM_Utils_Recent::del($activityRecent); } $transaction->commit(); return $result; }
/** * returns all the rows in the given offset and rowCount * * @param enum $action the action being performed * @param int $offset the row number to start from * @param int $rowCount the number of rows to return * @param string $sort the sql string that describes the sort order * @param enum $output what should the result set include (web/email/csv) * * @return array rows in the given offset and rowCount */ function &getRows($action, $offset, $rowCount, $sort, $output = NULL) { $result = $this->_query->searchQuery($offset, $rowCount, $sort, FALSE, FALSE, FALSE, FALSE, FALSE, $this->_activityClause); $rows = array(); $mailingIDs = CRM_Mailing_BAO_Mailing::mailingACLIDs(); $accessCiviMail = CRM_Core_Permission::check('access CiviMail'); //get all campaigns. $allCampaigns = CRM_Campaign_BAO_Campaign::getCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE); $engagementLevels = CRM_Campaign_PseudoConstant::engagementLevel(); while ($result->fetch()) { $row = array(); // ignore rows where we dont have an activity id if (empty($result->activity_id)) { continue; } // the columns we are interested in foreach (self::$_properties as $property) { if (isset($result->{$property})) { $row[$property] = $result->{$property}; } } $contactId = CRM_Utils_Array::value('contact_id', $row); if (!$contactId) { $contactId = CRM_Utils_Array::value('source_contact_id', $row); } $row['target_contact_name'] = CRM_Activity_BAO_ActivityTarget::getTargetNames($row['activity_id']); $row['assignee_contact_name'] = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($row['activity_id']); if (CRM_Utils_Array::value('source_contact_id', $row)) { $row['source_contact_name'] = CRM_Contact_BAO_Contact::displayName($row['source_contact_id']); } if ($this->_context == 'search') { $row['checkbox'] = CRM_Core_Form::CB_PREFIX . $result->activity_id; } $row['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? $result->contact_sub_type : $result->contact_type, FALSE, $result->contact_id); $accessMailingReport = FALSE; $activityType = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'name', TRUE); $activityTypeId = CRM_Utils_Array::key($row['activity_type'], $activityType); if ($row['activity_is_test']) { $row['activity_type'] = $row['activity_type'] . " (test)"; } $bulkActivityTypeID = CRM_Utils_Array::key('Bulk Email', $activityType); $row['mailingId'] = ''; if ($accessCiviMail && in_array($result->source_record_id, $mailingIDs) && $bulkActivityTypeID == $activityTypeId) { $row['mailingId'] = CRM_Utils_System::url('civicrm/mailing/report', "mid={$result->source_record_id}&reset=1&cid={$result->source_contact_id}&context=activitySelector"); $row['recipients'] = ts('(recipients)'); $row['target_contact_name'] = ''; $row['assignee_contact_name'] = ''; $accessMailingReport = TRUE; } $activityActions = new CRM_Activity_Selector_Activity($result->contact_id, NULL); $actionLinks = $activityActions->actionLinks($activityTypeId, CRM_Utils_Array::value('source_record_id', $row), $accessMailingReport, CRM_Utils_Array::value('activity_id', $row), $this->_key, $this->_compContext); $row['action'] = CRM_Core_Action::formLink($actionLinks, NULL, array('id' => $result->activity_id, 'cid' => $contactId, 'cxt' => $this->_context)); //carry campaign to selector. $row['campaign'] = CRM_Utils_Array::value($result->activity_campaign_id, $allCampaigns); $row['campaign_id'] = $result->activity_campaign_id; if ($engagementLevel = CRM_Utils_Array::value('activity_engagement_level', $row)) { $row['activity_engagement_level'] = CRM_Utils_Array::value($engagementLevel, $engagementLevels, $engagementLevel); } $rows[] = $row; } return $rows; }
/** * Build the form * * @access public * * @return void */ static function buildQuickForm(&$form) { $toArray = array(); $form->assign('max_sms_length', CRM_SMS_Provider::MAX_SMS_CHAR); $providers = CRM_SMS_BAO_Provider::getProviders(NULL, NULL, TRUE, 'is_default desc'); $providerSelect = array(); foreach ($providers as $provider) { $providerSelect[$provider['id']] = $provider['title']; } $suppressedSms = 0; //here we are getting logged in user id as array but we need target contact id. CRM-5988 $cid = $form->get('cid'); if ($cid) { $form->_contactIds = array($cid); } $to = $form->add('text', 'to', ts('To'), '', TRUE); $form->add('text', 'activity_subject', ts('Name The SMS'), '', TRUE); $toSetDefault = TRUE; if (property_exists($form, '_context') && $form->_context == 'standalone') { $toSetDefault = FALSE; } // when form is submitted recompute contactIds $allToSMS = array(); if ($to->getValue()) { $allToPhone = explode(',', $to->getValue()); $form->_contactIds = array(); foreach ($allToPhone as $value) { list($contactId, $phone) = explode('::', $value); if ($contactId) { $form->_contactIds[] = $contactId; $form->_toContactPhone[] = $phone; } } $toSetDefault = TRUE; } //get the group of contacts as per selected by user in case of Find Activities if (!empty($form->_activityHolderIds)) { $extendTargetContacts = 0; $invalidActivity = 0; $validActivities = 0; foreach ($form->_activityHolderIds as $key => $id) { //valid activity check if (CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $id, 'subject', 'id') != self::RECIEVED_SMS_ACTIVITY_SUBJECT) { $invalidActivity++; continue; } //target contacts limit check $ids = array_keys(CRM_Activity_BAO_ActivityTarget::getTargetNames($id)); if (count($ids) > 1) { $extendTargetContacts++; continue; } $validActivities++; $form->_contactIds = empty($form->_contactIds) ? $ids : array_unique(array_merge($form->_contactIds, $ids)); } if (!$validActivities) { $errorMess = ""; if ($extendTargetContacts) { $errorMess = ts('One selected activity consists of more than one target contact.', array('count' => $extendTargetContacts, 'plural' => '%count selected activities consist of more than one target contact.')); } if ($invalidActivity) { $errorMess = $errorMess ? ' ' : ''; $errorMess .= ts('The selected activity is invalid.', array('count' => $invalidActivity, 'plural' => '%count selected activities are invalid.')); } CRM_Core_Error::statusBounce(ts("%1: SMS Reply will not be sent.", array(1 => $errorMess))); } } if (is_array($form->_contactIds) && $toSetDefault) { $returnProperties = array('sort_name' => 1, 'phone' => 1, 'do_not_sms' => 1, 'is_deceased' => 1, 'display_name' => 1); list($form->_contactDetails) = CRM_Utils_Token::getTokenDetails($form->_contactIds, $returnProperties, FALSE, FALSE); // make a copy of all contact details $form->_allContactDetails = $form->_contactDetails; foreach ($form->_contactIds as $key => $contactId) { $value = $form->_contactDetails[$contactId]; //to check if the phone type is "Mobile" $phoneTypes = CRM_Core_OptionGroup::values('phone_type', TRUE, FALSE, FALSE, NULL, 'name'); if (CRM_Utils_System::getClassName($form) == 'CRM_Activity_Form_Task_SMS') { //to check for "if the contact id belongs to a specified activity type" $actDetails = CRM_Activity_BAO_Activity::getContactActivity($contactId); if (self::RECIEVED_SMS_ACTIVITY_SUBJECT != CRM_Utils_Array::retrieveValueRecursive($actDetails, 'subject')) { $suppressedSms++; unset($form->_contactDetails[$contactId]); continue; } } if (isset($value['phone_type_id']) && $value['phone_type_id'] != CRM_Utils_Array::value('Mobile', $phoneTypes) || $value['do_not_sms'] || empty($value['phone']) || CRM_Utils_Array::value('is_deceased', $value)) { //if phone is not primary check if non-primary phone is "Mobile" if (!empty($value['phone']) && $value['phone_type_id'] != CRM_Utils_Array::value('Mobile', $phoneTypes) && !CRM_Utils_Array::value('is_deceased', $value)) { $filter = array('do_not_sms' => 0); $contactPhones = CRM_Core_BAO_Phone::allPhones($contactId, FALSE, 'Mobile', $filter); if (count($contactPhones) > 0) { $mobilePhone = CRM_Utils_Array::retrieveValueRecursive($contactPhones, 'phone'); $form->_contactDetails[$contactId]['phone_id'] = CRM_Utils_Array::retrieveValueRecursive($contactPhones, 'id'); $form->_contactDetails[$contactId]['phone'] = $mobilePhone; $form->_contactDetails[$contactId]['phone_type_id'] = CRM_Utils_Array::value('Mobile', $phoneTypes); } else { $suppressedSms++; unset($form->_contactDetails[$contactId]); continue; } } else { $suppressedSms++; unset($form->_contactDetails[$contactId]); continue; } } if (isset($mobilePhone)) { $phone = $mobilePhone; } elseif (empty($form->_toContactPhone)) { $phone = $value['phone']; } else { $phone = CRM_Utils_Array::value($key, $form->_toContactPhone); } if ($phone) { $toArray[] = array('name' => '"' . $value['sort_name'] . '" <' . $phone . '>', 'id' => "{$contactId}::{$phone}"); } } if (empty($toArray)) { CRM_Core_Error::statusBounce(ts('Selected contact(s) do not have a valid Phone, or communication preferences specify DO NOT SMS, or they are deceased')); } } //activity related variables if (isset($invalidActivity)) { $form->assign('invalidActivity', $invalidActivity); } if (isset($extendTargetContacts)) { $form->assign('extendTargetContacts', $extendTargetContacts); } $form->assign('toContact', json_encode($toArray)); $form->assign('suppressedSms', $suppressedSms); $form->assign('totalSelectedContacts', count($form->_contactIds)); $form->add('select', 'sms_provider_id', ts('From'), $providerSelect, TRUE); CRM_Mailing_BAO_Mailing::commonCompose($form); if ($form->_single) { // also fix the user context stack if ($form->_context) { $url = CRM_Utils_System::url('civicrm/dashboard', 'reset=1'); } else { $url = CRM_Utils_System::url('civicrm/contact/view', "&show=1&action=browse&cid={$form->_contactIds[0]}&selectedChild=activity"); } $session = CRM_Core_Session::singleton(); $session->replaceUserContext($url); $form->addDefaultButtons(ts('Send SMS'), 'upload', 'cancel'); } else { $form->addDefaultButtons(ts('Send SMS'), 'upload'); } $form->addFormRule(array('CRM_Contact_Form_Task_SMSCommon', 'formRule'), $form); }
/** * process the form after the input has been submitted and validated * * @access public * @return None */ public function postProcess() { $params = $this->exportValues(); $this->_contacts = array(); //get assignee contacts if ($params['assigned_to']) { require_once 'CRM/Activity/BAO/ActivityAssignment.php'; foreach ($this->_activityHolderIds as $key => $id) { $ids = array_keys(CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($id)); $this->_contacts = array_merge($this->_contacts, $ids); } } //get target contacts if ($params['with_contact']) { require_once 'CRM/Activity/BAO/ActivityTarget.php'; foreach ($this->_activityHolderIds as $key => $id) { $ids = array_keys(CRM_Activity_BAO_ActivityTarget::getTargetNames($id)); $this->_contacts = array_merge($this->_contacts, $ids); } } //get 'Added by' contacts if ($params['created_by']) { parent::setContactIDs(); if (!empty($this->_contactIds)) { $this->_contacts = array_merge($this->_contacts, $this->_contactIds); } } $this->_contacts = array_unique($this->_contacts); $this->set('contacts', $this->_contacts); }
/** * process the form after the input has been submitted and validated * * @access public * * @return None */ public function postProcess() { $params = $this->exportValues(); $this->_contacts = array(); //get assignee contacts if ($params['assigned_to']) { foreach ($this->_activityHolderIds as $key => $id) { $ids = array_keys(CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($id)); $this->_contacts = array_merge($this->_contacts, $ids); } } //get target contacts if ($params['with_contact']) { foreach ($this->_activityHolderIds as $key => $id) { $ids = array_keys(CRM_Activity_BAO_ActivityTarget::getTargetNames($id)); $this->_contacts = array_merge($this->_contacts, $ids); } } //get 'Added by' contacts if ($params['created_by']) { parent::setContactIDs(); if (!empty($this->_contactIds)) { $this->_contacts = array_merge($this->_contacts, $this->_contactIds); } } $this->_contacts = array_unique($this->_contacts); //bounce to pick option if no contacts to send to if (empty($this->_contacts)) { $urlParams = "_qf_PickOption_display=true&qfKey={$params['qfKey']}"; $urlRedirect = CRM_Utils_System::url('civicrm/activity/search', $urlParams); CRM_Core_Error::statusBounce(ts('It appears you have no contacts with emails from the selected recipients.'), $urlRedirect); } $this->set('contacts', $this->_contacts); }
function alterDisplay(&$rows) { // custom code to alter rows $entryFound = false; $activityType = CRM_Core_PseudoConstant::activityType(true, true, false, 'label', true); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $viewLinks = false; require_once 'CRM/Core/Permission.php'; if (CRM_Core_Permission::check('access CiviCRM')) { $viewLinks = true; $onHover = ts('View Contact Summary for this Contact'); $onHoverAct = ts('View Activity Record'); } foreach ($rows as $rowNum => $row) { if (array_key_exists('civicrm_contact_contact_source', $row)) { if ($value = $row['civicrm_contact_source_contact_id']) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $rows[$rowNum]['civicrm_contact_contact_source_link'] = $url; $rows[$rowNum]['civicrm_contact_contact_source_hover'] = $onHover; } $entryFound = true; } } if (array_key_exists('civicrm_contact_contact_assignee', $row) && $row['civicrm_activity_assignment_assignee_contact_id']) { $assignee = array(); //retrieve all contact assignees and build list with links require_once 'CRM/Activity/BAO/ActivityAssignment.php'; $activity_assignment_ids = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($row['civicrm_activity_id'], false, true); foreach ($activity_assignment_ids as $cid => $assignee_name) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $cid, $this->_absoluteUrl); $assignee[] = '<a title="' . $onHover . '" href="' . $url . '">' . $assignee_name . '</a>'; } else { $assignee[] = $assignee_name; } } $rows[$rowNum]['civicrm_contact_contact_assignee'] = implode('; ', $assignee); $entryFound = true; } if (array_key_exists('civicrm_contact_contact_target', $row) && $row['civicrm_activity_target_target_contact_id']) { $target = array(); //retrieve all contact targets and build list with links require_once 'CRM/Activity/BAO/ActivityTarget.php'; $activity_target_ids = CRM_Activity_BAO_ActivityTarget::getTargetNames($row['civicrm_activity_id']); foreach ($activity_target_ids as $cid => $target_name) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $cid, $this->_absoluteUrl); $target[] = '<a title="' . $onHover . '" href="' . $url . '">' . $target_name . '</a>'; } else { $target[] = $target_name; } } $rows[$rowNum]['civicrm_contact_contact_target'] = implode('; ', $target); $entryFound = true; } if (array_key_exists('civicrm_activity_activity_type_id', $row)) { if ($value = $row['civicrm_activity_activity_type_id']) { $rows[$rowNum]['civicrm_activity_activity_type_id'] = $activityType[$value]; if ($viewLinks) { // case activities get a special view link if ($rows[$rowNum]['civicrm_case_activity_case_id']) { $url = CRM_Utils_System::url("civicrm/case/activity/view", 'reset=1&cid=' . $rows[$rowNum]['civicrm_contact_source_contact_id'] . '&aid=' . $rows[$rowNum]['civicrm_activity_id'] . '&caseID=' . $rows[$rowNum]['civicrm_case_activity_case_id'], $this->_absoluteUrl); } else { $url = CRM_Utils_System::url("civicrm/contact/view/activity", 'action=view&reset=1&cid=' . $rows[$rowNum]['civicrm_contact_source_contact_id'] . '&id=' . $rows[$rowNum]['civicrm_activity_id'] . '&atype=' . $value, $this->_absoluteUrl); } $rows[$rowNum]['civicrm_activity_activity_type_id_link'] = $url; $rows[$rowNum]['civicrm_activity_activity_type_id_hover'] = $onHoverAct; } $entryFound = true; } } if (array_key_exists('civicrm_activity_status_id', $row)) { if ($value = $row['civicrm_activity_status_id']) { $rows[$rowNum]['civicrm_activity_status_id'] = $activityStatus[$value]; $entryFound = true; } } if (!$entryFound) { break; } } }
/** * Function to delete the activity * * @param array $params associated array * * @return void * @access public * */ public static function deleteActivity(&$params, $moveToTrash = FALSE) { // CRM-9137 if (CRM_Utils_Array::value('id', $params) && !is_array($params['id'])) { CRM_Utils_Hook::pre('delete', 'Activity', $params['id'], $params); } else { CRM_Utils_Hook::pre('delete', 'Activity', NULL, $params); } $transaction = new CRM_Core_Transaction(); if (is_array(CRM_Utils_Array::value('source_record_id', $params))) { $sourceRecordIds = implode(',', $params['source_record_id']); } else { $sourceRecordIds = CRM_Utils_Array::value('source_record_id', $params); } $result = NULL; if (!$moveToTrash) { if (!isset($params['id'])) { if (is_array($params['activity_type_id'])) { $activityTypes = implode(',', $params['activity_type_id']); } else { $activityTypes = $params['activity_type_id']; } $query = "DELETE FROM civicrm_activity WHERE source_record_id IN ({$sourceRecordIds}) AND activity_type_id IN ( {$activityTypes} )"; $dao = CRM_Core_DAO::executeQuery($query); } else { $activity = new CRM_Activity_DAO_Activity(); $activity->copyValues($params); $result = $activity->delete(); // CRM-8708 $activity->case_id = CRM_Case_BAO_Case::getCaseIdByActivityId($activity->id); } } else { $activity = new CRM_Activity_DAO_Activity(); $activity->copyValues($params); $activity->is_deleted = 1; $result = $activity->save(); //log activty delete.CRM-4525. $logMsg = 'Case Activity deleted for'; $msgs = array(); $sourceContactId = CRM_Core_DAO::getfieldValue('CRM_Activity_DAO_Activity', $activity->id, 'source_contact_id'); if ($sourceContactId) { $msgs[] = " source={$sourceContactId}"; } //get target contacts. $targetContactIds = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id); if (!empty($targetContactIds)) { $msgs[] = " target =" . implode(',', array_keys($targetContactIds)); } //get assignee contacts. $assigneeContactIds = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id); if (!empty($assigneeContactIds)) { $msgs[] = " assignee =" . implode(',', array_keys($assigneeContactIds)); } $logMsg .= implode(', ', $msgs); self::logActivityAction($activity, $logMsg); } // delete the recently created Activity if ($result) { $activityRecent = array('id' => $activity->id, 'type' => 'Activity'); CRM_Utils_Recent::del($activityRecent); } $transaction->commit(); if (isset($activity)) { // CRM-8708 $activity->case_id = CRM_Case_BAO_Case::getCaseIdByActivityId($activity->id); CRM_Utils_Hook::post('delete', 'Activity', $activity->id, $activity); } return $result; }
/** * returns all the rows in the given offset and rowCount * * @param enum $action the action being performed * @param int $offset the row number to start from * @param int $rowCount the number of rows to return * @param string $sort the sql string that describes the sort order * @param enum $output what should the result set include (web/email/csv) * * @return array rows in the given offset and rowCount */ function &getRows($action, $offset, $rowCount, $sort, $output = null) { $result = $this->_query->searchQuery($offset, $rowCount, $sort, false, false, false, false, false, $this->_activityClause); $rows = array(); require_once 'CRM/Mailing/BAO/Mailing.php'; require_once 'CRM/Mailing/Info.php'; $mailingIDs =& CRM_Mailing_BAO_Mailing::mailingACLIDs(); $accessCiviMail = CRM_Core_Permission::check('access CiviMail'); while ($result->fetch()) { $row = array(); // ignore rows where we dont have an activity id if (empty($result->activity_id)) { continue; } // the columns we are interested in foreach (self::$_properties as $property) { if (isset($result->{$property})) { $row[$property] = $result->{$property}; } } $contactId = CRM_Utils_Array::value('contact_id', $row); if (!$contactId) { $contactId = CRM_Utils_Array::value('source_contact_id', $row); } $row['target_contact_name'] = CRM_Activity_BAO_ActivityTarget::getTargetNames($row['activity_id']); $row['assignee_contact_name'] = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($row['activity_id']); if (CRM_Utils_Array::value('source_contact_id', $row)) { $row['source_contact_name'] = CRM_Contact_BAO_Contact::displayName($row['source_contact_id']); } if ($this->_context == 'search') { $row['checkbox'] = CRM_Core_Form::CB_PREFIX . $result->activity_id; } require_once 'CRM/Contact/BAO/Contact/Utils.php'; $row['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? $result->contact_sub_type : $result->contact_type, false, $result->contact_id); $accessMailingReport = false; $activityType = CRM_Core_PseudoConstant::activityType(true, true); $activityTypeId = CRM_Utils_Array::key($row['activity_type'], $activityType); if ($row['activity_is_test']) { $row['activity_type'] = $row['activity_type'] . " (test)"; } $bulkActivityTypeID = CRM_Utils_Array::key('Bulk Email', $activityType); if ($accessCiviMail && in_array($result->source_record_id, $mailingIDs) && $bulkActivityTypeID == $activityTypeId) { $row['mailingId'] = CRM_Utils_System::url('civicrm/mailing/report', "mid={$result->source_record_id}&reset=1&cid={$result->source_contact_id}&context=activitySelector"); $row['recipients'] = ts('(recipients)'); $row['target_contact_name'] = ''; $row['assignee_contact_name'] = ''; $accessMailingReport = true; } require_once 'CRM/Activity/Selector/Activity.php'; $activityActions = new CRM_Activity_Selector_Activity($result->contact_id, null); $actionLinks = $activityActions->actionLinks($activityTypeId, CRM_Utils_Array::value('source_record_id', $row), $accessMailingReport, CRM_Utils_Array::value('activity_id', $row), $this->_key, $this->_compContext); $row['action'] = CRM_Core_Action::formLink($actionLinks, null, array('id' => $result->activity_id, 'cid' => $contactId, 'cxt' => $this->_context)); $rows[] = $row; } return $rows; }
/** * Function to delete the activity * @param array $params associated array * * @return void * @access public * */ public function deleteActivity(&$params, $moveToTrash = false) { require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); $activity =& new CRM_Activity_DAO_Activity(); $activity->copyValues($params); if (!$moveToTrash) { $result = $activity->delete(); } else { $activity->is_deleted = 1; $result = $activity->save(); //log activty delete.CRM-4525. $logMsg = "Case Activity deleted for"; $msgs = array(); $sourceContactId = CRM_Core_DAO::getfieldValue('CRM_Activity_DAO_Activity', $activity->id, 'source_contact_id'); if ($sourceContactId) { $msgs[] = " source={$sourceContactId}"; } //get target contacts. $targetContactIds = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id); if (!empty($targetContactIds)) { $msgs[] = " target =" . implode(',', array_keys($targetContactIds)); } //get assignee contacts. $assigneeContactIds = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id); if (!empty($assigneeContactIds)) { $msgs[] = " assigne =" . implode(',', array_keys($assigneeContactIds)); } $logMsg .= implode(', ', $msgs); self::logActivityAction($activity, $logMsg); } // delete the recently created Activity require_once 'CRM/Utils/Recent.php'; if ($result) { CRM_Utils_Recent::del($activity->id); } $transaction->commit(); return $result; }