CRM-19800, added test
[civicrm-core.git] / templates / CRM / Event / Form / Participant.tpl
CommitLineData
6a488035
TO
1{*
2 +--------------------------------------------------------------------+
2c4c49ca 3 | CiviCRM version 4.7 |
6a488035 4 +--------------------------------------------------------------------+
fa938177 5 | Copyright CiviCRM LLC (c) 2004-2016 |
6a488035
TO
6 +--------------------------------------------------------------------+
7 | This file is a part of CiviCRM. |
8 | |
9 | CiviCRM is free software; you can copy, modify, and distribute it |
10 | under the terms of the GNU Affero General Public License |
11 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
12 | |
13 | CiviCRM is distributed in the hope that it will be useful, but |
14 | WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
16 | See the GNU Affero General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU Affero General Public |
19 | License and the CiviCRM Licensing Exception along |
20 | with this program; if not, contact CiviCRM LLC |
21 | at info[AT]civicrm[DOT]org. If you have questions about the |
22 | GNU Affero General Public License or the licensing of CiviCRM, |
23 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
24 +--------------------------------------------------------------------+
25*}
26{* This template is used for adding/editing/deleting offline Event Registrations *}
1beb268a
CW
27
28{* Ajax callback for showing event fee snippet *}
bc2eeabb 29{if $showFeeBlock}
6a488035
TO
30 {if $priceSet}
31 <div id='validate_pricefield' class='messages crm-error hiddenElement'></div>
32 {literal}
33 <script type="text/javascript">
34
ae8f569f 35 var fieldOptionsFull = [];
6a488035
TO
36 {/literal}
37 {foreach from=$priceSet.fields item=fldElement key=fldId}
38 {if $fldElement.options}
39 {foreach from=$fldElement.options item=fldOptions key=opId}
40 {if $fldOptions.is_full}
41 {literal}
ae8f569f 42 fieldOptionsFull[{/literal}{$fldId}{literal}] = [];
6a488035
TO
43 fieldOptionsFull[{/literal}{$fldId}{literal}][{/literal}{$opId}{literal}] = 1;
44 {/literal}
45 {/if}
46 {/foreach}
47 {/if}
48 {/foreach}
49 {literal}
50
51 if ( fieldOptionsFull.length > 0 ) {
3cc60a06 52 CRM.$(function($) {
ae8f569f
CW
53 $("input,#priceset select,#priceset").each(function () {
54 if ( $(this).attr('price') ) {
55 switch( $(this).attr('type') ) {
6a488035
TO
56 case 'checkbox':
57 case 'radio':
ae8f569f 58 $(this).click( function() {
6a488035
TO
59 validatePriceField(this);
60 });
61 break;
62
63 case 'select-one':
ae8f569f 64 $(this).change( function() {
6a488035
TO
65 validatePriceField(this);
66 });
67 break;
68 case 'text':
ae8f569f 69 $(this).bind( 'keyup', function() { validatePriceField(this) });
6a488035
TO
70 break;
71 }
72 }
73 });
74 });
75
76 function validatePriceField( obj ) {
77 var namePart = cj(obj).attr('name').split('_');
78 var fldVal = cj(obj).val();
79 if ( cj(obj).attr('type') == 'checkbox') {
80 var eleIdpart = namePart[1].split('[');
81 var eleId = eleIdpart[0];
82 }
83 else {
84 var eleId = namePart[1];
85 }
86 var showError = false;
87
88 switch( cj(obj).attr('type') ) {
89 case 'text':
90 if ( fieldOptionsFull[eleId] && fldVal ) {
91 showError = true;
92 cj(obj).parent( ).parent( ).children('.label').addClass('crm-error');
93 }
94 else {
95 cj(obj).parent( ).parent( ).children('.label').removeClass('crm-error');
96 cj('#validate_pricefield').hide( ).html('');
97 }
98 break;
99
100 case 'checkbox':
101 var checkBoxValue = eleIdpart[1].split(']');
8539f25d 102 if ( cj(obj).prop("checked") == true &&
6a488035
TO
103 fieldOptionsFull[eleId] &&
104 fieldOptionsFull[eleId][checkBoxValue[0]]) {
105 showError = true;
106 cj(obj).parent( ).addClass('crm-error');
107 }
108 else {
109 cj(obj).parent( ).removeClass('crm-error');
110 }
111 break;
112
113 default:
114 if ( fieldOptionsFull[eleId] &&
115 fieldOptionsFull[eleId][fldVal] ) {
116 showError = true;
117 cj(obj).parent( ).addClass('crm-error');
118 }
119 else {
120 cj(obj).parent( ).removeClass('crm-error');
121 }
122 }
123
124 if ( showError ) {
ee8c1ef3 125 cj('#validate_pricefield').show().html('<i class="crm-i fa-exclamation-triangle crm-i-red"></i>{/literal} {ts escape='js'}This Option is already full for this event.{/ts}{literal}');
6a488035
TO
126 }
127 else {
128 cj('#validate_pricefield').hide( ).html('');
129 }
130 }
131 }
59e44db1
PJ
132
133 // change the status to default 'partially paid' for partial payments
b6c15d8a 134 var feeAmount, userModifiedAmount;
81f3d017 135 var partiallyPaidStatusId = {/literal}{$partiallyPaidStatusId}{literal};
59e44db1
PJ
136
137 cj('#total_amount')
138 .focus(
139 function() {
140 feeAmount = cj(this).val();
141 feeAmount = parseInt(feeAmount);
142 }
143 )
144 .change(
145 function() {
146 userModifiedAmount = cj(this).val();
147 userModifiedAmount = parseInt(userModifiedAmount);
148 if (userModifiedAmount < feeAmount) {
f5bb53b8 149 cj('#status_id').val(partiallyPaidStatusId).change();
59e44db1
PJ
150 }
151 }
152 );
153
b50fdacc 154 cj('form[name=Participant]').on("click", '.validate',
59e44db1 155 function(e) {
ad44e24b
DRJ
156 if (CRM.$('#total_amount').length == 0) {
157 var $balance = CRM.$('#payment-info-balance');
158 if ($balance.length > 0 && parseFloat($balance.attr('data-balance')) == 0) {
159 return true;
160 }
161 }
59e44db1
PJ
162 var userSubmittedStatus = cj('#status_id').val();
163 var statusLabel = cj('#status_id option:selected').text();
81f3d017
PJ
164 if (userModifiedAmount < feeAmount && userSubmittedStatus != partiallyPaidStatusId) {
165 var msg = "{/literal}{ts escape="js" 1="%1"}Payment amount is less than the amount owed. Expected participant status is 'Partially paid'. Are you sure you want to set the participant status to %1? Click OK to continue, Cancel to change your entries.{/ts}{literal}";
166 var result = confirm(ts(msg, {1: statusLabel}));
59e44db1 167 if (result == false) {
81f3d017 168 return false;
59e44db1
PJ
169 }
170 }
171 }
172 );
6a488035
TO
173 </script>
174 {/literal}
175 {/if}
d5397f2f 176
6a488035 177 {include file="CRM/Event/Form/EventFees.tpl"}
1beb268a 178
1beb268a 179{* Main event form template *}
6a488035
TO
180{else}
181 {if $participantMode == 'test' }
182 {assign var=registerMode value="TEST"}
183 {elseif $participantMode == 'live'}
184 {assign var=registerMode value="LIVE"}
185 {/if}
6a488035
TO
186 <div class="crm-block crm-form-block crm-participant-form-block">
187 <div class="view-content">
188 {if $participantMode}
f6eedce7 189 <div class="help">
6a488035
TO
190 {ts 1=$displayName 2=$registerMode}Use this form to submit an event registration on behalf of %1. <strong>A %2 transaction will be submitted</strong> using the selected payment processor.{/ts}
191 </div>
192 {/if}
193 <div id="eventFullMsg" class="messages status no-popup" style="display:none;"></div>
194
195
196 {if $action eq 1 AND $paid}
f6eedce7 197 <div class="help">
6a488035
TO
198 {ts}If you are accepting offline payment from this participant, check <strong>Record Payment</strong>. You will be able to fill in the payment information, and optionally send a receipt.{/ts}
199 </div>
200 {/if}
201
202 {if $action eq 8} {* If action is Delete *}
6a488035
TO
203 <div class="crm-participant-form-block-delete messages status no-popup">
204 <div class="crm-content">
205 <div class="icon inform-icon"></div> &nbsp;
206 {ts}WARNING: Deleting this registration will result in the loss of related payment records (if any).{/ts} {ts}Do you want to continue?{/ts}
207 </div>
208 {if $additionalParticipant}
209 <div class="crm-content">
210 {ts 1=$additionalParticipant} There are %1 more Participant(s) registered by this participant.{/ts}
211 </div>
212 {/if}
213 </div>
214 {if $additionalParticipant}
215 {$form.delete_participant.html}
216 {/if}
217 {else} {* If action is other than Delete *}
218 <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
219 <table class="form-layout-compressed">
220 {if $single and $context neq 'standalone'}
221 <tr class="crm-participant-form-block-displayName">
222 <td class="label font-size12pt"><label>{ts}Participant{/ts}</label></td>
223 <td class="font-size12pt view-value">{$displayName}&nbsp;</td>
224 </tr>
225 {else}
479696ed
CW
226 <tr class="crm-participant-form-contact-id">
227 <td class="label">{$form.contact_id.label}</td>
228 <td>{$form.contact_id.html}</td>
229 </tr>
6a488035
TO
230 {/if}
231 {if $action EQ 2}
232 {if $additionalParticipants} {* Display others registered by this participant *}
233 <tr class="crm-participant-form-block-additionalParticipants">
234 <td class="label"><label>{ts}Also Registered by this Participant{/ts}</label></td>
235 <td>
236 {foreach from=$additionalParticipants key=apName item=apURL}
237 <a href="{$apURL}" title="{ts}view additional participant{/ts}">{$apName}</a><br />
238 {/foreach}
239 </td>
240 </tr>
241 {/if}
242 {if $registered_by_contact_id}
243 <tr class="crm-participant-form-block-registered-by">
244 <td class="label"><label>{ts}Registered By{/ts}</label></td>
245 <td class="view-value">
246 <a href="{crmURL p='civicrm/contact/view/participant' q="reset=1&id=$participant_registered_by_id&cid=$registered_by_contact_id&action=view"}"
247 title="{ts}view primary participant{/ts}">{$registered_by_display_name}</a>
248 </td>
249 </tr>
250 {/if}
251 {/if}
252 {if $participantMode}
253 <tr class="crm-participant-form-block-payment_processor_id">
254 <td class="label nowrap">{$form.payment_processor_id.label}</td>
255 <td>{$form.payment_processor_id.html}</td>
256 </tr>
257 {/if}
258 <tr class="crm-participant-form-block-event_id">
1beb268a
CW
259 <td class="label">{$form.event_id.label}</td>
260 <td class="view-value">
261 {$form.event_id.html}
262 {if $is_test}
263 {ts}(test){/ts}
264 {/if}
265 </td>
6a488035
TO
266 </tr>
267
268 {* CRM-7362 --add campaign *}
1beb268a 269 {include file="CRM/Campaign/Form/addCampaignToComponent.tpl" campaignTrClass="crm-participant-form-block-campaign_id"}
6a488035
TO
270
271 <tr class="crm-participant-form-block-role_id">
272 <td class="label">{$form.role_id.label}</td>
273 <td>{$form.role_id.html}</td>
274 </tr>
275 <tr class="crm-participant-form-block-register_date">
276 <td class="label">{$form.register_date.label}</td>
277 <td>
278 {if $hideCalendar neq true}
279 {include file="CRM/common/jcalendar.tpl" elementName=register_date}
280 {else}
d32858b8 281 {$form.register_date.value|crmDate}
6a488035
TO
282 {/if}
283 </td>
284 </tr>
285 <tr class="crm-participant-form-block-status_id">
286 <td class="label">{$form.status_id.label}</td>
287 <td>{$form.status_id.html}{if $event_is_test} {ts}(test){/ts}{/if}
288 <div id="notify">{$form.is_notify.html}{$form.is_notify.label}</div>
289 </td>
290 </tr>
291 <tr class="crm-participant-form-block-source">
292 <td class="label">{$form.source.label}</td><td>{$form.source.html|crmAddClass:huge}<br />
293 <span class="description">{ts}Source for this registration (if applicable).{/ts}</span></td>
294 </tr>
295 </table>
0b2b58ea 296 {if $participantId and $hasPayment}
29c61b58
PJ
297 <table class='form-layout'>
298 <tr>
299 <td class='label'>{ts}Fees{/ts}</td>
300 {* this is where the payment info is shown using CRM/Contribute/Page/PaymentInfo.tpl tpl*}
301 <td id='payment-info'></td>
302 </tr>
303 </table>
304 {/if}
6a488035 305 {* Fee block (EventFees.tpl) is injected here when an event is selected. *}
ab421ec6 306 <div class="crm-event-form-fee-block"></div>
6a488035
TO
307 <fieldset>
308 <table class="form-layout">
309 <tr class="crm-participant-form-block-note">
310 <td class="label">{$form.note.label}</td><td>{$form.note.html}</td>
311 </tr>
312 </table>
313 </fieldset>
314
315 <div class="crm-participant-form-block-customData">
316 <div id="customData" class="crm-customData-block"></div> {* Participant Custom data *}
317 <div id="customData{$eventNameCustomDataTypeID}" class="crm-customData-block"></div> {* Event Custom Data *}
318 <div id="customData{$roleCustomDataTypeID}" class="crm-customData-block"></div> {* Role Custom Data *}
319 <div id="customData{$eventTypeCustomDataTypeID}" class="crm-customData-block"></div> {* Role Custom Data *}
320 </div>
321 {/if}
322
323 {if $accessContribution and $action eq 2 and $rows.0.contribution_id}
324 {include file="CRM/Contribute/Form/Selector.tpl" context="Search"}
325 {/if}
326
327 <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
328 </div>
329 </div>
1beb268a 330 {* JS block for ADD or UPDATE actions only *}
6a488035 331 {if $action eq 1 or $action eq 2}
0b2b58ea 332 {if $participantId and $hasPayment}
685dc433 333 {include file="CRM/Contribute/Page/PaymentInfo.tpl" show='payments'}
dfbeebc5 334 {/if}
b1ea2569
PJ
335
336 {*include custom data js file*}
337 {include file="CRM/common/customData.tpl"}
338
6a488035 339 <script type="text/javascript">
1beb268a 340 {literal}
3cc60a06 341 CRM.$(function($) {
82a54c66 342
b50fdacc 343 var $form = $('form.{/literal}{$form.formClass}{literal}');
6a488035 344
1beb268a
CW
345 // Handle event selection
346 $('#event_id', $form).change(function() {
347 var eventId = $(this).val();
348 if (!eventId) {
349 return;
350 }
351 var info = $(this).select2('data').extra;
6a488035 352
1beb268a 353 // Set role from default
cd120ea0 354 $('select[name^=role_id]', $form).select2('val', [info.default_role_id], true);
6a488035 355
1beb268a
CW
356 // Set campaign default
357 $('#campaign_id', $form).select2('val', info.campaign_id);
6a488035 358
1beb268a
CW
359 // Event and event-type custom data
360 CRM.buildCustomData('Participant', eventId, {/literal}{$eventNameCustomDataTypeID}{literal});
361 CRM.buildCustomData('Participant', info.event_type_id, {/literal}{$eventTypeCustomDataTypeID}{literal});
6a488035 362
1beb268a
CW
363 buildFeeBlock();
364 });
6a488035 365
1beb268a 366 // Handle participant role selection
cd120ea0
CW
367 $('select[name^=role_id]', $form).change(buildRoleCustomData);
368 if ($('select[name^=role_id]', $form).val()) {
369 buildRoleCustomData();
370 }
6a488035 371
1beb268a 372 buildFeeBlock();
6a488035 373
1beb268a
CW
374 //build discount block
375 if ($('#discount_id', $form).val()) {
376 buildFeeBlock($('#discount_id', $form).val());
377 }
95e7a695
CW
378 $($form).on('change', '#discount_id', function() {
379 buildFeeBlock($(this).val());
380 });
6a488035 381
cd120ea0 382 function buildRoleCustomData() {
91dcfec6
CW
383 var roleId = $('select[name^=role_id]', $form).val() || [];
384 CRM.buildCustomData('Participant', roleId.join(), {/literal}{$roleCustomDataTypeID}{literal});
cd120ea0
CW
385 }
386
1beb268a
CW
387 //build fee block
388 function buildFeeBlock(discountId) {
389 var dataUrl = {/literal}"{crmURL p=$urlPath h=0 q="snippet=4&qfKey=$qfKey"}";
6a488035 390
1beb268a
CW
391 {if $urlPathVar}
392 dataUrl += '&' + '{$urlPathVar}';
393 {/if}
6a488035 394
1beb268a 395 {literal}
ab421ec6 396 var eventId = $('[name=event_id], #event_id', $form).val();
6a488035 397
1beb268a
CW
398 if (eventId) {
399 dataUrl += '&eventId=' + eventId;
400 }
401 else {
ab421ec6
CW
402 $('#eventFullMsg', $form).hide( );
403 $('.crm-event-form-fee-block', $form).html('');
1beb268a
CW
404 return;
405 }
6a488035 406
1beb268a 407 var participantId = "{/literal}{$participantId}{literal}";
6a488035 408
1beb268a
CW
409 if (participantId) {
410 dataUrl += '&participantId=' + participantId;
411 }
6a488035 412
1beb268a
CW
413 if (discountId) {
414 dataUrl += '&discountId=' + discountId;
415 }
6a488035 416
b6c15d8a 417 $.ajax({
1beb268a 418 url: dataUrl,
1beb268a 419 success: function ( html ) {
ab421ec6 420 $(".crm-event-form-fee-block", $form).html( html ).trigger('crmLoad');
5be1890a 421 //show event real full as well as waiting list message.
ab421ec6
CW
422 if ( $("#hidden_eventFullMsg", $form).val( ) ) {
423 $( "#eventFullMsg", $form).show( ).html( $("#hidden_eventFullMsg", $form).val( ) );
5be1890a
CW
424 }
425 else {
ab421ec6 426 $( "#eventFullMsg", $form ).hide( );
5be1890a 427 }
1beb268a
CW
428 }
429 });
6a488035 430 }
1beb268a 431
b6c15d8a 432 {/literal}
b67c3f78 433 CRM.buildCustomData( '{$customDataType}', null, null );
b6c15d8a
CW
434 {if $eventID}
435 CRM.buildCustomData( '{$customDataType}', {$eventID}, {$eventNameCustomDataTypeID} );
436 {/if}
437 {if $eventTypeID}
438 CRM.buildCustomData( '{$customDataType}', {$eventTypeID}, {$eventTypeCustomDataTypeID} );
439 {/if}
440 {literal}
6a488035 441
1beb268a 442 });
6a488035
TO
443 </script>
444 {/literal}
445
446 {/if}
447
6a488035 448
6a488035
TO
449<script type="text/javascript">
450 {literal}
453ed6d1 451
6a488035 452 sendNotification();
453ed6d1
KJ
453 function sendNotification() {
454 var notificationStatusIds = {/literal}"{$notificationStatusIds}"{literal};
455 notificationStatusIds = notificationStatusIds.split(',');
456 if (cj.inArray(cj('select#status_id option:selected').val(), notificationStatusIds) > -1) {
6a488035 457 cj("#notify").show();
8539f25d 458 cj("#is_notify").prop('checked', true);
453ed6d1
KJ
459 }
460 else {
461 cj("#notify").hide();
8539f25d 462 cj("#is_notify").prop('checked', false);
6a488035
TO
463 }
464 }
465
6a488035 466 {/literal}
6a488035 467</script>
6a488035 468
453ed6d1 469{/if} {* end of main event block*}