Merge pull request #13241 from seamuslee001/561_schedule_reminders
[civicrm-core.git] / CRM / Contribute / Form / ContributionPage / Amount.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
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 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2019
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 /**
40 * Contribution amount block.
41 *
42 * @var array
43 */
44 protected $_amountBlock = array();
45
46 /**
47 * Constants for number of options for data types of multiple option.
48 */
49 const NUM_OPTION = 11;
50
51 /**
52 * Build the form object.
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
64 //CRM-12055
65 $this->add('text', 'amount_label', ts('Contribution Amounts Label'));
66
67 $default = array($this->createElement('radio', NULL, NULL, NULL, 0));
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
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 }
104 }
105 }
106 if (count($recurringPaymentProcessor)) {
107 $this->assign('recurringPaymentProcessor', $recurringPaymentProcessor);
108 }
109 if (count($futurePaymentProcessor)) {
110 $this->assign('futurePaymentProcessor', $futurePaymentProcessor);
111 }
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
122 //check if selected payment processor supports recurring payment
123 if (!empty($recurringPaymentProcessor)) {
124 $this->addElement('checkbox', 'is_recur', ts('Recurring Contributions'), NULL,
125 array('onclick' => "showHideByValue('is_recur',true,'recurFields','table-row','radio',false);")
126 );
127 $this->addCheckBox('recur_frequency_unit', ts('Supported recurring units'),
128 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE),
129 NULL, NULL, NULL, NULL,
130 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>'), TRUE
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 );
142 $this->add('wysiwyg', 'pay_later_receipt', ts('Pay Later Instructions'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_receipt'));
143 $this->addElement('checkbox', 'is_billing_required', ts('Billing address required'));
144
145 //add partial payment options
146
147 // add price set fields
148 $price = CRM_Price_BAO_PriceSet::getAssoc(FALSE, 'CiviContribute');
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(
157 '' => ts('- none -'),
158 ) + $price,
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'),
169 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE),
170 NULL, NULL, NULL, NULL,
171 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>'), TRUE
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));
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 }
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 /**
205 * Set default values for the form. Note that in edit/view mode
206 * the default values are retrieved from the database
207 *
208 *
209 * @return array
210 */
211 public function setDefaultValues() {
212 $defaults = parent::setDefaultValues();
213
214 if (empty($defaults['pay_later_text'])) {
215 $defaults['pay_later_text'] = ts('I will send payment by check');
216 }
217
218 if (!empty($defaults['amount_block_is_active'])) {
219
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')) {
222 $this->assign('isQuick', $isQuick);
223 //$priceField = CRM_Core_DAO::getFieldValue( 'CRM_Price_DAO_PriceField', $priceSetId, 'id', 'price_set_id' );
224 $options = $pFIDs = array();
225 $priceFieldParams = array('price_set_id' => $priceSetId);
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',
230 'label',
231 ));
232 foreach ($priceFields as $priceField) {
233 if ($priceField['id'] && $priceField['html_type'] == 'Radio' && $priceField['name'] == 'contribution_amount') {
234 $defaults['price_field_id'] = $priceField['id'];
235 $priceFieldOptions = CRM_Price_BAO_PriceFieldValue::getValues($priceField['id'], $options, 'id', 1);
236 if (empty($priceFieldOptions)) {
237 continue;
238 }
239 $countRow = 0;
240 $defaults['amount_label'] = $priceField['label'];
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'];
256 if (!isset($defaults['amount_label'])) {
257 $defaults['amount_label'] = $priceField['label'];
258 }
259 }
260 }
261 }
262 }
263
264 if (empty($defaults['amount_label'])) {
265 $defaults['amount_label'] = ts('Contribution Amount');
266 }
267
268 if (!empty($defaults['value']) && is_array($defaults['value'])) {
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
285 if (!empty($defaults['payment_processor'])) {
286 $defaults['payment_processor'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR,
287 $defaults['payment_processor']
288 ), '1');
289 }
290 return $defaults;
291 }
292
293 /**
294 * Global form rule.
295 *
296 * @param array $fields
297 * The input form values.
298 * @param array $files
299 * The uploaded files if any.
300 * @param $self
301 *
302 *
303 * @return bool|array
304 * true if no errors, else array of errors
305 */
306 public static function formRule($fields, $files, $self) {
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)) {
320 if (!empty($fields['amount_block_is_active']) &&
321 ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $self->_id, NULL, 1))
322 ) {
323 $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends');
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;
330 if ($membershipBlock->is_separate_payment && empty($fields['amount_block_is_active'])) {
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 }
333
334 //CRM-16165, Don't allow reccuring contribution if membership block contain any renewable membership option
335 $membershipTypes = unserialize($membershipBlock->membership_types);
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 }
343 }
344 }
345
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
353 //check for the amount label (mandatory)
354 if (!empty($fields['amount_block_is_active']) && empty($fields['price_set_id']) && empty($fields['amount_label'])) {
355 $errors['amount_label'] = ts('Please enter the contribution amount label.');
356 }
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 }
366
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 }
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 }
380
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.
396 if (!empty($fields['is_pledge_active'])) {
397 if (empty($fields['pledge_frequency_unit'])) {
398 $errors['pledge_frequency_unit'] = ts('At least one pledge frequency option needs to be checked.');
399 }
400 if (!empty($fields['is_recur'])) {
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
406 // Allow other amounts must be enabled OR the Fixed Contribution
407 // Contribution options must contain at least one set of values.
408 if (!empty($fields['amount_block_is_active'])) {
409 if (empty($fields['is_allow_other_amount']) &&
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 }
426
427 if (!empty($fields['payment_processor']) && $financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($self->_defaultValues['financial_type_id'])) {
428 $errors['payment_processor'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType;
429 }
430
431 return $errors;
432 }
433
434 /**
435 * Process the form.
436 */
437 public function postProcess() {
438 // get the submitted form values.
439 $params = $this->controller->exportValues($this->_name);
440
441 //update 'is_billing_required'
442 if (empty($params['is_pay_later'])) {
443 $params['is_billing_required'] = 0;
444 }
445
446 if (array_key_exists('payment_processor', $params)) {
447 if (array_key_exists(CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', 'AuthNet',
448 'id', 'payment_processor_type_id'
449 ),
450 CRM_Utils_Array::value('payment_processor', $params)
451 )) {
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,
467 'is_billing_required' => FALSE,
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
480 if (empty($params['is_recur'])) {
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(
491 'min_amount',
492 'max_amount',
493 ))) {
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
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') {
515 $fieldValue = json_encode(array('contribution_date' => date('m/d/Y')));
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
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
566 if (!empty($params['amount_block_is_active'])) {
567 // handle price set.
568 if ($priceSetID) {
569 // add/update price set.
570 $deletePriceSet = FALSE;
571 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
572 $deleteAmountBlk = TRUE;
573 }
574
575 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageID, $priceSetID);
576 }
577 else {
578
579 $deletePriceSet = FALSE;
580 // process contribution amount block
581 $deleteAmountBlk = FALSE;
582
583 $labels = CRM_Utils_Array::value('label', $params);
584 $values = CRM_Utils_Array::value('value', $params);
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 ) {
592 $options[] = array(
593 'label' => trim($labels[$i]),
594 'value' => CRM_Utils_Rule::cleanMoney(trim($values[$i])),
595 'weight' => $i,
596 'is_active' => 1,
597 'is_default' => $default == $i,
598 );
599 }
600 }
601 /* || !empty($params['price_field_value']) || CRM_Utils_Array::value( 'price_field_other', $params )*/
602 if (!empty($options) || !empty($params['is_allow_other_amount'])) {
603 $fieldParams['is_quick_config'] = 1;
604 $noContriAmount = NULL;
605 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
606 if (!(!empty($params['price_field_id']) || !empty($params['price_field_other'])) && !$usedPriceSetId) {
607 $pageTitle = strtolower(CRM_Utils_String::munge($this->_values['title'], '_', 245));
608 $setParams['title'] = $this->_values['title'];
609 if (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle, 'id', 'name')) {
610 $setParams['name'] = $pageTitle;
611 }
612 elseif (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle . '_' . $this->_id, 'id', 'name')) {
613 $setParams['name'] = $pageTitle . '_' . $this->_id;
614 }
615 else {
616 $timeSec = explode(".", microtime(TRUE));
617 $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1];
618 }
619 $setParams['is_quick_config'] = 1;
620 $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
621 $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute');
622 $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
623 $priceSetId = $priceSet->id;
624 }
625 elseif ($usedPriceSetId && empty($params['price_field_id'])) {
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)) {
632 CRM_Price_BAO_PriceFieldValue::setIsActive($fieldValueID, '0');
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;
642 CRM_Price_BAO_PriceField::setIsActive($priceFieldId, '0');
643 }
644 }
645 else {
646 $priceFieldId = CRM_Utils_Array::value('price_field_other', $params);
647 }
648 $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id');
649 }
650 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $this->_id, $priceSetId);
651 if (!empty($options)) {
652 $editedFieldParams = array(
653 'price_set_id' => $priceSetId,
654 'name' => 'contribution_amount',
655 );
656 $editedResults = array();
657 $noContriAmount = 1;
658 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
659 if (empty($editedResults['id'])) {
660 $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245));
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
670 if (!empty($params['is_allow_other_amount'])) {
671 $fieldParams['is_required'] = 0;
672 }
673 else {
674 $fieldParams['is_required'] = 1;
675 }
676 $fieldParams['label'] = $params['amount_label'];
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'];
685 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
686 }
687 if (!empty($params['is_allow_other_amount']) && empty($params['price_field_other'])) {
688 $editedFieldParams = array(
689 'price_set_id' => $priceSetId,
690 'name' => 'other_amount',
691 );
692 $editedResults = array();
693
694 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
695
696 if (!$priceFieldID = CRM_Utils_Array::value('id', $editedResults)) {
697 $fieldParams = array(
698 'name' => 'other_amount',
699 'label' => ts('Other Amount'),
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;
710 $fieldParams['option_label'][1] = $fieldParams['label'] = $params['amount_label'];
711 }
712 else {
713 $fieldParams['is_required'] = 0;
714 $fieldParams['option_label'][1] = $fieldParams['label'] = ts('Other Amount');
715 }
716
717 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
718 }
719 else {
720 if (empty($editedResults['is_active'])) {
721 $fieldParams = $editedResults;
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);
733 }
734 }
735 }
736 elseif (empty($params['is_allow_other_amount']) && !empty($params['price_field_other'])) {
737 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
738 }
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');
741 if (!$noContriAmount) {
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']);
749 }
750 else {
751 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceField', $priceFieldID, 'is_required', 0);
752 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', ts('Other Amount'));
753 }
754 }
755 }
756
757 if (!empty($params['is_pledge_active'])) {
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(
767 'pledge_frequency_unit',
768 'max_reminders',
769 'initial_reminder_day',
770 'additional_reminder_day',
771 'pledge_start_date',
772 'is_pledge_start_date_visible',
773 'is_pledge_start_date_editable',
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 );
781 $pledgeBlockParams['pledge_start_date'] = CRM_Utils_Array::value('pledge_start_date',
782 $params, FALSE
783 );
784 // create pledge block.
785 CRM_Pledge_BAO_PledgeBlock::create($pledgeBlockParams);
786 }
787 }
788 }
789 else {
790 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
791 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
792 if ($usedPriceSetId) {
793 if (!empty($params['price_field_id'])) {
794 CRM_Price_BAO_PriceField::setIsActive($params['price_field_id'], '0');
795 }
796 if (!empty($params['price_field_other'])) {
797 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
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) {
814 CRM_Price_BAO_PriceSet::removeFrom('civicrm_contribution_page', $contributionPageID);
815 }
816
817 if ($deleteAmountBlk) {
818 $priceField = !empty($params['price_field_id']) ? $params['price_field_id'] : CRM_Utils_Array::value('price_field_other', $params);
819 if ($priceField) {
820 $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceField, 'price_set_id');
821 CRM_Price_BAO_PriceSet::setIsQuickConfig($priceSetID, 0);
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
832 */
833 public function getTitle() {
834 return ts('Amounts');
835 }
836
837 }