From 49d4d2225b189c3a24a3f2db0cd10cd81c042a29 Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Fri, 30 Jun 2017 23:41:55 +0530 Subject: [PATCH] CRM-20793: Add filter - activity date and status on search criteria of activity listing --- CRM/Activity/BAO/Activity.php | 16 +- CRM/Activity/Form/ActivityFilter.php | 10 ++ CRM/Activity/Page/AJAX.php | 4 + CRM/Core/Form/Date.php | 23 ++- templates/CRM/Activity/Selector/Selector.tpl | 31 ++-- templates/CRM/Core/DateRange.tpl | 3 + .../phpunit/CRM/Activity/BAO/ActivityTest.php | 157 ++++++++++++++++++ 7 files changed, 229 insertions(+), 15 deletions(-) diff --git a/CRM/Activity/BAO/Activity.php b/CRM/Activity/BAO/Activity.php index 26c8a69b0b..d44959dd20 100644 --- a/CRM/Activity/BAO/Activity.php +++ b/CRM/Activity/BAO/Activity.php @@ -1234,7 +1234,21 @@ LEFT JOIN civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a "civicrm_activity.is_test= 0", ); - if ($input['context'] != 'activity') { + if (isset($input['activity_date_relative']) || + (!empty($input['activity_date_low']) || !empty($input['activity_date_high'])) + ) { + list($from, $to) = CRM_Utils_Date::getFromTo( + CRM_Utils_Array::value('activity_date_relative', $input, 0), + CRM_Utils_Array::value('activity_date_low', $input), + CRM_Utils_Array::value('activity_date_high', $input) + ); + $commonClauses[] = sprintf('civicrm_activity.activity_date_time BETWEEN "%s" AND "%s" ', $from, $to); + } + + if (!empty($input['activity_status_id'])) { + $commonClauses[] = sprintf("civicrm_activity.status_id IN (%s)", $input['activity_status_id']); + } + elseif ($input['context'] != 'activity') { $commonClauses[] = "civicrm_activity.status_id = 1"; } diff --git a/CRM/Activity/Form/ActivityFilter.php b/CRM/Activity/Form/ActivityFilter.php index ef687781c9..bcfaede429 100644 --- a/CRM/Activity/Form/ActivityFilter.php +++ b/CRM/Activity/Form/ActivityFilter.php @@ -42,6 +42,16 @@ class CRM_Activity_Form_ActivityFilter extends CRM_Core_Form { $this->add('select', 'activity_type_filter_id', ts('Include'), array('' => ts('- all activity type(s) -')) + $activityOptions); $this->add('select', 'activity_type_exclude_filter_id', ts('Exclude'), array('' => ts('- select activity type -')) + $activityOptions); + CRM_Core_Form_Date::buildDateRange( + $this, 'activity_date', 1, + '_low', '_high', ts('From:'), + FALSE, array(), 'searchDate', + FALSE, array('class' => 'crm-select2 medium') + ); + $this->addSelect('status_id', + array('entity' => 'activity', 'multiple' => 'multiple', 'option_url' => NULL, 'placeholder' => ts('- any -')) + ); + $this->assign('suppressForm', TRUE); } diff --git a/CRM/Activity/Page/AJAX.php b/CRM/Activity/Page/AJAX.php index b7f4e14624..b3a1c78602 100644 --- a/CRM/Activity/Page/AJAX.php +++ b/CRM/Activity/Page/AJAX.php @@ -403,6 +403,10 @@ class CRM_Activity_Page_AJAX { 'context' => 'String', 'activity_type_id' => 'Integer', 'activity_type_exclude_id' => 'Integer', + 'activity_status_id' => 'String', + 'activity_date_relative' => 'String', + 'activity_date_low' => 'String', + 'activity_date_high' => 'String', ); $params = CRM_Core_Page_AJAX::defaultSortAndPagerParams(); diff --git a/CRM/Core/Form/Date.php b/CRM/Core/Form/Date.php index 99b6614593..e5f22414a7 100644 --- a/CRM/Core/Form/Date.php +++ b/CRM/Core/Form/Date.php @@ -81,12 +81,14 @@ class CRM_Core_Form_Date { * Additional value pairs to add. * @param string $dateFormat * @param bool|string $displayTime + * @param array $attributes */ public static function buildDateRange( &$form, $fieldName, $count = 1, $from = '_from', $to = '_to', $fromLabel = 'From:', $required = FALSE, $operators = array(), - $dateFormat = 'searchDate', $displayTime = FALSE + $dateFormat = 'searchDate', $displayTime = FALSE, + $attributes = array('class' => 'crm-select2') ) { $selector = CRM_Core_Form_Date::returnDateRangeSelector( @@ -98,7 +100,8 @@ class CRM_Core_Form_Date { CRM_Core_Form_Date::addDateRangeToForm( $form, $fieldName, $selector, $from, $to, $fromLabel, - $required, $dateFormat, $displayTime + $required, $dateFormat, $displayTime, + $attributes ); } @@ -165,14 +168,26 @@ class CRM_Core_Form_Date { * @param bool $required * @param string $dateFormat * @param bool $displayTime + * @param array $attributes */ - public static function addDateRangeToForm(&$form, $fieldName, $selector, $from = '_from', $to = '_to', $fromLabel = 'From:', $required = FALSE, $dateFormat = 'searchDate', $displayTime = FALSE) { + public static function addDateRangeToForm( + &$form, + $fieldName, + $selector, + $from = '_from', + $to = '_to', + $fromLabel = 'From:', + $required = FALSE, + $dateFormat = 'searchDate', + $displayTime = FALSE, + $attributes + ) { $form->add('select', "{$fieldName}_relative", ts('Relative Date Range'), $selector, $required, - array('class' => 'crm-select2') + $attributes ); $form->addDateRange($fieldName, $from, $to, $fromLabel, $dateFormat, FALSE, $displayTime); diff --git a/templates/CRM/Activity/Selector/Selector.tpl b/templates/CRM/Activity/Selector/Selector.tpl index d17ee8afa6..471fdc3fdf 100644 --- a/templates/CRM/Activity/Selector/Selector.tpl +++ b/templates/CRM/Activity/Selector/Selector.tpl @@ -26,17 +26,23 @@
- {ts}Filter by Activity Type{/ts} + {ts}Filter by Activity{/ts}
-
-
- {$form.activity_type_filter_id.label} {$form.activity_type_filter_id.html|crmAddClass:big} -
-
- {$form.activity_type_exclude_filter_id.label} {$form.activity_type_exclude_filter_id.html|crmAddClass:big} -
-
+ + + + + {include file="CRM/Core/DateRange.tpl" fieldName="activity_date" from='_low' to='_high' label='Date'} + + +
+ {$form.activity_type_filter_id.label}
{$form.activity_type_filter_id.html|crmAddClass:medium} +
+ {$form.activity_type_exclude_filter_id.label}
{$form.activity_type_exclude_filter_id.html|crmAddClass:medium} +
+ {ts}Status{/ts}: {$form.status_id.html|crmAddClass:medium} +
@@ -62,8 +68,13 @@ "ajax": { "url": {/literal}'{crmURL p="civicrm/ajax/contactactivity" h=0 q="snippet=4&context=$context&cid=$contactId"}'{literal}, "data": function (d) { + var status_id = $('.crm-activity-selector-' + context + ' select#status_id').val() || []; d.activity_type_id = $('.crm-activity-selector-' + context + ' select#activity_type_filter_id').val(), - d.activity_type_exclude_id = $('.crm-activity-selector-' + context + ' select#activity_type_exclude_filter_id').val() + d.activity_type_exclude_id = $('.crm-activity-selector-' + context + ' select#activity_type_exclude_filter_id').val(), + d.activity_date_relative = $('select#activity_date_relative').val(), + d.activity_date_low = $('#activity_date_low').val(), + d.activity_date_high = $('#activity_date_high').val(), + d.activity_status_id = status_id.join(',') } } }); diff --git a/templates/CRM/Core/DateRange.tpl b/templates/CRM/Core/DateRange.tpl index ab7a151f05..8e30142669 100644 --- a/templates/CRM/Core/DateRange.tpl +++ b/templates/CRM/Core/DateRange.tpl @@ -26,6 +26,9 @@ {*this is included inside a table row*} {assign var=relativeName value=$fieldName|cat:"_relative"}
+ {if $label} + {ts}{$label}{/ts} + {/if} {$form.$relativeName.html}
diff --git a/tests/phpunit/CRM/Activity/BAO/ActivityTest.php b/tests/phpunit/CRM/Activity/BAO/ActivityTest.php index 1477ec2669..97ffec5904 100644 --- a/tests/phpunit/CRM/Activity/BAO/ActivityTest.php +++ b/tests/phpunit/CRM/Activity/BAO/ActivityTest.php @@ -731,6 +731,163 @@ class CRM_Activity_BAO_ActivityTest extends CiviUnitTestCase { } } + /** + * CRM-20793 : Test getActivities by using activity date and status filter + */ + public function testbyActivityDateAndStatus() { + $op = new PHPUnit_Extensions_Database_Operation_Insert(); + $op->execute($this->_dbconn, + $this->createFlatXMLDataSet( + dirname(__FILE__) . '/activities_for_dashboard_count.xml' + ) + ); + + // activity IDs catagorised by date + $lastWeekActivities = array(1, 2, 3); + $todayActivities = array(4, 5, 6, 7); + $lastMonthActivities = array(8, 9, 10, 11); + $lastYearActivties = array(12, 13, 14, 15, 16); + + // date values later used to set activity date value + $lastWeekDate = date('YmdHis', strtotime('1 week ago')); + $today = date('YmdHis'); + $lastMonthDate = date('YmdHis', strtotime('1 month ago')); + $lastYearDate = date('YmdHis', strtotime('1 year ago')); + for ($i = 1; $i <= 16; $i++) { + if (in_array($i, $lastWeekActivities)) { + $date = $lastWeekDate; + } + elseif (in_array($i, $lastMonthActivities)) { + $date = $lastMonthDate; + } + elseif (in_array($i, $lastYearActivties)) { + $date = $lastYearDate; + } + elseif (in_array($i, $todayActivities)) { + $date = $today; + } + $this->callAPISuccess('Activity', 'create', array( + 'id' => $i, + 'activity_date_time' => $date, + )); + } + + // parameters for different test cases, check each array key for the specific test-case + $testCases = array( + 'todays-activity' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_date_relative' => 'this.day', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + 'todays-activity-filtered-by-range' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_date_low' => date('Y/m/d', strtotime('yesterday')), + 'activity_date_high' => date('Y/m/d'), + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + 'last-week-activity' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_date_relative' => 'previous.week', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + 'last-month-activity' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_date_relative' => 'previous.month', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + 'last-year-activity' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_date_relative' => 'previous.year', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + 'activity-of-all-statuses' => array( + 'params' => array( + 'contact_id' => 1, + 'admin' => TRUE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_status_id' => '1,2', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => NULL, + ), + ), + ); + + foreach ($testCases as $caseName => $testCase) { + $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($testCase['params']); + $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($testCase['params']); + asort($activitiesDep); + $activityIDs = array_keys($activitiesDep); + + if ($caseName == 'todays-activity' || $caseName == 'todays-activity-filtered-by-range') { + $this->assertEquals(count($todayActivities), $activityCount); + $this->assertEquals(count($todayActivities), count($activitiesDep)); + $this->checkArrayEquals($todayActivities, $activityIDs); + } + elseif ($caseName == 'last-week-activity') { + $this->assertEquals(count($lastWeekActivities), $activityCount); + $this->assertEquals(count($lastWeekActivities), count($activitiesDep)); + $this->checkArrayEquals($lastWeekActivities, $activityIDs); + } + elseif ($caseName == 'last-month-activity') { + $this->assertEquals(count($lastMonthActivities), $activityCount); + $this->assertEquals(count($lastMonthActivities), count($activitiesDep)); + $this->checkArrayEquals($lastMonthActivities, $activityIDs); + } + elseif ($caseName == 'last-year-activity') { + $this->assertEquals(count($lastYearActivties), $activityCount); + $this->assertEquals(count($lastYearActivties), count($activitiesDep)); + $this->checkArrayEquals($lastYearActivties, $activityIDs); + } + elseif ($caseName == 'activity-of-all-statuses') { + $this->assertEquals(16, $activityCount); + $this->assertEquals(16, count($activitiesDep)); + } + } + } + /** * CRM-20308: Test from email address when a 'copy of Activity' event occur */ -- 2.25.1