Skip to content

Commit

Permalink
Merge pull request #16643 from demeritcowboy/activity-summary-groupby
Browse files Browse the repository at this point in the history
dev/core#1619 - Fatal error when grouping Activity Summary report by activity date
  • Loading branch information
colemanw authored Feb 27, 2020
2 parents d97aed6 + 04076b1 commit 5128655
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CRM/Report/Form/ActivitySummary.php
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,9 @@ public function buildQuery($applyLimit = TRUE) {
$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();
Expand Down
38 changes: 38 additions & 0 deletions tests/phpunit/api/v3/ReportTemplateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1055,6 +1055,44 @@ public function testReportsWithNoTInSmartGroupFilter($template) {
$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.
*/
Expand Down

0 comments on commit 5128655

Please sign in to comment.