CRM-12642 add time to membership receive_date fields, move date_time handling to...
authoreileen <eileen@fuzion.co.nz>
Mon, 20 May 2013 23:49:33 +0000 (11:49 +1200)
committereileen <eileen@fuzion.co.nz>
Mon, 20 May 2013 23:49:33 +0000 (11:49 +1200)
CRM/Core/Form.php
CRM/Member/Form/Membership.php
CRM/Member/Form/MembershipRenewal.php

index 649c3464a25aacde8afc072a790efa7e56937da4..13ade1734f9082851d46f9aeb2ea1ce4ba751f45 100644 (file)
@@ -76,6 +76,21 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    */
   protected $_renderer;
 
+  /**
+   * An array to hold a list of datefields on the form
+   * so that they can be converted to ISO in a consistent manner
+   *
+   * @var array
+   *
+   * e.g on a form declare $_dateFields = array(
+   *  'receive_date' => array('default' => 'now'),
+   *  );
+   *  then in postProcess call $this->convertDateFieldsToMySQL($formValues)
+   *  to have the time field re-incorporated into the field & 'now' set if
+   *  no value has been passed in
+   */
+  protected $_dateFields = array();
+
   /**
    * cache the smarty template for efficiency reasons
    *
@@ -1218,6 +1233,34 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     $this->setDefaults(array($name => $defaultCurrency));
   }
 
+  /**
+   * Convert all date fields within the params to mysql date ready for the
+   * BAO layer. In this case fields are checked against the $_datefields defined for the form
+   * and if time is defined it is incorporated
+   *
+   * @param array $params input params from the form
+   *
+   * @todo it would probably be better to work on $this->_params than a passed array
+   * @todo standardise the format which dates are passed to the BAO layer in & remove date
+   * handling from BAO
+   */
+  function convertDateFieldsToMySQL(&$params){
+    foreach ($this->_dateFields as $fieldName => $specs){
+      if(!empty($params[$fieldName])){
+        $params[$fieldName] = CRM_Utils_Date::isoToMysql(
+          CRM_Utils_Date::processDate(
+          $params[$fieldName],
+          CRM_Utils_Array::value("{$fieldName}_time", $params), TRUE)
+        );
+      }
+      else{
+        if(isset($specs['default'])){
+          $params[$fieldName] = date('YmdHis', strtotime($specs['default']));
+        }
+      }
+    }
+  }
+
   function removeFileRequiredRules($elementName) {
     $this->_required = array_diff($this->_required, array($elementName));
     if (isset($this->_rules[$elementName])) {
index a66dcdfb85c5902d04979f0aa3f5defa595a1818..182b16f9a77e3a45a3e19353af010cae4109079f 100644 (file)
@@ -92,6 +92,16 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
    */
   protected $_membershipIDs = array( );
 
+  /**
+   * An array to hold a list of datefields on the form
+   * so that they can be converted to ISO in a consistent manner
+   *
+   * @var array
+   */
+  protected $_dateFields = array(
+    'receive_date' => array('default' => 'now'),
+  );
+
   public function preProcess() {
     //custom data related code
     $this->_cdType = CRM_Utils_Array::value('type', $_GET);
@@ -235,7 +245,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $resources->addScriptFile('civicrm', 'templates/CRM/Member/Form/Membership.js');
         }
       }
-      else { 
+      else {
         $resources = CRM_Core_Resources::singleton();
         $resources->addScriptFile('civicrm', 'templates/CRM/Member/Form/MembershipStandalone.js');
         $statuses = array();
@@ -719,7 +729,7 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
       $this->add('text', 'total_amount', ts('Amount'));
       $this->addRule('total_amount', ts('Please enter a valid amount.'), 'money');
 
-      $this->addDate('receive_date', ts('Received'), FALSE, array('formatType' => 'activityDate'));
+      $this->addDate('receive_date', ts('Received'), FALSE, array('formatType' => 'activityDateTime'));
 
       $this->add('select', 'payment_instrument_id',
         ts('Paid By'),
@@ -1063,6 +1073,7 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
     $config = CRM_Core_Config::singleton();
     // get the submitted form values.
     $this->_params = $formValues = $this->controller->exportValues($this->_name);
+    $this->convertDateFieldsToMySQL($formValues);
 
     $params = $ids = array();
 
@@ -1168,12 +1179,6 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
       $$dateVariable = CRM_Utils_Date::processDate($formValues[$dateField]);
     }
 
-    $dates = array(
-      'join_date',
-      'start_date',
-      'end_date',
-    );
-
     $num_terms = CRM_Utils_Array::value('num_terms', $formValues, 1);
 
     $calcDates = array();
@@ -1185,7 +1190,7 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
     }
 
     foreach ($calcDates as $memType => $calcDate) {
-      foreach ($dates as $d) {
+      foreach (array_keys($dateTypes) as $d) {
         //first give priority to form values then calDates.
         $date = CRM_Utils_Array::value($d, $formValues);
         if (!$date) {
@@ -1276,11 +1281,8 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
         $this->assign('is_pay_later', 1);
       }
 
-      if (CRM_Utils_Array::value('receive_date', $params)) {
-        $formValues['receive_date'] = $params['receive_date'] = CRM_Utils_Date::processDate($params['receive_date']);
-      }
       if (CRM_Utils_Array::value('send_receipt', $formValues)) {
-        $params['receipt_date'] = CRM_Utils_Array::value('receive_date', $params);
+        $params['receipt_date'] = CRM_Utils_Array::value('receive_date', $formValues);
       }
 
       //insert financial type name in receipt.
index b9fada68d281dea640e7ecb302fa903366c3d0e1..9296109560913a4345c92526a9022c04ff34f3a7 100644 (file)
@@ -72,6 +72,16 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
    */
   protected $_context;
 
+  /**
+   * An array to hold a list of datefields on the form
+   * so that they can be converted to ISO in a consistent manner
+   *
+   * @var array
+   */
+  protected $_dateFields = array(
+    'receive_date' => array('default' => 'now'),
+  );
+
   public function preProcess() {
     //custom data related code
     $this->_cdType = CRM_Utils_Array::value('type', $_GET);
@@ -436,7 +446,7 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
       $this->add('text', 'total_amount', ts('Amount'));
       $this->addRule('total_amount', ts('Please enter a valid amount.'), 'money');
 
-      $this->addDate('receive_date', ts('Received'), FALSE, array('formatType' => 'activityDate'));
+      $this->addDate('receive_date', ts('Received'), FALSE, array('formatType' => 'activityDateTime'));
 
       $this->add('text', 'num_terms', ts('Extend Membership by'), array('onchange' => "setPaymentBlock();"), TRUE);
       $this->addRule('num_terms', ts('Please enter a whole number for how many periods to renew.'), 'integer');
@@ -563,12 +573,7 @@ WHERE   id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )';
     }
 
     $now = CRM_Utils_Date::getToday( null, 'YmdHis');
-    if (CRM_Utils_Array::value('receive_date', $this->_params)) {
-      $formValues['receive_date'] = CRM_Utils_Date::processDate($this->_params['receive_date']);
-    }
-    else {
-      $formValues['receive_date'] = $now;
-    }
+    $this->convertDateFieldsToMySQL($formValues);
     $this->assign('receive_date', $formValues['receive_date']);
 
     if (CRM_Utils_Array::value('send_receipt', $this->_params)) {