3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
32 * @copyright CiviCRM LLC (c) 2004-2019
36 * This class generates form components for processing a participation fee block
38 class CRM_Event_Form_EventFees
{
41 * Set variables up before form is built.
43 * @param CRM_Core_Form $form
45 * @throws \CRM_Core_Exception
47 public static function preProcess(&$form) {
48 //as when call come from register.php
49 if (!$form->_eventId
) {
50 $form->_eventId
= CRM_Utils_Request
::retrieve('eventId', 'Positive', $form);
53 $form->_pId
= CRM_Utils_Request
::retrieve('participantId', 'Positive', $form);
54 $form->_discountId
= CRM_Utils_Request
::retrieve('discountId', 'Positive', $form);
56 $form->_fromEmails
= CRM_Event_BAO_Event
::getFromEmailIds($form->_eventId
);
58 //CRM-6907 set event specific currency.
59 if ($form->_eventId
&&
60 ($currency = CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Event', $form->_eventId
, 'currency'))
62 CRM_Core_Config
::singleton()->defaultCurrency
= $currency;
67 * This function sets the default values for the form in edit/view mode.
69 * @param CRM_Core_Form $form
73 public static function setDefaultValues(&$form) {
76 if ($form->_eventId
) {
77 //get receipt text and financial type
78 $returnProperities = ['confirm_email_text', 'financial_type_id', 'campaign_id', 'start_date'];
80 CRM_Core_DAO
::commonRetrieveAll('CRM_Event_DAO_Event', 'id', $form->_eventId
, $details, $returnProperities);
81 if (!empty($details[$form->_eventId
]['financial_type_id'])) {
82 $defaults[$form->_pId
]['financial_type_id'] = $details[$form->_eventId
]['financial_type_id'];
88 $params = ['id' => $form->_pId
];
90 CRM_Event_BAO_Participant
::getValues($params, $defaults, $ids);
91 if ($form->_action
== CRM_Core_Action
::UPDATE
) {
93 if (!empty($form->_values
['discount'])) {
94 foreach ($form->_values
['discount'] as $key => $value) {
95 $value = current($value);
96 $discounts[$key] = $value['name'];
100 if ($form->_discountId
&& !empty($discounts[$defaults[$form->_pId
]['discount_id']])) {
101 $form->assign('discount', $discounts[$defaults[$form->_pId
]['discount_id']]);
104 $form->assign('fee_amount', CRM_Utils_Array
::value('fee_amount', $defaults[$form->_pId
]));
105 $form->assign('fee_level', CRM_Utils_Array
::value('fee_level', $defaults[$form->_pId
]));
107 $defaults[$form->_pId
]['send_receipt'] = 0;
110 $defaults[$form->_pId
]['send_receipt'] = (strtotime(CRM_Utils_Array
::value('start_date', $details[$form->_eventId
])) >= time()) ?
1 : 0;
111 if ($form->_eventId
&& !empty($details[$form->_eventId
]['confirm_email_text'])) {
113 $defaults[$form->_pId
]['receipt_text'] = $details[$form->_eventId
]['confirm_email_text'];
116 $defaults[$form->_pId
]['receive_date'] = date('Y-m-d H:i:s');
119 //CRM-11601 we should keep the record contribution
120 //true by default while adding participant
121 if ($form->_action
== CRM_Core_Action
::ADD
&& !$form->_mode
&& $form->_isPaidEvent
) {
122 $defaults[$form->_pId
]['record_contribution'] = 1;
126 if (empty($defaults['payment_instrument_id'])) {
127 $defaults[$form->_pId
]['payment_instrument_id'] = key(CRM_Core_OptionGroup
::values('payment_instrument', FALSE, FALSE, FALSE, 'AND is_default = 1'));
130 $config = CRM_Core_Config
::singleton();
131 // set default country from config if no country set
132 if (empty($defaults[$form->_pId
]["billing_country_id-{$form->_bltID}"])) {
133 $defaults[$form->_pId
]["billing_country_id-{$form->_bltID}"] = $config->defaultContactCountry
;
136 if (empty($defaults["billing_state_province_id-{$form->_bltID}"])) {
137 $defaults[$form->_pId
]["billing_state_province_id-{$form->_bltID}"] = $config->defaultContactStateProvince
;
140 $billingDefaults = $form->getProfileDefaults('Billing', $form->_contactId
);
141 $defaults[$form->_pId
] = array_merge($defaults[$form->_pId
], $billingDefaults);
144 // if user has selected discount use that to set default
145 if (isset($form->_discountId
)) {
146 $defaults[$form->_pId
]['discount_id'] = $form->_discountId
;
148 //hack to set defaults for already selected discount value
149 if ($form->_action
== CRM_Core_Action
::UPDATE
&& !$form->_originalDiscountId
) {
150 $form->_originalDiscountId
= $defaults[$form->_pId
]['discount_id'];
151 if ($form->_originalDiscountId
) {
152 $defaults[$form->_pId
]['discount_id'] = $form->_originalDiscountId
;
155 $discountId = $form->_discountId
;
158 $discountId = CRM_Core_BAO_Discount
::findSet($form->_eventId
, 'civicrm_event');
162 $priceSetId = CRM_Core_DAO
::getFieldValue('CRM_Core_BAO_Discount', $discountId, 'price_set_id');
165 $priceSetId = CRM_Price_BAO_PriceSet
::getFor('civicrm_event', $form->_eventId
);
168 if (($form->_action
== CRM_Core_Action
::ADD
) && $form->_eventId
&& $discountId) {
169 // this case is for add mode, where we show discount automatically
170 $defaults[$form->_pId
]['discount_id'] = $discountId;
174 // get price set default values, CRM-4090
175 if (in_array(get_class($form),
177 'CRM_Event_Form_Participant',
178 'CRM_Event_Form_Registration_Register',
179 'CRM_Event_Form_Registration_AdditionalParticipant',
182 $priceSetValues = self
::setDefaultPriceSet($form->_pId
, $form->_eventId
);
183 if (!empty($priceSetValues)) {
184 $defaults[$form->_pId
] = array_merge($defaults[$form->_pId
], $priceSetValues);
188 if ($form->_action
== CRM_Core_Action
::ADD
&& !empty($form->_priceSet
['fields'])) {
189 foreach ($form->_priceSet
['fields'] as $key => $val) {
190 foreach ($val['options'] as $keys => $values) {
191 if ($values['is_default']) {
192 if (get_class($form) != 'CRM_Event_Form_Participant' && !empty($values['is_full'])) {
196 if ($val['html_type'] == 'CheckBox') {
197 $defaults[$form->_pId
]["price_{$key}"][$keys] = 1;
200 $defaults[$form->_pId
]["price_{$key}"] = $keys;
207 $form->assign('totalAmount', CRM_Utils_Array
::value('fee_amount', $defaults[$form->_pId
]));
208 if ($form->_action
== CRM_Core_Action
::UPDATE
) {
209 $fee_level = $defaults[$form->_pId
]['fee_level'];
210 CRM_Event_BAO_Participant
::fixEventLevel($fee_level);
211 $form->assign('fee_level', $fee_level);
212 $form->assign('fee_amount', CRM_Utils_Array
::value('fee_amount', $defaults[$form->_pId
]));
217 if (!empty($defaults[$form->_pId
]['participant_fee_currency'])) {
218 $form->assign('fee_currency', $defaults[$form->_pId
]['participant_fee_currency']);
222 if ($contriId = $form->get('onlinePendingContributionId')) {
223 $defaults[$form->_pId
]['record_contribution'] = 1;
224 $contribution = new CRM_Contribute_DAO_Contribution();
225 $contribution->id
= $contriId;
226 $contribution->find(TRUE);
229 'payment_instrument_id',
230 'contribution_status_id',
234 $defaults[$form->_pId
][$f] = $contribution->$f;
237 return $defaults[$form->_pId
];
241 * This function sets the default values for price set.
243 * @param int $participantID
244 * @param int $eventID
245 * @param bool $includeQtyZero
249 public static function setDefaultPriceSet($participantID, $eventID = NULL, $includeQtyZero = TRUE) {
251 if (!$eventID && $participantID) {
252 $eventID = CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Participant', $participantID, 'event_id');
254 if (!$participantID ||
!$eventID) {
259 $priceSetID = CRM_Price_BAO_PriceSet
::getFor('civicrm_event', $eventID);
264 // use line items for setdefault price set fields, CRM-4090
265 $lineItems[$participantID] = CRM_Price_BAO_LineItem
::getLineItems($participantID, 'participant', FALSE, $includeQtyZero);
267 if (is_array($lineItems[$participantID]) &&
268 !CRM_Utils_System
::isNull($lineItems[$participantID])
271 $priceFields = $htmlTypes = $optionValues = [];
272 foreach ($lineItems[$participantID] as $lineId => $items) {
273 $priceFieldId = CRM_Utils_Array
::value('price_field_id', $items);
274 $priceOptionId = CRM_Utils_Array
::value('price_field_value_id', $items);
275 if ($priceFieldId && $priceOptionId) {
276 $priceFields[$priceFieldId][] = $priceOptionId;
280 if (empty($priceFields)) {
284 // get all price set field html types.
287 FROM civicrm_price_field
288 WHERE id IN (' . implode(',', array_keys($priceFields)) . ')';
289 $fieldDAO = CRM_Core_DAO
::executeQuery($sql);
290 while ($fieldDAO->fetch()) {
291 $htmlTypes[$fieldDAO->id
] = $fieldDAO->html_type
;
294 foreach ($lineItems[$participantID] as $lineId => $items) {
295 $fieldId = $items['price_field_id'];
296 $htmlType = CRM_Utils_Array
::value($fieldId, $htmlTypes);
301 if ($htmlType == 'Text') {
302 $defaults["price_{$fieldId}"] = $items['qty'];
305 $fieldOptValues = CRM_Utils_Array
::value($fieldId, $priceFields);
306 if (!is_array($fieldOptValues)) {
310 foreach ($fieldOptValues as $optionId) {
311 if ($htmlType == 'CheckBox') {
312 $defaults["price_{$fieldId}"][$optionId] = TRUE;
315 $defaults["price_{$fieldId}"] = $optionId;
327 * Build the form object.
329 * @param CRM_Core_Form $form
331 public static function buildQuickForm(&$form) {
332 if ($form->_eventId
) {
333 $form->_isPaidEvent
= CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Event', $form->_eventId
, 'is_monetary');
334 if ($form->_isPaidEvent
) {
335 $form->addElement('hidden', 'hidden_feeblock', 1);
338 // make sure this is for backoffice registration.
339 if ($form->getName() == 'Participant') {
340 $eventfullMsg = CRM_Event_BAO_Participant
::eventFullMessage($form->_eventId
, $form->_pId
);
341 $form->addElement('hidden', 'hidden_eventFullMsg', $eventfullMsg, ['id' => 'hidden_eventFullMsg']);
346 if (CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_ParticipantPayment',
347 $form->_pId
, 'contribution_id', 'participant_id'
350 $form->_online
= TRUE;
354 if ($form->_isPaidEvent
) {
355 $params = ['id' => $form->_eventId
];
356 CRM_Event_BAO_Event
::retrieve($params, $event);
358 //retrieve custom information
360 CRM_Event_Form_Registration
::initEventFee($form, $event['id']);
361 CRM_Event_Form_Registration_Register
::buildAmount($form, TRUE, $form->_discountId
);
363 $invoiceSettings = Civi
::settings()->get('contribution_invoice_settings');
364 $invoicing = CRM_Utils_Array
::value('invoicing', $invoiceSettings);
366 if (!CRM_Utils_System
::isNull(CRM_Utils_Array
::value('line_items', $form->_values
))) {
367 $lineItem[] = $form->_values
['line_items'];
368 foreach ($form->_values
['line_items'] as $key => $value) {
369 $totalTaxAmount = $value['tax_amount'] +
$totalTaxAmount;
373 $form->assign('totalTaxAmount', $totalTaxAmount);
375 $form->assign('lineItem', empty($lineItem) ?
FALSE : $lineItem);
377 if (!empty($form->_values
['discount'])) {
378 foreach ($form->_values
['discount'] as $key => $value) {
379 $value = current($value);
380 $discounts[$key] = $value['name'];
383 $element = $form->add('select', 'discount_id',
386 0 => ts('- select -'),
389 ['class' => "crm-select2"]
392 if ($form->_online
) {
396 if (CRM_Financial_BAO_FinancialType
::isACLFinancialTypeStatus()
397 && !CRM_Utils_Array
::value('fee', $form->_values
)
398 && CRM_Utils_Array
::value('snippet', $_REQUEST) == CRM_Core_Smarty
::PRINT_NOFORM
400 CRM_Core_Session
::setStatus(ts('You do not have all the permissions needed for this page.'), 'Permission Denied', 'error');
404 CRM_Core_Payment_Form
::buildPaymentForm($form, $form->_paymentProcessor
, FALSE, TRUE, self
::getDefaultPaymentInstrumentId());
406 $form->addElement('checkbox', 'record_contribution', ts('Record Payment?'), NULL,
407 ['onclick' => "return showHideByValue('record_contribution','','payment_information','table-row','radio',false);"]
409 // Check permissions for financial type first
410 if (CRM_Financial_BAO_FinancialType
::isACLFinancialTypeStatus()) {
411 CRM_Financial_BAO_FinancialType
::getAvailableFinancialTypes($financialTypes, $form->_action
);
414 $financialTypes = CRM_Contribute_PseudoConstant
::financialType();
417 $form->add('select', 'financial_type_id',
418 ts('Financial Type'),
419 ['' => ts('- select -')] +
$financialTypes
422 $form->add('datepicker', 'receive_date', ts('Received'), [], FALSE, ['time' => TRUE]);
424 $form->add('select', 'payment_instrument_id',
425 ts('Payment Method'),
426 ['' => ts('- select -')] + CRM_Contribute_PseudoConstant
::paymentInstrument(),
427 FALSE, ['onChange' => "return showHideByValue('payment_instrument_id','4','checkNumber','table-row','select',false);"]
429 // don't show transaction id in batch update mode
430 $path = CRM_Utils_System
::currentPath();
431 $form->assign('showTransactionId', FALSE);
432 if ($path != 'civicrm/contact/search/basic') {
433 $form->add('text', 'trxn_id', ts('Transaction ID'));
434 $form->addRule('trxn_id', ts('Transaction ID already exists in Database.'),
435 'objectExists', ['CRM_Contribute_DAO_Contribution', $form->_eventId
, 'trxn_id']
437 $form->assign('showTransactionId', TRUE);
440 $form->add('select', 'contribution_status_id',
441 ts('Payment Status'), CRM_Contribute_BAO_Contribution_Utils
::getContributionStatuses('participant')
444 $form->add('text', 'check_number', ts('Check Number'),
445 CRM_Core_DAO
::getAttribute('CRM_Contribute_DAO_Contribution', 'check_number')
448 $form->add('text', 'total_amount', ts('Amount'),
449 CRM_Core_DAO
::getAttribute('CRM_Contribute_DAO_Contribution', 'total_amount')
454 $form->add('text', 'amount', ts('Event Fee(s)'));
456 $form->assign('onlinePendingContributionId', $form->get('onlinePendingContributionId'));
458 $form->assign('paid', $form->_isPaidEvent
);
460 $form->addElement('checkbox',
462 ts('Send Confirmation?'), NULL,
463 ['onclick' => "showHideByValue('send_receipt','','notice','table-row','radio',false); showHideByValue('send_receipt','','from-email','table-row','radio',false);"]
466 $form->add('select', 'from_email_address', ts('Receipt From'), $form->_fromEmails
['from_email_id']);
468 $form->add('textarea', 'receipt_text', ts('Confirmation Message'));
470 // Retrieve the name and email of the contact - form will be the TO for receipt email ( only if context is not standalone)
471 if ($form->_context
!= 'standalone') {
472 if ($form->_contactId
) {
473 list($form->_contributorDisplayName
,
474 $form->_contributorEmail
475 ) = CRM_Contact_BAO_Contact_Location
::getEmailDetails($form->_contactId
);
476 $form->assign('email', $form->_contributorEmail
);
479 //show email block for batch update for event
480 $form->assign('batchEmail', TRUE);
484 $mailingInfo = Civi
::settings()->get('mailing_backend');
485 $form->assign('outBound_option', $mailingInfo['outBound_option']);
486 $form->assign('hasPayment', $form->_paymentId
);
490 * Get the default payment instrument id.
492 * @todo resolve relationship between this form & abstractEdit -which should be it's parent.
496 protected static function getDefaultPaymentInstrumentId() {
497 $paymentInstrumentID = CRM_Utils_Request
::retrieve('payment_instrument_id', 'Integer');
498 if ($paymentInstrumentID) {
499 return $paymentInstrumentID;
501 return key(CRM_Core_OptionGroup
::values('payment_instrument', FALSE, FALSE, FALSE, 'AND is_default = 1'));