Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
fee14197 | 4 | | CiviCRM version 5 | |
6a488035 | 5 | +--------------------------------------------------------------------+ |
8c9251b3 | 6 | | Copyright CiviCRM LLC (c) 2004-2018 | |
6a488035 TO |
7 | +--------------------------------------------------------------------+ |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
11 | | under the terms of the GNU Affero General Public License | | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
13 | | | | |
14 | | CiviCRM is distributed in the hope that it will be useful, but | | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
17 | | See the GNU Affero General Public License for more details. | | |
18 | | | | |
19 | | You should have received a copy of the GNU Affero General Public | | |
20 | | License and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
d25dd0ee | 26 | */ |
6a488035 TO |
27 | |
28 | /** | |
29 | * | |
30 | * @package CRM | |
8c9251b3 | 31 | * @copyright CiviCRM LLC (c) 2004-2018 |
6a488035 TO |
32 | */ |
33 | ||
34 | /** | |
35 | * form to process actions on the group aspect of Custom Data | |
36 | */ | |
37 | class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_ContributionPage { | |
38 | ||
39 | /** | |
100fef9d | 40 | * Contribution amount block. |
6a488035 TO |
41 | * |
42 | * @var array | |
6a488035 TO |
43 | */ |
44 | protected $_amountBlock = array(); | |
45 | ||
46 | /** | |
47 | * Constants for number of options for data types of multiple option. | |
48 | */ | |
7da04cde | 49 | const NUM_OPTION = 11; |
6a488035 TO |
50 | |
51 | /** | |
fe482240 | 52 | * Build the form object. |
6a488035 TO |
53 | */ |
54 | public function buildQuickForm() { | |
55 | ||
56 | // do u want to allow a free form text field for amount | |
57 | $this->addElement('checkbox', 'is_allow_other_amount', ts('Allow other amounts'), NULL, array('onclick' => "minMax(this);showHideAmountBlock( this, 'is_allow_other_amount' );")); | |
58 | $this->add('text', 'min_amount', ts('Minimum Amount'), array('size' => 8, 'maxlength' => 8)); | |
59 | $this->addRule('min_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('9.99', ' '))), 'money'); | |
60 | ||
61 | $this->add('text', 'max_amount', ts('Maximum Amount'), array('size' => 8, 'maxlength' => 8)); | |
62 | $this->addRule('max_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money'); | |
63 | ||
5778c444 PN |
64 | //CRM-12055 |
65 | $this->add('text', 'amount_label', ts('Contribution Amounts Label')); | |
66 | ||
8a4f27dc | 67 | $default = array($this->createElement('radio', NULL, NULL, NULL, 0)); |
6a488035 TO |
68 | $this->add('hidden', "price_field_id", '', array('id' => "price_field_id")); |
69 | $this->add('hidden', "price_field_other", '', array('id' => "price_field_option")); | |
70 | for ($i = 1; $i <= self::NUM_OPTION; $i++) { | |
71 | // label | |
72 | $this->add('text', "label[$i]", ts('Label'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'label')); | |
73 | ||
74 | $this->add('hidden', "price_field_value[$i]", '', array('id' => "price_field_value[$i]")); | |
75 | ||
76 | // value | |
77 | $this->add('text', "value[$i]", ts('Value'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'value')); | |
78 | $this->addRule("value[$i]", ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money'); | |
79 | ||
80 | // default | |
81 | $default[] = $this->createElement('radio', NULL, NULL, NULL, $i); | |
82 | } | |
83 | ||
84 | $this->addGroup($default, 'default'); | |
85 | ||
86 | $this->addElement('checkbox', 'amount_block_is_active', ts('Contribution Amounts section enabled'), NULL, array('onclick' => "showHideAmountBlock( this, 'amount_block_is_active' );")); | |
87 | ||
88 | $this->addElement('checkbox', 'is_monetary', ts('Execute real-time monetary transactions')); | |
89 | ||
dccd9f4f ERL |
90 | $paymentProcessors = CRM_Financial_BAO_PaymentProcessor::getAllPaymentProcessors('live'); |
91 | $recurringPaymentProcessor = $futurePaymentProcessor = $paymentProcessor = array(); | |
92 | ||
93 | if (!empty($paymentProcessors)) { | |
94 | foreach ($paymentProcessors as $id => $processor) { | |
95 | if ($id != 0) { | |
96 | $paymentProcessor[$id] = $processor['name']; | |
97 | } | |
98 | if (CRM_Utils_Array::value('is_recur', $processor)) { | |
99 | $recurringPaymentProcessor[] = $id; | |
100 | } | |
101 | if (CRM_Utils_Array::value('object', $processor) && $processor['object']->supports('FutureRecurStartDate')) { | |
102 | $futurePaymentProcessor[] = $id; | |
103 | } | |
6a488035 TO |
104 | } |
105 | } | |
dccd9f4f ERL |
106 | if (count($recurringPaymentProcessor)) { |
107 | $this->assign('recurringPaymentProcessor', $recurringPaymentProcessor); | |
108 | } | |
109 | if (count($futurePaymentProcessor)) { | |
110 | $this->assign('futurePaymentProcessor', $futurePaymentProcessor); | |
111 | } | |
6a488035 TO |
112 | if (count($paymentProcessor)) { |
113 | $this->assign('paymentProcessor', $paymentProcessor); | |
114 | } | |
115 | ||
116 | $this->addCheckBox('payment_processor', ts('Payment Processor'), | |
117 | array_flip($paymentProcessor), | |
118 | NULL, NULL, NULL, NULL, | |
119 | array(' ', ' ', ' ', '<br/>') | |
120 | ); | |
121 | ||
6a488035 TO |
122 | //check if selected payment processor supports recurring payment |
123 | if (!empty($recurringPaymentProcessor)) { | |
6985dad8 | 124 | $this->addElement('checkbox', 'is_recur', ts('Recurring Contributions'), NULL, |
6a488035 TO |
125 | array('onclick' => "showHideByValue('is_recur',true,'recurFields','table-row','radio',false);") |
126 | ); | |
127 | $this->addCheckBox('recur_frequency_unit', ts('Supported recurring units'), | |
1314081f | 128 | CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE), |
6a488035 | 129 | NULL, NULL, NULL, NULL, |
1314081f | 130 | array(' ', ' ', ' ', '<br/>'), TRUE |
6a488035 TO |
131 | ); |
132 | $this->addElement('checkbox', 'is_recur_interval', ts('Support recurring intervals')); | |
133 | $this->addElement('checkbox', 'is_recur_installments', ts('Offer installments')); | |
134 | } | |
135 | ||
136 | // add pay later options | |
137 | $this->addElement('checkbox', 'is_pay_later', ts('Pay later option'), NULL); | |
138 | $this->addElement('textarea', 'pay_later_text', ts('Pay later label'), | |
139 | CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_text'), | |
140 | FALSE | |
141 | ); | |
5d51a2f9 | 142 | $this->add('wysiwyg', 'pay_later_receipt', ts('Pay Later Instructions'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_receipt')); |
2b3fa30d | 143 | $this->addElement('checkbox', 'is_billing_required', ts('Billing address required')); |
665e5ec7 | 144 | |
6a488035 TO |
145 | //add partial payment options |
146 | ||
147 | // add price set fields | |
9da8dc8c | 148 | $price = CRM_Price_BAO_PriceSet::getAssoc(FALSE, 'CiviContribute'); |
6a488035 TO |
149 | if (CRM_Utils_System::isNull($price)) { |
150 | $this->assign('price', FALSE); | |
151 | } | |
152 | else { | |
153 | $this->assign('price', TRUE); | |
154 | } | |
155 | $this->add('select', 'price_set_id', ts('Price Set'), | |
156 | array( | |
acb1052e | 157 | '' => ts('- none -'), |
353ffa53 | 158 | ) + $price, |
6a488035 TO |
159 | NULL, array('onchange' => "showHideAmountBlock( this.value, 'price_set_id' );") |
160 | ); | |
161 | //CiviPledge fields. | |
162 | $config = CRM_Core_Config::singleton(); | |
163 | if (in_array('CiviPledge', $config->enableComponents)) { | |
164 | $this->assign('civiPledge', TRUE); | |
165 | $this->addElement('checkbox', 'is_pledge_active', ts('Pledges'), | |
166 | NULL, array('onclick' => "showHideAmountBlock( this, 'is_pledge_active' ); return showHideByValue('is_pledge_active',true,'pledgeFields','table-row','radio',false);") | |
167 | ); | |
168 | $this->addCheckBox('pledge_frequency_unit', ts('Supported pledge frequencies'), | |
1314081f | 169 | CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE), |
6a488035 | 170 | NULL, NULL, NULL, NULL, |
1314081f | 171 | array(' ', ' ', ' ', '<br/>'), TRUE |
6a488035 TO |
172 | ); |
173 | $this->addElement('checkbox', 'is_pledge_interval', ts('Allow frequency intervals')); | |
174 | $this->addElement('text', 'initial_reminder_day', ts('Send payment reminder'), array('size' => 3)); | |
175 | $this->addElement('text', 'max_reminders', ts('Send up to'), array('size' => 3)); | |
176 | $this->addElement('text', 'additional_reminder_day', ts('Send additional reminders'), array('size' => 3)); | |
dccd9f4f ERL |
177 | if (!empty($futurePaymentProcessor)) { |
178 | // CRM-18854 | |
179 | $this->addElement('checkbox', 'adjust_recur_start_date', ts('Adjust Recurring Start Date'), NULL, | |
180 | array('onclick' => "showHideByValue('adjust_recur_start_date',true,'recurDefaults','table-row','radio',false);") | |
181 | ); | |
182 | $this->addDate('pledge_calendar_date', ts('Specific Calendar Date')); | |
183 | $month = CRM_Utils_Date::getCalendarDayOfMonth(); | |
184 | $this->add('select', 'pledge_calendar_month', ts('Specific day of Month'), $month); | |
185 | $pledgeDefaults = array( | |
186 | 'contribution_date' => ts('Day of Contribution'), | |
187 | 'calendar_date' => ts('Specific Calendar Date'), | |
188 | 'calendar_month' => ts('Specific day of Month'), | |
189 | ); | |
190 | $this->addRadio('pledge_default_toggle', ts('Recurring Contribution Start Date Default'), $pledgeDefaults, array('allowClear' => FALSE), '<br/><br/>'); | |
191 | $this->addElement('checkbox', 'is_pledge_start_date_visible', ts('Show Recurring Donation Start Date?'), NULL); | |
192 | $this->addElement('checkbox', 'is_pledge_start_date_editable', ts('Allow Edits to Recurring Donation Start date?'), NULL); | |
193 | } | |
6a488035 TO |
194 | } |
195 | ||
196 | //add currency element. | |
197 | $this->addCurrency('currency', ts('Currency')); | |
198 | ||
199 | $this->addFormRule(array('CRM_Contribute_Form_ContributionPage_Amount', 'formRule'), $this); | |
200 | ||
201 | parent::buildQuickForm(); | |
202 | } | |
203 | ||
204 | /** | |
c490a46a | 205 | * Set default values for the form. Note that in edit/view mode |
6a488035 TO |
206 | * the default values are retrieved from the database |
207 | * | |
6a488035 | 208 | * |
03110609 | 209 | * @return array |
6a488035 | 210 | */ |
00be9182 | 211 | public function setDefaultValues() { |
6a488035 | 212 | $defaults = parent::setDefaultValues(); |
6a488035 | 213 | |
a7488080 | 214 | if (empty($defaults['pay_later_text'])) { |
6a488035 TO |
215 | $defaults['pay_later_text'] = ts('I will send payment by check'); |
216 | } | |
217 | ||
a7488080 | 218 | if (!empty($defaults['amount_block_is_active'])) { |
6a488035 | 219 | |
9da8dc8c | 220 | if ($priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, NULL)) { |
221 | if ($isQuick = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config')) { | |
6a488035 | 222 | $this->assign('isQuick', $isQuick); |
9da8dc8c | 223 | //$priceField = CRM_Core_DAO::getFieldValue( 'CRM_Price_DAO_PriceField', $priceSetId, 'id', 'price_set_id' ); |
353ffa53 | 224 | $options = $pFIDs = array(); |
6a488035 | 225 | $priceFieldParams = array('price_set_id' => $priceSetId); |
353ffa53 TO |
226 | $priceFields = CRM_Core_DAO::commonRetrieveAll('CRM_Price_DAO_PriceField', 'price_set_id', $priceSetId, $pFIDs, $return = array( |
227 | 'html_type', | |
228 | 'name', | |
229 | 'is_active', | |
acb1052e | 230 | 'label', |
353ffa53 | 231 | )); |
6a488035 TO |
232 | foreach ($priceFields as $priceField) { |
233 | if ($priceField['id'] && $priceField['html_type'] == 'Radio' && $priceField['name'] == 'contribution_amount') { | |
234 | $defaults['price_field_id'] = $priceField['id']; | |
9da8dc8c | 235 | $priceFieldOptions = CRM_Price_BAO_PriceFieldValue::getValues($priceField['id'], $options, 'id', 1); |
5778c444 PN |
236 | if (empty($priceFieldOptions)) { |
237 | continue; | |
238 | } | |
6a488035 | 239 | $countRow = 0; |
5778c444 | 240 | $defaults['amount_label'] = $priceField['label']; |
6a488035 TO |
241 | foreach ($options as $optionId => $optionValue) { |
242 | $countRow++; | |
243 | $defaults['value'][$countRow] = $optionValue['amount']; | |
244 | $defaults['label'][$countRow] = CRM_Utils_Array::value('label', $optionValue); | |
245 | $defaults['name'][$countRow] = CRM_Utils_Array::value('name', $optionValue); | |
246 | $defaults['weight'][$countRow] = $optionValue['weight']; | |
247 | ||
248 | $defaults["price_field_value"][$countRow] = $optionValue['id']; | |
249 | if ($optionValue['is_default']) { | |
250 | $defaults['default'] = $countRow; | |
251 | } | |
252 | } | |
253 | } | |
254 | elseif ($priceField['id'] && $priceField['html_type'] == 'Text' && $priceField['name'] = 'other_amount' && $priceField['is_active']) { | |
255 | $defaults['price_field_other'] = $priceField['id']; | |
5778c444 PN |
256 | if (!isset($defaults['amount_label'])) { |
257 | $defaults['amount_label'] = $priceField['label']; | |
258 | } | |
6a488035 TO |
259 | } |
260 | } | |
261 | } | |
262 | } | |
263 | ||
a7488080 | 264 | if (empty($defaults['amount_label'])) { |
5778c444 PN |
265 | $defaults['amount_label'] = ts('Contribution Amount'); |
266 | } | |
da6b46f4 | 267 | |
a7488080 | 268 | if (!empty($defaults['value']) && is_array($defaults['value'])) { |
6a488035 TO |
269 | |
270 | // CRM-4038: fix value display | |
271 | foreach ($defaults['value'] as & $amount) { | |
272 | $amount = trim(CRM_Utils_Money::format($amount, ' ')); | |
273 | } | |
274 | } | |
275 | } | |
276 | ||
277 | // fix the display of the monetary value, CRM-4038 | |
278 | if (isset($defaults['min_amount'])) { | |
279 | $defaults['min_amount'] = CRM_Utils_Money::format($defaults['min_amount'], NULL, '%a'); | |
280 | } | |
281 | if (isset($defaults['max_amount'])) { | |
282 | $defaults['max_amount'] = CRM_Utils_Money::format($defaults['max_amount'], NULL, '%a'); | |
283 | } | |
284 | ||
a7488080 | 285 | if (!empty($defaults['payment_processor'])) { |
6a488035 | 286 | $defaults['payment_processor'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR, |
353ffa53 TO |
287 | $defaults['payment_processor'] |
288 | ), '1'); | |
6a488035 TO |
289 | } |
290 | return $defaults; | |
291 | } | |
292 | ||
293 | /** | |
fe482240 | 294 | * Global form rule. |
6a488035 | 295 | * |
014c4014 TO |
296 | * @param array $fields |
297 | * The input form values. | |
298 | * @param array $files | |
299 | * The uploaded files if any. | |
da6b46f4 EM |
300 | * @param $self |
301 | * | |
6a488035 | 302 | * |
72b3a70c CW |
303 | * @return bool|array |
304 | * true if no errors, else array of errors | |
6a488035 | 305 | */ |
00be9182 | 306 | public static function formRule($fields, $files, $self) { |
6a488035 TO |
307 | $errors = array(); |
308 | //as for separate membership payment we has to have | |
309 | //contribution amount section enabled, hence to disable it need to | |
310 | //check if separate membership payment enabled, | |
311 | //if so disable first separate membership payment option | |
312 | //then disable contribution amount section. CRM-3801, | |
313 | ||
314 | $membershipBlock = new CRM_Member_DAO_MembershipBlock(); | |
315 | $membershipBlock->entity_table = 'civicrm_contribution_page'; | |
316 | $membershipBlock->entity_id = $self->_id; | |
317 | $membershipBlock->is_active = 1; | |
318 | $hasMembershipBlk = FALSE; | |
319 | if ($membershipBlock->find(TRUE)) { | |
a7488080 | 320 | if (!empty($fields['amount_block_is_active']) && |
9da8dc8c | 321 | ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $self->_id, NULL, 1)) |
6a488035 | 322 | ) { |
9da8dc8c | 323 | $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends'); |
6a488035 TO |
324 | if ($extends && $extends == CRM_Core_Component::getComponentID('CiviMember')) { |
325 | $errors['amount_block_is_active'] = ts('You cannot use a Membership Price Set when the Contribution Amounts section is enabled. Click the Memberships tab above, and select your Membership Price Set on that form. Membership Price Sets may include additional fields for non-membership options that require an additional fee (e.g. magazine subscription) or an additional voluntary contribution.'); | |
326 | return $errors; | |
327 | } | |
328 | } | |
329 | $hasMembershipBlk = TRUE; | |
8cc574cf | 330 | if ($membershipBlock->is_separate_payment && empty($fields['amount_block_is_active'])) { |
6a488035 TO |
331 | $errors['amount_block_is_active'] = ts('To disable Contribution Amounts section you need to first disable Separate Membership Payment option from Membership Settings.'); |
332 | } | |
919e8652 | 333 | |
334 | //CRM-16165, Don't allow reccuring contribution if membership block contain any renewable membership option | |
335 | $membershipTypes = unserialize($membershipBlock->membership_types); | |
9cc96227 | 336 | if (!empty($fields['is_recur']) && !empty($membershipTypes)) { |
337 | if (!$membershipBlock->is_separate_payment) { | |
338 | $errors['is_recur'] = ts('You need to enable Separate Membership Payment when online contribution page is configured for both Membership and Recurring Contribution.'); | |
339 | } | |
340 | elseif (count(array_filter($membershipTypes)) != 0) { | |
341 | $errors['is_recur'] = ts('You cannot enable both Recurring Contributions and Auto-renew memberships on the same online contribution page.'); | |
342 | } | |
919e8652 | 343 | } |
6a488035 TO |
344 | } |
345 | ||
dccd9f4f ERL |
346 | // CRM-18854 Check if recurring start date is in the future. |
347 | if (CRM_Utils_Array::value('pledge_calendar_date', $fields)) { | |
348 | if (date('Ymd') > date('Ymd', strtotime($fields['pledge_calendar_date']))) { | |
349 | $errors['pledge_calendar_date'] = ts('The recurring start date cannot be prior to the current date.'); | |
350 | } | |
351 | } | |
352 | ||
b52a8f03 | 353 | //check for the amount label (mandatory) |
5a892338 | 354 | if (!empty($fields['amount_block_is_active']) && empty($fields['price_set_id']) && empty($fields['amount_label'])) { |
b52a8f03 PN |
355 | $errors['amount_label'] = ts('Please enter the contribution amount label.'); |
356 | } | |
6a488035 TO |
357 | $minAmount = CRM_Utils_Array::value('min_amount', $fields); |
358 | $maxAmount = CRM_Utils_Array::value('max_amount', $fields); | |
359 | if (!empty($minAmount) && !empty($maxAmount)) { | |
360 | $minAmount = CRM_Utils_Rule::cleanMoney($minAmount); | |
361 | $maxAmount = CRM_Utils_Rule::cleanMoney($maxAmount); | |
362 | if ((float ) $minAmount > (float ) $maxAmount) { | |
363 | $errors['min_amount'] = ts('Minimum Amount should be less than Maximum Amount'); | |
364 | } | |
365 | } | |
665e5ec7 | 366 | |
6a488035 TO |
367 | if (isset($fields['is_pay_later'])) { |
368 | if (empty($fields['pay_later_text'])) { | |
369 | $errors['pay_later_text'] = ts('Please enter the text for the \'pay later\' checkbox displayed on the contribution form.'); | |
370 | } | |
371 | if (empty($fields['pay_later_receipt'])) { | |
372 | $errors['pay_later_receipt'] = ts('Please enter the instructions to be sent to the contributor when they choose to \'pay later\'.'); | |
373 | } | |
374 | } | |
fd5bb3c3 YC |
375 | else { |
376 | if ($fields['amount_block_is_active'] && empty($fields['payment_processor'])) { | |
377 | $errors['payment_processor'] = ts('You have listed fixed contribution options or selected a price set, but no payment option has been selected. Please select at least one payment processor and/or enable the pay later option.'); | |
378 | } | |
379 | } | |
665e5ec7 | 380 | |
6a488035 TO |
381 | // don't allow price set w/ membership signup, CRM-5095 |
382 | if ($priceSetId = CRM_Utils_Array::value('price_set_id', $fields)) { | |
383 | // don't allow price set w/ membership. | |
384 | if ($hasMembershipBlk) { | |
385 | $errors['price_set_id'] = ts('You cannot enable both a Contribution Price Set and Membership Signup on the same online contribution page.'); | |
386 | } | |
387 | } | |
388 | else { | |
389 | if (isset($fields['is_recur'])) { | |
390 | if (empty($fields['recur_frequency_unit'])) { | |
391 | $errors['recur_frequency_unit'] = ts('At least one recurring frequency option needs to be checked.'); | |
392 | } | |
393 | } | |
394 | ||
395 | // validation for pledge fields. | |
a7488080 | 396 | if (!empty($fields['is_pledge_active'])) { |
6a488035 TO |
397 | if (empty($fields['pledge_frequency_unit'])) { |
398 | $errors['pledge_frequency_unit'] = ts('At least one pledge frequency option needs to be checked.'); | |
399 | } | |
a7488080 | 400 | if (!empty($fields['is_recur'])) { |
6a488035 TO |
401 | $errors['is_recur'] = ts('You cannot enable both Recurring Contributions AND Pledges on the same online contribution page.'); |
402 | } | |
403 | } | |
404 | ||
405 | // If Contribution amount section is enabled, then | |
03110609 | 406 | // Allow other amounts must be enabled OR the Fixed Contribution |
6a488035 | 407 | // Contribution options must contain at least one set of values. |
a7488080 CW |
408 | if (!empty($fields['amount_block_is_active'])) { |
409 | if (empty($fields['is_allow_other_amount']) && | |
6a488035 TO |
410 | !$priceSetId |
411 | ) { | |
412 | //get the values of amount block | |
413 | $values = CRM_Utils_Array::value('value', $fields); | |
414 | $isSetRow = FALSE; | |
415 | for ($i = 1; $i < self::NUM_OPTION; $i++) { | |
416 | if ((isset($values[$i]) && (strlen(trim($values[$i])) > 0))) { | |
417 | $isSetRow = TRUE; | |
418 | } | |
419 | } | |
420 | if (!$isSetRow) { | |
421 | $errors['amount_block_is_active'] = ts('If you want to enable the \'Contribution Amounts section\', you need to either \'Allow Other Amounts\' and/or enter at least one row in the \'Fixed Contribution Amounts\' table.'); | |
422 | } | |
423 | } | |
424 | } | |
425 | } | |
da6b46f4 | 426 | |
a7488080 | 427 | if (!empty($fields['payment_processor']) && $financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($self->_defaultValues['financial_type_id'])) { |
da6b46f4 | 428 | $errors['payment_processor'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType; |
3b67ab13 | 429 | } |
da6b46f4 | 430 | |
6a488035 TO |
431 | return $errors; |
432 | } | |
433 | ||
434 | /** | |
fe482240 | 435 | * Process the form. |
6a488035 TO |
436 | */ |
437 | public function postProcess() { | |
438 | // get the submitted form values. | |
439 | $params = $this->controller->exportValues($this->_name); | |
e45f6ab0 | 440 | |
d75f2f47 | 441 | //update 'is_billing_required' |
e45f6ab0 PB |
442 | if (empty($params['is_pay_later'])) { |
443 | $params['is_billing_required'] = 0; | |
444 | } | |
445 | ||
6a488035 TO |
446 | if (array_key_exists('payment_processor', $params)) { |
447 | if (array_key_exists(CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', 'AuthNet', | |
353ffa53 TO |
448 | 'id', 'payment_processor_type_id' |
449 | ), | |
450 | CRM_Utils_Array::value('payment_processor', $params) | |
451 | )) { | |
6a488035 TO |
452 | CRM_Core_Session::setStatus(ts(' Please note that the Authorize.net payment processor only allows recurring contributions and auto-renew memberships with payment intervals from 7-365 days or 1-12 months (i.e. not greater than 1 year).'), '', 'alert'); |
453 | } | |
454 | } | |
455 | ||
456 | // check for price set. | |
457 | $priceSetID = CRM_Utils_Array::value('price_set_id', $params); | |
458 | ||
459 | // get required fields. | |
460 | $fields = array( | |
461 | 'id' => $this->_id, | |
462 | 'is_recur' => FALSE, | |
463 | 'min_amount' => "null", | |
464 | 'max_amount' => "null", | |
465 | 'is_monetary' => FALSE, | |
466 | 'is_pay_later' => FALSE, | |
e45f6ab0 | 467 | 'is_billing_required' => FALSE, |
6a488035 TO |
468 | 'is_recur_interval' => FALSE, |
469 | 'is_recur_installments' => FALSE, | |
470 | 'recur_frequency_unit' => "null", | |
471 | 'default_amount_id' => "null", | |
472 | 'is_allow_other_amount' => FALSE, | |
473 | 'amount_block_is_active' => FALSE, | |
474 | ); | |
475 | $resetFields = array(); | |
476 | if ($priceSetID) { | |
477 | $resetFields = array('min_amount', 'max_amount', 'is_allow_other_amount'); | |
478 | } | |
479 | ||
a7488080 | 480 | if (empty($params['is_recur'])) { |
6a488035 TO |
481 | $resetFields = array_merge($resetFields, array('is_recur_interval', 'recur_frequency_unit')); |
482 | } | |
483 | ||
484 | foreach ($fields as $field => $defaultVal) { | |
485 | $val = CRM_Utils_Array::value($field, $params, $defaultVal); | |
486 | if (in_array($field, $resetFields)) { | |
487 | $val = $defaultVal; | |
488 | } | |
489 | ||
490 | if (in_array($field, array( | |
353ffa53 | 491 | 'min_amount', |
acb1052e | 492 | 'max_amount', |
353ffa53 | 493 | ))) { |
6a488035 TO |
494 | $val = CRM_Utils_Rule::cleanMoney($val); |
495 | } | |
496 | ||
497 | $params[$field] = $val; | |
498 | } | |
499 | ||
500 | if ($params['is_recur']) { | |
501 | $params['recur_frequency_unit'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, | |
502 | array_keys($params['recur_frequency_unit']) | |
503 | ); | |
504 | $params['is_recur_interval'] = CRM_Utils_Array::value('is_recur_interval', $params, FALSE); | |
505 | $params['is_recur_installments'] = CRM_Utils_Array::value('is_recur_installments', $params, FALSE); | |
506 | } | |
507 | ||
dccd9f4f ERL |
508 | if (CRM_Utils_Array::value('adjust_recur_start_date', $params)) { |
509 | $fieldValue = ''; | |
510 | $pledgeDateFields = array( | |
511 | 'calendar_date' => 'pledge_calendar_date', | |
512 | 'calendar_month' => 'pledge_calendar_month', | |
513 | ); | |
514 | if ($params['pledge_default_toggle'] == 'contribution_date') { | |
31fdc705 | 515 | $fieldValue = json_encode(array('contribution_date' => date('m/d/Y'))); |
dccd9f4f ERL |
516 | } |
517 | else { | |
518 | foreach ($pledgeDateFields as $key => $pledgeDateField) { | |
519 | if (CRM_Utils_Array::value($pledgeDateField, $params) && $params['pledge_default_toggle'] == $key) { | |
520 | $fieldValue = json_encode(array($key => $params[$pledgeDateField])); | |
521 | break; | |
522 | } | |
523 | } | |
524 | } | |
525 | $params['pledge_start_date'] = $fieldValue; | |
526 | } | |
527 | else { | |
528 | $params['pledge_start_date'] = ''; | |
529 | $params['adjust_recur_start_date'] = 0; | |
530 | $params['is_pledge_start_date_visible'] = 0; | |
531 | $params['is_pledge_start_date_editable'] = 0; | |
532 | } | |
533 | if (!CRM_Utils_Array::value('is_pledge_start_date_visible', $params)) { | |
534 | $params['is_pledge_start_date_visible'] = 0; | |
535 | } | |
536 | if (!CRM_Utils_Array::value('is_pledge_start_date_editable', $params)) { | |
537 | $params['is_pledge_start_date_editable'] = 0; | |
538 | } | |
539 | ||
6a488035 TO |
540 | if (array_key_exists('payment_processor', $params) && |
541 | !CRM_Utils_System::isNull($params['payment_processor']) | |
542 | ) { | |
543 | $params['payment_processor'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, array_keys($params['payment_processor'])); | |
544 | } | |
545 | else { | |
546 | $params['payment_processor'] = 'null'; | |
547 | } | |
548 | ||
549 | $contributionPage = CRM_Contribute_BAO_ContributionPage::create($params); | |
550 | $contributionPageID = $contributionPage->id; | |
551 | ||
552 | // prepare for data cleanup. | |
553 | $deleteAmountBlk = $deletePledgeBlk = $deletePriceSet = FALSE; | |
554 | if ($this->_priceSetID) { | |
555 | $deletePriceSet = TRUE; | |
556 | } | |
557 | if ($this->_pledgeBlockID) { | |
558 | $deletePledgeBlk = TRUE; | |
559 | } | |
560 | if (!empty($this->_amountBlock)) { | |
561 | $deleteAmountBlk = TRUE; | |
562 | } | |
563 | ||
564 | if ($contributionPageID) { | |
565 | ||
a7488080 | 566 | if (!empty($params['amount_block_is_active'])) { |
6a488035 TO |
567 | // handle price set. |
568 | if ($priceSetID) { | |
569 | // add/update price set. | |
570 | $deletePriceSet = FALSE; | |
8cc574cf | 571 | if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) { |
6a488035 TO |
572 | $deleteAmountBlk = TRUE; |
573 | } | |
574 | ||
9da8dc8c | 575 | CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageID, $priceSetID); |
6a488035 TO |
576 | } |
577 | else { | |
578 | ||
579 | $deletePriceSet = FALSE; | |
580 | // process contribution amount block | |
581 | $deleteAmountBlk = FALSE; | |
582 | ||
353ffa53 TO |
583 | $labels = CRM_Utils_Array::value('label', $params); |
584 | $values = CRM_Utils_Array::value('value', $params); | |
6a488035 TO |
585 | $default = CRM_Utils_Array::value('default', $params); |
586 | ||
587 | $options = array(); | |
588 | for ($i = 1; $i < self::NUM_OPTION; $i++) { | |
589 | if (isset($values[$i]) && | |
590 | (strlen(trim($values[$i])) > 0) | |
591 | ) { | |
874c9be7 | 592 | $options[] = array( |
353ffa53 | 593 | 'label' => trim($labels[$i]), |
6a488035 TO |
594 | 'value' => CRM_Utils_Rule::cleanMoney(trim($values[$i])), |
595 | 'weight' => $i, | |
596 | 'is_active' => 1, | |
597 | 'is_default' => $default == $i, | |
598 | ); | |
599 | } | |
600 | } | |
874c9be7 | 601 | /* || !empty($params['price_field_value']) || CRM_Utils_Array::value( 'price_field_other', $params )*/ |
8cc574cf | 602 | if (!empty($options) || !empty($params['is_allow_other_amount'])) { |
6a488035 TO |
603 | $fieldParams['is_quick_config'] = 1; |
604 | $noContriAmount = NULL; | |
9da8dc8c | 605 | $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3); |
8cc574cf | 606 | if (!(!empty($params['price_field_id']) || !empty($params['price_field_other'])) && !$usedPriceSetId) { |
6a488035 TO |
607 | $pageTitle = strtolower(CRM_Utils_String::munge($this->_values['title'], '_', 245)); |
608 | $setParams['title'] = $this->_values['title']; | |
9da8dc8c | 609 | if (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle, 'id', 'name')) { |
6a488035 | 610 | $setParams['name'] = $pageTitle; |
665e5ec7 | 611 | } |
9da8dc8c | 612 | elseif (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle . '_' . $this->_id, 'id', 'name')) { |
6a488035 TO |
613 | $setParams['name'] = $pageTitle . '_' . $this->_id; |
614 | } | |
615 | else { | |
874c9be7 | 616 | $timeSec = explode(".", microtime(TRUE)); |
6a488035 TO |
617 | $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1]; |
618 | } | |
619 | $setParams['is_quick_config'] = 1; | |
cc9b58f3 | 620 | $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values); |
6a488035 | 621 | $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute'); |
9da8dc8c | 622 | $priceSet = CRM_Price_BAO_PriceSet::create($setParams); |
6a488035 TO |
623 | $priceSetId = $priceSet->id; |
624 | } | |
8cc574cf | 625 | elseif ($usedPriceSetId && empty($params['price_field_id'])) { |
6a488035 TO |
626 | $priceSetId = $usedPriceSetId; |
627 | } | |
628 | else { | |
629 | if ($priceFieldId = CRM_Utils_Array::value('price_field_id', $params)) { | |
630 | foreach ($params['price_field_value'] as $arrayID => $fieldValueID) { | |
631 | if (empty($params['label'][$arrayID]) && empty($params['value'][$arrayID]) && !empty($fieldValueID)) { | |
9da8dc8c | 632 | CRM_Price_BAO_PriceFieldValue::setIsActive($fieldValueID, '0'); |
6a488035 TO |
633 | unset($params['price_field_value'][$arrayID]); |
634 | } | |
635 | } | |
636 | if (implode('', $params['price_field_value'])) { | |
637 | $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params); | |
638 | $fieldParams['option_id'] = $params['price_field_value']; | |
639 | } | |
640 | else { | |
641 | $noContriAmount = 0; | |
9da8dc8c | 642 | CRM_Price_BAO_PriceField::setIsActive($priceFieldId, '0'); |
6a488035 TO |
643 | } |
644 | } | |
a13f3d8c TO |
645 | else { |
646 | $priceFieldId = CRM_Utils_Array::value('price_field_other', $params); | |
874c9be7 | 647 | } |
9da8dc8c | 648 | $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id'); |
6a488035 | 649 | } |
9da8dc8c | 650 | CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $this->_id, $priceSetId); |
6a488035 TO |
651 | if (!empty($options)) { |
652 | $editedFieldParams = array( | |
5778c444 PN |
653 | 'price_set_id' => $priceSetId, |
654 | 'name' => 'contribution_amount', | |
655 | ); | |
6a488035 TO |
656 | $editedResults = array(); |
657 | $noContriAmount = 1; | |
9da8dc8c | 658 | CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults); |
a7488080 | 659 | if (empty($editedResults['id'])) { |
6a488035 | 660 | $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245)); |
6a488035 TO |
661 | } |
662 | else { | |
663 | $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults); | |
664 | } | |
665 | ||
666 | $fieldParams['price_set_id'] = $priceSetId; | |
667 | $fieldParams['is_active'] = 1; | |
668 | $fieldParams['weight'] = 2; | |
669 | ||
a7488080 | 670 | if (!empty($params['is_allow_other_amount'])) { |
6a488035 TO |
671 | $fieldParams['is_required'] = 0; |
672 | } | |
673 | else { | |
674 | $fieldParams['is_required'] = 1; | |
675 | } | |
5778c444 | 676 | $fieldParams['label'] = $params['amount_label']; |
6a488035 TO |
677 | $fieldParams['html_type'] = 'Radio'; |
678 | $fieldParams['option_label'] = $params['label']; | |
679 | $fieldParams['option_amount'] = $params['value']; | |
680 | $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values); | |
681 | foreach ($options as $value) { | |
682 | $fieldParams['option_weight'][$value['weight']] = $value['weight']; | |
683 | } | |
684 | $fieldParams['default_option'] = $params['default']; | |
9da8dc8c | 685 | $priceField = CRM_Price_BAO_PriceField::create($fieldParams); |
6a488035 | 686 | } |
8cc574cf | 687 | if (!empty($params['is_allow_other_amount']) && empty($params['price_field_other'])) { |
6a488035 | 688 | $editedFieldParams = array( |
353ffa53 TO |
689 | 'price_set_id' => $priceSetId, |
690 | 'name' => 'other_amount', | |
6a488035 TO |
691 | ); |
692 | $editedResults = array(); | |
693 | ||
9da8dc8c | 694 | CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults); |
da6b46f4 | 695 | |
6a488035 | 696 | if (!$priceFieldID = CRM_Utils_Array::value('id', $editedResults)) { |
665e5ec7 | 697 | $fieldParams = array( |
6a488035 | 698 | 'name' => 'other_amount', |
6b7385f4 | 699 | 'label' => ts('Other Amount'), |
6a488035 TO |
700 | 'price_set_id' => $priceSetId, |
701 | 'html_type' => 'Text', | |
702 | 'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $this->_values), | |
703 | 'is_display_amounts' => 0, | |
704 | 'weight' => 3, | |
705 | ); | |
706 | $fieldParams['option_weight'][1] = 1; | |
707 | $fieldParams['option_amount'][1] = 1; | |
708 | if (!$noContriAmount) { | |
709 | $fieldParams['is_required'] = 1; | |
5778c444 | 710 | $fieldParams['option_label'][1] = $fieldParams['label'] = $params['amount_label']; |
da6b46f4 | 711 | } |
5778c444 | 712 | else { |
6a488035 | 713 | $fieldParams['is_required'] = 0; |
6b7385f4 | 714 | $fieldParams['option_label'][1] = $fieldParams['label'] = ts('Other Amount'); |
6a488035 TO |
715 | } |
716 | ||
9da8dc8c | 717 | $priceField = CRM_Price_BAO_PriceField::create($fieldParams); |
da6b46f4 | 718 | } |
5778c444 | 719 | else { |
a7488080 | 720 | if (empty($editedResults['is_active'])) { |
ff5f7956 | 721 | $fieldParams = $editedResults; |
5778c444 PN |
722 | if (!$noContriAmount) { |
723 | $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id'); | |
724 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']); | |
725 | $fieldParams = array( | |
726 | 'is_required' => 1, | |
727 | 'label' => $params['amount_label'], | |
728 | 'id' => $priceFieldID, | |
729 | ); | |
730 | } | |
731 | $fieldParams['is_active'] = 1; | |
732 | $priceField = CRM_Price_BAO_PriceField::add($fieldParams); | |
6a488035 TO |
733 | } |
734 | } | |
da6b46f4 | 735 | } |
8cc574cf | 736 | elseif (empty($params['is_allow_other_amount']) && !empty($params['price_field_other'])) { |
9da8dc8c | 737 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0'); |
da6b46f4 | 738 | } |
5778c444 PN |
739 | elseif ($priceFieldID = CRM_Utils_Array::value('price_field_other', $params)) { |
740 | $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id'); | |
6a488035 | 741 | if (!$noContriAmount) { |
5778c444 PN |
742 | $fieldParams = array( |
743 | 'is_required' => 1, | |
744 | 'label' => $params['amount_label'], | |
745 | 'id' => $priceFieldID, | |
746 | ); | |
747 | CRM_Price_BAO_PriceField::add($fieldParams); | |
748 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']); | |
da6b46f4 | 749 | } |
5778c444 | 750 | else { |
481a74f4 | 751 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceField', $priceFieldID, 'is_required', 0); |
6b7385f4 | 752 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', ts('Other Amount')); |
6a488035 TO |
753 | } |
754 | } | |
755 | } | |
756 | ||
a7488080 | 757 | if (!empty($params['is_pledge_active'])) { |
6a488035 TO |
758 | $deletePledgeBlk = FALSE; |
759 | $pledgeBlockParams = array( | |
760 | 'entity_id' => $contributionPageID, | |
761 | 'entity_table' => ts('civicrm_contribution_page'), | |
762 | ); | |
763 | if ($this->_pledgeBlockID) { | |
764 | $pledgeBlockParams['id'] = $this->_pledgeBlockID; | |
765 | } | |
766 | $pledgeBlock = array( | |
353ffa53 TO |
767 | 'pledge_frequency_unit', |
768 | 'max_reminders', | |
769 | 'initial_reminder_day', | |
770 | 'additional_reminder_day', | |
dccd9f4f ERL |
771 | 'pledge_start_date', |
772 | 'is_pledge_start_date_visible', | |
773 | 'is_pledge_start_date_editable', | |
6a488035 TO |
774 | ); |
775 | foreach ($pledgeBlock as $key) { | |
776 | $pledgeBlockParams[$key] = CRM_Utils_Array::value($key, $params); | |
777 | } | |
778 | $pledgeBlockParams['is_pledge_interval'] = CRM_Utils_Array::value('is_pledge_interval', | |
779 | $params, FALSE | |
780 | ); | |
dccd9f4f ERL |
781 | $pledgeBlockParams['pledge_start_date'] = CRM_Utils_Array::value('pledge_start_date', |
782 | $params, FALSE | |
783 | ); | |
6a488035 TO |
784 | // create pledge block. |
785 | CRM_Pledge_BAO_PledgeBlock::create($pledgeBlockParams); | |
786 | } | |
787 | } | |
788 | } | |
789 | else { | |
8cc574cf | 790 | if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) { |
9da8dc8c | 791 | $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3); |
6a488035 | 792 | if ($usedPriceSetId) { |
a7488080 | 793 | if (!empty($params['price_field_id'])) { |
9da8dc8c | 794 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_id'], '0'); |
6a488035 | 795 | } |
a7488080 | 796 | if (!empty($params['price_field_other'])) { |
9da8dc8c | 797 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0'); |
6a488035 TO |
798 | } |
799 | } | |
800 | else { | |
801 | $deleteAmountBlk = TRUE; | |
802 | $deletePriceSet = TRUE; | |
803 | } | |
804 | } | |
805 | } | |
806 | ||
807 | // delete pledge block. | |
808 | if ($deletePledgeBlk) { | |
809 | CRM_Pledge_BAO_PledgeBlock::deletePledgeBlock($this->_pledgeBlockID); | |
810 | } | |
811 | ||
812 | // delete previous price set. | |
813 | if ($deletePriceSet) { | |
9da8dc8c | 814 | CRM_Price_BAO_PriceSet::removeFrom('civicrm_contribution_page', $contributionPageID); |
6a488035 | 815 | } |
665e5ec7 | 816 | |
481a74f4 | 817 | if ($deleteAmountBlk) { |
874c9be7 | 818 | $priceField = !empty($params['price_field_id']) ? $params['price_field_id'] : CRM_Utils_Array::value('price_field_other', $params); |
6a488035 | 819 | if ($priceField) { |
9da8dc8c | 820 | $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceField, 'price_set_id'); |
874c9be7 | 821 | CRM_Price_BAO_PriceSet::setIsQuickConfig($priceSetID, 0); |
6a488035 TO |
822 | } |
823 | } | |
824 | } | |
825 | parent::endPostProcess(); | |
826 | } | |
827 | ||
828 | /** | |
829 | * Return a descriptive name for the page, used in wizard header | |
830 | * | |
831 | * @return string | |
6a488035 TO |
832 | */ |
833 | public function getTitle() { | |
834 | return ts('Amounts'); | |
835 | } | |
96025800 | 836 | |
6a488035 | 837 | } |