From 62c0873480ef965e73a7e675aebf98585341c251 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Mon, 23 Feb 2015 11:59:08 -0500 Subject: [PATCH] Consider selected line items when fetching price set recur details. --- CRM/Contribute/Form/Contribution/Confirm.php | 7 ++++++- CRM/Price/BAO/PriceSet.php | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CRM/Contribute/Form/Contribution/Confirm.php b/CRM/Contribute/Form/Contribution/Confirm.php index 81384a8de6..3494a7a50e 100644 --- a/CRM/Contribute/Form/Contribution/Confirm.php +++ b/CRM/Contribute/Form/Contribution/Confirm.php @@ -334,7 +334,12 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr $this->_params['is_recur'] = $this->_values['is_recur'] = 1; // check if price set is not quick config if (CRM_Utils_Array::value('priceSetId', $this->_params) && !$isQuickConfig) { - list($this->_params['frequency_interval'], $this->_params['frequency_unit']) = CRM_Price_BAO_PriceSet::getRecurDetails($this->_params['priceSetId']); + // Extract the ids for all of the line items that have been + // chosen. + $priceFieldValueIds = array_keys($this->_lineItem[$this->_params['priceSetId']]); + + list($this->_params['frequency_interval'], $this->_params['frequency_unit']) = + CRM_Price_BAO_PriceSet::getRecurDetails($this->_params['priceSetId'], $priceFieldValueIds); } else { // FIXME: set interval and unit based on selected membership type diff --git a/CRM/Price/BAO/PriceSet.php b/CRM/Price/BAO/PriceSet.php index bf297b8c63..b9405386f1 100644 --- a/CRM/Price/BAO/PriceSet.php +++ b/CRM/Price/BAO/PriceSet.php @@ -1119,17 +1119,24 @@ GROUP BY mt.member_of_contact_id"; * Function to retrieve auto renew frequency and interval * * @param int $priceSetId price set id + * @param array $priceFieldValueIds price field value ids (line items) * * @return array associate array of frequency interval and unit * @static * @access public */ public static function getRecurDetails($priceSetId) { + // Escape the array of ids. + foreach ($priceFieldValueIds as $index => $id) { + $priceFieldValueIds[$index] = CRM_Utils_Type::escape($id, 'Integer'); + } + $query = 'SELECT mt.duration_interval, mt.duration_unit FROM civicrm_price_field_value pfv INNER JOIN civicrm_membership_type mt ON pfv.membership_type_id = mt.id INNER JOIN civicrm_price_field pf ON pfv.price_field_id = pf.id - WHERE pf.price_set_id = %1 LIMIT 1'; + WHERE pf.price_set_id = %1 AND pfv.id IN (' + . implode(',', $priceFieldValueIds) . ') LIMIT 1'; $params = array(1 => array($priceSetId, 'Integer')); $dao = CRM_Core_DAO::executeQuery($query, $params); -- 2.25.1