bulk comment fix
[civicrm-core.git] / CRM / Contribute / Form / ContributionPage / Amount.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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-2014
32 * $Id$
33 *
34 */
35
36 /**
37 * form to process actions on the group aspect of Custom Data
38 */
39 class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_ContributionPage {
40
41 /**
42 * contribution amount block.
43 *
44 * @var array
45 * @access protected
46 */
47 protected $_amountBlock = array();
48
49 /**
50 * Constants for number of options for data types of multiple option.
51 */
52 CONST NUM_OPTION = 11;
53
54 /**
55 * Function to actually build the form
56 *
57 * @return void
58 * @access public
59 */
60 public function buildQuickForm() {
61
62 // do u want to allow a free form text field for amount
63 $this->addElement('checkbox', 'is_allow_other_amount', ts('Allow other amounts'), NULL, array('onclick' => "minMax(this);showHideAmountBlock( this, 'is_allow_other_amount' );"));
64 $this->add('text', 'min_amount', ts('Minimum Amount'), array('size' => 8, 'maxlength' => 8));
65 $this->addRule('min_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('9.99', ' '))), 'money');
66
67 $this->add('text', 'max_amount', ts('Maximum Amount'), array('size' => 8, 'maxlength' => 8));
68 $this->addRule('max_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money');
69
70 //CRM-12055
71 $this->add('text', 'amount_label', ts('Contribution Amounts Label'));
72
73 $default = array($this->createElement('radio', NULL, NULL, NULL, 0));
74 $this->add('hidden', "price_field_id", '', array('id' => "price_field_id"));
75 $this->add('hidden', "price_field_other", '', array('id' => "price_field_option"));
76 for ($i = 1; $i <= self::NUM_OPTION; $i++) {
77 // label
78 $this->add('text', "label[$i]", ts('Label'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'label'));
79
80 $this->add('hidden', "price_field_value[$i]", '', array('id' => "price_field_value[$i]"));
81
82 // value
83 $this->add('text', "value[$i]", ts('Value'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'value'));
84 $this->addRule("value[$i]", ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money');
85
86 // default
87 $default[] = $this->createElement('radio', NULL, NULL, NULL, $i);
88 }
89
90 $this->addGroup($default, 'default');
91
92 $this->addElement('checkbox', 'amount_block_is_active', ts('Contribution Amounts section enabled'), NULL, array('onclick' => "showHideAmountBlock( this, 'amount_block_is_active' );"));
93
94 $this->addElement('checkbox', 'is_monetary', ts('Execute real-time monetary transactions'));
95
96 $paymentProcessor = CRM_Core_PseudoConstant::paymentProcessor();
97 $recurringPaymentProcessor = array();
98
99 if (!empty($paymentProcessor)) {
100 $paymentProcessorIds = implode(',', array_keys($paymentProcessor));
101 $query = "
102 SELECT id
103 FROM civicrm_payment_processor
104 WHERE id IN ({$paymentProcessorIds})
105 AND is_recur = 1";
106 $dao = CRM_Core_DAO::executeQuery($query);
107 while ($dao->fetch()) {
108 $recurringPaymentProcessor[] = $dao->id;
109 }
110 }
111 $this->assign('recurringPaymentProcessor', $recurringPaymentProcessor);
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
123 //check if selected payment processor supports recurring payment
124 if (!empty($recurringPaymentProcessor)) {
125 $this->addElement('checkbox', 'is_recur', ts('Recurring contributions'), NULL,
126 array('onclick' => "showHideByValue('is_recur',true,'recurFields','table-row','radio',false);")
127 );
128 $this->addCheckBox('recur_frequency_unit', ts('Supported recurring units'),
129 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, FALSE, NULL, 'name'),
130 NULL, NULL, NULL, NULL,
131 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>')
132 );
133 $this->addElement('checkbox', 'is_recur_interval', ts('Support recurring intervals'));
134 $this->addElement('checkbox', 'is_recur_installments', ts('Offer installments'));
135 }
136
137 // add pay later options
138 $this->addElement('checkbox', 'is_pay_later', ts('Pay later option'), NULL);
139 $this->addElement('textarea', 'pay_later_text', ts('Pay later label'),
140 CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_text'),
141 FALSE
142 );
143 $this->addWysiwyg('pay_later_receipt', ts('Pay Later Instructions'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_receipt'));
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 -')) + $price,
158 NULL, array('onchange' => "showHideAmountBlock( this.value, 'price_set_id' );")
159 );
160 //CiviPledge fields.
161 $config = CRM_Core_Config::singleton();
162 if (in_array('CiviPledge', $config->enableComponents)) {
163 $this->assign('civiPledge', TRUE);
164 $this->addElement('checkbox', 'is_pledge_active', ts('Pledges'),
165 NULL, array('onclick' => "showHideAmountBlock( this, 'is_pledge_active' ); return showHideByValue('is_pledge_active',true,'pledgeFields','table-row','radio',false);")
166 );
167 $this->addCheckBox('pledge_frequency_unit', ts('Supported pledge frequencies'),
168 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, FALSE, NULL, 'name'),
169 NULL, NULL, NULL, NULL,
170 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>')
171 );
172 $this->addElement('checkbox', 'is_pledge_interval', ts('Allow frequency intervals'));
173 $this->addElement('text', 'initial_reminder_day', ts('Send payment reminder'), array('size' => 3));
174 $this->addElement('text', 'max_reminders', ts('Send up to'), array('size' => 3));
175 $this->addElement('text', 'additional_reminder_day', ts('Send additional reminders'), array('size' => 3));
176 }
177
178 //add currency element.
179 $this->addCurrency('currency', ts('Currency'));
180
181 $this->addFormRule(array('CRM_Contribute_Form_ContributionPage_Amount', 'formRule'), $this);
182
183 parent::buildQuickForm();
184 }
185
186 /**
187 * This function sets the default values for the form. Note that in edit/view mode
188 * the default values are retrieved from the database
189 *
190 * @access public
191 *
192 * @return void
193 */
194 function setDefaultValues() {
195 $defaults = parent::setDefaultValues();
196 $title = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionPage', $this->_id, 'title');
197 CRM_Utils_System::setTitle(ts('Contribution Amounts (%1)', array(1 => $title)));
198
199 if (empty($defaults['pay_later_text'])) {
200 $defaults['pay_later_text'] = ts('I will send payment by check');
201 }
202
203 if (!empty($defaults['amount_block_is_active'])) {
204
205 if ($priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, NULL)) {
206 if ($isQuick = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config')) {
207 $this->assign('isQuick', $isQuick);
208 //$priceField = CRM_Core_DAO::getFieldValue( 'CRM_Price_DAO_PriceField', $priceSetId, 'id', 'price_set_id' );
209 $options = $pFIDs = array();
210 $priceFieldParams = array('price_set_id' => $priceSetId);
211 $priceFields = CRM_Core_DAO::commonRetrieveAll('CRM_Price_DAO_PriceField', 'price_set_id', $priceSetId, $pFIDs, $return = array('html_type', 'name', 'is_active', 'label'));
212 foreach ($priceFields as $priceField) {
213 if ($priceField['id'] && $priceField['html_type'] == 'Radio' && $priceField['name'] == 'contribution_amount') {
214 $defaults['price_field_id'] = $priceField['id'];
215 $priceFieldOptions = CRM_Price_BAO_PriceFieldValue::getValues($priceField['id'], $options, 'id', 1);
216 if (empty($priceFieldOptions)) {
217 continue;
218 }
219 $countRow = 0;
220 $defaults['amount_label'] = $priceField['label'];
221 foreach ($options as $optionId => $optionValue) {
222 $countRow++;
223 $defaults['value'][$countRow] = $optionValue['amount'];
224 $defaults['label'][$countRow] = CRM_Utils_Array::value('label', $optionValue);
225 $defaults['name'][$countRow] = CRM_Utils_Array::value('name', $optionValue);
226 $defaults['weight'][$countRow] = $optionValue['weight'];
227
228 $defaults["price_field_value"][$countRow] = $optionValue['id'];
229 if ($optionValue['is_default']) {
230 $defaults['default'] = $countRow;
231 }
232 }
233 }
234 elseif ($priceField['id'] && $priceField['html_type'] == 'Text' && $priceField['name'] = 'other_amount' && $priceField['is_active']) {
235 $defaults['price_field_other'] = $priceField['id'];
236 if (!isset($defaults['amount_label'])) {
237 $defaults['amount_label'] = $priceField['label'];
238 }
239 }
240 }
241 }
242 }
243
244 if (empty($defaults['amount_label'])) {
245 $defaults['amount_label'] = ts('Contribution Amount');
246 }
247
248 if (!empty($defaults['value']) && is_array($defaults['value'])) {
249
250 // CRM-4038: fix value display
251 foreach ($defaults['value'] as & $amount) {
252 $amount = trim(CRM_Utils_Money::format($amount, ' '));
253 }
254 }
255 }
256
257 // fix the display of the monetary value, CRM-4038
258 if (isset($defaults['min_amount'])) {
259 $defaults['min_amount'] = CRM_Utils_Money::format($defaults['min_amount'], NULL, '%a');
260 }
261 if (isset($defaults['max_amount'])) {
262 $defaults['max_amount'] = CRM_Utils_Money::format($defaults['max_amount'], NULL, '%a');
263 }
264
265 if (!empty($defaults['payment_processor'])) {
266 $defaults['payment_processor'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR,
267 $defaults['payment_processor']
268 ), '1');
269 }
270 return $defaults;
271 }
272
273 /**
274 * global form rule
275 *
276 * @param array $fields the input form values
277 * @param array $files the uploaded files if any
278 * @param $self
279 *
280 * @internal param array $options additional user data
281 *
282 * @return true if no errors, else array of errors
283 * @access public
284 * @static
285 */
286 static function formRule($fields, $files, $self) {
287 $errors = array();
288 //as for separate membership payment we has to have
289 //contribution amount section enabled, hence to disable it need to
290 //check if separate membership payment enabled,
291 //if so disable first separate membership payment option
292 //then disable contribution amount section. CRM-3801,
293
294 $membershipBlock = new CRM_Member_DAO_MembershipBlock();
295 $membershipBlock->entity_table = 'civicrm_contribution_page';
296 $membershipBlock->entity_id = $self->_id;
297 $membershipBlock->is_active = 1;
298 $hasMembershipBlk = FALSE;
299 if ($membershipBlock->find(TRUE)) {
300 if (!empty($fields['amount_block_is_active']) &&
301 ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $self->_id, NULL, 1))
302 ) {
303 $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends');
304 if ($extends && $extends == CRM_Core_Component::getComponentID('CiviMember')) {
305 $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.');
306 return $errors;
307 }
308 }
309 $hasMembershipBlk = TRUE;
310 if ($membershipBlock->is_separate_payment && empty($fields['amount_block_is_active'])) {
311 $errors['amount_block_is_active'] = ts('To disable Contribution Amounts section you need to first disable Separate Membership Payment option from Membership Settings.');
312 }
313 }
314
315 //check for the amount label (mandatory)
316 if (!empty($fields['amount_block_is_active']) && empty($fields['amount_label'])) {
317 $errors['amount_label'] = ts('Please enter the contribution amount label.');
318 }
319 $minAmount = CRM_Utils_Array::value('min_amount', $fields);
320 $maxAmount = CRM_Utils_Array::value('max_amount', $fields);
321 if (!empty($minAmount) && !empty($maxAmount)) {
322 $minAmount = CRM_Utils_Rule::cleanMoney($minAmount);
323 $maxAmount = CRM_Utils_Rule::cleanMoney($maxAmount);
324 if ((float ) $minAmount > (float ) $maxAmount) {
325 $errors['min_amount'] = ts('Minimum Amount should be less than Maximum Amount');
326 }
327 }
328
329 if (isset($fields['is_pay_later'])) {
330 if (empty($fields['pay_later_text'])) {
331 $errors['pay_later_text'] = ts('Please enter the text for the \'pay later\' checkbox displayed on the contribution form.');
332 }
333 if (empty($fields['pay_later_receipt'])) {
334 $errors['pay_later_receipt'] = ts('Please enter the instructions to be sent to the contributor when they choose to \'pay later\'.');
335 }
336 }
337
338 // don't allow price set w/ membership signup, CRM-5095
339 if ($priceSetId = CRM_Utils_Array::value('price_set_id', $fields)) {
340 // don't allow price set w/ membership.
341 if ($hasMembershipBlk) {
342 $errors['price_set_id'] = ts('You cannot enable both a Contribution Price Set and Membership Signup on the same online contribution page.');
343 }
344 }
345 else {
346 if (isset($fields['is_recur'])) {
347 if (empty($fields['recur_frequency_unit'])) {
348 $errors['recur_frequency_unit'] = ts('At least one recurring frequency option needs to be checked.');
349 }
350 }
351
352 // validation for pledge fields.
353 if (!empty($fields['is_pledge_active'])) {
354 if (empty($fields['pledge_frequency_unit'])) {
355 $errors['pledge_frequency_unit'] = ts('At least one pledge frequency option needs to be checked.');
356 }
357 if (!empty($fields['is_recur'])) {
358 $errors['is_recur'] = ts('You cannot enable both Recurring Contributions AND Pledges on the same online contribution page.');
359 }
360 }
361
362 // If Contribution amount section is enabled, then
363 // Allow other amounts must be enabeld OR the Fixed Contribution
364 // Contribution options must contain at least one set of values.
365 if (!empty($fields['amount_block_is_active'])) {
366 if (empty($fields['is_allow_other_amount']) &&
367 !$priceSetId
368 ) {
369 //get the values of amount block
370 $values = CRM_Utils_Array::value('value', $fields);
371 $isSetRow = FALSE;
372 for ($i = 1; $i < self::NUM_OPTION; $i++) {
373 if ((isset($values[$i]) && (strlen(trim($values[$i])) > 0))) {
374 $isSetRow = TRUE;
375 }
376 }
377 if (!$isSetRow) {
378 $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.');
379 }
380 }
381 }
382 }
383
384 if (!empty($fields['payment_processor']) && $financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($self->_defaultValues['financial_type_id'])) {
385 $errors['payment_processor'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType;
386 }
387
388 if (!empty($fields['is_recur_interval'])) {
389 foreach(array_keys($fields['payment_processor']) as $paymentProcessorID) {
390 $paymentProcessorTypeId = CRM_Core_DAO::getFieldValue(
391 'CRM_Financial_DAO_PaymentProcessor',
392 $paymentProcessorID,
393 'payment_processor_type_id'
394 );
395 $paymentProcessorType = CRM_Core_PseudoConstant::paymentProcessorType(false, $paymentProcessorTypeId, 'name');
396 if ($paymentProcessorType == 'Google_Checkout') {
397 $errors['is_recur_interval'] = ts('Google Checkout does not support recurring intervals');
398 break;
399 }
400 }
401 }
402
403 return $errors;
404 }
405
406 /**
407 * Process the form
408 *
409 * @return void
410 * @access public
411 */
412 public function postProcess() {
413 // get the submitted form values.
414 $params = $this->controller->exportValues($this->_name);
415 if (array_key_exists('payment_processor', $params)) {
416 if (array_key_exists(CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', 'AuthNet',
417 'id', 'payment_processor_type_id'
418 ),
419 CRM_Utils_Array::value('payment_processor', $params)
420 )) {
421 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');
422 }
423 }
424
425 // check for price set.
426 $priceSetID = CRM_Utils_Array::value('price_set_id', $params);
427
428 // get required fields.
429 $fields = array(
430 'id' => $this->_id,
431 'is_recur' => FALSE,
432 'min_amount' => "null",
433 'max_amount' => "null",
434 'is_monetary' => FALSE,
435 'is_pay_later' => FALSE,
436 'is_recur_interval' => FALSE,
437 'is_recur_installments' => FALSE,
438 'recur_frequency_unit' => "null",
439 'default_amount_id' => "null",
440 'is_allow_other_amount' => FALSE,
441 'amount_block_is_active' => FALSE,
442 );
443 $resetFields = array();
444 if ($priceSetID) {
445 $resetFields = array('min_amount', 'max_amount', 'is_allow_other_amount');
446 }
447
448 if (empty($params['is_recur'])) {
449 $resetFields = array_merge($resetFields, array('is_recur_interval', 'recur_frequency_unit'));
450 }
451
452 foreach ($fields as $field => $defaultVal) {
453 $val = CRM_Utils_Array::value($field, $params, $defaultVal);
454 if (in_array($field, $resetFields)) {
455 $val = $defaultVal;
456 }
457
458 if (in_array($field, array(
459 'min_amount', 'max_amount'))) {
460 $val = CRM_Utils_Rule::cleanMoney($val);
461 }
462
463 $params[$field] = $val;
464 }
465
466 if ($params['is_recur']) {
467 $params['recur_frequency_unit'] = implode(CRM_Core_DAO::VALUE_SEPARATOR,
468 array_keys($params['recur_frequency_unit'])
469 );
470 $params['is_recur_interval'] = CRM_Utils_Array::value('is_recur_interval', $params, FALSE);
471 $params['is_recur_installments'] = CRM_Utils_Array::value('is_recur_installments', $params, FALSE);
472 }
473
474 if (array_key_exists('payment_processor', $params) &&
475 !CRM_Utils_System::isNull($params['payment_processor'])
476 ) {
477 $params['payment_processor'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, array_keys($params['payment_processor']));
478 }
479 else {
480 $params['payment_processor'] = 'null';
481 }
482
483 $contributionPage = CRM_Contribute_BAO_ContributionPage::create($params);
484 $contributionPageID = $contributionPage->id;
485
486 // prepare for data cleanup.
487 $deleteAmountBlk = $deletePledgeBlk = $deletePriceSet = FALSE;
488 if ($this->_priceSetID) {
489 $deletePriceSet = TRUE;
490 }
491 if ($this->_pledgeBlockID) {
492 $deletePledgeBlk = TRUE;
493 }
494 if (!empty($this->_amountBlock)) {
495 $deleteAmountBlk = TRUE;
496 }
497
498 if ($contributionPageID) {
499
500 if (!empty($params['amount_block_is_active'])) {
501 // handle price set.
502 if ($priceSetID) {
503 // add/update price set.
504 $deletePriceSet = FALSE;
505 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
506 $deleteAmountBlk = TRUE;
507 }
508
509 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageID, $priceSetID);
510 }
511 else {
512
513 $deletePriceSet = FALSE;
514 // process contribution amount block
515 $deleteAmountBlk = FALSE;
516
517 $labels = CRM_Utils_Array::value('label', $params);
518 $values = CRM_Utils_Array::value('value', $params);
519 $default = CRM_Utils_Array::value('default', $params);
520
521 $options = array();
522 for ($i = 1; $i < self::NUM_OPTION; $i++) {
523 if (isset($values[$i]) &&
524 (strlen(trim($values[$i])) > 0)
525 ) {
526 $options[] = array('label' => trim($labels[$i]),
527 'value' => CRM_Utils_Rule::cleanMoney(trim($values[$i])),
528 'weight' => $i,
529 'is_active' => 1,
530 'is_default' => $default == $i,
531 );
532 }
533 }
534 /* || !empty($params['price_field_value']) || CRM_Utils_Array::value( 'price_field_other', $params )*/
535 if (!empty($options) || !empty($params['is_allow_other_amount'])) {
536 $fieldParams['is_quick_config'] = 1;
537 $noContriAmount = NULL;
538 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
539 if (!(!empty($params['price_field_id']) || !empty($params['price_field_other'])) && !$usedPriceSetId) {
540 $pageTitle = strtolower(CRM_Utils_String::munge($this->_values['title'], '_', 245));
541 $setParams['title'] = $this->_values['title'];
542 if (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle, 'id', 'name')) {
543 $setParams['name'] = $pageTitle;
544 }
545 elseif (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle . '_' . $this->_id, 'id', 'name')) {
546 $setParams['name'] = $pageTitle . '_' . $this->_id;
547 }
548 else {
549 $timeSec = explode(".", microtime(true));
550 $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1];
551 }
552 $setParams['is_quick_config'] = 1;
553 $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
554 $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute');
555 $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
556 $priceSetId = $priceSet->id;
557 }
558 elseif ($usedPriceSetId && empty($params['price_field_id'])) {
559 $priceSetId = $usedPriceSetId;
560 }
561 else {
562 if ($priceFieldId = CRM_Utils_Array::value('price_field_id', $params)) {
563 foreach ($params['price_field_value'] as $arrayID => $fieldValueID) {
564 if (empty($params['label'][$arrayID]) && empty($params['value'][$arrayID]) && !empty($fieldValueID)) {
565 CRM_Price_BAO_PriceFieldValue::setIsActive($fieldValueID, '0');
566 unset($params['price_field_value'][$arrayID]);
567 }
568 }
569 if (implode('', $params['price_field_value'])) {
570 $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params);
571 $fieldParams['option_id'] = $params['price_field_value'];
572 }
573 else {
574 $noContriAmount = 0;
575 CRM_Price_BAO_PriceField::setIsActive($priceFieldId, '0');
576 }
577 }
578 else $priceFieldId = CRM_Utils_Array::value('price_field_other', $params);
579 $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id');
580 }
581 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $this->_id, $priceSetId);
582 if (!empty($options)) {
583 $editedFieldParams = array(
584 'price_set_id' => $priceSetId,
585 'name' => 'contribution_amount',
586 );
587 $editedResults = array();
588 $noContriAmount = 1;
589 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
590 if (empty($editedResults['id'])) {
591 $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245));
592 }
593 else {
594 $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults);
595 }
596
597 $fieldParams['price_set_id'] = $priceSetId;
598 $fieldParams['is_active'] = 1;
599 $fieldParams['weight'] = 2;
600
601 if (!empty($params['is_allow_other_amount'])) {
602 $fieldParams['is_required'] = 0;
603 }
604 else {
605 $fieldParams['is_required'] = 1;
606 }
607 $fieldParams['label'] = $params['amount_label'];
608 $fieldParams['html_type'] = 'Radio';
609 $fieldParams['option_label'] = $params['label'];
610 $fieldParams['option_amount'] = $params['value'];
611 $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
612 foreach ($options as $value) {
613 $fieldParams['option_weight'][$value['weight']] = $value['weight'];
614 }
615 $fieldParams['default_option'] = $params['default'];
616 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
617 }
618 if (!empty($params['is_allow_other_amount']) && empty($params['price_field_other'])) {
619 $editedFieldParams = array(
620 'price_set_id' => $priceSetId,
621 'name' => 'other_amount',
622 );
623 $editedResults = array();
624
625 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
626
627 if (!$priceFieldID = CRM_Utils_Array::value('id', $editedResults)) {
628 $fieldParams = array(
629 'name' => 'other_amount',
630 'label' => 'Other Amount',
631 'price_set_id' => $priceSetId,
632 'html_type' => 'Text',
633 'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $this->_values),
634 'is_display_amounts' => 0,
635 'weight' => 3,
636 );
637 $fieldParams['option_weight'][1] = 1;
638 $fieldParams['option_amount'][1] = 1;
639 if (!$noContriAmount) {
640 $fieldParams['is_required'] = 1;
641 $fieldParams['option_label'][1] = $fieldParams['label'] = $params['amount_label'];
642 }
643 else {
644 $fieldParams['is_required'] = 0;
645 $fieldParams['option_label'][1] = $fieldParams['label'] = 'Other Amount';
646 }
647
648 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
649 }
650 else {
651 if (empty($editedResults['is_active'])) {
652 if (!$noContriAmount) {
653 $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id');
654 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']);
655 $fieldParams = array(
656 'is_required' => 1,
657 'label' => $params['amount_label'],
658 'id' => $priceFieldID,
659 );
660 }
661 $fieldParams['is_active'] = 1;
662 $priceField = CRM_Price_BAO_PriceField::add($fieldParams);
663 }
664 }
665 }
666 elseif (empty($params['is_allow_other_amount']) && !empty($params['price_field_other'])) {
667 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
668 }
669 elseif ($priceFieldID = CRM_Utils_Array::value('price_field_other', $params)) {
670 $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id');
671 if (!$noContriAmount) {
672 $fieldParams = array(
673 'is_required' => 1,
674 'label' => $params['amount_label'],
675 'id' => $priceFieldID,
676 );
677 CRM_Price_BAO_PriceField::add($fieldParams);
678 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']);
679 }
680 else {
681 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceField', $priceFieldID, 'is_required', 0 );
682 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', 'Other Amount');
683 }
684 }
685 }
686
687 if (!empty($params['is_pledge_active'])) {
688 $deletePledgeBlk = FALSE;
689 $pledgeBlockParams = array(
690 'entity_id' => $contributionPageID,
691 'entity_table' => ts('civicrm_contribution_page'),
692 );
693 if ($this->_pledgeBlockID) {
694 $pledgeBlockParams['id'] = $this->_pledgeBlockID;
695 }
696 $pledgeBlock = array(
697 'pledge_frequency_unit', 'max_reminders',
698 'initial_reminder_day', 'additional_reminder_day',
699 );
700 foreach ($pledgeBlock as $key) {
701 $pledgeBlockParams[$key] = CRM_Utils_Array::value($key, $params);
702 }
703 $pledgeBlockParams['is_pledge_interval'] = CRM_Utils_Array::value('is_pledge_interval',
704 $params, FALSE
705 );
706 // create pledge block.
707 CRM_Pledge_BAO_PledgeBlock::create($pledgeBlockParams);
708 }
709 }
710 }
711 else {
712 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
713 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
714 if ($usedPriceSetId) {
715 if (!empty($params['price_field_id'])) {
716 CRM_Price_BAO_PriceField::setIsActive($params['price_field_id'], '0');
717 }
718 if (!empty($params['price_field_other'])) {
719 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
720 }
721 }
722 else {
723 $deleteAmountBlk = TRUE;
724 $deletePriceSet = TRUE;
725 }
726 }
727 }
728
729 // delete pledge block.
730 if ($deletePledgeBlk) {
731 CRM_Pledge_BAO_PledgeBlock::deletePledgeBlock($this->_pledgeBlockID);
732 }
733
734 // delete previous price set.
735 if ($deletePriceSet) {
736 CRM_Price_BAO_PriceSet::removeFrom('civicrm_contribution_page', $contributionPageID);
737 }
738
739 if ($deleteAmountBlk ) {
740 $priceField = !empty($params['price_field_id']) ?$params['price_field_id']:CRM_Utils_Array::value('price_field_other', $params);
741 if ($priceField) {
742 $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceField, 'price_set_id');
743 CRM_Price_BAO_PriceSet::setIsQuickConfig($priceSetID,0);
744 }
745 }
746 }
747 parent::endPostProcess();
748 }
749
750 /**
751 * Return a descriptive name for the page, used in wizard header
752 *
753 * @return string
754 * @access public
755 */
756 public function getTitle() {
757 return ts('Amounts');
758 }
759 }
760