From ee63135d34d507beaf988f2fd311f07daebdd10c Mon Sep 17 00:00:00 2001 From: eileen Date: Thu, 23 Mar 2017 01:13:15 +1300 Subject: [PATCH] CRM-20008 fix pending flow. This adds a test written by Peter Hartmann for repeattransaction with pending status. I altered is a little, working on the assumption the flow should be - create pending, leave status unchanged - complete pending, updte status & advance end date --- CRM/Contribute/BAO/Contribution.php | 75 +++++++++++++---------- tests/phpunit/api/v3/ContributionTest.php | 39 ++++++++++++ 2 files changed, 81 insertions(+), 33 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 60b197bd78df..bf7a4c92b930 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -4548,43 +4548,52 @@ public static function completeOrder(&$input, &$ids, $objects, $transaction, $re } $dao->free(); - $membershipParams['num_terms'] = $contribution->getNumTermsByContributionAndMembershipType( - $membershipParams['membership_type_id'], - $primaryContributionID - ); - $dates = array_fill_keys(array('join_date', 'start_date', 'end_date'), NULL); - if ($currentMembership) { - /* - * Fixed FOR CRM-4433 - * In BAO/Membership.php(renewMembership function), we skip the extend membership date and status - * when Contribution mode is notify and membership is for renewal ) - */ - CRM_Member_BAO_Membership::fixMembershipStatusBeforeRenew($currentMembership, $changeDate); - - // @todo - we should pass membership_type_id instead of null here but not - // adding as not sure of testing - $dates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($membershipParams['id'], - $changeDate, NULL, $membershipParams['num_terms'] - ); - - $dates['join_date'] = $currentMembership['join_date']; + if (CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_Contribution', 'contribution_status_id', CRM_Utils_Array::value('contribution_status_id', $input)) === 'Pending') { + $membershipParams['num_terms'] = 0; } + else { + $membershipParams['num_terms'] = $contribution->getNumTermsByContributionAndMembershipType( + $membershipParams['membership_type_id'], + $primaryContributionID + ); + // @todo remove all this stuff in favour of letting the api call further down handle in + // (it is a duplication of what the api does). + $dates = array_fill_keys(array('join_date', 'start_date', 'end_date'), NULL); + if ($currentMembership) { + /* + * Fixed FOR CRM-4433 + * In BAO/Membership.php(renewMembership function), we skip the extend membership date and status + * when Contribution mode is notify and membership is for renewal ) + */ + CRM_Member_BAO_Membership::fixMembershipStatusBeforeRenew($currentMembership, $changeDate); + + // @todo - we should pass membership_type_id instead of null here but not + // adding as not sure of testing + $dates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($membershipParams['id'], + $changeDate, NULL, $membershipParams['num_terms'] + ); + + $dates['join_date'] = $currentMembership['join_date']; + } - //get the status for membership. - $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dates['start_date'], - $dates['end_date'], - $dates['join_date'], - 'today', - TRUE, - $membershipParams['membership_type_id'], - $membershipParams - ); + //get the status for membership. + $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dates['start_date'], + $dates['end_date'], + $dates['join_date'], + 'today', + TRUE, + $membershipParams['membership_type_id'], + $membershipParams + ); - $membershipParams['status_id'] = CRM_Utils_Array::value('id', $calcStatus, 'New'); - //we might be renewing membership, - //so make status override false. - $membershipParams['is_override'] = FALSE; + unset($dates['end_date']); + $membershipParams['status_id'] = CRM_Utils_Array::value('id', $calcStatus, 'New'); + //we might be renewing membership, + //so make status override false. + $membershipParams['is_override'] = FALSE; + } //CRM-17723 - reset static $relatedContactIds array() + // @todo move it to Civi Statics. $var = TRUE; CRM_Member_BAO_Membership::createRelatedMemberships($var, $var, TRUE); civicrm_api3('Membership', 'create', $membershipParams); diff --git a/tests/phpunit/api/v3/ContributionTest.php b/tests/phpunit/api/v3/ContributionTest.php index 83d271a7554d..5760a84408d7 100644 --- a/tests/phpunit/api/v3/ContributionTest.php +++ b/tests/phpunit/api/v3/ContributionTest.php @@ -3419,6 +3419,45 @@ public function testRepeatTransactionWithNonCreditCardDefault() { $this->quickCleanUpFinancialEntities(); } + /** + * CRM-20008 Tests repeattransaction creates pending membership. + */ + public function testRepeatTransactionPendingMembership() { + list($originalContribution, $membership) = $this->setUpAutoRenewMembership(); + $this->callAPISuccess('membership', 'create', array( + 'id' => $membership['id'], + 'end_date' => 'yesterday', + 'status_id' => 'Expired', + )); + $repeatedContribution = $this->callAPISuccess('contribution', 'repeattransaction', array( + 'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'], + 'contribution_status_id' => 'Pending', + 'trxn_id' => uniqid(), + )); + $membershipStatusId = $this->callAPISuccess('membership', 'getvalue', array( + 'id' => $membership['id'], + 'return' => 'status_id', + )); + + // Let's see if the membership payments got created while we're at it. + $membershipPayments = $this->callAPISuccess('MembershipPayment', 'get', array( + 'memberhip_id' => $membership['id'], + )); + $this->assertEquals(2, $membershipPayments['count']); + + $this->assertEquals('Expired', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId)); + $this->callAPISuccess('Contribution', 'completetransaction', array('id' => $repeatedContribution['id'])); + $membership = $this->callAPISuccessGetSingle('membership', array( + 'id' => $membership['id'], + 'return' => 'status_id, end_date', + )); + $this->assertEquals('New', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membership['status_id'])); + $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 month')), $membership['end_date']); + + $this->quickCleanUpFinancialEntities(); + $this->contactDelete($originalContribution['values'][1]['contact_id']); + } + /** * Test sending a mail via the API. */