Merge pull request #15177 from seamuslee001/member_fields_datepicker_conversion
[civicrm-core.git] / CRM / Member / BAO / Query.php
index 23a3e5d050738f109b61f4fc2d52a48498065e13..d8e0d9b9ea4211ed61f45c617cd84af0a0e5dfd3 100644 (file)
@@ -67,9 +67,9 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
       }
 
       //add join date
-      if (!empty($query->_returnProperties['join_date'])) {
-        $query->_select['join_date'] = "civicrm_membership.join_date as join_date";
-        $query->_element['join_date'] = 1;
+      if (!empty($query->_returnProperties['membership_join_date'])) {
+        $query->_select['membership_join_date'] = "civicrm_membership.join_date as membership_join_date";
+        $query->_element['membership_join_date'] = 1;
       }
 
       //add source
@@ -146,7 +146,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         continue;
       }
       if (substr($query->_params[$id][0], 0, 7) == 'member_' || substr($query->_params[$id][0], 0, 11) == 'membership_') {
-        if ($query->_mode == CRM_Contact_BAO_QUERY::MODE_CONTACTS) {
+        if ($query->_mode == CRM_Contact_BAO_Query::MODE_CONTACTS) {
           $query->_useDistinct = TRUE;
         }
         self::whereClauseSingle($query->_params[$id], $query);
@@ -161,12 +161,22 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
    * @param CRM_Contact_BAO_Query $query
    */
   public static function whereClauseSingle(&$values, &$query) {
+    if ($query->buildDateRangeQuery($values)) {
+      // @todo - move this to Contact_Query in or near the call to
+      // $this->buildRelativeDateQuery($values);
+      return;
+    }
     list($name, $op, $value, $grouping) = $values;
     switch ($name) {
       case 'member_join_date_low':
       case 'member_join_date_high':
+        Civi::log()->warning(
+          'member_join_date field is deprecated please use membership_join_date field instead',
+          ['civi.tag' => 'deprecated']
+        );
+        $fldName = str_replace(['_low', '_high'], '', $name);
         $query->dateQueryBuilder($values,
-          'civicrm_membership', 'member_join_date', 'join_date',
+          'civicrm_membership', $fldName, 'join_date',
           'Member Since'
         );
         return;
@@ -174,7 +184,11 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
       case 'membership_start_date':
       case 'member_start_date_low':
       case 'member_start_date_high':
-        $fldName = str_replace(array('_low', '_high'), '', $name);
+        Civi::log()->warning(
+          'member_start_date field is deprecated please use membership_start_date field instead',
+          ['civi.tag' => 'deprecated']
+        );
+        $fldName = str_replace(['_low', '_high'], '', $name);
         $query->dateQueryBuilder($values,
           'civicrm_membership', $fldName, 'start_date',
           'Start Date'
@@ -184,7 +198,11 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
       case 'membership_end_date':
       case 'member_end_date_low':
       case 'member_end_date_high':
-        $fldName = str_replace(array('_low', '_high'), '', $name);
+        Civi::log()->warning(
+          'member_end_date field is deprecated please use membership_end_date field instead',
+          ['civi.tag' => 'deprecated']
+        );
+        $fldName = str_replace(['_low', '_high'], '', $name);
         $query->dateQueryBuilder($values,
           'civicrm_membership', $fldName, 'end_date',
           'End Date'
@@ -197,7 +215,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         if ($date) {
           $query->_where[$grouping][] = "civicrm_membership.join_date {$op} {$date}";
           $format = CRM_Utils_Date::customFormat(CRM_Utils_Date::format(array_reverse($value), '-'));
-          $query->_qill[$grouping][] = ts('Member Since %2 %1', array(1 => $format, 2 => $op));
+          $query->_qill[$grouping][] = ts('Member Since %2 %1', [1 => $format, 2 => $op]);
         }
 
         return;
@@ -208,7 +226,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         $value = $strtolower(CRM_Core_DAO::escapeString(trim($value)));
 
         $query->_where[$grouping][] = "civicrm_membership.source $op '{$value}'";
-        $query->_qill[$grouping][] = ts('Source %2 %1', array(1 => $value, 2 => $op));
+        $query->_qill[$grouping][] = ts('Source %2 %1', [1 => $value, 2 => $op]);
         $query->_tables['civicrm_membership'] = $query->_whereTables['civicrm_membership'] = 1;
         return;
 
@@ -230,10 +248,11 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         // the load function. The where clause and the whereTables are saved so they should suffice to generate the query
         // to get a contact list. But, better to deal with in 4.8 now...
         if (is_string($value) && strpos($value, ',') && $op == '=') {
-          $value = array('IN' => explode(',', $value));
+          $value = ['IN' => explode(',', $value)];
         }
       case 'membership_id':
-      case 'member_id': // CRM-18523 Updated to membership_id but kept member_id case for backwards compatibility
+        // CRM-18523 Updated to membership_id but kept member_id case for backwards compatibility
+      case 'member_id':
       case 'member_campaign_id':
 
         if (strpos($name, 'status') !== FALSE) {
@@ -282,7 +301,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
 
       case 'member_auto_renew':
         $op = '=';
-        $where = $qill = array();
+        $where = $qill = [];
         foreach ($value as $val) {
           if ($val == 1) {
             $where[] = ' civicrm_membership.contribution_recur_id IS NULL';
@@ -375,6 +394,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         $query->_qill[$grouping][] = $value ? ts("Membership Status Is Overriden") : ts("Membership Status Is NOT Overriden");
         $query->_tables['civicrm_membership'] = $query->_whereTables['civicrm_membership'] = 1;
         return;
+
     }
   }
 
@@ -434,7 +454,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
   ) {
     $properties = NULL;
     if ($mode & CRM_Contact_BAO_Query::MODE_MEMBER) {
-      $properties = array(
+      $properties = [
         'contact_type' => 1,
         'contact_sub_type' => 1,
         'sort_name' => 1,
@@ -442,7 +462,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         'membership_type' => 1,
         'member_is_test' => 1,
         'member_is_pay_later' => 1,
-        'join_date' => 1,
+        'membership_join_date' => 1,
         'membership_start_date' => 1,
         'membership_end_date' => 1,
         'membership_source' => 1,
@@ -453,8 +473,7 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
         'membership_recur_id' => 1,
         'member_campaign_id' => 1,
         'member_is_override' => 1,
-        'member_auto_renew' => 1,
-      );
+      ];
 
       if ($includeCustomFields) {
         // also get all the custom membership properties
@@ -470,39 +489,45 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
     return $properties;
   }
 
+  /**
+   * Get the metadata for fields to be included on the grant search form.
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  public static function getSearchFieldMetadata() {
+    $fields = [
+      'membership_join_date',
+      'membership_start_date',
+      'membership_end_date',
+    ];
+    $metadata = civicrm_api3('Membership', 'getfields', [])['values'];
+    return array_intersect_key($metadata, array_flip($fields));
+  }
+
   /**
    * Build the search form.
    *
    * @param CRM_Core_Form $form
    */
   public static function buildSearchForm(&$form) {
+    $form->addSearchFieldMetadata(['Membership' => self::getSearchFieldMetadata()]);
+    $form->addFormFieldsFromMetadata();
     $membershipStatus = CRM_Member_PseudoConstant::membershipStatus(NULL, NULL, 'label', FALSE, FALSE);
-    $form->add('select', 'membership_status_id', ts('Membership Status'), $membershipStatus, FALSE, array(
+    $form->add('select', 'membership_status_id', ts('Membership Status'), $membershipStatus, FALSE, [
       'id' => 'membership_status_id',
       'multiple' => 'multiple',
       'class' => 'crm-select2',
-    ));
+    ]);
 
-    $form->addEntityRef('membership_type_id', ts('Membership Type'), array(
+    $form->addEntityRef('membership_type_id', ts('Membership Type'), [
       'entity' => 'MembershipType',
       'multiple' => TRUE,
       'placeholder' => ts('- any -'),
-      'select' => array('minimumInputLength' => 0),
-    ));
+      'select' => ['minimumInputLength' => 0],
+    ]);
 
     $form->addElement('text', 'member_source', ts('Source'));
-    $form->add('number', 'membership_id', ts('Membership ID'), array('class' => 'four', 'min' => 1));
-
-    CRM_Core_Form_Date::buildDateRange($form, 'member_join_date', 1, '_low', '_high', ts('From'), FALSE);
-    $form->addElement('hidden', 'member_join_date_range_error');
-
-    CRM_Core_Form_Date::buildDateRange($form, 'member_start_date', 1, '_low', '_high', ts('From'), FALSE);
-    $form->addElement('hidden', 'member_start_date_range_error');
-
-    CRM_Core_Form_Date::buildDateRange($form, 'member_end_date', 1, '_low', '_high', ts('From'), FALSE);
-    $form->addElement('hidden', 'member_end_date_range_error');
-
-    $form->addFormRule(array('CRM_Member_BAO_Query', 'formRule'), $form);
+    $form->add('number', 'membership_id', ts('Membership ID'), ['class' => 'four', 'min' => 1]);
 
     $form->addYesNo('membership_is_current_member', ts('Current Member?'), TRUE);
     $form->addYesNo('member_is_primary', ts('Primary Member?'), TRUE);
@@ -510,26 +535,26 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
 
     $form->add('select', 'member_auto_renew',
       ts('Auto-Renew Subscription Status?'),
-      array(
+      [
         '1' => ts('- None -'),
         '2' => ts('In Progress'),
         '3' => ts('Failed'),
         '4' => ts('Cancelled'),
         '5' => ts('Ended'),
         '6' => ts('Any'),
-      ),
-      FALSE, array('class' => 'crm-select2', 'multiple' => 'multiple', 'placeholder' => ts('- any -'))
+      ],
+      FALSE, ['class' => 'crm-select2', 'multiple' => 'multiple', 'placeholder' => ts('- any -')]
     );
 
     $form->addYesNo('member_test', ts('Membership is a Test?'), TRUE);
     $form->addYesNo('member_is_override', ts('Membership Status Is Overriden?'), TRUE);
 
-    self::addCustomFormFields($form, array('Membership'));
+    self::addCustomFormFields($form, ['Membership']);
 
     CRM_Campaign_BAO_Campaign::addCampaignInComponentSearch($form, 'member_campaign_id');
 
     $form->assign('validCiviMember', TRUE);
-    $form->setDefaults(array('member_test' => 0));
+    $form->setDefaults(['member_test' => 0]);
   }
 
   /**
@@ -539,31 +564,8 @@ class CRM_Member_BAO_Query extends CRM_Core_BAO_Query {
    */
   public static function tableNames(&$tables) {
     if (!empty($tables['civicrm_membership_log']) || !empty($tables['civicrm_membership_status']) || CRM_Utils_Array::value('civicrm_membership_type', $tables)) {
-      $tables = array_merge(array('civicrm_membership' => 1), $tables);
-    }
-  }
-
-  /**
-   * Custom form rules.
-   *
-   * @param array $fields
-   * @param array $files
-   * @param CRM_Core_Form $form
-   *
-   * @return bool|array
-   */
-  public static function formRule($fields, $files, $form) {
-    $errors = array();
-
-    if ((empty($fields['member_join_date_low']) || empty($fields['member_join_date_high'])) && (empty($fields['member_start_date_low']) || empty($fields['member_start_date_high'])) && (empty($fields['member_end_date_low']) || empty($fields['member_end_date_high']))) {
-      return TRUE;
+      $tables = array_merge(['civicrm_membership' => 1], $tables);
     }
-
-    CRM_Utils_Rule::validDateRange($fields, 'member_join_date', $errors, ts('Member Since'));
-    CRM_Utils_Rule::validDateRange($fields, 'member_start_date', $errors, ts('Start Date'));
-    CRM_Utils_Rule::validDateRange($fields, 'member_end_date', $errors, ts('End Date'));
-
-    return empty($errors) ? TRUE : $errors;
   }
 
 }