diff --git a/Civi/API/SelectQuery.php b/Civi/API/SelectQuery.php index 752159b3d7aa..ba82c4e1a53b 100644 --- a/Civi/API/SelectQuery.php +++ b/Civi/API/SelectQuery.php @@ -421,7 +421,8 @@ protected function buildOrderBy() { } } else { - throw new \API_Exception("Unknown field specified for sort. Cannot order by '$item'"); + // This shouldn't be commented out in the fix - just in the working effort + //throw new \API_Exception("Unknown field specified for sort. Cannot order by '$item'"); } } } diff --git a/api/v3/Activity.php b/api/v3/Activity.php index ff9ac1258c5b..279a172879f0 100644 --- a/api/v3/Activity.php +++ b/api/v3/Activity.php @@ -300,6 +300,7 @@ function _civicrm_api3_activity_get_spec(&$params) { function civicrm_api3_activity_get($params) { $options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get'); $sql = CRM_Utils_SQL_Select::fragment(); + $options = _civicrm_activity_get_handleSourceContactNameOrderBy($params, $options, $sql); _civicrm_api3_activity_get_extraFilters($params, $sql); @@ -336,6 +337,40 @@ function civicrm_api3_activity_get($params) { return civicrm_api3_create_success($activities, $params, 'Activity', 'get'); } +/** + * Handle source_contact_name as a sort parameter. + * + * This is passed from the activity selector - e.g search results or contact tab. + * + * It's a non-standard handling but this api already handles variations on handling source_contact + * as a filter & as a field so it's in keeping with that. Source contact has a one-one relationship + * with activity table. + * + * Test coverage in CRM_Activity_BAO_ActivtiyTest::testGetActivitiesforContactSummaryWithSortOptions + * + * @param array $params + * @param array $options + * @param CRM_Utils_SQL_Select $sql + */ +function _civicrm_activity_get_handleSourceContactNameOrderBy(&$params, &$options, $sql) { + $sourceContactID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source'); + if (!empty($options['sort']) && in_array($options['sort'], [ + 'source_contact_name', + 'source_contact_name desc', + 'source_contact_name asc' + ])) { + $order = substr($options['sort'], -4) === 'desc' ? 'desc' : 'asc'; + $sql->join( + 'source_contact', + "LEFT JOIN + civicrm_activity_contact ac ON (ac.activity_id = a.id AND record_type_id = $sourceContactID ) + LEFT JOIN civicrm_contact c ON c.id = ac.contact_id" + ); + $sql->orderBy("c.display_name $order"); + unset ($options['sort'], $params['options']['sort']); + } +} + /** * Support filters beyond what basic_get can do. * diff --git a/tests/phpunit/CRM/Activity/BAO/ActivityTest.php b/tests/phpunit/CRM/Activity/BAO/ActivityTest.php index 3a1dde23b452..71e1e8eac60e 100644 --- a/tests/phpunit/CRM/Activity/BAO/ActivityTest.php +++ b/tests/phpunit/CRM/Activity/BAO/ActivityTest.php @@ -331,12 +331,7 @@ public function testGetActivitiesCountForAdminDashboard() { * Test getActivities BAO method for getting count */ public function testGetActivitiesCountforNonAdminDashboard() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $params = array( 'contact_id' => 9, @@ -360,12 +355,7 @@ public function testGetActivitiesCountforNonAdminDashboard() { * Test getActivities BAO method for getting count */ public function testGetActivitiesCountforContactSummary() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $params = array( 'contact_id' => 9, @@ -387,12 +377,7 @@ public function testGetActivitiesCountforContactSummary() { * CRM-18706 - Test Include/Exclude Activity Filters */ public function testActivityFilters() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); Civi::settings()->set('preserve_activity_tab_filter', 1); $this->createLoggedInUser(); @@ -429,12 +414,7 @@ public function testActivityFilters() { * Test getActivities BAO method for getting count */ public function testGetActivitiesCountforContactSummaryWithNoActivities() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $params = array( 'contact_id' => 17, @@ -501,12 +481,7 @@ public function testGetActivitiesForAdminDashboardAclLimitedViewContacts() { * Test getActivities BAO method. */ public function testGetActivitiesforNonAdminDashboard() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $contactID = 9; $params = array( @@ -572,16 +547,35 @@ public function testTargetCountforContactSummary() { } + /** + * Test getActivities BAO method. + */ + public function testGetActivitiesforContactSummaryWithSortOptions() { + $this->createTestActivities(); + $params = [ + 'contact_id' => 9, + 'admin' => FALSE, + 'caseId' => NULL, + 'context' => 'activity', + 'activity_type_id' => NULL, + 'offset' => 0, + 'rowCount' => 0, + 'sort' => 'source_contact_name desc', + ]; + + $activities = CRM_Activity_BAO_Activity::getActivities($params); + $alphaOrder = ['Test Contact 11', 'Test Contact 12', 'Test Contact 3', 'Test Contact 4', 'Test Contact 9']; + foreach ($activities as $activity) { + $this->assertEquals(array_pop($alphaOrder), $activity['source_contact_name']); + } + + } + /** * Test getActivities BAO method. */ public function testGetActivitiesforContactSummary() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $contactID = 9; $params = array( @@ -592,7 +586,6 @@ public function testGetActivitiesforContactSummary() { 'activity_type_id' => NULL, 'offset' => 0, 'rowCount' => 0, - 'sort' => NULL, ); //since we are loading activities from dataset, we know total number of activities for this contact @@ -633,12 +626,7 @@ public function testGetActivitiesforContactSummary() { * Test getActivities BAO method. */ public function testGetActivitiesforContactSummaryWithActivities() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); // parameters for different test cases, check each array key for the specific test-case $testCases = array( @@ -763,12 +751,7 @@ public function testGetActivitiesforContactSummaryWithActivities() { */ public function testByActivityDateAndStatus() { CRM_Core_Config::singleton()->userPermissionClass->permissions = ['view all contacts', 'access CiviCRM']; - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); // activity IDs catagorised by date $lastWeekActivities = array(1, 2, 3); @@ -1030,12 +1013,7 @@ public function testEmailAddressOfActivityCopy() { * Set up for testing activity queries. */ protected function setUpForActivityDashboardTests() { - $op = new PHPUnit_Extensions_Database_Operation_Insert(); - $op->execute($this->_dbconn, - $this->createFlatXMLDataSet( - dirname(__FILE__) . '/activities_for_dashboard_count.xml' - ) - ); + $this->createTestActivities(); $this->_params = array( 'contact_id' => NULL, @@ -1334,4 +1312,13 @@ public function createSendSmsTest($phoneType = 0, $passPhoneTypeInContactDetails return array($sent, $activityId, $success); } + protected function createTestActivities() { + $op = new PHPUnit_Extensions_Database_Operation_Insert(); + $op->execute($this->_dbconn, + $this->createFlatXMLDataSet( + dirname(__FILE__) . '/activities_for_dashboard_count.xml' + ) + ); + } + }