From 8fc332411d98163d5f5b0f8b17e7a01fe3b5da21 Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Thu, 5 Jul 2018 12:32:33 +0530 Subject: [PATCH] dev/core#176 Odd / Even street number filter missing from Reports --- CRM/Report/Form.php | 19 ++ CRM/Report/Form/Walklist/Walklist.php | 51 +---- .../CRM/Report/Form/ContactSummaryTest.php | 199 ++++++++++++++++++ 3 files changed, 219 insertions(+), 50 deletions(-) create mode 100644 tests/phpunit/CRM/Report/Form/ContactSummaryTest.php diff --git a/CRM/Report/Form.php b/CRM/Report/Form.php index 3d1ebc3456..d48fe6dac5 100644 --- a/CRM/Report/Form.php +++ b/CRM/Report/Form.php @@ -1068,6 +1068,15 @@ class CRM_Report_Form extends CRM_Core_Form { $this->_params = $params; } + /** + * Getter for $_params. + * + * @return void|array $params + */ + public function getParams() { + return $this->_params; + } + /** * Setter for $_id. * @@ -5481,6 +5490,16 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a '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'), diff --git a/CRM/Report/Form/Walklist/Walklist.php b/CRM/Report/Form/Walklist/Walklist.php index 0464411277..5727e3b5ec 100644 --- a/CRM/Report/Form/Walklist/Walklist.php +++ b/CRM/Report/Form/Walklist/Walklist.php @@ -76,55 +76,6 @@ class CRM_Report_Form_Walklist_Walklist extends CRM_Report_Form { ), ), ), - '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)), @@ -135,7 +86,7 @@ class CRM_Report_Form_Walklist_Walklist extends CRM_Report_Form { 'fields' => array('phone' => NULL), 'grouping' => 'location-fields', ), - ); + ) + $this->getAddressColumns(array('group_bys' => FALSE)); parent::__construct(); } diff --git a/tests/phpunit/CRM/Report/Form/ContactSummaryTest.php b/tests/phpunit/CRM/Report/Form/ContactSummaryTest.php new file mode 100644 index 0000000000..d129f6382f --- /dev/null +++ b/tests/phpunit/CRM/Report/Form/ContactSummaryTest.php @@ -0,0 +1,199 @@ +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']))); + } + } + +} -- 2.25.1