Add unit test for api ContributionRecur.cancel, add support for cancel_reason
authoreileen <emcnaughton@wikimedia.org>
Mon, 8 Apr 2019 02:32:51 +0000 (14:32 +1200)
committereileen <emcnaughton@wikimedia.org>
Mon, 8 Apr 2019 02:42:26 +0000 (14:42 +1200)
CRM/Contribute/BAO/ContributionRecur.php
CRM/Contribute/Form/CancelSubscription.php
api/v3/ContributionRecur.php
tests/phpunit/CRM/Contribute/BAO/ContributionRecurTest.php
tests/phpunit/api/v3/ContributionRecurTest.php

index 27f41cfcb2dac2f41736168dd45bd41298d38e3f..559496f02f0f2362c75e69a0d26f6f7e426338ca 100644 (file)
@@ -258,14 +258,19 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
   /**
    * Cancel Recurring contribution.
    *
-   * @param int $recurId
-   *   Recur contribution id.
+   * @param array $params
+   *   Recur contribution params
    *
    * @param array $activityParams
    *
    * @return bool
    */
-  public static function cancelRecurContribution($recurId, $activityParams = []) {
+  public static function cancelRecurContribution($params, $activityParams = []) {
+    if (is_int($params)) {
+      CRM_Core_Error::deprecatedFunctionWarning('You are using a BAO function whose signature has changed. Please use the ContributionRecur.cancel api');
+      $params = ['id' => $params];
+    }
+    $recurId = $params['id'];
     if (!$recurId) {
       return FALSE;
     }
@@ -282,6 +287,7 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
       $recur->start_date = CRM_Utils_Date::isoToMysql($recur->start_date);
       $recur->create_date = CRM_Utils_Date::isoToMysql($recur->create_date);
       $recur->modified_date = CRM_Utils_Date::isoToMysql($recur->modified_date);
+      $recur->cancel_reason = CRM_Utils_Array::value('cancel_reason', $params);
       $recur->cancel_date = date('YmdHis');
       $recur->save();
 
index ce98fbb513d7b6e605631d8784a3244829251928..dfd921041bd0ed06c2138ef46bd054ecc7baebb0 100644 (file)
@@ -213,7 +213,7 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
           'details' => $message,
         ];
       $cancelStatus = CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution(
-        $this->_subscriptionDetails->recur_id,
+        ['id' => $this->_subscriptionDetails->recur_id],
         $activityParams
       );
 
index 2ccb9555962f7ee6d82c78cc7fde4f326016669a..ae29b75fda334111992c5efe137fc95ac118cdce 100644 (file)
@@ -84,8 +84,23 @@ function civicrm_api3_contribution_recur_get($params) {
  *   returns true is successfully cancelled
  */
 function civicrm_api3_contribution_recur_cancel($params) {
-  civicrm_api3_verify_one_mandatory($params, NULL, ['id']);
-  return CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution($params['id']) ? civicrm_api3_create_success() : civicrm_api3_create_error(ts('Error while cancelling recurring contribution'));
+  return CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution($params) ? civicrm_api3_create_success() : civicrm_api3_create_error(ts('Error while cancelling recurring contribution'));
+}
+
+/**
+ * Adjust Metadata for Cancel action.
+ *
+ * The metadata is used for setting defaults, documentation & validation.
+ *
+ * @param array $params
+ *   Array of parameters determined by getfields.
+ */
+function _civicrm_api3_contribution_recur_cancel_spec(&$params) {
+  $params['id'] = [
+    'title' => ts('Contribution Recur ID'),
+    'api.required' => TRUE,
+    'type' => CRM_Utils_Type::T_INT,
+  ];
 }
 
 /**
index 2a755ba5fe348fe584c48bdfb3e18e9ea7b31fd1..5d82d4c0b839528329859a36a20dc1a3da97f9a1 100644 (file)
@@ -90,7 +90,7 @@ class CRM_Contribute_BAO_ContributionRecurTest extends CiviUnitTestCase {
    */
   public function testCancelRecur() {
     $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', $this->_params);
-    CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution($contributionRecur['id']);
+    CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution(['id' => $contributionRecur['id']]);
   }
 
   /**
index b4a382a5c9f63cd60a78668b75037eca6569a457..93e15db7bcb86bd5afda0dd44bb58205d94c8645 100644 (file)
@@ -100,4 +100,16 @@ class api_v3_ContributionRecurTest extends CiviUnitTestCase {
     $this->assertEquals(12, $result['values']['start_date']['type']);
   }
 
+  /**
+   * Test that we can cancel a contribution and add a cancel_reason via the api.
+   */
+  public function testContributionRecurCancel() {
+    $result = $this->callAPISuccess($this->_entity, 'create', $this->params);
+    $this->callAPISuccess('ContributionRecur', 'cancel', ['id' => $result['id'], 'cancel_reason' => 'just cos']);
+    $cancelled = $this->callAPISuccess('ContributionRecur', 'getsingle', ['id' => $result['id']]);
+    $this->assertEquals('just cos', $cancelled['cancel_reason']);
+    $this->assertEquals(CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', 'Cancelled'), $cancelled['contribution_status_id']);
+    $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($cancelled['cancel_date'])));
+  }
+
 }