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..76424748 100644 --- a/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php +++ b/tests/phpunit/CRM/MembershipExtras/Hook/Pre/MembershipPaymentPlanProcessor/LineItemTest.php @@ -184,6 +184,22 @@ private function mockParams($membershipPeriodType, $membershipTypeDuration, $mem 'entity_table' => 'civicrm_membership', 'entity_id' => $this->membership['id'], 'contact_id' => $contact['id'], + 'line_item' => [ + 0 => [ + 1 => [ + 'membership_type_id' => $membershipType['id'], + 'entity_table' => 'civicrm_membership', + 'entity_id' => 1, + 'line_total' => 1200, + ], + 2 => [ + 'membership_type_id' => $membershipType['id'], + 'entity_table' => 'civicrm_membership', + 'entity_id' => 2, + 'line_total' => 1300, + ], + ], + ], ]; }