Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
232624b1 | 4 | | CiviCRM version 4.4 | |
6a488035 TO |
5 | +--------------------------------------------------------------------+ |
6 | | Copyright CiviCRM LLC (c) 2004-2013 | | |
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-2013 | |
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 | ||
5778c444 PN |
70 | //CRM-12055 |
71 | $this->add('text', 'amount_label', ts('Contribution Amounts Label')); | |
72 | ||
8a4f27dc | 73 | $default = array($this->createElement('radio', NULL, NULL, NULL, 0)); |
6a488035 TO |
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(' ', ' ', ' ', '<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(' ', ' ', ' ', '<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 | ); | |
d11a05d6 | 143 | $this->addWysiwyg('pay_later_receipt', ts('Pay Later Instructions'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_receipt')); |
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( | |
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(' ', ' ', ' ', '<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 | ||
a7488080 | 199 | if (empty($defaults['pay_later_text'])) { |
6a488035 TO |
200 | $defaults['pay_later_text'] = ts('I will send payment by check'); |
201 | } | |
202 | ||
a7488080 | 203 | if (!empty($defaults['amount_block_is_active'])) { |
6a488035 | 204 | |
9da8dc8c | 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')) { | |
6a488035 | 207 | $this->assign('isQuick', $isQuick); |
9da8dc8c | 208 | //$priceField = CRM_Core_DAO::getFieldValue( 'CRM_Price_DAO_PriceField', $priceSetId, 'id', 'price_set_id' ); |
6a488035 TO |
209 | $options = $pFIDs = array(); |
210 | $priceFieldParams = array('price_set_id' => $priceSetId); | |
5778c444 | 211 | $priceFields = CRM_Core_DAO::commonRetrieveAll('CRM_Price_DAO_PriceField', 'price_set_id', $priceSetId, $pFIDs, $return = array('html_type', 'name', 'is_active', 'label')); |
6a488035 TO |
212 | foreach ($priceFields as $priceField) { |
213 | if ($priceField['id'] && $priceField['html_type'] == 'Radio' && $priceField['name'] == 'contribution_amount') { | |
214 | $defaults['price_field_id'] = $priceField['id']; | |
9da8dc8c | 215 | $priceFieldOptions = CRM_Price_BAO_PriceFieldValue::getValues($priceField['id'], $options, 'id', 1); |
5778c444 PN |
216 | if (empty($priceFieldOptions)) { |
217 | continue; | |
218 | } | |
6a488035 | 219 | $countRow = 0; |
5778c444 | 220 | $defaults['amount_label'] = $priceField['label']; |
6a488035 TO |
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']; | |
5778c444 PN |
236 | if (!isset($defaults['amount_label'])) { |
237 | $defaults['amount_label'] = $priceField['label']; | |
238 | } | |
6a488035 TO |
239 | } |
240 | } | |
241 | } | |
242 | } | |
243 | ||
a7488080 | 244 | if (empty($defaults['amount_label'])) { |
5778c444 PN |
245 | $defaults['amount_label'] = ts('Contribution Amount'); |
246 | } | |
247 | ||
a7488080 | 248 | if (!empty($defaults['value']) && is_array($defaults['value'])) { |
6a488035 TO |
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 | ||
a7488080 | 265 | if (!empty($defaults['payment_processor'])) { |
6a488035 TO |
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 array $options additional user data | |
279 | * | |
280 | * @return true if no errors, else array of errors | |
281 | * @access public | |
282 | * @static | |
283 | */ | |
284 | static function formRule($fields, $files, $self) { | |
285 | $errors = array(); | |
286 | //as for separate membership payment we has to have | |
287 | //contribution amount section enabled, hence to disable it need to | |
288 | //check if separate membership payment enabled, | |
289 | //if so disable first separate membership payment option | |
290 | //then disable contribution amount section. CRM-3801, | |
291 | ||
292 | $membershipBlock = new CRM_Member_DAO_MembershipBlock(); | |
293 | $membershipBlock->entity_table = 'civicrm_contribution_page'; | |
294 | $membershipBlock->entity_id = $self->_id; | |
295 | $membershipBlock->is_active = 1; | |
296 | $hasMembershipBlk = FALSE; | |
297 | if ($membershipBlock->find(TRUE)) { | |
a7488080 | 298 | if (!empty($fields['amount_block_is_active']) && |
9da8dc8c | 299 | ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $self->_id, NULL, 1)) |
6a488035 | 300 | ) { |
9da8dc8c | 301 | $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends'); |
6a488035 TO |
302 | if ($extends && $extends == CRM_Core_Component::getComponentID('CiviMember')) { |
303 | $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.'); | |
304 | return $errors; | |
305 | } | |
306 | } | |
307 | $hasMembershipBlk = TRUE; | |
8cc574cf | 308 | if ($membershipBlock->is_separate_payment && empty($fields['amount_block_is_active'])) { |
6a488035 TO |
309 | $errors['amount_block_is_active'] = ts('To disable Contribution Amounts section you need to first disable Separate Membership Payment option from Membership Settings.'); |
310 | } | |
311 | } | |
312 | ||
b52a8f03 | 313 | //check for the amount label (mandatory) |
a7488080 | 314 | if (!empty($fields['amount_block_is_active']) && empty($fields['amount_label'])) { |
b52a8f03 PN |
315 | $errors['amount_label'] = ts('Please enter the contribution amount label.'); |
316 | } | |
6a488035 TO |
317 | $minAmount = CRM_Utils_Array::value('min_amount', $fields); |
318 | $maxAmount = CRM_Utils_Array::value('max_amount', $fields); | |
319 | if (!empty($minAmount) && !empty($maxAmount)) { | |
320 | $minAmount = CRM_Utils_Rule::cleanMoney($minAmount); | |
321 | $maxAmount = CRM_Utils_Rule::cleanMoney($maxAmount); | |
322 | if ((float ) $minAmount > (float ) $maxAmount) { | |
323 | $errors['min_amount'] = ts('Minimum Amount should be less than Maximum Amount'); | |
324 | } | |
325 | } | |
665e5ec7 | 326 | |
6a488035 TO |
327 | if (isset($fields['is_pay_later'])) { |
328 | if (empty($fields['pay_later_text'])) { | |
329 | $errors['pay_later_text'] = ts('Please enter the text for the \'pay later\' checkbox displayed on the contribution form.'); | |
330 | } | |
331 | if (empty($fields['pay_later_receipt'])) { | |
332 | $errors['pay_later_receipt'] = ts('Please enter the instructions to be sent to the contributor when they choose to \'pay later\'.'); | |
333 | } | |
334 | } | |
665e5ec7 | 335 | |
6a488035 TO |
336 | // don't allow price set w/ membership signup, CRM-5095 |
337 | if ($priceSetId = CRM_Utils_Array::value('price_set_id', $fields)) { | |
338 | // don't allow price set w/ membership. | |
339 | if ($hasMembershipBlk) { | |
340 | $errors['price_set_id'] = ts('You cannot enable both a Contribution Price Set and Membership Signup on the same online contribution page.'); | |
341 | } | |
342 | } | |
343 | else { | |
344 | if (isset($fields['is_recur'])) { | |
345 | if (empty($fields['recur_frequency_unit'])) { | |
346 | $errors['recur_frequency_unit'] = ts('At least one recurring frequency option needs to be checked.'); | |
347 | } | |
348 | } | |
349 | ||
350 | // validation for pledge fields. | |
a7488080 | 351 | if (!empty($fields['is_pledge_active'])) { |
6a488035 TO |
352 | if (empty($fields['pledge_frequency_unit'])) { |
353 | $errors['pledge_frequency_unit'] = ts('At least one pledge frequency option needs to be checked.'); | |
354 | } | |
a7488080 | 355 | if (!empty($fields['is_recur'])) { |
6a488035 TO |
356 | $errors['is_recur'] = ts('You cannot enable both Recurring Contributions AND Pledges on the same online contribution page.'); |
357 | } | |
358 | } | |
359 | ||
360 | // If Contribution amount section is enabled, then | |
361 | // Allow other amounts must be enabeld OR the Fixed Contribution | |
362 | // Contribution options must contain at least one set of values. | |
a7488080 CW |
363 | if (!empty($fields['amount_block_is_active'])) { |
364 | if (empty($fields['is_allow_other_amount']) && | |
6a488035 TO |
365 | !$priceSetId |
366 | ) { | |
367 | //get the values of amount block | |
368 | $values = CRM_Utils_Array::value('value', $fields); | |
369 | $isSetRow = FALSE; | |
370 | for ($i = 1; $i < self::NUM_OPTION; $i++) { | |
371 | if ((isset($values[$i]) && (strlen(trim($values[$i])) > 0))) { | |
372 | $isSetRow = TRUE; | |
373 | } | |
374 | } | |
375 | if (!$isSetRow) { | |
376 | $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.'); | |
377 | } | |
378 | } | |
379 | } | |
380 | } | |
3b67ab13 | 381 | |
a7488080 | 382 | if (!empty($fields['payment_processor']) && $financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($self->_defaultValues['financial_type_id'])) { |
3b67ab13 PN |
383 | $errors['payment_processor'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType; |
384 | } | |
385 | ||
a7488080 | 386 | if (!empty($fields['is_recur_interval'])) { |
6a488035 TO |
387 | foreach(array_keys($fields['payment_processor']) as $paymentProcessorID) { |
388 | $paymentProcessorTypeId = CRM_Core_DAO::getFieldValue( | |
389 | 'CRM_Financial_DAO_PaymentProcessor', | |
390 | $paymentProcessorID, | |
391 | 'payment_processor_type_id' | |
392 | ); | |
393 | $paymentProcessorType = CRM_Core_PseudoConstant::paymentProcessorType(false, $paymentProcessorTypeId, 'name'); | |
394 | if ($paymentProcessorType == 'Google_Checkout') { | |
395 | $errors['is_recur_interval'] = ts('Google Checkout does not support recurring intervals'); | |
396 | break; | |
397 | } | |
398 | } | |
399 | } | |
665e5ec7 | 400 | |
6a488035 TO |
401 | return $errors; |
402 | } | |
403 | ||
404 | /** | |
405 | * Process the form | |
406 | * | |
407 | * @return void | |
408 | * @access public | |
409 | */ | |
410 | public function postProcess() { | |
411 | // get the submitted form values. | |
412 | $params = $this->controller->exportValues($this->_name); | |
413 | if (array_key_exists('payment_processor', $params)) { | |
414 | if (array_key_exists(CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', 'AuthNet', | |
415 | 'id', 'payment_processor_type_id' | |
416 | ), | |
417 | CRM_Utils_Array::value('payment_processor', $params) | |
418 | )) { | |
419 | 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'); | |
420 | } | |
421 | } | |
422 | ||
423 | // check for price set. | |
424 | $priceSetID = CRM_Utils_Array::value('price_set_id', $params); | |
425 | ||
426 | // get required fields. | |
427 | $fields = array( | |
428 | 'id' => $this->_id, | |
429 | 'is_recur' => FALSE, | |
430 | 'min_amount' => "null", | |
431 | 'max_amount' => "null", | |
432 | 'is_monetary' => FALSE, | |
433 | 'is_pay_later' => FALSE, | |
434 | 'is_recur_interval' => FALSE, | |
435 | 'is_recur_installments' => FALSE, | |
436 | 'recur_frequency_unit' => "null", | |
437 | 'default_amount_id' => "null", | |
438 | 'is_allow_other_amount' => FALSE, | |
439 | 'amount_block_is_active' => FALSE, | |
440 | ); | |
441 | $resetFields = array(); | |
442 | if ($priceSetID) { | |
443 | $resetFields = array('min_amount', 'max_amount', 'is_allow_other_amount'); | |
444 | } | |
445 | ||
a7488080 | 446 | if (empty($params['is_recur'])) { |
6a488035 TO |
447 | $resetFields = array_merge($resetFields, array('is_recur_interval', 'recur_frequency_unit')); |
448 | } | |
449 | ||
450 | foreach ($fields as $field => $defaultVal) { | |
451 | $val = CRM_Utils_Array::value($field, $params, $defaultVal); | |
452 | if (in_array($field, $resetFields)) { | |
453 | $val = $defaultVal; | |
454 | } | |
455 | ||
456 | if (in_array($field, array( | |
457 | 'min_amount', 'max_amount'))) { | |
458 | $val = CRM_Utils_Rule::cleanMoney($val); | |
459 | } | |
460 | ||
461 | $params[$field] = $val; | |
462 | } | |
463 | ||
464 | if ($params['is_recur']) { | |
465 | $params['recur_frequency_unit'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, | |
466 | array_keys($params['recur_frequency_unit']) | |
467 | ); | |
468 | $params['is_recur_interval'] = CRM_Utils_Array::value('is_recur_interval', $params, FALSE); | |
469 | $params['is_recur_installments'] = CRM_Utils_Array::value('is_recur_installments', $params, FALSE); | |
470 | } | |
471 | ||
472 | if (array_key_exists('payment_processor', $params) && | |
473 | !CRM_Utils_System::isNull($params['payment_processor']) | |
474 | ) { | |
475 | $params['payment_processor'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, array_keys($params['payment_processor'])); | |
476 | } | |
477 | else { | |
478 | $params['payment_processor'] = 'null'; | |
479 | } | |
480 | ||
481 | $contributionPage = CRM_Contribute_BAO_ContributionPage::create($params); | |
482 | $contributionPageID = $contributionPage->id; | |
483 | ||
484 | // prepare for data cleanup. | |
485 | $deleteAmountBlk = $deletePledgeBlk = $deletePriceSet = FALSE; | |
486 | if ($this->_priceSetID) { | |
487 | $deletePriceSet = TRUE; | |
488 | } | |
489 | if ($this->_pledgeBlockID) { | |
490 | $deletePledgeBlk = TRUE; | |
491 | } | |
492 | if (!empty($this->_amountBlock)) { | |
493 | $deleteAmountBlk = TRUE; | |
494 | } | |
495 | ||
496 | if ($contributionPageID) { | |
497 | ||
a7488080 | 498 | if (!empty($params['amount_block_is_active'])) { |
6a488035 TO |
499 | // handle price set. |
500 | if ($priceSetID) { | |
501 | // add/update price set. | |
502 | $deletePriceSet = FALSE; | |
8cc574cf | 503 | if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) { |
6a488035 TO |
504 | $deleteAmountBlk = TRUE; |
505 | } | |
506 | ||
9da8dc8c | 507 | CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageID, $priceSetID); |
6a488035 TO |
508 | } |
509 | else { | |
510 | ||
511 | $deletePriceSet = FALSE; | |
512 | // process contribution amount block | |
513 | $deleteAmountBlk = FALSE; | |
514 | ||
515 | $labels = CRM_Utils_Array::value('label', $params); | |
516 | $values = CRM_Utils_Array::value('value', $params); | |
517 | $default = CRM_Utils_Array::value('default', $params); | |
518 | ||
519 | $options = array(); | |
520 | for ($i = 1; $i < self::NUM_OPTION; $i++) { | |
521 | if (isset($values[$i]) && | |
522 | (strlen(trim($values[$i])) > 0) | |
523 | ) { | |
524 | $options[] = array('label' => trim($labels[$i]), | |
525 | 'value' => CRM_Utils_Rule::cleanMoney(trim($values[$i])), | |
526 | 'weight' => $i, | |
527 | 'is_active' => 1, | |
528 | 'is_default' => $default == $i, | |
529 | ); | |
530 | } | |
531 | } | |
8cc574cf CW |
532 | /* || !empty($params['price_field_value']) || CRM_Utils_Array::value( 'price_field_other', $params )*/ |
533 | if (!empty($options) || !empty($params['is_allow_other_amount'])) { | |
6a488035 TO |
534 | $fieldParams['is_quick_config'] = 1; |
535 | $noContriAmount = NULL; | |
9da8dc8c | 536 | $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3); |
8cc574cf | 537 | if (!(!empty($params['price_field_id']) || !empty($params['price_field_other'])) && !$usedPriceSetId) { |
6a488035 TO |
538 | $pageTitle = strtolower(CRM_Utils_String::munge($this->_values['title'], '_', 245)); |
539 | $setParams['title'] = $this->_values['title']; | |
9da8dc8c | 540 | if (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle, 'id', 'name')) { |
6a488035 | 541 | $setParams['name'] = $pageTitle; |
665e5ec7 | 542 | } |
9da8dc8c | 543 | elseif (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle . '_' . $this->_id, 'id', 'name')) { |
6a488035 TO |
544 | $setParams['name'] = $pageTitle . '_' . $this->_id; |
545 | } | |
546 | else { | |
547 | $timeSec = explode(".", microtime(true)); | |
548 | $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1]; | |
549 | } | |
550 | $setParams['is_quick_config'] = 1; | |
cc9b58f3 | 551 | $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values); |
6a488035 | 552 | $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute'); |
9da8dc8c | 553 | $priceSet = CRM_Price_BAO_PriceSet::create($setParams); |
6a488035 TO |
554 | $priceSetId = $priceSet->id; |
555 | } | |
8cc574cf | 556 | elseif ($usedPriceSetId && empty($params['price_field_id'])) { |
6a488035 TO |
557 | $priceSetId = $usedPriceSetId; |
558 | } | |
559 | else { | |
560 | if ($priceFieldId = CRM_Utils_Array::value('price_field_id', $params)) { | |
561 | foreach ($params['price_field_value'] as $arrayID => $fieldValueID) { | |
562 | if (empty($params['label'][$arrayID]) && empty($params['value'][$arrayID]) && !empty($fieldValueID)) { | |
9da8dc8c | 563 | CRM_Price_BAO_PriceFieldValue::setIsActive($fieldValueID, '0'); |
6a488035 TO |
564 | unset($params['price_field_value'][$arrayID]); |
565 | } | |
566 | } | |
567 | if (implode('', $params['price_field_value'])) { | |
568 | $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params); | |
569 | $fieldParams['option_id'] = $params['price_field_value']; | |
570 | } | |
571 | else { | |
572 | $noContriAmount = 0; | |
9da8dc8c | 573 | CRM_Price_BAO_PriceField::setIsActive($priceFieldId, '0'); |
6a488035 TO |
574 | } |
575 | } | |
576 | else $priceFieldId = CRM_Utils_Array::value('price_field_other', $params); | |
9da8dc8c | 577 | $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id'); |
6a488035 | 578 | } |
9da8dc8c | 579 | CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $this->_id, $priceSetId); |
6a488035 TO |
580 | if (!empty($options)) { |
581 | $editedFieldParams = array( | |
5778c444 PN |
582 | 'price_set_id' => $priceSetId, |
583 | 'name' => 'contribution_amount', | |
584 | ); | |
6a488035 TO |
585 | $editedResults = array(); |
586 | $noContriAmount = 1; | |
9da8dc8c | 587 | CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults); |
a7488080 | 588 | if (empty($editedResults['id'])) { |
6a488035 | 589 | $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245)); |
6a488035 TO |
590 | } |
591 | else { | |
592 | $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults); | |
593 | } | |
594 | ||
595 | $fieldParams['price_set_id'] = $priceSetId; | |
596 | $fieldParams['is_active'] = 1; | |
597 | $fieldParams['weight'] = 2; | |
598 | ||
a7488080 | 599 | if (!empty($params['is_allow_other_amount'])) { |
6a488035 TO |
600 | $fieldParams['is_required'] = 0; |
601 | } | |
602 | else { | |
603 | $fieldParams['is_required'] = 1; | |
604 | } | |
5778c444 | 605 | $fieldParams['label'] = $params['amount_label']; |
6a488035 TO |
606 | $fieldParams['html_type'] = 'Radio'; |
607 | $fieldParams['option_label'] = $params['label']; | |
608 | $fieldParams['option_amount'] = $params['value']; | |
609 | $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values); | |
610 | foreach ($options as $value) { | |
611 | $fieldParams['option_weight'][$value['weight']] = $value['weight']; | |
612 | } | |
613 | $fieldParams['default_option'] = $params['default']; | |
9da8dc8c | 614 | $priceField = CRM_Price_BAO_PriceField::create($fieldParams); |
6a488035 | 615 | } |
8cc574cf | 616 | if (!empty($params['is_allow_other_amount']) && empty($params['price_field_other'])) { |
6a488035 TO |
617 | $editedFieldParams = array( |
618 | 'price_set_id' => $priceSetId, | |
619 | 'name' => 'other_amount', | |
620 | ); | |
621 | $editedResults = array(); | |
622 | ||
9da8dc8c | 623 | CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults); |
5778c444 | 624 | |
6a488035 | 625 | if (!$priceFieldID = CRM_Utils_Array::value('id', $editedResults)) { |
665e5ec7 | 626 | $fieldParams = array( |
6a488035 TO |
627 | 'name' => 'other_amount', |
628 | 'label' => 'Other Amount', | |
629 | 'price_set_id' => $priceSetId, | |
630 | 'html_type' => 'Text', | |
631 | 'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $this->_values), | |
632 | 'is_display_amounts' => 0, | |
633 | 'weight' => 3, | |
634 | ); | |
635 | $fieldParams['option_weight'][1] = 1; | |
636 | $fieldParams['option_amount'][1] = 1; | |
637 | if (!$noContriAmount) { | |
638 | $fieldParams['is_required'] = 1; | |
5778c444 PN |
639 | $fieldParams['option_label'][1] = $fieldParams['label'] = $params['amount_label']; |
640 | } | |
641 | else { | |
6a488035 | 642 | $fieldParams['is_required'] = 0; |
5778c444 | 643 | $fieldParams['option_label'][1] = $fieldParams['label'] = 'Other Amount'; |
6a488035 TO |
644 | } |
645 | ||
9da8dc8c | 646 | $priceField = CRM_Price_BAO_PriceField::create($fieldParams); |
5778c444 PN |
647 | } |
648 | else { | |
a7488080 | 649 | if (empty($editedResults['is_active'])) { |
5778c444 PN |
650 | if (!$noContriAmount) { |
651 | $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id'); | |
652 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']); | |
653 | $fieldParams = array( | |
654 | 'is_required' => 1, | |
655 | 'label' => $params['amount_label'], | |
656 | 'id' => $priceFieldID, | |
657 | ); | |
658 | } | |
659 | $fieldParams['is_active'] = 1; | |
660 | $priceField = CRM_Price_BAO_PriceField::add($fieldParams); | |
6a488035 TO |
661 | } |
662 | } | |
5778c444 | 663 | } |
8cc574cf | 664 | elseif (empty($params['is_allow_other_amount']) && !empty($params['price_field_other'])) { |
9da8dc8c | 665 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0'); |
5778c444 PN |
666 | } |
667 | elseif ($priceFieldID = CRM_Utils_Array::value('price_field_other', $params)) { | |
668 | $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id'); | |
6a488035 | 669 | if (!$noContriAmount) { |
5778c444 PN |
670 | $fieldParams = array( |
671 | 'is_required' => 1, | |
672 | 'label' => $params['amount_label'], | |
673 | 'id' => $priceFieldID, | |
674 | ); | |
675 | CRM_Price_BAO_PriceField::add($fieldParams); | |
676 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']); | |
677 | } | |
678 | else { | |
9da8dc8c | 679 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceField', $priceFieldID, 'is_required', 0 ); |
5778c444 | 680 | CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', 'Other Amount'); |
6a488035 TO |
681 | } |
682 | } | |
683 | } | |
684 | ||
a7488080 | 685 | if (!empty($params['is_pledge_active'])) { |
6a488035 TO |
686 | $deletePledgeBlk = FALSE; |
687 | $pledgeBlockParams = array( | |
688 | 'entity_id' => $contributionPageID, | |
689 | 'entity_table' => ts('civicrm_contribution_page'), | |
690 | ); | |
691 | if ($this->_pledgeBlockID) { | |
692 | $pledgeBlockParams['id'] = $this->_pledgeBlockID; | |
693 | } | |
694 | $pledgeBlock = array( | |
695 | 'pledge_frequency_unit', 'max_reminders', | |
696 | 'initial_reminder_day', 'additional_reminder_day', | |
697 | ); | |
698 | foreach ($pledgeBlock as $key) { | |
699 | $pledgeBlockParams[$key] = CRM_Utils_Array::value($key, $params); | |
700 | } | |
701 | $pledgeBlockParams['is_pledge_interval'] = CRM_Utils_Array::value('is_pledge_interval', | |
702 | $params, FALSE | |
703 | ); | |
704 | // create pledge block. | |
705 | CRM_Pledge_BAO_PledgeBlock::create($pledgeBlockParams); | |
706 | } | |
707 | } | |
708 | } | |
709 | else { | |
8cc574cf | 710 | if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) { |
9da8dc8c | 711 | $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3); |
6a488035 | 712 | if ($usedPriceSetId) { |
a7488080 | 713 | if (!empty($params['price_field_id'])) { |
9da8dc8c | 714 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_id'], '0'); |
6a488035 | 715 | } |
a7488080 | 716 | if (!empty($params['price_field_other'])) { |
9da8dc8c | 717 | CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0'); |
6a488035 TO |
718 | } |
719 | } | |
720 | else { | |
721 | $deleteAmountBlk = TRUE; | |
722 | $deletePriceSet = TRUE; | |
723 | } | |
724 | } | |
725 | } | |
726 | ||
727 | // delete pledge block. | |
728 | if ($deletePledgeBlk) { | |
729 | CRM_Pledge_BAO_PledgeBlock::deletePledgeBlock($this->_pledgeBlockID); | |
730 | } | |
731 | ||
732 | // delete previous price set. | |
733 | if ($deletePriceSet) { | |
9da8dc8c | 734 | CRM_Price_BAO_PriceSet::removeFrom('civicrm_contribution_page', $contributionPageID); |
6a488035 | 735 | } |
665e5ec7 | 736 | |
737 | if ($deleteAmountBlk ) { | |
0d8afee2 | 738 | $priceField = !empty($params['price_field_id']) ?$params['price_field_id']:CRM_Utils_Array::value('price_field_other', $params); |
6a488035 | 739 | if ($priceField) { |
9da8dc8c | 740 | $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceField, 'price_set_id'); |
741 | CRM_Price_BAO_PriceSet::setIsQuickConfig($priceSetID,0); | |
6a488035 TO |
742 | } |
743 | } | |
744 | } | |
745 | parent::endPostProcess(); | |
746 | } | |
747 | ||
748 | /** | |
749 | * Return a descriptive name for the page, used in wizard header | |
750 | * | |
751 | * @return string | |
752 | * @access public | |
753 | */ | |
754 | public function getTitle() { | |
755 | return ts('Amounts'); | |
756 | } | |
757 | } | |
758 |