From 04076b1b47b95c644819755f5b7783e902d36f6e Mon Sep 17 00:00:00 2001 From: demeritcowboy Date: Thu, 27 Feb 2020 15:50:27 -0500 Subject: [PATCH] fatal error when grouping by activity date --- CRM/Report/Form/ActivitySummary.php | 2 ++ tests/phpunit/api/v3/ReportTemplateTest.php | 38 +++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/CRM/Report/Form/ActivitySummary.php b/CRM/Report/Form/ActivitySummary.php index 48cef535fb..14b5946642 100644 --- a/CRM/Report/Form/ActivitySummary.php +++ b/CRM/Report/Form/ActivitySummary.php @@ -457,7 +457,9 @@ class CRM_Report_Form_ActivitySummary extends CRM_Report_Form { $insertCols = ''; $insertQuery = "INSERT INTO {$this->_tempTableName} ( " . implode(',', array_merge(array_keys($this->_columnHeaders), array_keys($unselectedColumns))) . " ) {$sql}"; + CRM_Core_DAO::disableFullGroupByMode(); CRM_Core_DAO::executeQuery($insertQuery); + CRM_Core_DAO::reenableFullGroupByMode(); // now build the query for duration sum $this->activityDurationFrom(); diff --git a/tests/phpunit/api/v3/ReportTemplateTest.php b/tests/phpunit/api/v3/ReportTemplateTest.php index 038b076741..51d9e9956d 100644 --- a/tests/phpunit/api/v3/ReportTemplateTest.php +++ b/tests/phpunit/api/v3/ReportTemplateTest.php @@ -1055,6 +1055,44 @@ class api_v3_ReportTemplateTest extends CiviUnitTestCase { $this->assertNumberOfContactsInResult(2, $rows, $template); } + /** + * Test we don't get a fatal grouping with various frequencies. + * + * @throws \CRM_Core_Exception + */ + public function testActivitySummaryGroupByFrequency() { + $this->createContactsWithActivities(); + foreach (['MONTH', 'YEARWEEK', 'QUARTER', 'YEAR'] as $frequency) { + $params = [ + 'report_id' => 'activitySummary', + 'fields' => [ + 'activity_type_id' => 1, + 'duration' => 1, + // id is "total activities", which is required by default(?) + 'id' => 1, + ], + 'group_bys' => ['activity_date_time' => 1], + 'group_bys_freq' => ['activity_date_time' => $frequency], + 'options' => ['metadata' => ['sql']], + ]; + $rowsSql = $this->callAPISuccess('report_template', 'getrows', $params)['metadata']['sql']; + $statsSql = $this->callAPISuccess('report_template', 'getstatistics', $params)['metadata']['sql']; + switch ($frequency) { + case 'YEAR': + // Year only contains one grouping. + // Also note the extra space. + $this->assertContains('GROUP BY YEAR(activity_civireport.activity_date_time)', $rowsSql[1], "Failed for frequency $frequency"); + $this->assertContains('GROUP BY YEAR(activity_civireport.activity_date_time)', $statsSql[1], "Failed for frequency $frequency"); + break; + + default: + $this->assertContains("GROUP BY YEAR(activity_civireport.activity_date_time), {$frequency}(activity_civireport.activity_date_time)", $rowsSql[1], "Failed for frequency $frequency"); + $this->assertContains("GROUP BY YEAR(activity_civireport.activity_date_time), {$frequency}(activity_civireport.activity_date_time)", $statsSql[1], "Failed for frequency $frequency"); + break; + } + } + } + /** * Test activity details report - requiring all current fields to be output. */ -- 2.25.1