Skip to content

Commit

Permalink
dev/core#176 Odd / Even street number filter missing from Reports
Browse files Browse the repository at this point in the history
  • Loading branch information
monishdeb committed Jul 5, 2018
1 parent 6673795 commit 8fc3324
Show file tree
Hide file tree
Showing 3 changed files with 219 additions and 50 deletions.
19 changes: 19 additions & 0 deletions CRM/Report/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -1068,6 +1068,15 @@ public function setParams($params) {
$this->_params = $params;
}

/**
* Getter for $_params.
*
* @return void|array $params
*/
public function getParams() {
return $this->_params;
}

/**
* Setter for $_id.
*
Expand Down Expand Up @@ -5481,6 +5490,16 @@ protected function getAddressColumns($options = array()) {
'type' => 1,
'is_fields' => TRUE,
),
$options['prefix'] . 'odd_street_number' => array(
'title' => ts('Odd / Even Street Number'),
'name' => 'odd_street_number',
'type' => CRM_Utils_Type::T_INT,
'no_display' => TRUE,
'required' => TRUE,
'dbAlias' => '(address_civireport.street_number % 2)',
'is_fields' => TRUE,
'is_order_bys' => TRUE,
),
$options['prefix'] . 'street_name' => array(
'name' => 'street_name',
'title' => ts($options['prefix_label'] . 'Street Name'),
Expand Down
51 changes: 1 addition & 50 deletions CRM/Report/Form/Walklist/Walklist.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,55 +76,6 @@ public function __construct() {
),
),
),
'civicrm_address' => array(
'dao' => 'CRM_Core_DAO_Address',
'fields' => array(
'street_number' => array(
'title' => ts('Street Number'),
'type' => 1,
),
'street_address' => NULL,
'city' => NULL,
'postal_code' => NULL,
'state_province_id' => array(
'title' => ts('State/Province'),
'default' => TRUE,
'type' => CRM_Utils_Type::T_INT,
),
'country_id' => array(
'title' => ts('Country'),
),
'odd_street_number' => array(
'title' => ts('Odd/Even Street Number'),
'type' => CRM_Utils_Type::T_INT,
'no_display' => TRUE,
'required' => TRUE,
'dbAlias' => '(address_civireport.street_number % 2)',
),
),
'filters' => array(
'street_number' => array(
'title' => ts('Street Number'),
'type' => 1,
'name' => 'street_number',
),
'street_address' => NULL,
'city' => NULL,
),
'order_bys' => array(
'street_name' => array(
'title' => ts('Street Name'),
),
'street_number' => array(
'title' => ts('Street Number'),
),
'odd_street_number' => array(
'title' => ts('Odd/Even Street Number'),
'dbAlias' => 'civicrm_address_odd_street_number',
),
),
'grouping' => 'location-fields',
),
'civicrm_email' => array(
'dao' => 'CRM_Core_DAO_Email',
'fields' => array('email' => array('default' => TRUE)),
Expand All @@ -135,7 +86,7 @@ public function __construct() {
'fields' => array('phone' => NULL),
'grouping' => 'location-fields',
),
);
) + $this->getAddressColumns(array('group_bys' => FALSE));
parent::__construct();
}

Expand Down
199 changes: 199 additions & 0 deletions tests/phpunit/CRM/Report/Form/ContactSummaryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 5 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2018 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/

/**
* Test Contact Summary report outcome
*
* @package CiviCRM
*/
class CRM_Report_Form_ContactSummaryTest extends CiviReportTestCase {
protected $_tablesToTruncate = array(
'civicrm_contact',
'civicrm_email',
'civicrm_phone',
'civicrm_address',
);

public function setUp() {
parent::setUp();
$this->quickCleanup($this->_tablesToTruncate);
}

public function tearDown() {
parent::tearDown();
}

/**
* Ensure the new Odd/Event street number sort column works correctly
*/
public function testOddEvenStreetNumber() {
// Create 5 contacts where:
// Contact A - Odd Street number - 3
// Contact B - Odd Street number - 5
// Contact C - Even Street number - 2
// Contact D - Even Street number - 4
// Contact E - No Street number
$contactIDs = [
'odd_street_number_1' => $this->individualCreate([
'api.Address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'street_number' => 3,
]
]),
'odd_street_number_2' => $this->individualCreate([
'api.Address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'street_number' => 5,
]
]),
'even_street_number_1' => $this->individualCreate([
'api.Address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'street_number' => 2,
]
]),
'even_street_number_2' => $this->individualCreate([
'api.Address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'street_number' => 4,
]
]),
'no_street_number' => $this->individualCreate(),
];

$input = [
'fields' => [
'address_street_number',
'address_odd_street_number',
],
];
$obj = $this->getReportObject('CRM_Report_Form_Contact_Summary', $input);

$expectedCases = [
// CASE A: Sorting by odd street number in desc order + street number in desc order
[
'order_bys' => [
[
'column' => 'address_odd_street_number',
'order' => 'DESC',
],
[
'column' => 'address_street_number',
'order' => 'DESC',
],
],
'expected_contact_ids' => [
$contactIDs['odd_street_number_2'],
$contactIDs['odd_street_number_1'],
$contactIDs['even_street_number_2'],
$contactIDs['even_street_number_1'],
$contactIDs['no_street_number'],
],
'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number DESC',
],
// CASE B: Sorting by odd street number in asc order + street number in desc order
[
'order_bys' => [
[
'column' => 'address_odd_street_number',
'order' => 'ASC',
],
[
'column' => 'address_street_number',
'order' => 'DESC',
],
],
'expected_contact_ids' => [
$contactIDs['no_street_number'],
$contactIDs['even_street_number_2'],
$contactIDs['even_street_number_1'],
$contactIDs['odd_street_number_2'],
$contactIDs['odd_street_number_1'],
],
'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number DESC',
],
// CASE C: Sorting by odd street number in desc order + street number in asc order
[
'order_bys' => [
[
'column' => 'address_odd_street_number',
'order' => 'DESC',
],
[
'column' => 'address_street_number',
'order' => 'ASC',
],
],
'expected_contact_ids' => [
$contactIDs['odd_street_number_1'],
$contactIDs['odd_street_number_2'],
$contactIDs['even_street_number_1'],
$contactIDs['even_street_number_2'],
$contactIDs['no_street_number'],
],
'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) DESC, address_civireport.street_number ASC',
],
// CASE A: Sorting by odd street number in asc order + street number in asc order
[
'order_bys' => [
[
'column' => 'address_odd_street_number',
'order' => 'ASC',
],
[
'column' => 'address_street_number',
'order' => 'ASC',
],
],
'expected_contact_ids' => [
$contactIDs['no_street_number'],
$contactIDs['even_street_number_1'],
$contactIDs['even_street_number_2'],
$contactIDs['odd_street_number_1'],
$contactIDs['odd_street_number_2'],
],
'expected_orderby_clause' => 'ORDER BY (address_civireport.street_number % 2) ASC, address_civireport.street_number ASC',
],
];

foreach ($expectedCases as $case) {
$obj->setParams(array_merge($obj->getParams(), ['order_bys' => $case['order_bys']]));
$sql = $obj->buildQuery();
$rows = CRM_Core_DAO::executeQuery($sql)->fetchAll();

// check the order of contact IDs
$this->assertEquals($case['expected_contact_ids'], CRM_Utils_Array::collect('civicrm_contact_id', $rows));
// check the order clause
$this->assertEquals(TRUE, !empty(strstr($sql, $case['expected_orderby_clause'])));
}
}

}

0 comments on commit 8fc3324

Please sign in to comment.