Skip to content

Commit

Permalink
Merge pull request #11737 from aydun/CRM-21816-relative-dates-in-search
Browse files Browse the repository at this point in the history
CRM-21816 Fix Relative dates in search bug
  • Loading branch information
eileenmcnaughton authored May 21, 2018
2 parents 42c4823 + 7c75781 commit 7f874ed
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 37 deletions.
75 changes: 38 additions & 37 deletions CRM/Contact/BAO/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -1563,11 +1563,43 @@ public static function convertFormValues(&$formValues, $wildcard = 0, $useEquals

self::filterCountryFromValuesIfStateExists($formValues);

foreach ($formValues as $id => &$val) {
// CRM-19374 - we don't want to change $val in $formValues.
// Assign it to a temp variable which operates while iteration.
$values = $val;
// Handle relative dates first
foreach (array_keys($formValues) as $id) {
if (preg_match('/_date_relative$/', $id) ||
$id == 'event_relative' ||
$id == 'case_from_relative' ||
$id == 'case_to_relative' ||
$id == 'participant_relative'
) {
if ($id == 'event_relative') {
$fromRange = 'event_start_date_low';
$toRange = 'event_end_date_high';
}
elseif ($id == 'participant_relative') {
$fromRange = 'participant_register_date_low';
$toRange = 'participant_register_date_high';
}
elseif ($id == 'case_from_relative') {
$fromRange = 'case_from_start_date_low';
$toRange = 'case_from_start_date_high';
}
elseif ($id == 'case_to_relative') {
$fromRange = 'case_to_end_date_low';
$toRange = 'case_to_end_date_high';
}
else {
$dateComponent = explode('_date_relative', $id);
$fromRange = "{$dateComponent[0]}_date_low";
$toRange = "{$dateComponent[0]}_date_high";
}

if (array_key_exists($fromRange, $formValues) && array_key_exists($toRange, $formValues)) {
CRM_Contact_BAO_Query::fixDateValues($formValues[$id], $formValues[$fromRange], $formValues[$toRange]);
}
}
}

foreach ($formValues as $id => $values) {
if (self::isAlreadyProcessedForQueryFormat($values)) {
$params[] = $values;
continue;
Expand Down Expand Up @@ -1622,39 +1654,8 @@ public static function convertFormValues(&$formValues, $wildcard = 0, $useEquals
$id == 'case_to_relative' ||
$id == 'participant_relative'
) {
if ($id == 'event_relative') {
$fromRange = 'event_start_date_low';
$toRange = 'event_end_date_high';
}
elseif ($id == 'participant_relative') {
$fromRange = 'participant_register_date_low';
$toRange = 'participant_register_date_high';
}
elseif ($id == 'case_from_relative') {
$fromRange = 'case_from_start_date_low';
$toRange = 'case_from_start_date_high';
}
elseif ($id == 'case_to_relative') {
$fromRange = 'case_to_end_date_low';
$toRange = 'case_to_end_date_high';
}
else {
$dateComponent = explode('_date_relative', $id);
$fromRange = "{$dateComponent[0]}_date_low";
$toRange = "{$dateComponent[0]}_date_high";
}

if (array_key_exists($fromRange, $formValues) && array_key_exists($toRange, $formValues)) {
// relative dates are not processed correctly as lower date value were ignored,
// to ensure both high and low date value got added IF there is relative date,
// we need to reset $formValues by unset and then adding again via CRM_Contact_BAO_Query::fixDateValues(...)
if (!empty($formValues[$id])) {
unset($formValues[$fromRange]);
unset($formValues[$toRange]);
}
CRM_Contact_BAO_Query::fixDateValues($formValues[$id], $formValues[$fromRange], $formValues[$toRange]);
continue;
}
// Already handled in previous loop
continue;
}
elseif (in_array($id, $entityReferenceFields) && !empty($values) && is_string($values) && (strpos($values, ',') !=
FALSE)) {
Expand Down
38 changes: 38 additions & 0 deletions tests/phpunit/CRM/Contact/BAO/QueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -531,4 +531,42 @@ public function testGetSummaryQueryWithFinancialACLEnabled() {
$this->disableFinancialACLs();
}

/**
* When we have a relative date in search criteria, check that convertFormValues() sets _low & _high date fields and returns other criteria.
* CRM-21816 fix relative dates in search bug
*/
public function testConvertFormValuesCRM21816() {
$fv = array(
"member_end_date_relative" => "starting_2.month", // next 60 days
"member_end_date_low" => "20180101000000",
"member_end_date_high" => "20180331235959",
"membership_is_current_member" => "1",
"member_is_primary" => "1",
);
$fv_orig = $fv; // $fv is modified by convertFormValues()
$params = CRM_Contact_BAO_Query::convertFormValues($fv);

// restructure for easier testing
$modparams = array();
foreach ($params as $p) {
$modparams[$p[0]] = $p;
}

// Check member_end_date_low is in params
$this->assertTrue(is_array($modparams['member_end_date_low']));
// ... fv and params should match
$this->assertEquals($modparams['member_end_date_low'][2], $fv['member_end_date_low']);
// ... fv & fv_orig should be different
$this->assertNotEquals($fv['member_end_date_low'], $fv_orig['member_end_date_low']);

// same for member_end_date_high
$this->assertTrue(is_array($modparams['member_end_date_high']));
$this->assertEquals($modparams['member_end_date_high'][2], $fv['member_end_date_high']);
$this->assertNotEquals($fv['member_end_date_high'], $fv_orig['member_end_date_high']);

// Check other fv values are in params
$this->assertEquals($modparams['membership_is_current_member'][2], $fv_orig['membership_is_current_member']);
$this->assertEquals($modparams['member_is_primary'][2], $fv_orig['member_is_primary']);
}

}

0 comments on commit 7f874ed

Please sign in to comment.