PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.8.1
GiveWP – Donation Plugin and Fundraising Platform v4.16.8.1
4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 All 255 releases
give / src / FormMigration / Steps / RecurringDonationOptions.php

RecurringDonationOptions.php in GiveWP – Donation Plugin and Fundraising Platform 4.16.8.1, at src/FormMigration/Steps/RecurringDonationOptions.php

144 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\FormMigration\Steps;
4
5 use Give\FormBuilder\BlockModels\DonationAmountBlockModel;
6 use Give\FormMigration\Contracts\FormMigrationStep;
7 use Give\Subscriptions\ValueObjects\SubscriptionPeriod;
8
9 /**
10 * @since 3.0.0
11 */
12 class RecurringDonationOptions extends FormMigrationStep
13 {
14 /**
15 * @since 3.0.0
16 */
17 public function canHandle(): bool
18 {
19 return $this->formV2->isRecurringDonationsEnabled();
20 }
21
22 /**
23 * @since 3.0.0
24 */
25 public function process()
26 {
27 $block = $this->fieldBlocks->findByName('givewp/donation-amount');
28 $amountBlock = new DonationAmountBlockModel($block);
29
30 switch ($this->formV2->getRecurringDonationsOption()) {
31 case 'no':
32 $amountBlock->setRecurringEnabled(false);
33 break;
34 case 'yes_donor':
35 $this->handleDonorChoice($amountBlock);
36 break;
37 case 'yes_admin':
38 $this->handleAdminDefined($amountBlock);
39 break;
40 default:
41 break;
42 }
43 }
44
45 /**
46 * Donor's choice has its own set of options for period functionality and default period (checkbox opt-in).
47 *
48 * @since 3.0.0
49 */
50 protected function handleDonorChoice(DonationAmountBlockModel $amountBlock)
51 {
52 $amountBlock->setRecurringEnabled();
53 $amountBlock->setRecurringEnableOneTimeDonations();
54
55 // donor's choice of billing period means the donor selects the billing period
56 if ($this->formV2->isRecurringPeriodFunctionalityDonorsChoice()) {
57 // add all available subscription billing period options
58 $amountBlock->setRecurringBillingPeriodOptions(...SubscriptionPeriod::values());
59
60 if ($this->formV2->isRecurringDefaultCheckboxEnabled()) {
61 $defaultPeriod = $this->getBillingPeriodFromMeta(
62 $this->formV2->getRecurringPeriodDefaultDonorsChoice()
63 );
64
65 $amountBlock->setRecurringOptInDefaultBillingPeriod($defaultPeriod);
66 } else {
67 $amountBlock->setAttribute('recurringOptInDefaultBillingPeriod', 'one-time');
68 }
69 // admins choice of billing period means the admin selects the billing period
70 } elseif ($this->formV2->isRecurringPeriodFunctionalityAdminChoice()) {
71 $defaultBillingPeriod = $this->getBillingPeriodFromMeta($this->formV2->getRecurringPeriod());
72
73 $amountBlock->setRecurringBillingPeriodOptions($defaultBillingPeriod);
74
75 if ($this->formV2->isRecurringDefaultCheckboxEnabled()) {
76 $amountBlock->setRecurringOptInDefaultBillingPeriod($defaultBillingPeriod);
77 } else {
78 $amountBlock->setAttribute('recurringOptInDefaultBillingPeriod', 'one-time');
79 }
80 }
81
82 if (!empty($recurringBillingInterval = $this->formV2->getRecurringBillingInterval())) {
83 $amountBlock->setRecurringBillingInterval($recurringBillingInterval);
84 }
85
86 if (!empty($recurringLengthOfTime = $this->formV2->getRecurringLengthOfTime())) {
87 $amountBlock->setRecurringLengthOfTime($recurringLengthOfTime);
88 }
89 }
90
91 /**
92 * Admins choice works differently depending on the donation option value and if custom amount is enabled.
93 * If donation option is 'set', then it uses the general recurring options.
94 * If donation option is 'multi' and custom amount is enabled, then it uses the custom amount recurring options.
95 * If donation option is 'multi' and custom amount is disabled, then it uses the first donation level recurring options.
96 *
97 * @since 3.0.0
98 */
99 protected function handleAdminDefined(DonationAmountBlockModel $amountBlock)
100 {
101 $amountBlock->setRecurringEnabled();
102 $amountBlock->setRecurringEnableOneTimeDonations(false);
103
104 if ($this->formV2->isDonationOptionSet()) {
105 $billingPeriod = $this->getBillingPeriodFromMeta($this->formV2->getRecurringPeriod());
106
107 $amountBlock->setRecurringLengthOfTime($this->formV2->getRecurringLengthOfTime());
108 $amountBlock->setRecurringBillingInterval($this->formV2->getRecurringBillingInterval());
109 $amountBlock->setRecurringBillingPeriodOptions($billingPeriod);
110 $amountBlock->setRecurringOptInDefaultBillingPeriod($billingPeriod);
111 } elseif ($this->formV2->isDonationOptionMulti()) {
112 if ($this->formV2->isCustomAmountOptionEnabled()) {
113 $billingPeriod = $this->getBillingPeriodFromMeta($this->formV2->getRecurringCustomAmountPeriod());
114
115 $amountBlock->setRecurringLengthOfTime($this->formV2->getRecurringCustomAmountTimes());
116 $amountBlock->setRecurringBillingInterval($this->formV2->getRecurringCustomAmountInterval());
117 $amountBlock->setRecurringBillingPeriodOptions($billingPeriod);
118 $amountBlock->setRecurringOptInDefaultBillingPeriod($billingPeriod);
119 } else {
120 // get from donation levels
121 $donationLevels = $this->formV2->getDonationLevels();
122
123 if (!empty($donationLevels) && $donationLevels[0]['_give_recurring'] === 'yes') {
124 $level = $donationLevels[0];
125 $amountBlock->setRecurringLengthOfTime((int)$level["_give_times"]);
126 $amountBlock->setRecurringBillingInterval((int)$level["_give_period_interval"]);
127
128 $period = $this->getBillingPeriodFromMeta($level["_give_period"]);
129 $amountBlock->setRecurringBillingPeriodOptions($period);
130 $amountBlock->setRecurringOptInDefaultBillingPeriod($period);
131 }
132 }
133 }
134 }
135
136 /**
137 * @since 3.0.0
138 */
139 protected function getBillingPeriodFromMeta(string $period): SubscriptionPeriod
140 {
141 return SubscriptionPeriod::isValid($period) ? new SubscriptionPeriod($period) : SubscriptionPeriod::MONTH();
142 }
143 }
144