Fix pledge to support v4 api
authoreileen <emcnaughton@wikimedia.org>
Mon, 18 Jan 2021 06:12:49 +0000 (19:12 +1300)
committereileen <emcnaughton@wikimedia.org>
Mon, 18 Jan 2021 20:06:43 +0000 (09:06 +1300)
CRM/Pledge/BAO/Pledge.php
Civi/Test/Api3TestTrait.php
tests/phpunit/api/v3/ACLPermissionTest.php

index c04f509f6ef0555c2c35527dce9d14010bc37213..2f647e153bd0957368df9d4b84cf959efb3be2d9 100644 (file)
@@ -118,8 +118,16 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
    * @throws \CRM_Core_Exception
    */
   public static function create(array $params): CRM_Pledge_DAO_Pledge {
+    $action = empty($params['id']) ? 'create' : 'edit';
+    if ($action === 'create') {
+      $defaults = [
+        'currency' => CRM_Core_Config::singleton()->defaultCurrency,
+        'installments' => (int) self::fields()['installments']['default'],
+        'scheduled_date' => $params['start_date'] ?? date('Ymd'),
+      ];
+      $params = array_merge($defaults, $params);
+    }
 
-    $isRecalculatePledgePayment = self::isPaymentsRequireRecalculation($params);
     $transaction = new CRM_Core_Transaction();
 
     $paymentParams = [];
@@ -144,9 +152,7 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
     }
     $paymentParams['status_id'] = $params['status_id'] ?? NULL;
 
-    $hook = empty($params['id']) ? 'create' : 'edit';
-    CRM_Utils_Hook::pre($hook, 'Pledge', $params['id'] ?? NULL, $params);
-
+    CRM_Utils_Hook::pre($action, 'Pledge', $params['id'] ?? NULL, $params);
     $pledge = new CRM_Pledge_DAO_Pledge();
 
     // if pledge is complete update end date as current date
@@ -155,15 +161,8 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
     }
 
     $pledge->copyValues($params);
-
-    // set currency for CRM-1496
-    if (!isset($pledge->currency)) {
-      $pledge->currency = CRM_Core_Config::singleton()->defaultCurrency;
-    }
-
     $pledge->save();
-
-    CRM_Utils_Hook::post($hook, 'Pledge', $pledge->id, $pledge);
+    CRM_Utils_Hook::post($action, 'Pledge', $pledge->id, $pledge);
 
     // handle custom data.
     if (!empty($params['custom']) &&
@@ -172,11 +171,11 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
       CRM_Core_BAO_CustomValueTable::store($params['custom'], 'civicrm_pledge', $pledge->id);
     }
 
-    // skip payment stuff inedit mode
-    if (!isset($params['id']) || $isRecalculatePledgePayment) {
+    // skip payment stuff in edit mode
+    if (empty($params['id']) || self::isPaymentsRequireRecalculation($params)) {
 
       // if pledge is pending delete all payments and recreate.
-      if ($isRecalculatePledgePayment) {
+      if (!empty(empty($params['id']))) {
         CRM_Pledge_BAO_PledgePayment::deletePayments($pledge->id);
       }
 
index b785f91f90a1fb02bddb385c97393382b44f59a5..a9b985178b80e6b839609c7f53b12cbb825b4abf 100644 (file)
@@ -127,7 +127,13 @@ trait Api3TestTrait {
         'version' => $this->_apiversion,
       ];
     }
-    $result = $this->civicrm_api($entity, $action, $params);
+    try {
+      $result = $this->civicrm_api($entity, $action, $params);
+    }
+    catch (\API_Exception $e) {
+      // api v4 call failed and threw an exception.
+      return [];
+    }
     $this->assertAPIFailure($result, "We expected a failure for $entity $action but got a success", $expectedErrorMessage);
     return $result;
   }
@@ -439,7 +445,7 @@ trait Api3TestTrait {
         }
         if ($options['sort']) {
           foreach (explode(',', $options['sort']) as $sort) {
-            list($sortField, $sortDir) = array_pad(explode(' ', trim($sort)), 2, 'ASC');
+            [$sortField, $sortDir] = array_pad(explode(' ', trim($sort)), 2, 'ASC');
             $v4Params['orderBy'][$sortField] = $sortDir;
           }
         }
index 558e99a4847253db19437f5e6e30474914fd0814..f587ad13f991362359134a94aa822cfdd2322aab 100644 (file)
@@ -456,7 +456,7 @@ class api_v3_ACLPermissionTest extends CiviUnitTestCase {
    * @dataProvider versionThreeAndFour
    * @throws \CRM_Core_Exception
    */
-  public function testContactGetPledgeNotChainable($version) {
+  public function testContactGetPledgeNotChainable(int $version): void {
     $this->_apiversion = $version;
     $this->hookClass->setHook('civicrm_aclWhereClause', [
       $this,