3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2017 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2017
35 * This class is used to retrieve and display activities for a contact.
37 class CRM_Activity_Selector_Activity
extends CRM_Core_Selector_Base
implements CRM_Core_Selector_API
{
40 * We use desc to remind us what that column is, name is used in the tpl
44 static $_columnHeaders;
47 * ContactId - contact id of contact whose activies are displayed
51 protected $_contactId;
57 protected $_activityTypeIDs;
59 protected $_viewOptions;
64 * @param int $contactId
65 * Contact whose activities we want to display.
66 * @param int $permission
67 * The permission we have for this contact.
70 * @param string $context
71 * @param null $activityTypeIDs
73 * @return \CRM_Activity_Selector_Activity
75 public function __construct(
79 $context = 'activity',
80 $activityTypeIDs = NULL) {
81 $this->_contactId
= $contactId;
82 $this->_permission
= $permission;
83 $this->_admin
= $admin;
84 $this->_context
= $context;
85 $this->_activityTypeIDs
= $activityTypeIDs;
87 // get all enabled view componentc (check if case is enabled)
88 $this->_viewOptions
= CRM_Core_BAO_Setting
::valueOptions(CRM_Core_BAO_Setting
::SYSTEM_PREFERENCES_NAME
,
89 'contact_view_options', TRUE, NULL, TRUE
94 * This method returns the action links that are given for each search row.
95 * currently the action links added for each row are
99 * @param int $activityTypeId
100 * @param int $sourceRecordId
101 * @param bool $accessMailingReport
102 * @param int $activityId
104 * @param null $compContext
108 public static function actionLinks(
110 $sourceRecordId = NULL,
111 $accessMailingReport = FALSE,
114 $compContext = NULL) {
115 static $activityActTypes = NULL;
116 //CRM-14277 added addtitional param to handle activity search
117 $extraParams = "&searchContext=activity";
119 $extraParams .= ($key) ?
"&key={$key}" : NULL;
121 $extraParams .= "&compContext={$compContext}";
125 $showUpdate = $showDelete = FALSE;
128 if (!$activityActTypes) {
129 $activeActTypes = CRM_Core_PseudoConstant
::activityType(TRUE, TRUE, FALSE, 'name', TRUE);
131 $activityTypeName = CRM_Utils_Array
::value($activityTypeId, $activeActTypes);
134 // Lets allow to have normal operation for only activity types.
135 // When activity type is disabled or no more exists give only delete.
136 switch ($activityTypeName) {
137 case 'Event Registration':
138 case 'Change Registration':
139 $url = 'civicrm/contact/view/participant';
140 $qsView = "action=view&reset=1&id={$sourceRecordId}&cid=%%cid%%&context=%%cxt%%{$extraParams}";
144 $url = 'civicrm/contact/view/contribution';
145 $qsView = "action=view&reset=1&id={$sourceRecordId}&cid=%%cid%%&context=%%cxt%%{$extraParams}";
150 $participantId = CRM_Core_DAO
::getFieldValue('CRM_Event_BAO_ParticipantPayment', $sourceRecordId, 'participant_id', 'contribution_id');
151 if (!empty($participantId)) {
152 $url = 'civicrm/contact/view/participant';
153 $qsView = "action=view&reset=1&id={$participantId}&cid=%%cid%%&context=%%cxt%%{$extraParams}";
157 case 'Membership Signup':
158 case 'Membership Renewal':
159 case 'Change Membership Status':
160 case 'Change Membership Type':
161 $url = 'civicrm/contact/view/membership';
162 $qsView = "action=view&reset=1&id={$sourceRecordId}&cid=%%cid%%&context=%%cxt%%{$extraParams}";
165 case 'Pledge Reminder':
166 case 'Pledge Acknowledgment':
167 $url = 'civicrm/contact/view/activity';
168 $qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
173 $url = 'civicrm/activity/view';
174 $delUrl = 'civicrm/activity';
175 $qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
176 if ($activityTypeName == 'Email') {
181 case 'Inbound Email':
182 $url = 'civicrm/contact/view/activity';
183 $qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
187 case 'Change Case Type':
188 case 'Change Case Status':
189 case 'Change Case Start Date':
190 $showUpdate = $showDelete = FALSE;
191 $url = 'civicrm/activity';
192 $qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
193 $qsUpdate = "atype={$activityTypeId}&action=update&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
197 $url = 'civicrm/activity';
198 $showView = $showDelete = $showUpdate = TRUE;
199 $qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
200 $qsUpdate = "atype={$activityTypeId}&action=update&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
202 // When type is not available lets hide view and update.
203 if (empty($activityTypeName)) {
204 $showView = $showUpdate = FALSE;
209 $qsDelete = "atype={$activityTypeId}&action=delete&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
211 $actionLinks = array();
214 $actionLinks +
= array(
217 'name' => ts('View'),
220 'title' => ts('View Activity'),
226 $updateUrl = 'civicrm/activity/add';
227 if ($activityTypeName == 'Email') {
228 $updateUrl = 'civicrm/activity/email/add';
230 elseif ($activityTypeName == 'Print PDF Letter') {
231 $updateUrl = 'civicrm/activity/pdf/add';
233 if (CRM_Activity_BAO_Activity
::checkPermission($activityId, CRM_Core_Action
::UPDATE
)) {
234 $actionLinks +
= array(
237 'name' => ts('Edit'),
240 'title' => ts('Update Activity'),
248 CRM_Case_BAO_Case
::checkPermission($activityId, 'File On Case', $activityTypeId)
250 $actionLinks +
= array(
253 'name' => ts('File on Case'),
255 'extra' => 'onclick="javascript:fileOnCase( \'file\', \'%%id%%\', null, this ); return false;"',
256 'title' => ts('File on Case'),
262 if (!isset($delUrl) ||
!$delUrl) {
265 $actionLinks +
= array(
268 'name' => ts('Delete'),
271 'title' => ts('Delete Activity'),
276 if ($accessMailingReport) {
277 $actionLinks +
= array(
280 'name' => ts('Mailing Report'),
281 'url' => 'civicrm/mailing/report',
282 'qs' => "mid={$sourceRecordId}&reset=1&cid=%%cid%%&context=activitySelector",
283 'title' => ts('View Mailing Report'),
292 * Getter for array of the parameters required for creating pager.
295 * @param array $params
297 public function getPagerParams($action, &$params) {
298 $params['status'] = ts('Activities %%StatusMessage%%');
299 $params['csvString'] = NULL;
300 $params['rowCount'] = CRM_Utils_Pager
::ROWCOUNT
;
302 $params['buttonTop'] = 'PagerTopButton';
303 $params['buttonBottom'] = 'PagerBottomButton';
307 * Returns the column headers as an array of tuples:
308 * (name, sortName (key to the sort array))
310 * @param string $action
311 * The action being performed.
312 * @param string $output
313 * What should the result set include (web/email/csv).
316 * the column headers that need to be displayed
318 public function &getColumnHeaders($action = NULL, $output = NULL) {
319 if ($output == CRM_Core_Selector_Controller
::EXPORT ||
$output == CRM_Core_Selector_Controller
::SCREEN
) {
320 $csvHeaders = array(ts('Activity Type'), ts('Description'), ts('Activity Date'));
321 foreach (self
::_getColumnHeaders() as $column) {
322 if (array_key_exists('name', $column)) {
323 $csvHeaders[] = $column['name'];
329 return self
::_getColumnHeaders();
334 * Returns total number of rows for the query.
336 * @param string $action
337 * Action being performed.
342 * Total number of rows
344 public function getTotalCount($action, $case = NULL) {
346 'contact_id' => $this->_contactId
,
347 'admin' => $this->_admin
,
349 'context' => $this->_context
,
350 'activity_type_id' => $this->_activityTypeIDs
,
355 return CRM_Activity_BAO_Activity
::getActivities($params, TRUE);
359 * Returns all the rows in the given offset and rowCount.
361 * @param string $action
362 * The action being performed.
364 * The row number to start from.
365 * @param int $rowCount
366 * The number of rows to return.
367 * @param string $sort
368 * The sql string that describes the sort order.
369 * @param string $output
370 * What should the result set include (web/email/csv).
375 * the total number of rows for this action
377 public function &getRows($action, $offset, $rowCount, $sort, $output = NULL, $case = NULL) {
379 'contact_id' => $this->_contactId
,
380 'admin' => $this->_admin
,
382 'context' => $this->_context
,
383 'activity_type_id' => $this->_activityTypeIDs
,
385 'rowCount' => $rowCount,
388 $config = CRM_Core_Config
::singleton();
389 $rows = CRM_Activity_BAO_Activity
::getActivities($params);
395 $activityStatus = CRM_Core_PseudoConstant
::activityStatus();
397 $engagementLevels = CRM_Campaign_PseudoConstant
::engagementLevel();
400 $permissions = array($this->_permission
);
401 if (CRM_Core_Permission
::check('delete activities')) {
402 $permissions[] = CRM_Core_Permission
::DELETE
;
404 $mask = CRM_Core_Action
::mask($permissions);
406 foreach ($rows as $k => $row) {
409 // DRAFTING: provide a facility for db-stored strings
410 // localize the built-in activity names for display
411 // (these are not enums, so we can't use any automagic here)
412 switch ($row['activity_type']) {
414 $row['activity_type'] = ts('Meeting');
418 $row['activity_type'] = ts('Phone Call');
422 $row['activity_type'] = ts('Email');
426 $row['activity_type'] = ts('SMS');
430 $row['activity_type'] = ts('Event');
434 // add class to this row if overdue
435 if (CRM_Utils_Date
::overdue(CRM_Utils_Array
::value('activity_date_time', $row))
436 && CRM_Utils_Array
::value('status_id', $row) == 1
439 $row['class'] = 'status-overdue';
443 $row['class'] = 'status-ontime';
446 $row['status'] = $row['status_id'] ?
$activityStatus[$row['status_id']] : NULL;
448 if ($engagementLevel = CRM_Utils_Array
::value('engagement_level', $row)) {
449 $row['engagement_level'] = CRM_Utils_Array
::value($engagementLevel, $engagementLevels, $engagementLevel);
453 $accessMailingReport = FALSE;
454 if (!empty($row['mailingId'])) {
455 $accessMailingReport = TRUE;
458 $actionLinks = $this->actionLinks(CRM_Utils_Array
::value('activity_type_id', $row),
459 CRM_Utils_Array
::value('source_record_id', $row),
460 $accessMailingReport,
461 CRM_Utils_Array
::value('activity_id', $row),
465 $actionMask = array_sum(array_keys($actionLinks)) & $mask;
467 if ($output != CRM_Core_Selector_Controller
::EXPORT
&& $output != CRM_Core_Selector_Controller
::SCREEN
) {
468 $row['action'] = CRM_Core_Action
::formLink($actionLinks,
471 'id' => $row['activity_id'],
472 'cid' => $this->_contactId
,
473 'cxt' => $this->_context
,
474 'caseid' => CRM_Utils_Array
::value('case_id', $row),
478 'activity.selector.action',
491 * Name of export file.
493 * @param string $output
499 public function getExportFileName($output = 'csv') {
500 return ts('CiviCRM Activity');
504 * Get colunmn headers for search selector.
509 private static function &_getColumnHeaders() {
510 if (!isset(self
::$_columnHeaders)) {
511 self
::$_columnHeaders = array(
513 'name' => ts('Type'),
514 'sort' => 'activity_type',
515 'direction' => CRM_Utils_Sort
::DONTCARE
,
518 'name' => ts('Subject'),
520 'direction' => CRM_Utils_Sort
::DONTCARE
,
523 'name' => ts('Added By'),
524 'sort' => 'source_contact_name',
525 'direction' => CRM_Utils_Sort
::DONTCARE
,
527 array('name' => ts('With')),
528 array('name' => ts('Assigned')),
530 'name' => ts('Date'),
531 'sort' => 'activity_date_time',
532 'direction' => CRM_Utils_Sort
::DONTCARE
,
535 'name' => ts('Status'),
536 'sort' => 'status_id',
537 'direction' => CRM_Utils_Sort
::DONTCARE
,
539 array('desc' => ts('Actions')),
543 return self
::$_columnHeaders;