3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.3 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
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-2013
35 class CRM_Report_Form_Activity
extends CRM_Report_Form
{
37 protected $_customGroupExtends = array(
38 'Activity'); function __construct() {
39 $config = CRM_Core_Config
::singleton();
40 $campaignEnabled = in_array("CiviCampaign", $config->enableComponents
);
41 if ($campaignEnabled) {
42 $getCampaigns = CRM_Campaign_BAO_Campaign
::getPermissionedCampaigns(NULL, NULL, TRUE, FALSE, TRUE);
43 $this->activeCampaigns
= $getCampaigns['campaigns'];
44 asort($this->activeCampaigns
);
45 $this->engagementLevels
= CRM_Campaign_PseudoConstant
::engagementLevel();
47 $this->activityTypes
= CRM_Core_PseudoConstant
::activityType(TRUE, FALSE, FALSE, 'label', TRUE);
48 asort($this->activityTypes
);
50 $this->_columns
= array(
53 'dao' => 'CRM_Contact_DAO_Contact',
58 'name' => 'sort_name',
59 'title' => ts('Source Contact Name'),
60 'alias' => 'civicrm_contact_source',
65 'name' => 'sort_name',
66 'title' => ts('Assignee Contact Name'),
67 'alias' => 'civicrm_contact_assignee',
72 'name' => 'sort_name',
73 'title' => ts('Target Contact Name'),
74 'alias' => 'contact_civireport',
82 'name' => 'sort_name',
83 'alias' => 'civicrm_contact_source',
84 'title' => ts('Source Contact Name'),
86 'type' => CRM_Report_Form
::OP_STRING
,
90 'name' => 'sort_name',
91 'alias' => 'civicrm_contact_assignee',
92 'title' => ts('Assignee Contact Name'),
94 'type' => CRM_Report_Form
::OP_STRING
,
98 'name' => 'sort_name',
99 'alias' => 'contact_civireport',
100 'title' => ts('Target Contact Name'),
101 'operator' => 'like',
102 'type' => CRM_Report_Form
::OP_STRING
,
106 'name' => 'current_user',
107 'title' => ts('Limit To Current User'),
108 'type' => CRM_Utils_Type
::T_INT
,
109 'operatorType' => CRM_Report_Form
::OP_SELECT
,
110 'options' => array('0' => ts('No'), '1' => ts('Yes')),
113 'grouping' => 'contact-fields',
117 'dao' => 'CRM_Core_DAO_Email',
120 'contact_source_email' =>
123 'title' => ts('Source Contact Email'),
124 'alias' => 'civicrm_email_source',
126 'contact_assignee_email' =>
129 'title' => ts('Assignee Contact Email'),
130 'alias' => 'civicrm_email_assignee',
132 'contact_target_email' =>
135 'title' => ts('Target Contact Email'),
136 'alias' => 'civicrm_email_target',
141 'source_contact_email' =>
144 'title' => ts('Source Contact Email'),
145 'alias' => 'civicrm_email_source',
149 'civicrm_activity' =>
151 'dao' => 'CRM_Activity_DAO_Activity',
156 'no_display' => TRUE,
159 'source_record_id' =>
161 'no_display' => TRUE,
164 'activity_type_id' =>
165 array('title' => ts('Activity Type'),
167 'type' => CRM_Utils_Type
::T_STRING
,
169 'activity_subject' =>
170 array('title' => ts('Subject'),
173 'activity_date_time' =>
174 array('title' => ts('Activity Date'),
178 array('title' => ts('Activity Status'),
180 'type' => CRM_Utils_Type
::T_STRING
,
183 array('title' => ts('Duration'),
184 'type' => CRM_Utils_Type
::T_INT
,
189 'activity_date_time' =>
191 'default' => 'this.month',
192 'operatorType' => CRM_Report_Form
::OP_DATE
,
194 'activity_subject' =>
195 array('title' => ts('Activity Subject')),
196 'activity_type_id' =>
197 array('title' => ts('Activity Type'),
198 'operatorType' => CRM_Report_Form
::OP_MULTISELECT
,
199 'options' => $this->activityTypes
,
202 array('title' => ts('Activity Status'),
203 'operatorType' => CRM_Report_Form
::OP_MULTISELECT
,
204 'options' => CRM_Core_PseudoConstant
::activityStatus(),
209 'source_contact_id' =>
210 array('title' => ts('Source Contact'), 'default_weight' => '0'),
211 'activity_date_time' =>
212 array('title' => ts('Activity Date'), 'default_weight' => '1'),
213 'activity_type_id' =>
214 array('title' => ts('Activity Type'), 'default_weight' => '2'),
216 'grouping' => 'activity-fields',
217 'alias' => 'activity',
219 'civicrm_activity_assignment' =>
221 'dao' => 'CRM_Activity_DAO_ActivityContact',
226 'no_display' => TRUE,
230 'alias' => 'activity_assignment',
232 'civicrm_activity_target' =>
234 'dao' => 'CRM_Activity_DAO_ActivityContact',
239 'no_display' => TRUE,
243 'alias' => 'activity_target',
245 'civicrm_activity_source' =>
247 'dao' => 'CRM_Activity_DAO_ActivityContact',
252 'no_display' => TRUE,
256 'alias' => 'activity_source',
259 'civicrm_case_activity' =>
261 'dao' => 'CRM_Case_DAO_CaseActivity',
267 'no_display' => TRUE,
271 'alias' => 'case_activity',
273 ) +
$this->addAddressFields(FALSE, TRUE);
275 if ($campaignEnabled) {
276 // Add display column and filter for Survey Results, Campaign and Engagement Index if CiviCampaign is enabled
278 $this->_columns
['civicrm_activity']['fields']['result'] = array(
279 'title' => 'Survey Result',
280 'default' => 'false',
282 $this->_columns
['civicrm_activity']['filters']['result'] = array('title' => ts('Survey Result'),
283 'operator' => 'like',
284 'type' => CRM_Utils_Type
::T_STRING
,
286 if (!empty($this->activeCampaigns
)) {
287 $this->_columns
['civicrm_activity']['fields']['campaign_id'] = array(
288 'title' => 'Campaign',
289 'default' => 'false',
291 $this->_columns
['civicrm_activity']['filters']['campaign_id'] = array('title' => ts('Campaign'),
292 'operatorType' => CRM_Report_Form
::OP_MULTISELECT
,
293 'options' => $this->activeCampaigns
,
296 if (!empty($this->engagementLevels
)) {
297 $this->_columns
['civicrm_activity']['fields']['engagement_level'] = array(
298 'title' => 'Engagement Index',
299 'default' => 'false',
301 $this->_columns
['civicrm_activity']['filters']['engagement_level'] = array('title' => ts('Engagement Index'),
302 'operatorType' => CRM_Report_Form
::OP_MULTISELECT
,
303 'options' => $this->engagementLevels
,
307 $this->_groupFilter
= TRUE;
308 $this->_tagFilter
= TRUE;
309 parent
::__construct();
314 $seperator = CRM_CORE_DAO
::VALUE_SEPARATOR
;
315 $this->_columnHeaders
= array();
316 foreach ($this->_columns
as $tableName => $table) {
317 if (array_key_exists('fields', $table)) {
318 foreach ($table['fields'] as $fieldName => $field) {
319 if (CRM_Utils_Array
::value('required', $field) ||
320 CRM_Utils_Array
::value($fieldName, $this->_params
['fields'])
323 if (isset($this->_params
['group_bys']) &&
324 !CRM_Utils_Array
::value('activity_type_id', $this->_params
['group_bys']) &&
325 (in_array($fieldName, array(
326 'contact_assignee', 'assignee_contact_id')) ||
327 in_array($fieldName, array('contact_target', 'target_contact_id'))
330 $orderByRef = "activity_assignment_civireport.contact_id";
331 if (in_array($fieldName, array(
332 'contact_target', 'target_contact_id'))) {
333 $orderByRef = "activity_target_civireport.target_contact_id";
335 $select[] = "GROUP_CONCAT(DISTINCT {$field['dbAlias']} ORDER BY {$orderByRef} SEPARATOR '{$seperator}') as {$tableName}_{$fieldName}";
338 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
340 $this->_columnHeaders
["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array
::value('type', $field);
341 $this->_columnHeaders
["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array
::value('title', $field);
342 $this->_columnHeaders
["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array
::value('no_display', $field);
348 $this->_select
= "SELECT " . implode(', ', $select) . " ";
352 $activityContacts = CRM_Core_PseudoConstant
::activityContacts('name');
353 $assigneeID = CRM_Utils_Array
::key('Activity Assignees', $activityContacts);
354 $targetID = CRM_Utils_Array
::key('Activity Targets', $activityContacts);
355 $sourceID = CRM_Utils_Array
::key('Activity Source', $activityContacts);
357 FROM civicrm_activity {$this->_aliases['civicrm_activity']}
359 LEFT JOIN civicrm_activity_contact {$this->_aliases['civicrm_activity_target']}
360 ON {$this->_aliases['civicrm_activity']}.id = {$this->_aliases['civicrm_activity_target']}.activity_id AND
361 {$this->_aliases['civicrm_activity_target']}.record_type_id = {$targetID}
362 LEFT JOIN civicrm_activity_contact {$this->_aliases['civicrm_activity_assignment']}
363 ON {$this->_aliases['civicrm_activity']}.id = {$this->_aliases['civicrm_activity_assignment']}.activity_id AND
364 {$this->_aliases['civicrm_activity_assignment']}.record_type_id = {$assigneeID}
365 LEFT JOIN civicrm_activity_contact {$this->_aliases['civicrm_activity_source']}
366 ON {$this->_aliases['civicrm_activity']}.id = {$this->_aliases['civicrm_activity_source']}.activity_id AND
367 {$this->_aliases['civicrm_activity_target']}.record_type_id = {$sourceID}
368 LEFT JOIN civicrm_contact contact_civireport
369 ON {$this->_aliases['civicrm_activity_target']}.contact_id = contact_civireport.id
370 LEFT JOIN civicrm_contact civicrm_contact_assignee
371 ON {$this->_aliases['civicrm_activity_assignment']}.contact_id = civicrm_contact_assignee.id
372 LEFT JOIN civicrm_contact civicrm_contact_source
373 ON {$this->_aliases['civicrm_activity_source']}.contact_id = civicrm_contact_source.id
375 LEFT JOIN civicrm_option_value
376 ON ( {$this->_aliases['civicrm_activity']}.activity_type_id = civicrm_option_value.value )
377 LEFT JOIN civicrm_option_group
378 ON civicrm_option_group.id = civicrm_option_value.option_group_id
379 LEFT JOIN civicrm_case_activity case_activity_civireport
380 ON case_activity_civireport.activity_id = {$this->_aliases['civicrm_activity']}.id
381 LEFT JOIN civicrm_case
382 ON case_activity_civireport.case_id = civicrm_case.id
383 LEFT JOIN civicrm_case_contact
384 ON civicrm_case_contact.case_id = civicrm_case.id ";
386 if ($this->isTableSelected('civicrm_email')) {
388 LEFT JOIN civicrm_email civicrm_email_source
389 ON {$this->_aliases['civicrm_activity_source']}.contact_id = civicrm_email_source.contact_id AND
390 civicrm_email_source.is_primary = 1
392 LEFT JOIN civicrm_email civicrm_email_target
393 ON {$this->_aliases['civicrm_activity_target']}.contact_id = civicrm_email_target.contact_id AND
394 civicrm_email_target.is_primary = 1
396 LEFT JOIN civicrm_email civicrm_email_assignee
397 ON {$this->_aliases['civicrm_activity_assignment']}.contact_id = civicrm_email_assignee.contact_id AND
398 civicrm_email_assignee.is_primary = 1 ";
400 $this->addAddressFromClause();
404 $this->_where
= " WHERE civicrm_option_group.name = 'activity_type' AND
405 {$this->_aliases['civicrm_activity']}.is_test = 0 AND
406 {$this->_aliases['civicrm_activity']}.is_deleted = 0 AND
407 {$this->_aliases['civicrm_activity']}.is_current_revision = 1";
410 foreach ($this->_columns
as $tableName => $table) {
411 if (array_key_exists('filters', $table)) {
413 foreach ($table['filters'] as $fieldName => $field) {
415 if (CRM_Utils_Array
::value('type', $field) & CRM_Utils_Type
::T_DATE
) {
416 $relative = CRM_Utils_Array
::value("{$fieldName}_relative", $this->_params
);
417 $from = CRM_Utils_Array
::value("{$fieldName}_from", $this->_params
);
418 $to = CRM_Utils_Array
::value("{$fieldName}_to", $this->_params
);
420 $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
423 $op = CRM_Utils_Array
::value("{$fieldName}_op", $this->_params
);
425 $clause = $this->whereClause($field,
427 CRM_Utils_Array
::value("{$fieldName}_value", $this->_params
),
428 CRM_Utils_Array
::value("{$fieldName}_min", $this->_params
),
429 CRM_Utils_Array
::value("{$fieldName}_max", $this->_params
)
434 if ($field['name'] == 'current_user') {
435 if (CRM_Utils_Array
::value("{$fieldName}_value", $this->_params
) == 1) {
437 $session = CRM_Core_Session
::singleton();
438 if ($contactID = $session->get('userID')) {
439 $clause = "( civicrm_contact_source.id = " . $contactID . " OR civicrm_contact_assignee.id = " . $contactID . " OR contact_civireport.id = " . $contactID . " )";
449 if (!empty($clause)) {
450 $clauses[] = $clause;
456 if (empty($clauses)) {
457 $this->_where
.= " ";
460 $this->_where
.= " AND " . implode(' AND ', $clauses);
463 if ($this->_aclWhere
) {
464 $this->_where
.= " AND {$this->_aclWhere} ";
469 $this->_groupBy
= "GROUP BY {$this->_aliases['civicrm_activity']}.id";
472 function buildACLClause($tableAlias = 'contact_a') {
473 //override for ACL( Since Contact may be source
474 //contact/assignee or target also it may be null )
476 if (CRM_Core_Permission
::check('view all contacts')) {
477 $this->_aclFrom
= $this->_aclWhere
= NULL;
481 $session = CRM_Core_Session
::singleton();
482 $contactID = $session->get('userID');
486 $contactID = CRM_Utils_Type
::escape($contactID, 'Integer');
488 CRM_Contact_BAO_Contact_Permission
::cache($contactID);
490 foreach ($tableAlias as $k => $alias) {
491 $clauses[] = " INNER JOIN civicrm_acl_contact_cache aclContactCache_{$k} ON ( {$alias}.id = aclContactCache_{$k}.contact_id OR {$alias}.id IS NULL ) AND aclContactCache_{$k}.user_id = $contactID ";
494 $this->_aclFrom
= implode(" ", $clauses);
495 $this->_aclWhere
= NULL;
498 function postProcess() {
500 $this->buildACLClause(array('civicrm_contact_source', 'contact_civireport', 'civicrm_contact_assignee'));
501 parent
::postProcess();
504 function alterDisplay(&$rows) {
505 // custom code to alter rows
508 $activityType = CRM_Core_PseudoConstant
::activityType(TRUE, TRUE, FALSE, 'label', TRUE);
509 $activityStatus = CRM_Core_PseudoConstant
::activityStatus();
511 $seperator = CRM_CORE_DAO
::VALUE_SEPARATOR
;
512 $context = CRM_Utils_Request
::retrieve('context', 'String', $this, FALSE, 'report');
514 if (CRM_Core_Permission
::check('access CiviCRM')) {
516 $onHover = ts('View Contact Summary for this Contact');
517 $onHoverAct = ts('View Activity Record');
520 foreach ($rows as $rowNum => $row) {
521 if (array_key_exists('civicrm_contact_contact_source', $row)) {
522 if ($value = $row['civicrm_activity_assignment_contact_id']) {
524 $url = CRM_Utils_System
::url("civicrm/contact/view",
525 'reset=1&cid=' . $value,
528 $rows[$rowNum]['civicrm_contact_contact_source_link'] = $url;
529 $rows[$rowNum]['civicrm_contact_contact_source_hover'] = $onHover;
535 if (array_key_exists('civicrm_contact_contact_assignee', $row)) {
536 $assigneeNames = explode($seperator, $row['civicrm_contact_contact_assignee']);
537 if ($value = $row['civicrm_activity_assignment_contact_id']) {
538 $assigneeContactIds = explode($seperator, $value);
541 foreach ($assigneeContactIds as $id => $value) {
542 $url = CRM_Utils_System
::url("civicrm/contact/view",
543 'reset=1&cid=' . $value,
546 $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$assigneeNames[$id]}</a>";
548 $rows[$rowNum]['civicrm_contact_contact_assignee'] = implode('; ', $link);
554 if (array_key_exists('civicrm_contact_contact_target', $row)) {
555 $targetNames = explode($seperator, $row['civicrm_contact_contact_target']);
556 if ($value = $row['civicrm_activity_target_contact_id']) {
557 $targetContactIds = explode($seperator, $value);
560 foreach ($targetContactIds as $id => $value) {
561 $url = CRM_Utils_System
::url("civicrm/contact/view",
562 'reset=1&cid=' . $value,
565 $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$targetNames[$id]}</a>";
567 $rows[$rowNum]['civicrm_contact_contact_target'] = implode('; ', $link);
573 if (array_key_exists('civicrm_activity_activity_type_id', $row)) {
574 if ($value = $row['civicrm_activity_activity_type_id']) {
575 $rows[$rowNum]['civicrm_activity_activity_type_id'] = $activityType[$value];
577 // Check for target contact id(s) and use the first contact id in that list for view activity link if found,
578 // else use source contact id
579 if (!empty($rows[$rowNum]['civicrm_activity_target_target_contact_id'])) {
580 $targets = explode($seperator, $rows[$rowNum]['civicrm_activity_target_target_contact_id']);
584 $cid = $rows[$rowNum]['civicrm_activity_source_contact_id'];
587 $actionLinks = CRM_Activity_Selector_Activity
::actionLinks($row['civicrm_activity_activity_type_id'],
588 CRM_Utils_Array
::value('civicrm_activity_source_record_id', $rows[$rowNum]),
590 $rows[$rowNum]['civicrm_activity_id']
594 'id' => $rows[$rowNum]['civicrm_activity_id'],
598 $url = CRM_Utils_System
::url($actionLinks[CRM_Core_Action
::VIEW
]['url'],
599 CRM_Core_Action
::replace($actionLinks[CRM_Core_Action
::VIEW
]['qs'], $linkValues), TRUE
601 $rows[$rowNum]['civicrm_activity_activity_type_id_link'] = $url;
602 $rows[$rowNum]['civicrm_activity_activity_type_id_hover'] = $onHoverAct;
608 if (array_key_exists('civicrm_activity_status_id', $row)) {
609 if ($value = $row['civicrm_activity_status_id']) {
610 $rows[$rowNum]['civicrm_activity_status_id'] = $activityStatus[$value];
615 if (array_key_exists('civicrm_activity_campaign_id', $row)) {
616 if ($value = $row['civicrm_activity_campaign_id']) {
617 $rows[$rowNum]['civicrm_activity_campaign_id'] = $this->activeCampaigns
[$value];
622 if (array_key_exists('civicrm_activity_engagement_level', $row)) {
623 if ($value = $row['civicrm_activity_engagement_level']) {
624 $rows[$rowNum]['civicrm_activity_engagement_level'] = $this->engagementLevels
[$value];
629 if (array_key_exists('civicrm_activity_activity_date_time', $row) && array_key_exists('civicrm_activity_status_id', $row)) {
630 if (CRM_Utils_Date
::overdue($rows[$rowNum]['civicrm_activity_activity_date_time']) &&
631 $activityStatus[$row['civicrm_activity_status_id']] != 'Completed'
633 $rows[$rowNum]['class'] = "status-overdue";
638 $entryFound = $this->alterDisplayAddressFields($row, $rows, $rowNum, 'activity', 'List all activities for this ') ?
TRUE : $entryFound;
648 * Add Target Contact Address into From Table if required
650 function addAddressFromClause() {
651 // include address field if address column is to be included
652 if ((isset($this->_addressField
) &&
655 $this->isTableSelected('civicrm_address')
658 LEFT JOIN civicrm_address {$this->_aliases['civicrm_address']}
659 ON ({$this->_aliases['civicrm_activity_target']}.target_contact_id =
660 {$this->_aliases['civicrm_address']}.contact_id) AND
661 {$this->_aliases['civicrm_address']}.is_primary = 1\n";