dev/core#1602 Fix join date filtering in search builder by standardising date field...
authorSeamus Lee <seamuslee001@gmail.com>
Mon, 17 Feb 2020 23:00:46 +0000 (10:00 +1100)
committerSeamus Lee <seamuslee001@gmail.com>
Mon, 17 Feb 2020 23:59:25 +0000 (10:59 +1100)
CRM/Member/BAO/Query.php
tests/phpunit/CRM/Member/BAO/QueryTest.php

index e90dfc84b069cadf5d01397f78dcae79078b0cae..a8908e0553a7696fc1b7de1ace08f86be679dc54 100644 (file)
@@ -153,6 +153,32 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
     list($name, $op, $value, $grouping) = $values;
     $fields = self::getFields();
 
+    $quoteValue = NULL;
+
+    if (!empty($value) && !is_array($value)) {
+      $quoteValue = "\"$value\"";
+    }
+
+    $fieldAliases = self::getLegacySupportedFields();
+
+    $fieldName = $name = self::getFieldName($values);
+    $qillName = $name;
+    if (in_array($name, $fieldAliases)) {
+      $qillName = array_search($name, $fieldAliases);
+    }
+    $pseudoExtraParam = [];
+    $fieldSpec = CRM_Utils_Array::value($fieldName, $fields, []);
+    $tableName = CRM_Utils_Array::value('table_name', $fieldSpec, 'civicrm_membership');
+    $dataType = CRM_Utils_Type::typeToString(CRM_Utils_Array::value('type', $fieldSpec));
+    if ($dataType === 'Timestamp' || $dataType === 'Date') {
+      $title = empty($fieldSpec['unique_title']) ? $fieldSpec['title'] : $fieldSpec['unique_title'];
+      $query->_tables['civicrm_membership'] = $query->_whereTables['civicrm_membership'] = 1;
+      $query->dateQueryBuilder($values,
+        $tableName, $fieldName, $fieldSpec['name'], $title
+      );
+      return;
+    }
+
     switch ($name) {
       case 'member_join_date_low':
       case 'member_join_date_high':
@@ -167,7 +193,6 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         );
         return;
 
-      case 'membership_start_date':
       case 'member_start_date_low':
       case 'member_start_date_high':
         Civi::log()->warning(
@@ -181,7 +206,6 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         );
         return;
 
-      case 'membership_end_date':
       case 'member_end_date_low':
       case 'member_end_date_high':
         Civi::log()->warning(
index 0d1df9c75f480117c0bb4e1672a494692b19d42c..98a563abf3a0e42cf467061bdc203d281db00c83 100644 (file)
@@ -80,4 +80,47 @@ class CRM_Member_BAO_QueryTest extends CiviUnitTestCase {
     $this->assertEquals(['civicrm_membership.membership_type_id IN ("1", "2")'], $obj->_where[0]);
   }
 
+  /**
+   * Membership Date fields
+   * @return array
+   */
+  public function membershipDateFields() {
+    $fields = [];
+    $fields[] = ['membership_join_date'];
+    $fields[] = ['membership_start_date'];
+    $fields[] = ['membership_end_date'];
+    return $fields;
+  }
+
+  /**
+   * Test generating a correct where clause for date fields as generated by search builder
+   * @dataProvider membershipDateFields
+   */
+  public function testMembershipDateWhereSearchBuilder($dateField) {
+    $dbDateField = str_replace('membership_', '', $dateField);
+    $formValues = [
+      'mapper' => [
+        1 => [['Membership', $dateField], [''], [''], [''], ['']],
+        2 => [[''], [''], [''], [''], ['']],
+        3 => [[''], [''], [''], [''], ['']],
+      ],
+      'operator' => [
+        1 => ['<=', '', '', '', ''],
+        2 => ['', '', '', '', ''],
+        3 => ['', '', '', '', ''],
+      ],
+      'value' => [
+        1 => ['20200201', '', '', '', ''],
+        2 => ['', '', '', '', '', ''],
+        3 => ['', '', '', '', '', ''],
+      ],
+      'radio_ts' => '',
+    ];
+    $searchBuilderForm = new CRM_Contact_Form_Search_Builder();
+    $params = [[$dateField, "<=", "20200201", 1, 0]];
+    $this->assertEquals($params, $searchBuilderForm->convertFormValues($formValues));
+    $obj = new CRM_Contact_BAO_Query($params);
+    $this->assertEquals(['civicrm_membership.' . $dbDateField . ' <= \'20200201000000\''], $obj->_where[1]);
+  }
+
 }