From 7c86e53f6d35fe58216e08edf2355f608ee93b0a Mon Sep 17 00:00:00 2001 From: eileen Date: Mon, 18 Jan 2021 19:12:49 +1300 Subject: [PATCH] Fix pledge to support v4 api --- CRM/Pledge/BAO/Pledge.php | 29 +++++++++++----------- Civi/Test/Api3TestTrait.php | 10 ++++++-- tests/phpunit/api/v3/ACLPermissionTest.php | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CRM/Pledge/BAO/Pledge.php b/CRM/Pledge/BAO/Pledge.php index c04f509f6e..2f647e153b 100644 --- a/CRM/Pledge/BAO/Pledge.php +++ b/CRM/Pledge/BAO/Pledge.php @@ -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); } diff --git a/Civi/Test/Api3TestTrait.php b/Civi/Test/Api3TestTrait.php index b785f91f90..a9b985178b 100644 --- a/Civi/Test/Api3TestTrait.php +++ b/Civi/Test/Api3TestTrait.php @@ -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; } } diff --git a/tests/phpunit/api/v3/ACLPermissionTest.php b/tests/phpunit/api/v3/ACLPermissionTest.php index 558e99a484..f587ad13f9 100644 --- a/tests/phpunit/api/v3/ACLPermissionTest.php +++ b/tests/phpunit/api/v3/ACLPermissionTest.php @@ -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, -- 2.25.1