option to configure confirm screen
[civicrm-core.git] / CRM / Event / Form / Registration / AdditionalParticipant.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 *
31 * @package CRM
32 * @copyright CiviCRM LLC (c) 2004-2014
33 * $Id$
34 *
35 */
36
37 /**
38 * This class generates form components for processing Event
39 *
40 */
41 class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_Registration {
42
43 /**
44 * The defaults involved in this page
45 *
46 */
47 public $_defaults = array();
48
49 /**
50 * pre-registered additional participant id.
51 *
52 */
53 public $additionalParticipantId = NULL;
54
55 /**
56 * Function to set variables up before form is built
57 *
58 * @return void
59 * @access public
60 */
61 function preProcess() {
62 parent::preProcess();
63
64 $participantNo = substr($this->_name, 12);
65
66 //lets process in-queue participants.
67 if ($this->_participantId && $this->_additionalParticipantIds) {
68 $this->_additionalParticipantId = CRM_Utils_Array::value($participantNo, $this->_additionalParticipantIds);
69 }
70
71 $participantCnt = $participantNo + 1;
72 $this->assign('formId', $participantNo);
73 $this->_params = array();
74 $this->_params = $this->get('params');
75
76 $participantTot = $this->_params[0]['additional_participants'] + 1;
77 $skipCount = count(array_keys($this->_params, "skip"));
78 if ($skipCount) {
79 $this->assign('skipCount', $skipCount);
80 }
81 CRM_Utils_System::setTitle(ts('Register Participant %1 of %2', array(1 => $participantCnt, 2 => $participantTot)));
82
83 //CRM-4320, hack to check last participant.
84 $this->_lastParticipant = FALSE;
85 if ($participantTot == $participantCnt) {
86 $this->_lastParticipant = TRUE;
87 }
88 $this->assign('lastParticipant', $this->_lastParticipant);
89 }
90
91 /**
92 * This function sets the default values for the form. For edit/view mode
93 * the default values are retrieved from the database
94 *
95 * @access public
96 *
97 * @return void
98 */
99 function setDefaultValues() {
100 $defaults = $unsetSubmittedOptions = array();
101 $discountId = NULL;
102 //fix for CRM-3088, default value for discount set.
103 if (!empty($this->_values['discount'])) {
104 $discountId = CRM_Core_BAO_Discount::findSet($this->_eventId, 'civicrm_event');
105 if ($discountId && !empty($this->_values['event']['default_discount_fee_id'])) {
106 $discountKey = CRM_Core_DAO::getFieldValue("CRM_Core_DAO_OptionValue", $this->_values['event']['default_discount_fee_id']
107 , 'weight', 'id'
108 );
109 $defaults['amount'] = key(array_slice($this->_values['discount'][$discountId], $discountKey - 1, $discountKey, TRUE));
110 }
111 }
112 if ($this->_priceSetId) {
113 foreach ($this->_feeBlock as $key => $val) {
114 if (empty($val['options'])) {
115 continue;
116 }
117
118 $optionsFull = CRM_Utils_Array::value('option_full_ids', $val, array());
119 foreach ($val['options'] as $keys => $values) {
120 if ($values['is_default'] && !in_array($keys, $optionsFull)) {
121 if ($val['html_type'] == 'CheckBox') {
122 $defaults["price_{$key}"][$keys] = 1;
123 }
124 else {
125 $defaults["price_{$key}"] = $keys;
126 }
127 }
128 }
129 if (!empty($optionsFull)) {
130 $unsetSubmittedOptions[$val['id']] = $optionsFull;
131 }
132 }
133 }
134
135 //CRM-4320, setdefault additional participant values.
136 if ($this->_allowConfirmation && $this->_additionalParticipantId) {
137 //hack to get set default from eventFees.php
138 $this->_discountId = $discountId;
139 $this->_pId = $this->_additionalParticipantId;
140 $this->_contactId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $this->_additionalParticipantId, 'contact_id');
141 $participantDefaults = CRM_Event_Form_EventFees::setDefaultValues($this);
142 $participantDefaults = array_merge($this->_defaults, $participantDefaults);
143 // use primary email address if billing email address is empty
144 if (empty($this->_defaults["email-{$this->_bltID}"]) &&
145 !empty($this->_defaults["email-Primary"])
146 ) {
147 $participantDefaults["email-{$this->_bltID}"] = $this->_defaults["email-Primary"];
148 }
149 $defaults = array_merge($defaults, $participantDefaults);
150 }
151
152 $defaults = array_merge($this->_defaults, $defaults);
153
154 //reset values for all options those are full.
155 if (!empty($unsetSubmittedOptions) && empty($_POST)) {
156 $this->resetElementValue($unsetSubmittedOptions);
157 }
158
159 //load default campaign from page.
160 if (array_key_exists('participant_campaign_id', $this->_fields)) {
161 $defaults['participant_campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values['event']);
162 }
163 CRM_Core_BAO_Address::fixAllStateSelects($this, $this->_defaults);
164
165 return $defaults;
166 }
167
168 /**
169 * Function to build the form
170 *
171 * @return void
172 * @access public
173 */
174 public function buildQuickForm() {
175 $config = CRM_Core_Config::singleton();
176 $button = substr($this->controller->getButtonName(), -4);
177
178 $this->add('hidden', 'scriptFee', NULL);
179 $this->add('hidden', 'scriptArray', NULL);
180
181 if ($this->_values['event']['is_monetary']) {
182 CRM_Event_Form_Registration_Register::buildAmount($this);
183 }
184 $first_name = $last_name = NULL;
185 $pre = $post = array();
186 foreach (array(
187 'pre', 'post') as $keys) {
188 if (isset($this->_values['additional_custom_' . $keys . '_id'])) {
189 $this->buildCustom($this->_values['additional_custom_' . $keys . '_id'], 'additionalCustom' . ucfirst($keys), TRUE);
190 $$keys = CRM_Core_BAO_UFGroup::getFields($this->_values['additional_custom_' . $keys . '_id']);
191 }
192 foreach (array(
193 'first_name', 'last_name') as $name) {
194 if (!empty($$keys[$name]) &&
195 CRM_Utils_Array::value('is_required', CRM_Utils_Array::value($name, $$keys))
196 ) {
197 $$name = 1;
198 }
199 }
200 }
201
202 $required = ($button == 'skip' ||
203 $this->_values['event']['allow_same_participant_emails'] == 1 &&
204 ($first_name && $last_name)
205 ) ? FALSE : TRUE;
206
207 //add buttons
208 $js = NULL;
209 if ($this->isLastParticipant(TRUE) && empty($this->_values['event']['is_monetary'])) {
210 $js = array('onclick' => "return submitOnce(this,'" . $this->_name . "','" . ts('Processing') . "');");
211 }
212
213 //handle case where user might sart with waiting by group
214 //registration and skip some people and now group fit to
215 //become registered so need to take payment from user.
216 //this case only occurs at dynamic waiting status, CRM-4320
217 $statusMessage = NULL;
218 $allowToProceed = TRUE;
219 $includeSkipButton = TRUE;
220 $this->_resetAllowWaitlist = FALSE;
221
222 $pricesetFieldsCount = CRM_Price_BAO_PriceSet::getPricesetCount($this->_priceSetId);
223
224 if ($this->_lastParticipant || $pricesetFieldsCount) {
225 //get the participant total.
226 $processedCnt = self::getParticipantCount($this, $this->_params, TRUE);
227 }
228
229 if (!$this->_allowConfirmation && !empty($this->_params[0]['bypass_payment']) &&
230 $this->_lastParticipant
231 ) {
232
233 //get the event spaces.
234 $spaces = $this->_availableRegistrations;
235
236 $currentPageMaxCount = 1;
237 if ($pricesetFieldsCount) {
238 $currentPageMaxCount = $pricesetFieldsCount;
239 }
240
241 //we might did reset allow waiting in case of dynamic calculation
242 if (!empty($this->_params[0]['bypass_payment']) &&
243 is_numeric($spaces) &&
244 $processedCnt > $spaces
245 ) {
246 $this->_allowWaitlist = TRUE;
247 $this->set('allowWaitlist', TRUE);
248 }
249
250 //lets allow to become a part of runtime waiting list, if primary selected pay later.
251 $realPayLater = FALSE;
252 if (!empty($this->_values['event']['is_monetary']) && !empty($this->_values['event']['is_pay_later'])) {
253 $realPayLater = CRM_Utils_Array::value('is_pay_later', $this->_params[0]);
254 }
255
256 //truly spaces are greater than required.
257 if (is_numeric($spaces) && $spaces >= ($processedCnt + $currentPageMaxCount)) {
258 if (CRM_Utils_Array::value('amount', $this->_params[0], 0) == 0 || $this->_requireApproval) {
259 $this->_allowWaitlist = FALSE;
260 $this->set('allowWaitlist', $this->_allowWaitlist);
261 if ($this->_requireApproval) {
262 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.", array(1 => ++$processedCnt, 2 => $spaces));
263 }
264 else {
265 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed).", array(1 => ++$processedCnt, 2 => $spaces));
266 }
267 }
268 else {
269 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Please go back to the main registration page and reduce the number of additional people. You will also need to complete payment information.", array(1 => ++$processedCnt, 2 => $spaces));
270 $allowToProceed = FALSE;
271 }
272 CRM_Core_Session::setStatus($statusMessage, ts('Registration Error'), 'error');
273 }
274 elseif ($processedCnt == $spaces) {
275 if (CRM_Utils_Array::value('amount', $this->_params[0], 0) == 0
276 || $realPayLater || $this->_requireApproval
277 ) {
278 $this->_resetAllowWaitlist = TRUE;
279 if ($this->_requireApproval) {
280 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.");
281 }
282 else {
283 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed).");
284 }
285 }
286 else {
287 //hey there is enough space and we require payment.
288 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed). Please go back to the main registration page and reduce the number of additional people. You will also need to complete payment information.");
289 $includeSkipButton = FALSE;
290 }
291 }
292 }
293
294 // for priceset with count
295 if ($pricesetFieldsCount && !empty($this->_values['event']['has_waitlist']) &&
296 !$this->_allowConfirmation
297 ) {
298
299 if ($this->_isEventFull) {
300 $statusMessage = ts('This event is currently full. You are registering for the waiting list. You will be notified if spaces become available.');
301 }
302 elseif ($this->_allowWaitlist ||
303 (!$this->_allowWaitlist && ($processedCnt + $pricesetFieldsCount) > $this->_availableRegistrations)
304 ) {
305
306 $waitingMsg = ts('It looks like you are registering more participants then there are spaces available. All participants will be added to the waiting list. You will be notified if spaces become available.');
307 $confirmedMsg = ts('It looks like there are enough spaces in this event for your group (you will not be wait listed).');
308 if ($this->_requireApproval) {
309 $waitingMsg = ts('It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.');
310 $confirmedMsg = ts('It looks there are enough spaces in this event for your group (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.');
311 }
312
313 $this->assign('waitingMsg', $waitingMsg);
314 $this->assign('confirmedMsg', $confirmedMsg);
315
316 $this->assign('availableRegistrations', $this->_availableRegistrations);
317 $this->assign('currentParticipantCount', $processedCnt);
318 $this->assign('allowGroupOnWaitlist', TRUE);
319
320 $paymentBypassed = NULL;
321 if (!empty($this->_params[0]['bypass_payment']) &&
322 !$this->_allowWaitlist &&
323 !$realPayLater &&
324 !$this->_requireApproval &&
325 !(CRM_Utils_Array::value('amount', $this->_params[0], 0) == 0)
326 ) {
327 $paymentBypassed = ts('Please go back to the main registration page, to complete payment information.');
328 }
329 $this->assign('paymentBypassed', $paymentBypassed);
330 }
331 }
332
333 $this->assign('statusMessage', $statusMessage);
334
335 $buttons = array(
336 array('type' => 'back',
337 'name' => ts('<< Go Back'),
338 'spacing' => '&nbsp;&nbsp;&nbsp;&nbsp',
339 ),
340 );
341
342 //CRM-4320
343 if ($allowToProceed) {
344 $buttons = array_merge($buttons, array(
345 array('type' => 'next',
346 'name' => ts('Continue >>'),
347 'spacing' => '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
348 'isDefault' => TRUE,
349 'js' => $js,
350 ),
351 )
352 );
353 if ($includeSkipButton) {
354 $buttons = array_merge($buttons, array(
355 array('type' => 'next',
356 'name' => ts('Skip Participant >>|'),
357 'subName' => 'skip',
358 ),
359 )
360 );
361 }
362 }
363 $this->addButtons($buttons);
364 $this->addFormRule(array('CRM_Event_Form_Registration_AdditionalParticipant', 'formRule'), $this);
365 }
366
367 /**
368 * global form rule
369 *
370 * @param array $fields the input form values
371 * @param array $files the uploaded files if any
372 * @param array $options additional user data
373 *
374 * @return true if no errors, else array of errors
375 * @access public
376 * @static
377 */
378 static function formRule($fields, $files, $self) {
379 $errors = array();
380 //get the button name.
381 $button = substr($self->controller->getButtonName(), -4);
382
383 $realPayLater = FALSE;
384 if (!empty($self->_values['event']['is_monetary']) && !empty($self->_values['event']['is_pay_later'])) {
385 $realPayLater = CRM_Utils_Array::value('is_pay_later', $self->_params[0]);
386 }
387
388 if ($button != 'skip') {
389 //Check that either an email or firstname+lastname is included in the form(CRM-9587)
390 CRM_Event_Form_Registration_Register::checkProfileComplete($fields, $errors, $self->_eventId);
391
392 //Additional Participant can also register for an event only once
393 $isRegistered = CRM_Event_Form_Registration_Register::checkRegistration($fields, $self, TRUE);
394 if ($isRegistered) {
395 if ($self->_values['event']['allow_same_participant_emails']) {
396 $errors['_qf_default'] = ts('A person is already registered for this event.');
397 }
398 else {
399 $errors["email-{$self->_bltID}"] = ts('A person with this email address is already registered for this event.');
400 }
401 }
402
403 //get the complete params.
404 $params = $self->get('params');
405
406 //take the participant instance.
407 $addParticipantNum = substr($self->_name, 12);
408
409 if (is_array($params)) {
410 foreach ($params as $key => $value) {
411 if ($key != $addParticipantNum) {
412 if (!$self->_values['event']['allow_same_participant_emails']) {
413 //collect all email fields
414 $existingEmails = array();
415 $additionalParticipantEmails = array();
416 if (is_array($value)) {
417 foreach ($value as $key => $val) {
418 if (substr($key, 0, 6) == 'email-' && $val) {
419 $existingEmails[] = $val;
420 }
421 }
422 }
423 foreach ($fields as $key => $val) {
424 if (substr($key, 0, 6) == 'email-' && $val) {
425 $additionalParticipantEmails[] = $val;
426 $mailKey = $key;
427 }
428 }
429 //check if any emails are common to both arrays
430 if (count(array_intersect($existingEmails, $additionalParticipantEmails))) {
431 $errors[$mailKey] = ts('The email address must be unique for each participant.');
432 break;
433 }
434 }
435 else {
436 // check with first_name and last_name for additional participants
437 if (!empty($value['first_name']) && ($value['first_name'] == CRM_Utils_Array::value('first_name', $fields)) &&
438 (CRM_Utils_Array::value('last_name',$value) == CRM_Utils_Array::value('last_name', $fields))
439 ) {
440 $errors['first_name'] = ts('The first name and last name must be unique for each participant.');
441 break;
442 }
443 }
444 }
445 }
446 }
447
448 //check for atleast one pricefields should be selected
449 if (!empty($fields['priceSetId'])) {
450 $allParticipantParams = $params;
451
452 //format current participant params.
453 $allParticipantParams[$addParticipantNum] = self::formatPriceSetParams($self, $fields);
454 $totalParticipants = self::getParticipantCount($self, $allParticipantParams);
455
456 //validate price field params.
457 $priceSetErrors = self::validatePriceSet($self, $allParticipantParams);
458 $errors = array_merge($errors, CRM_Utils_Array::value($addParticipantNum, $priceSetErrors, array()));
459
460 if (!$self->_allowConfirmation &&
461 is_numeric($self->_availableRegistrations)
462 ) {
463 if (!empty($self->_params[0]['bypass_payment']) &&
464 !$self->_allowWaitlist &&
465 !$realPayLater &&
466 !$self->_requireApproval &&
467 !(CRM_Utils_Array::value('amount', $self->_params[0], 0) == 0) &&
468 $totalParticipants < $self->_availableRegistrations
469 ) {
470 $errors['_qf_default'] = ts("Your event registration will be confirmed. Please go back to the main registration page, to complete payment information.");
471 }
472 //check for availability of registrations.
473 if (!$self->_allowConfirmation && empty($self->_values['event']['has_waitlist']) &&
474 $totalParticipants > $self->_availableRegistrations
475 ) {
476 $errors['_qf_default'] = ts('It looks like event has only %2 seats available and you are trying to register %1 participants, so could you please select price options accordingly.', array(1 => $totalParticipants, 2 => $self->_availableRegistrations));
477 }
478 }
479 }
480 }
481
482 if ($button == 'skip' && $self->_lastParticipant && !empty($fields['priceSetId'])) {
483 $pricesetFieldsCount = CRM_Price_BAO_PriceSet::getPricesetCount($fields['priceSetId']);
484 if (($pricesetFieldsCount < 1) || $self->_allowConfirmation) {
485 return $errors;
486 }
487
488 if (!empty($self->_values['event']['has_waitlist']) && !empty($self->_params[0]['bypass_payment']) &&
489 !$self->_allowWaitlist &&
490 !$realPayLater &&
491 !$self->_requireApproval &&
492 !(CRM_Utils_Array::value('amount', $self->_params[0], 0) == 0)
493 ) {
494 $errors['_qf_default'] = ts("You are going to skip the last participant, your event registration will be confirmed. Please go back to the main registration page, to complete payment information.");
495 }
496 }
497
498
499 if ($button != 'skip' &&
500 $self->_values['event']['is_monetary'] &&
501 !isset($errors['_qf_default']) &&
502 !$self->validatePaymentValues($self, $fields)
503 ) {
504 $errors['_qf_default'] = ts("Your payment information looks incomplete. Please go back to the main registration page, to complete payment information.");
505 $self->set('forcePayement', TRUE);
506 }
507 elseif ($button == 'skip') {
508 $self->set('forcePayement', TRUE);
509 }
510
511 return $errors;
512 }
513
514 function validatePaymentValues($self, $fields) {
515
516 if (!empty($self->_params[0]['bypass_payment']) ||
517 $self->_allowWaitlist ||
518 empty($self->_fields) ||
519 CRM_Utils_Array::value('amount', $self->_params[0]) > 0
520 ) {
521 return TRUE;
522 }
523
524 $validatePayement = FALSE;
525 if (!empty($fields['priceSetId'])) {
526 $lineItem = array();
527 CRM_Price_BAO_PriceSet::processAmount($self->_values['fee'], $fields, $lineItem);
528 if ($fields['amount'] > 0) {
529 $validatePayement = TRUE;
530 // $self->_forcePayement = true;
531 // return false;
532 }
533 }
534 elseif (!empty($fields['amount']) &&
535 (CRM_Utils_Array::value('value', $self->_values['fee'][$fields['amount']]) > 0)
536 ) {
537 $validatePayement = TRUE;
538 }
539
540 if (!$validatePayement) {
541 return TRUE;
542 }
543
544 $errors = array();
545
546 CRM_Core_Form::validateMandatoryFields($self->_fields, $fields, $errors);
547
548 // make sure that credit card number and cvv are valid
549 CRM_Core_Payment_Form::validateCreditCard($self->_params[0], $errors);
550
551 if ($errors) {
552 return FALSE;
553 }
554
555 foreach (CRM_Contact_BAO_Contact::$_greetingTypes as $greeting) {
556 if ($greetingType = CRM_Utils_Array::value($greeting, $self->_params[0])) {
557 $customizedValue = CRM_Core_OptionGroup::getValue($greeting, 'Customized', 'name');
558 if ($customizedValue == $greetingType && empty($self->_params[0][$greeting . '_custom'])) {
559 return FALSE;
560 }
561 }
562 }
563 }
564
565 /**
566 * Function to process the form
567 *
568 * @access public
569 *
570 * @return void
571 */
572 public function postProcess() {
573 //get the button name.
574 $button = substr($this->controller->getButtonName(), -4);
575
576 //take the participant instance.
577 $addParticipantNum = substr($this->_name, 12);
578
579 //user submitted params.
580 $params = $this->controller->exportValues($this->_name);
581
582 if (!$this->_allowConfirmation) {
583 // check if the participant is already registered
584 $params['contact_id'] = CRM_Event_Form_Registration_Register::checkRegistration($params, $this, TRUE, TRUE);
585 }
586
587 //carry campaign to partcipants.
588 if (array_key_exists('participant_campaign_id', $params)) {
589 $params['campaign_id'] = $params['participant_campaign_id'];
590 }
591 else {
592 $params['campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values['event']);
593 }
594
595 // if waiting is enabled
596 if (!$this->_allowConfirmation &&
597 is_numeric($this->_availableRegistrations)
598 ) {
599 $this->_allowWaitlist = FALSE;
600 //get the current page count.
601 $currentCount = self::getParticipantCount($this, $params);
602 if ($button == 'skip') {
603 $currentCount = 'skip';
604 }
605
606 //get the total count.
607 $previousCount = self::getParticipantCount($this, $this->_params, TRUE);
608 $totalParticipants = $previousCount;
609 if (is_numeric($currentCount)) {
610 $totalParticipants += $currentCount;
611 }
612 if (!empty($this->_values['event']['has_waitlist']) &&
613 $totalParticipants > $this->_availableRegistrations
614 ) {
615 $this->_allowWaitlist = TRUE;
616 }
617 $this->set('allowWaitlist', $this->_allowWaitlist);
618 $this->_lineItemParticipantsCount[$addParticipantNum] = $currentCount;
619 }
620
621 if ($button == 'skip') {
622 //hack for free/zero amount event.
623 if ($this->_resetAllowWaitlist) {
624 $this->_allowWaitlist = FALSE;
625 $this->set('allowWaitlist', FALSE);
626 if ($this->_requireApproval) {
627 $status = ts("You have skipped last participant and which result into event having enough spaces, but your registration require approval, Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.");
628 }
629 else {
630 $status = ts("You have skipped last participant and which result into event having enough spaces, hence your group become as register participants though you selected on wait list.");
631 }
632 CRM_Core_Session::setStatus($status);
633 }
634
635 $this->_params[$addParticipantNum] = 'skip';
636 if (isset($this->_lineItem)) {
637 $this->_lineItem[$addParticipantNum] = 'skip';
638 $this->_lineItemParticipantsCount[$addParticipantNum] = 'skip';
639 }
640 }
641 else {
642
643 $config = CRM_Core_Config::singleton();
644 $params['currencyID'] = $config->defaultCurrency;
645
646 if ($this->_values['event']['is_monetary']) {
647
648 //added for discount
649 $discountId = CRM_Core_BAO_Discount::findSet($this->_eventId, 'civicrm_event');
650
651 if (!empty($this->_values['discount'][$discountId])) {
652 $params['discount_id'] = $discountId;
653 $params['amount_level'] = $this->_values['discount'][$discountId][$params['amount']]['label'];
654 $params['amount'] = $this->_values['discount'][$discountId][$params['amount']]['value'];
655 }
656 elseif (empty($params['priceSetId'])) {
657 $params['amount_level'] = $this->_values['fee'][$params['amount']]['label'];
658 $params['amount'] = $this->_values['fee'][$params['amount']]['value'];
659 }
660 else {
661 $lineItem = array();
662 CRM_Price_BAO_PriceSet::processAmount($this->_values['fee'], $params, $lineItem);
663
664 //build the line item..
665 if (array_key_exists($addParticipantNum, $this->_lineItem)) {
666 $this->_lineItem[$addParticipantNum] = $lineItem;
667 }
668 else {
669 $this->_lineItem[] = $lineItem;
670 }
671 }
672 }
673
674 if (array_key_exists('participant_role', $params)) {
675 $params['participant_role_id'] = $params['participant_role'];
676 }
677
678 if (empty($params['participant_role_id']) && $this->_values['event']['default_role_id']) {
679 $params['participant_role_id'] = $this->_values['event']['default_role_id'];
680 }
681
682 if (!empty($this->_params[0]['is_pay_later'])) {
683 $params['is_pay_later'] = 1;
684 }
685
686 //carry additional participant id, contact id if pre-registered.
687 if ($this->_allowConfirmation && $this->_additionalParticipantId) {
688 $params['contact_id'] = $this->_contactId;
689 $params['participant_id'] = $this->_additionalParticipantId;
690 }
691
692 //build the params array.
693 if (array_key_exists($addParticipantNum, $this->_params)) {
694 $this->_params[$addParticipantNum] = $params;
695 }
696 else {
697 $this->_params[] = $params;
698 }
699 }
700
701 //finally set the params.
702 $this->set('params', $this->_params);
703 //set the line item.
704 if ($this->_lineItem) {
705 $this->set('lineItem', $this->_lineItem);
706 $this->set('lineItemParticipantsCount', $this->_lineItemParticipantsCount);
707 }
708
709 $participantNo = count($this->_params);
710 if ($button != 'skip') {
711 $statusMsg = ts('Registration information for participant %1 has been saved.', array(1 => $participantNo));
712 CRM_Core_Session::setStatus($statusMsg, ts('Registration Saved'), 'success');
713 }
714
715 // Check whether to process the registration now, calling processRegistration()
716 if (
717 !$this->_values['event']['is_confirm_enabled'] // CRM-11182 - Optional confirmation screen
718 && CRM_Utils_Array::value('additional_participants', $this->_params[0])
719 && $this->isLastParticipant()
720 ) {
721 CRM_Event_Form_Registration_Register::processRegistration($this->_params, NULL);
722 }
723 }
724
725 public static function &getPages($additionalParticipant) {
726 $details = array();
727 for ($i = 1; $i <= $additionalParticipant; $i++) {
728 $details["Participant_{$i}"] = array(
729 'className' => 'CRM_Event_Form_Registration_AdditionalParticipant',
730 'title' => "Register Additional Participant {$i}",
731 );
732 }
733 return $details;
734 }
735
736 /**
737 * check whether call current participant is last one
738 *
739 * @return boolean ture on success.
740 * @access public
741 */
742 function isLastParticipant($isButtonJs = FALSE) {
743 $participant = $isButtonJs ? $this->_params[0]['additional_participants'] : $this->_params[0]['additional_participants'] + 1;
744 if (count($this->_params) == $participant) {
745 return TRUE;
746 }
747 return FALSE;
748 }
749
750 /**
751 * Reset values for all options those are full.
752 *
753 **/
754 function resetElementValue($optionFullIds = array(
755 )) {
756 if (!is_array($optionFullIds) ||
757 empty($optionFullIds) ||
758 !$this->isSubmitted()
759 ) {
760 return;
761 }
762
763 foreach ($optionFullIds as $fldId => $optIds) {
764 $name = "price_$fldId";
765 if (!$this->elementExists($name)) {
766 continue;
767 }
768
769 $element = $this->getElement($name);
770 $eleType = $element->getType();
771
772 $resetSubmitted = FALSE;
773 switch ($eleType) {
774 case 'text':
775 if ($element->isFrozen()) {
776 $element->setValue('');
777 $resetSubmitted = TRUE;
778 }
779 break;
780
781 case 'group':
782 if (is_array($element->_elements)) {
783 foreach ($element->_elements as $child) {
784 $childType = $child->getType();
785 $methodName = 'getName';
786 if ($childType) {
787 $methodName = 'getValue';
788 }
789 if (in_array($child->{$methodName}(), $optIds) && $child->isFrozen()) {
790 $resetSubmitted = TRUE;
791 $child->updateAttributes(array('checked' => NULL));
792 }
793 }
794 }
795 break;
796
797 case 'select':
798 $resetSubmitted = TRUE;
799 $element->_values = array();
800 break;
801 }
802
803 //finally unset values from submitted.
804 if ($resetSubmitted) {
805 $this->resetSubmittedValue($name, $optIds);
806 }
807 }
808 }
809
810 function resetSubmittedValue($elementName, $optionIds = array(
811 )) {
812 if (empty($elementName) ||
813 !$this->elementExists($elementName) ||
814 !$this->getSubmitValue($elementName)
815 ) {
816 return;
817 }
818 foreach (array(
819 'constantValues', 'submitValues', 'defaultValues') as $val) {
820 $values = &$this->{"_$val"};
821 if (!is_array($values) || empty($values)) {
822 continue;
823 }
824 $eleVal = CRM_Utils_Array::value($elementName, $values);
825 if (empty($eleVal)) {
826 continue;
827 }
828 if (is_array($eleVal)) {
829 $found = FALSE;
830 foreach ($eleVal as $keyId => $ignore) {
831 if (in_array($keyId, $optionIds)) {
832 $found = TRUE;
833 unset($values[$elementName][$keyId]);
834 }
835 }
836 if ($found && empty($values[$elementName][$keyId])) {
837 $values[$elementName][$keyId] = NULL;
838 }
839 }
840 else {
841 $values[$elementName][$keyId] = NULL;
842 }
843 }
844 }
845 }
846