Skip to content

Commit

Permalink
Fix dev/report#23
Browse files Browse the repository at this point in the history
When filtering by contact sub-type using 'is not one of' do not exclude where sub-type is null.

Add unit tests for contact sub-type 'is one of' and 'is not one of'
Tighten the matching on sub-type to avoid problems where one contact sub-type is a substring of another.
  • Loading branch information
aydun committed Nov 27, 2019
1 parent 63865f0 commit 2d2ec06
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 11 deletions.
24 changes: 13 additions & 11 deletions CRM/Report/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -2114,32 +2114,34 @@ public function whereClause(&$field, $op, $value, $min, $max) {
*/
public function whereSubtypeClause($field, $value, $op) {
// Get the correct SQL operator.
$orNull = false;
switch ($op) {
case 'notin':
$op = 'nhas';
$clauseSeparator = 'AND';
$clauseSeparator = ' AND ';
$orNull = true;
break;

case 'in':
$op = 'has';
$clauseSeparator = 'OR';
$clauseSeparator = ' OR ';
break;
}
$sqlOp = $this->getSQLOperator($op);
$clause = '( ';
$subtypeFilters = count($value);
if ($sqlOp == 'IS NULL' || $sqlOp == 'IS NOT NULL') {
$clause .= "{$field['dbAlias']} $sqlOp";
$clause = "{$field['dbAlias']} $sqlOp";
}
else {
for ($i = 0; $i < $subtypeFilters; $i++) {
$clause .= "{$field['dbAlias']} $sqlOp '%$value[$i]%'";
if ($i !== ($subtypeFilters - 1)) {
$clause .= " $clauseSeparator ";
}
$subclauses = [];
foreach ($value as $item) {
$subclauses[] = "( {$field['dbAlias']} $sqlOp '%" . CRM_Core_DAO::VALUE_SEPARATOR . $item . CRM_Core_DAO::VALUE_SEPARATOR . "%' )";
}
$clause = implode($clauseSeparator, $subclauses);
}
$clause = "( $clause )";
if ($orNull) {
$clause = "( ( {$field['dbAlias']} IS NULL ) OR $clause )";
}
$clause .= ' )';
return $clause;
}

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 @@ -1145,6 +1145,44 @@ public function testContactSubtypeNull() {
$this->assertEquals(1, $rows['count']);
}

/**
* Test contact subtype filter on summary report.
*
* @throws \CRM_Core_Exception
*/
public function testContactSubtypeIn() {
$this->individualCreate(['contact_sub_type' => ['Student', 'Parent']]);
$this->individualCreate();

$rows = $this->callAPISuccess('report_template', 'getrows', [
'report_id' => 'contact/summary',
'contact_sub_type_op' => 'in',
'contact_sub_type_value' => ['Student'],
'contact_type_op' => 'in',
'contact_type_value' => 'Individual',
]);
$this->assertEquals(1, $rows['count']);
}

/**
* Test contact subtype filter on summary report.
*
* @throws \CRM_Core_Exception
*/
public function testContactSubtypeNotIn() {
$this->individualCreate(['contact_sub_type' => ['Student', 'Parent']]);
$this->individualCreate();

$rows = $this->callAPISuccess('report_template', 'getrows', [
'report_id' => 'contact/summary',
'contact_sub_type_op' => 'notin',
'contact_sub_type_value' => ['Student'],
'contact_type_op' => 'in',
'contact_type_value' => 'Individual',
]);
$this->assertEquals(1, $rows['count']);
}

/**
* Test PCP report to ensure total donors and total committed is accurate.
*/
Expand Down

0 comments on commit 2d2ec06

Please sign in to comment.