From c6f840faa65a812f2c1af78d09bfad1eab3fd45a Mon Sep 17 00:00:00 2001 From: "Matthew Wire (MJW Consulting)" Date: Wed, 21 Aug 2019 18:08:14 +0100 Subject: [PATCH] dev/core#792 Fix Contributions not recording if selected membership is none when using a membership priceset --- CRM/Contribute/Form/Contribution/Confirm.php | 72 +++++++++++++------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/CRM/Contribute/Form/Contribution/Confirm.php b/CRM/Contribute/Form/Contribution/Confirm.php index 25deceea7b02..0d452a65782f 100644 --- a/CRM/Contribute/Form/Contribution/Confirm.php +++ b/CRM/Contribute/Form/Contribution/Confirm.php @@ -2269,11 +2269,7 @@ protected function processFormSubmission($contactID) { $this->_useForMember = $this->get('useForMember'); // store the fact that this is a membership and membership type is selected - if ((!empty($membershipParams['selectMembership']) && - $membershipParams['selectMembership'] != 'no_thanks' - ) || - $this->_useForMember - ) { + if ($this->isMembershipSelected($membershipParams)) { if (!$this->_useForMember) { $this->assign('membership_assign', TRUE); $this->set('membershipTypeID', $this->_params['selectMembership']); @@ -2338,6 +2334,53 @@ protected function processFormSubmission($contactID) { } } + /** + * Return True/False if we have a membership selected on the contribution page + * @param array $membershipParams + * + * @return bool + */ + private function isMembershipSelected($membershipParams) { + $priceFieldIds = $this->get('memberPriceFieldIDS'); + if ((!empty($membershipParams['selectMembership']) && $membershipParams['selectMembership'] != 'no_thanks') + && empty($priceFieldIds)) { + return TRUE; + } + else { + $membershipParams = $this->getMembershipParamsFromPriceSet($membershipParams); + } + return !empty($membershipParams['selectMembership']); + } + + /** + * Extract the selected memberships from a priceSet + * + * @param array $membershipParams + * + * @return array + */ + private function getMembershipParamsFromPriceSet($membershipParams) { + $priceFieldIds = $this->get('memberPriceFieldIDS'); + if (empty($priceFieldIds)) { + return $membershipParams; + } + $membershipParams['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceFieldIds['id'], 'financial_type_id'); + unset($priceFieldIds['id']); + $membershipTypeIds = []; + $membershipTypeTerms = []; + foreach ($priceFieldIds as $priceFieldId) { + $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_type_id'); + if ($membershipTypeId) { + $membershipTypeIds[] = $membershipTypeId; + $term = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_num_terms') ?: 1; + $membershipTypeTerms[$membershipTypeId] = ($term > 1) ? $term : 1; + } + } + $membershipParams['selectMembership'] = $membershipTypeIds; + $membershipParams['types_terms'] = $membershipTypeTerms; + return $membershipParams; + } + /** * Membership processing section. * @@ -2387,24 +2430,7 @@ protected function doMembershipProcessing($contactID, $membershipParams, $premiu $fieldTypes = ['Contact', 'Organization', 'Membership']; } - $priceFieldIds = $this->get('memberPriceFieldIDS'); - - if (!empty($priceFieldIds)) { - $membershipParams['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceFieldIds['id'], 'financial_type_id'); - unset($priceFieldIds['id']); - $membershipTypeIds = []; - $membershipTypeTerms = []; - foreach ($priceFieldIds as $priceFieldId) { - $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_type_id'); - if ($membershipTypeId) { - $membershipTypeIds[] = $membershipTypeId; - $term = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_num_terms') ?: 1; - $membershipTypeTerms[$membershipTypeId] = ($term > 1) ? $term : 1; - } - } - $membershipParams['selectMembership'] = $membershipTypeIds; - $membershipParams['types_terms'] = $membershipTypeTerms; - } + $membershipParams = $this->getMembershipParamsFromPriceSet($membershipParams); if (!empty($membershipParams['selectMembership'])) { // CRM-12233 $membershipLineItems = $formLineItems;