Merge pull request #11821 from michaelmcandrew/500-http-response-code
[civicrm-core.git] / CRM / Contribute / Form / ContributionPage / Amount.php
CommitLineData
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 */
37class 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('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<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('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<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('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<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}