CRM-20936: Hide statuses on backoffice contribution form
authordeb.monish <monish.deb@jmaconsulting.biz>
Fri, 21 Jul 2017 12:00:16 +0000 (17:30 +0530)
committerdeb.monish <monish.deb@jmaconsulting.biz>
Wed, 23 Aug 2017 11:51:43 +0000 (17:21 +0530)
CRM/Contribute/BAO/Contribution/Utils.php
CRM/Contribute/Form/Contribution.php
CRM/Event/Form/EventFees.php
CRM/Member/Form/Membership.php
CRM/Member/Form/MembershipRenewal.php

index 6633d2fe43b64586a5c590091cfaf90111813280..79446af9d8cf747504fb0b4af682eae116df2d2e 100644 (file)
@@ -497,4 +497,111 @@ LIMIT 1
     return number_format((float) round($amount, (int) $decimals), (int) $decimals, '.', '');
   }
 
+  /**
+   * Get contribution statuses by entity e.g. contribution, membership or 'participant'
+   *
+   * @param string $usedFor
+   * @param int $id
+   *   Contribution ID
+   *
+   * @return array
+   *   Array of contribution statuses in array('status id' => 'label') format
+   */
+  public static function getContributionStatuses($usedFor = 'contribution', $id = NULL) {
+    if ($usedFor == 'pledge') {
+      $statusNames = CRM_Core_OptionGroup::values('pledge_status', FALSE, FALSE, FALSE, NULL, 'name');
+    }
+    else {
+      $statusNames = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
+    }
+
+    $statusNamesToUnset = array();
+
+    // on create fetch statuses on basis of component
+    if (!$id) {
+      $statusNamesToUnset = array(
+        'Refunded',
+        'Chargeback',
+        'Pending refund',
+      );
+      // Event registration and New Membership backoffice form support partially paid payment,
+      //  so exclude this status only for 'New Contribution' form
+      if ($usedFor == 'contribution') {
+        $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+          'In Progress',
+          'Overdue',
+          'Partially paid',
+        ));
+      }
+      elseif ($usedFor == 'participant') {
+        $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+          'Cancelled',
+          'Failed',
+        ));
+      }
+    }
+    else {
+      $contributionStatus = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $id, 'contribution_status_id');
+      $name = CRM_Utils_Array::value($contributionStatus, $statusNames);
+      switch ($name) {
+        case 'Completed':
+          // [CRM-17498] Removing unsupported status change options.
+          $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+            'Pending',
+            'Failed',
+            'Partially paid',
+            'Pending refund',
+          ));
+          break;
+
+        case 'Cancelled':
+        case 'Chargeback':
+        case 'Refunded':
+          $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+            'Pending',
+            'Failed',
+          ));
+          break;
+
+        case 'Pending':
+        case 'In Progress':
+          $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+            'Refunded',
+            'Chargeback',
+          ));
+          break;
+
+        case 'Failed':
+          $statusNamesToUnset = array_merge($statusNamesToUnset, array(
+            'Pending',
+            'Refunded',
+            'Chargeback',
+            'Completed',
+            'In Progress',
+            'Cancelled',
+          ));
+          break;
+      }
+    }
+
+    foreach ($statusNamesToUnset as $name) {
+      unset($statusNames[CRM_Utils_Array::key($name, $statusNames)]);
+    }
+
+    // based on filtered statuse names fetch the final list of statuses in array('id' => 'label') format
+    if ($usedFor == 'pledge') {
+      $statuses = CRM_Core_OptionGroup::values('pledge_status');
+    }
+    else {
+      $statuses = CRM_Contribute_PseudoConstant::contributionStatus();
+    }
+    foreach ($statuses as $statusID => $label) {
+      if (!array_key_exists($statusID, $statusNames)) {
+        unset($statuses[$statusID]);
+      }
+    }
+
+    return $statuses;
+  }
+
 }
index 247f64b61b744b1ee9782609ff22148c0235f787..8de90098d1c781d30884d6973baecae2e44c8e14 100644 (file)
@@ -651,92 +651,32 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
     $this->add('select', 'from_email_address', ts('Receipt From'), $this->_fromEmails);
 
-    $status = CRM_Contribute_PseudoConstant::contributionStatus();
-
-    // suppressing contribution statuses that are NOT relevant to pledges (CRM-5169)
-    $statusName = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
-    if ($this->_ppID) {
-      foreach (array(
-                 'Cancelled',
-                 'Failed',
-                 'In Progress',
-               ) as $suppress) {
-        unset($status[CRM_Utils_Array::key($suppress, $statusName)]);
-      }
-    }
-    elseif ((!$this->_ppID && $this->_id) || !$this->_id) {
-      $suppressFlag = FALSE;
-      if ($this->_id) {
-        $componentDetails = CRM_Contribute_BAO_Contribution::getComponentDetails($this->_id);
-        if (CRM_Utils_Array::value('membership', $componentDetails) || CRM_Utils_Array::value('participant', $componentDetails)) {
-          $suppressFlag = TRUE;
-        }
+    $isUpdate = FALSE;
+    $component = 'contribution';
+    if ($this->_id) {
+      $isUpdate = TRUE;
+      $componentDetails = CRM_Contribute_BAO_Contribution::getComponentDetails($this->_id);
+      if (CRM_Utils_Array::value('membership', $componentDetails)) {
+        $component = 'membership';
       }
-      if (!$suppressFlag) {
-        foreach (array(
-                   'Overdue',
-                   'In Progress',
-                 ) as $suppress) {
-          unset($status[CRM_Utils_Array::key($suppress, $statusName)]);
-        }
-      }
-      else {
-        unset($status[CRM_Utils_Array::key('Overdue', $statusName)]);
+      elseif (CRM_Utils_Array::value('participant', $componentDetails)) {
+        $component = 'participant';
       }
     }
+    elseif ($this->_ppID) {
+      $component = 'pledge';
+    }
+    $status = CRM_Contribute_BAO_Contribution_Utils::getContributionStatuses($component, $this->_id);
 
     // define the status IDs that show the cancellation info, see CRM-17589
     $cancelInfo_show_ids = array();
-    foreach (array_keys($statusName) as $status_id) {
+    foreach (array_keys($status) as $status_id) {
       if (CRM_Contribute_BAO_Contribution::isContributionStatusNegative($status_id)) {
         $cancelInfo_show_ids[] = "'$status_id'";
       }
     }
     $this->assign('cancelInfo_show_ids', implode(',', $cancelInfo_show_ids));
 
-    if ($this->_id) {
-      $contributionStatus = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $this->_id, 'contribution_status_id');
-      $name = CRM_Utils_Array::value($contributionStatus, $statusName);
-      switch ($name) {
-        case 'Completed':
-          // [CRM-17498] Removing unsupported status change options.
-          unset($status[CRM_Utils_Array::key('Pending', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Failed', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Partially paid', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Pending refund', $statusName)]);
-        case 'Cancelled':
-        case 'Chargeback':
-        case 'Refunded':
-          unset($status[CRM_Utils_Array::key('In Progress', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Pending', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Failed', $statusName)]);
-          break;
-
-        case 'Pending':
-        case 'In Progress':
-          unset($status[CRM_Utils_Array::key('Refunded', $statusName)]);
-          unset($status[CRM_Utils_Array::key('Chargeback', $statusName)]);
-          break;
-
-        case 'Failed':
-          foreach (array(
-                     'Pending',
-                     'Refunded',
-                     'Chargeback',
-                     'Completed',
-                     'In Progress',
-                     'Cancelled',
-                   ) as $suppress) {
-            unset($status[CRM_Utils_Array::key($suppress, $statusName)]);
-          }
-          break;
-      }
-    }
-    else {
-      unset($status[CRM_Utils_Array::key('Refunded', $statusName)]);
-      unset($status[CRM_Utils_Array::key('Chargeback', $statusName)]);
-    }
-
     $statusElement = $this->add('select', 'contribution_status_id',
       ts('Contribution Status'),
       $status,
index 3a4dffb629bda6f77c80827b23072938a9a34a22..216f97ce258d100188b8ed5a6fb08e2c673e073b 100644 (file)
@@ -448,23 +448,8 @@ SELECT  id, html_type
           $form->assign('showTransactionId', TRUE);
         }
 
-        $status = CRM_Contribute_PseudoConstant::contributionStatus();
-
-        // CRM-14417 suppressing contribution statuses that are NOT relevant to new participant registrations
-        $statusName = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
-        foreach (array(
-                   'Cancelled',
-                   'Failed',
-                   'In Progress',
-                   'Overdue',
-                   'Refunded',
-                   'Pending refund',
-                 ) as $suppress) {
-          unset($status[CRM_Utils_Array::key($suppress, $statusName)]);
-        }
-
         $form->add('select', 'contribution_status_id',
-          ts('Payment Status'), $status
+          ts('Payment Status'), CRM_Contribute_BAO_Contribution_Utils::getContributionStatuses('participant')
         );
 
         $form->add('text', 'check_number', ts('Check Number'),
index 163147f228763a586b63aff7a678beda0137daa8..5e640c72607944205e7d4c5b3f2e33be1f96d4ef 100644 (file)
@@ -638,26 +638,8 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         )
       );
 
-      $allowStatuses = array();
-      $statuses = CRM_Contribute_PseudoConstant::contributionStatus();
-      if ($this->_onlinePendingContributionId) {
-        $statusNames = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
-        foreach ($statusNames as $val => $name) {
-          if (in_array($name, array(
-            'In Progress',
-            'Overdue',
-          ))
-          ) {
-            continue;
-          }
-          $allowStatuses[$val] = $statuses[$val];
-        }
-      }
-      else {
-        $allowStatuses = $statuses;
-      }
       $this->add('select', 'contribution_status_id',
-        ts('Payment Status'), $allowStatuses
+        ts('Payment Status'), CRM_Contribute_BAO_Contribution_Utils::getContributionStatuses('membership')
       );
       $this->add('text', 'check_number', ts('Check Number'),
         CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Contribution', 'check_number')
index 21853f410612b435f6b9a682622dc4fbfa65563c..eeb0166e1a87f42255ff61476039df03a7a1f328 100644 (file)
@@ -367,7 +367,7 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
       );
 
       $this->add('select', 'contribution_status_id', ts('Payment Status'),
-        CRM_Contribute_PseudoConstant::contributionStatus()
+        CRM_Contribute_BAO_Contribution_Utils::getContributionStatuses('membership')
       );
 
       $this->add('text', 'check_number', ts('Check Number'),