diff --git a/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/AbstractProcessor.php b/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/AbstractProcessor.php index f7f8c6b2..33851b48 100644 --- a/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/AbstractProcessor.php +++ b/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/AbstractProcessor.php @@ -99,7 +99,9 @@ protected function getInstalmentAmountCalculator(array $membershipTypes, $period } $instalmentAmountCalculator = new InstalmentAmountCalculator($calculator); - $instalmentAmountCalculator->getCalculator()->calculate(); + $lineItems = CRM_Utils_Array::value('line_item', $this->params, []); + $isNotQuickConfig = !empty($lineItems) && count(array_values($lineItems)[0]) > 1; + $instalmentAmountCalculator->getCalculator()->calculate(!$this->isUsingPriceSet() || $isNotQuickConfig); return $instalmentAmountCalculator; } diff --git a/CRM/MembershipExtras/Service/MembershipPeriodType/FixedPeriodTypeCalculator.php b/CRM/MembershipExtras/Service/MembershipPeriodType/FixedPeriodTypeCalculator.php index ab4044db..e2e9d404 100644 --- a/CRM/MembershipExtras/Service/MembershipPeriodType/FixedPeriodTypeCalculator.php +++ b/CRM/MembershipExtras/Service/MembershipPeriodType/FixedPeriodTypeCalculator.php @@ -66,14 +66,15 @@ private function calculateProRatedAmount($amount, $duration, $diff) { /** * @throws Exception */ - public function calculate() { + public function calculate(bool $calculateProRated = TRUE) { foreach ($this->membershipTypes as $membershipType) { $settings = CRM_MembershipExtras_SettingsManager::getMembershipTypeSettings($membershipType->id); $membershipAmount = $membershipType->minimum_fee; $taxAmount = $this->instalmentTaxAmountCalculator->calculateByMembershipType($membershipType, $membershipAmount); $skipProRataUntilSetting = $settings[SettingField::ANNUAL_PRORATA_SKIP_ELEMENT] ?? NULL; - if (!empty($skipProRataUntilSetting) && !empty($skipProRataUntilSetting['M']) && $this->isWithinMembershipTypeProRataSkipPeriod($skipProRataUntilSetting)) { + if ((!empty($skipProRataUntilSetting) && !empty($skipProRataUntilSetting['M']) && $this->isWithinMembershipTypeProRataSkipPeriod($skipProRataUntilSetting)) + || !$calculateProRated) { $amount = $membershipAmount; } else { diff --git a/CRM/MembershipExtras/Service/MembershipPeriodType/PeriodTypeCalculatorInterface.php b/CRM/MembershipExtras/Service/MembershipPeriodType/PeriodTypeCalculatorInterface.php index c3808ab4..9655b838 100644 --- a/CRM/MembershipExtras/Service/MembershipPeriodType/PeriodTypeCalculatorInterface.php +++ b/CRM/MembershipExtras/Service/MembershipPeriodType/PeriodTypeCalculatorInterface.php @@ -3,7 +3,7 @@ interface CRM_MembershipExtras_Service_MembershipPeriodType_PeriodTypeCalculatorInterface { - public function calculate(); + public function calculate(bool $calculateProRated = TRUE); public function getAmount(); diff --git a/CRM/MembershipExtras/Service/MembershipPeriodType/RollingPeriodTypeCalculator.php b/CRM/MembershipExtras/Service/MembershipPeriodType/RollingPeriodTypeCalculator.php index fc03224a..583e6a45 100644 --- a/CRM/MembershipExtras/Service/MembershipPeriodType/RollingPeriodTypeCalculator.php +++ b/CRM/MembershipExtras/Service/MembershipPeriodType/RollingPeriodTypeCalculator.php @@ -21,7 +21,7 @@ public function __construct(array $membershipTypes) { * * @throws Exception */ - public function calculate() { + public function calculate(bool $calculateProRated = TRUE) { foreach ($this->membershipTypes as $membershipType) { $amount = $membershipType->minimum_fee; $taxAmount = $this->instalmentTaxAmountCalculator->calculateByMembershipType($membershipType, $membershipType->minimum_fee); diff --git a/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php b/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php index f30e3e9f..35533ffe 100644 --- a/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php +++ b/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php @@ -34,18 +34,14 @@ class CRM_MembershipExtras_Hook_Pre_MembershipPaymentPlanProcessor_LineItemTest * * @throws Exception */ - public function testProRatedPriceSetContributionLineItemOnCalculationByMonthFixedMembershipType() { + public function testProRatedPriceSetContributionLineItemOnCalculationWithModifiedMembershipFee() { $params = $this->mockParams('fixed', 'year', FixedPeriodCalculator::BY_MONTHS); //Since we test price set, line item amount can be different //from membership type that attached to price field value //the line total is changed here to test if the hook //is working correct with different price. $params['line_total'] = 240; - - $memTypeObj = CRM_Member_BAO_MembershipType::findById($params['membership_type_id']); - $membershipTypeDurationCalculator = new MembershipTypeDurationCalculator($memTypeObj, new MembershipTypeDatesCalculator()); - $diffInMonths = $membershipTypeDurationCalculator->calculateMonthsBasedOnDates(new DateTime($this->membership['start_date'])); - $expectedLineToTal = MoneyUtilities::roundToPrecision($params['line_total'] / 12 * $diffInMonths, 2); + $expectedLineToTal = $params['line_total']; $expectedTaxAmount = MoneyUtilities::roundToPrecision(($params['tax_rate'] / 100) * $expectedLineToTal, 2); $_REQUEST['price_set_id'] = $this->priceSet['id']; @@ -64,11 +60,7 @@ public function testProRatedPriceSetContributionLineItemOnCalculationByMonthFixe */ public function testProRatedPriceSetContributionLineItemOnCalculationByDaysFixedMembershipType() { $params = $this->mockParams('fixed', 'year', FixedPeriodCalculator::BY_DAYS); - $memTypeObj = CRM_Member_BAO_MembershipType::findById($params['membership_type_id']); - $membershipTypeDurationCalculator = new MembershipTypeDurationCalculator($memTypeObj, new MembershipTypeDatesCalculator()); - $membershipTypeDurationInDays = $membershipTypeDurationCalculator->calculateOriginalInDays(); - $diffInDays = $membershipTypeDurationCalculator->calculateDaysBasedOnDates(new DateTime($this->membership['start_date'])); - $expectedLineToTal = MoneyUtilities::roundToPrecision(($params['line_total'] / $membershipTypeDurationInDays) * $diffInDays, 2); + $expectedLineToTal = $params['line_total']; $expectedTaxAmount = MoneyUtilities::roundToPrecision(($params['tax_rate'] / 100) * $expectedLineToTal, 2); $_REQUEST['price_set_id'] = $this->priceSet['id'];