PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.4
VikBooking Hotel Booking Engine & PMS v1.6.4
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
vikbooking / admin / views / editorder / tmpl / default.php

default.php in VikBooking Hotel Booking Engine & PMS 1.6.4, at admin/views/editorder/tmpl/default.php

2,966 lines 128.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage com_vikbooking
5 * @author Alessio Gaggii - e4j - Extensionsforjoomla.com
6 * @copyright Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved.
7 * @license GNU General Public License version 2 or later; see LICENSE
8 * @link https://vikwp.com
9 */
10
11 defined('ABSPATH') or die('No script kiddies please!');
12
13 $row = $this->row;
14 $rooms = $this->rooms;
15 $busy = $this->busy;
16 $customer = $this->customer;
17 $payments = $this->payments;
18
19 $history_obj = VikBooking::getBookingHistoryInstance();
20 $history_obj->setBid($row['id']);
21
22 // availability helper
23 $av_helper = VikBooking::getAvailabilityInstance();
24
25 // load datepicker for all CMS compatibility
26 JHtml::fetch('stylesheet', VBO_SITE_URI.'resources/jquery-ui.min.css');
27 JHtml::fetch('jquery.framework', true, true);
28 JHtml::fetch('script', VBO_SITE_URI.'resources/jquery-ui.min.js');
29
30 // js lang def
31 JText::script('VBO_CONV_RES_OTA_CURRENCY_APPLY');
32 JText::script('VBDELCONFIRM');
33 JText::script('VBSENDCANCORDEMAIL');
34 JText::script('VBO_SET_STANDBY');
35
36 $dbo = JFactory::getDbo();
37
38 $vbo_app = VikBooking::getVboApplication();
39 $vbo_app->loadVisualEditorAssets();
40
41 /**
42 * This View can render within a modal the "bookingcheckin" View, and with WP
43 * this is loaded via AJAX. In order to not interfere or reset the contextual menu,
44 * we load the assets from the parent View. Context menu may also be used in this View.
45 *
46 * @since 1.16.0 (J) - 1.6.0 (WP)
47 */
48 $vbo_app->loadContextMenuAssets();
49 if (VBOPlatformDetection::isWordPress()) {
50 JText::script('VBRENTALORD');
51 JText::script('VBPVIEWORDERSPEOPLE');
52 }
53
54 $canDo = JFactory::getUser();
55 $vbo_auth_bookings = $canDo->authorise('core.vbo.bookings', 'com_vikbooking');
56
57 $currencyname = VikBooking::getCurrencyName();
58 $after_tax = VikBooking::ivaInclusa();
59 $nowdf = VikBooking::getDateFormat(true);
60 if ($nowdf == "%d/%m/%Y") {
61 $df = 'd/m/Y';
62 } elseif ($nowdf == "%m/%d/%Y") {
63 $df = 'm/d/Y';
64 } else {
65 $df = 'Y/m/d';
66 }
67 $datesep = VikBooking::getDateSeparator(true);
68 $vbo_modals_html = array();
69 $payment = VikBooking::getPayment($row['idpayment']);
70 $pactive_tab = VikRequest::getString('vbo_active_tab', 'vbo-tab-details', 'request');
71 $printreceipt = VikRequest::getInt('print', 0, 'request');
72 $printreceipt = ($printreceipt > 0);
73 if ($printreceipt) {
74 //we set a different page title when printing the receipt for the "PDF Printer" to give the file a good name.
75 JFactory::getDocument()->setTitle(VikBooking::getFrontTitle()." - ".JText::translate('VBOFISCRECEIPT')." #".$row['id']);
76 }
77 $gotouri = 'index.php?option=com_vikbooking&task=editorder&cid[]='.$row['id'];
78
79 if ($row['status'] == "confirmed") {
80 $use_js_bid = $row['id'];
81 JFactory::getDocument()->addScriptDeclaration(
82 <<<JS
83 window["vbo_current_bid"] = $use_js_bid;
84 JS
85 );
86 }
87
88 $tars = array();
89 $arrpeople = array();
90 $is_package = !empty($row['pkg']) ? true : false;
91 $is_cust_cost = false;
92 foreach ($rooms as $ind => $or) {
93 $num = $ind + 1;
94 $arrpeople[$num]['adults'] = $or['adults'];
95 $arrpeople[$num]['children'] = $or['children'];
96 $arrpeople[$num]['children_age'] = $or['childrenage'];
97 $arrpeople[$num]['t_first_name'] = $or['t_first_name'];
98 $arrpeople[$num]['t_last_name'] = $or['t_last_name'];
99 $arrpeople[$num]['pets'] = $or['pets'];
100 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
101 //package or custom cost set from the back-end
102 $is_cust_cost = true;
103 continue;
104 }
105 $q = "SELECT * FROM `#__vikbooking_dispcost` WHERE `id`=".(int)$or['idtar'].";";
106 $dbo->setQuery($q);
107 $dbo->execute();
108 $tar = $dbo->getNumRows() ? $dbo->loadAssocList() : array();
109 $tar = VikBooking::applySeasonsRoom($tar, $row['checkin'], $row['checkout']);
110
111 // apply OBP rules
112 $tar = VBORoomHelper::getInstance()->applyOBPRules($tar, $or, $or['adults']);
113
114 $tars[$num] = $tar;
115 }
116 $pcheckin = $row['checkin'];
117 $pcheckout = $row['checkout'];
118 $secdiff = $pcheckout - $pcheckin;
119 $daysdiff = $secdiff / 86400;
120 if (is_int($daysdiff)) {
121 if ($daysdiff < 1) {
122 $daysdiff = 1;
123 }
124 } else {
125 if ($daysdiff < 1) {
126 $daysdiff = 1;
127 } else {
128 $sum = floor($daysdiff) * 86400;
129 $newdiff = $secdiff - $sum;
130 $maxhmore = VikBooking::getHoursMoreRb() * 3600;
131 if ($maxhmore >= $newdiff) {
132 $daysdiff = floor($daysdiff);
133 } else {
134 $daysdiff = ceil($daysdiff);
135 }
136 }
137 }
138 $otachannel = '';
139 $otachannel_name = '';
140 $otachannel_bid = '';
141 $otacurrency = '';
142 if (!empty($row['channel'])) {
143 $channelparts = explode('_', $row['channel']);
144 $otachannel = array_key_exists(1, $channelparts) && strlen($channelparts[1]) > 0 ? $channelparts[1] : ucwords($channelparts[0]);
145 $otachannel_name = $otachannel;
146 $otachannel_bid = $otachannel.(!empty($row['idorderota']) ? ' - Booking ID: '.$row['idorderota'] : '');
147 if (strstr($otachannel, '.') !== false) {
148 $otaccparts = explode('.', $otachannel);
149 $otachannel = $otaccparts[0];
150 }
151 $otacurrency = strlen($row['chcurrency']) > 0 ? $row['chcurrency'] : '';
152 }
153
154 $status_type = !empty($row['type']) ? JText::translate('VBO_BTYPE_' . strtoupper($row['type'])) . ' / ' : '';
155 $extra_status = $row['refund'] > 0 ? ' / ' . JText::translate('VBO_STATUS_REFUNDED') : '';
156 if ($row['status'] == "confirmed") {
157 $saystaus = '<span class="label label-success">' . $status_type . JText::translate('VBCONFIRMED') . $extra_status . '</span>';
158 } elseif ($row['status'] == "standby") {
159 $saystaus = '<span class="label label-warning">' . $status_type . JText::translate('VBSTANDBY') . $extra_status . '</span>';
160 } else {
161 $saystaus = '<span class="label label-error" style="background-color: #d9534f;">' . $status_type . JText::translate('VBCANCELLED') . $extra_status . '</span>';
162 }
163
164 // extend booking details main panel
165 $bookingPanelForms = $this->onDisplayView();
166
167 // extend booking details sidebar
168 $bookingSidebarForms = $this->onDisplayView('Sidebar');
169
170 // extend administration main panel
171 $adminFormsSetup = new stdClass;
172 $adminFormsSetup->icons = [];
173 $adminPanelForms = $this->onDisplayView('Administration', $adminFormsSetup);
174
175 // extend administration sidebar
176 $adminSidebarForms = $this->onDisplayView('AdministrationSidebar');
177
178 //Prepare modal (used for the Registration and for reconstructing the credit card details through the channel manager)
179 echo $vbo_app->getJmodalScript();
180 //end Prepare modal
181 ?>
182 <script type="text/javascript">
183 function changePayment() {
184 var newpayment = document.getElementById('newpayment').value;
185 if (newpayment != '') {
186 var paymentname = document.getElementById('newpayment').options[document.getElementById('newpayment').selectedIndex].text;
187 if (confirm('<?php echo addslashes(JText::translate('VBCHANGEPAYCONFIRM')); ?>' + paymentname + '?')) {
188 document.adminForm.submit();
189 } else {
190 document.getElementById('newpayment').selectedIndex = 0;
191 }
192 }
193 }
194 function vbToggleLog(elem) {
195 vbToggleDynamicPanel(elem, '#vbpaymentlogdiv');
196 }
197 function vbToggleNotes(elem) {
198 vbToggleDynamicPanel(elem, '#vbadminnotesdiv');
199 }
200 function vbToggleHistory(elem) {
201 vbToggleDynamicPanel(elem, '#vbhistorydiv');
202 }
203 function vbToggleInvNotes(elem) {
204 vbToggleDynamicPanel(elem, '#vbinvnotesdiv');
205 }
206 function vbToggleMessaging(elem) {
207 vbToggleDynamicPanel(elem, '#vbmessagingdiv');
208 if (typeof VCMChat !== 'undefined') {
209 VCMChat.getInstance().scrollToBottom();
210 }
211 }
212 function vbToggleDynamicPanel(elem, target) {
213 if (jQuery(target).is(':visible')) {
214 return;
215 }
216
217 jQuery(".vbo-bookingdet-noteslogs-btn-active").removeClass("vbo-bookingdet-noteslogs-btn-active");
218
219 jQuery('.vbo-extra-panel').hide();
220 jQuery(target).show();
221
222 jQuery(elem).parent(".vbo-bookingdet-noteslogs-btn").addClass("vbo-bookingdet-noteslogs-btn-active");
223
224 if (typeof sessionStorage !== 'undefined') {
225 sessionStorage.setItem('vboEditOrderTab<?php echo $row['id']; ?>', jQuery(elem).parent().data('id'));
226 }
227 }
228 function toggleDiscount(elem) {
229 var discsp = document.getElementById('vbdiscenter').style.display;
230 if (discsp == 'block') {
231 document.getElementById('vbdiscenter').style.display = 'none';
232 jQuery(elem).find('i').attr('class', '<?php echo VikBookingIcons::i('chevron-down'); ?>');
233 } else {
234 document.getElementById('vbdiscenter').style.display = 'block';
235 jQuery(elem).find('i').attr('class', '<?php echo VikBookingIcons::i('chevron-up'); ?>');
236 }
237 }
238 </script>
239
240 <div class="vbo-bookingdet-topcontainer">
241 <form name="adminForm" id="adminForm" action="<?php echo VBOPlatformDetection::isWordPress() ? 'admin.php' : 'index.php'; ?>?option=com_vikbooking&amp;task=editorder&amp;cid[]=<?php echo $row['id']; ?>" method="post">
242 <?php
243 if ($printreceipt) {
244 //print the company details
245 $companylogo = VikBooking::getSiteLogo();
246 $next_receipt = VikBooking::getNextReceiptNumber($row['id']);
247 ?>
248 <div class="vbo-receipt-company-block-outer">
249 <div class="vbo-receipt-company-block">
250 <?php
251 if (!empty($companylogo)) {
252 ?>
253 <div class="vbo-receipt-company-logo"><img src="<?php echo VBO_ADMIN_URI.'resources/'.$companylogo; ?>" /></div>
254 <?php
255 }
256 ?>
257 <div class="vbo-receipt-company-info"><?php echo VikBooking::getInvoiceCompanyInfo(); ?></div>
258 </div>
259 <div class="vbo-receipt-numdate-block">
260 <div class="vbo-receipt-numdate-inner">
261 <div class="vbo-receipt-numdate-title">
262 <span><?php echo JText::translate('VBOFISCRECEIPT'); ?></span>
263 <span style="float: right; cursor: pointer; color: #ff0000;" onclick="vboMakePrintOnly();"><?php VikBookingIcons::e('times-circle'); ?></span>
264 </div>
265 <div class="vbo-receipt-numdate-num">
266 <span class="vbo-receipt-numdate-num-lbl"><?php echo JText::translate('VBOFISCRECEIPTNUM'); ?></span>
267 <span class="vbo-receipt-numdate-num-val">
268 <span class="vbo-showin-print" id="vbo-receipt-num"><?php echo $next_receipt; ?></span>
269 <input class="vbo-hidein-print" id="vbo-receipt-num-inp" type="number" min="0" value="<?php echo $next_receipt; ?>" onchange="document.getElementById('vbo-receipt-num').innerText = this.value;" />
270 </span>
271 </div>
272 <div class="vbo-receipt-numdate-date">
273 <span class="vbo-receipt-numdate-date-lbl"><?php echo JText::translate('VBOFISCRECEIPTDATE'); ?></span>
274 <span class="vbo-receipt-numdate-date-val"><?php echo date(str_replace("/", $datesep, $df)); ?></span>
275 </div>
276 </div>
277 </div>
278 <div class="vbo-receipt-print-confirm vbo-hidein-print">
279 <div class="vbo-receipt-print-btn">
280 <span onclick="vboLaunchPrintReceipt();">
281 <?php VikBookingIcons::e('print'); ?>
282 <span id="vbo-receipt-print-btn-name"><?php echo JText::translate('VBOPRINTRECEIPT'); ?></span>
283 </span>
284 </div>
285 </div>
286 </div>
287 <?php
288 }
289 ?>
290
291 <div class="vbo-bookdet-container">
292 <div class="vbo-bookdet-wrap">
293 <div class="vbo-bookdet-head">
294 <span>ID</span>
295 </div>
296 <div class="vbo-bookdet-foot">
297 <span><?php echo $row['id']; ?></span>
298 </div>
299 </div>
300 <div class="vbo-bookdet-wrap">
301 <div class="vbo-bookdet-head">
302 <span><?php echo JText::translate('VBEDITORDERONE'); ?></span>
303 </div>
304 <div class="vbo-bookdet-foot">
305 <span><?php echo date(str_replace("/", $datesep, $df).' H:i', $row['ts']); ?></span>
306 </div>
307 </div>
308 <?php
309 if (!$printreceipt && count($customer)) {
310 ?>
311 <div class="vbo-bookdet-wrap">
312 <div class="vbo-bookdet-head">
313 <span><?php echo JText::translate('VBCUSTOMERNOMINATIVE'); ?></span>
314 </div>
315 <div class="vbo-bookdet-foot">
316 <div class="vbo-customer-info-box">
317 <div class="vbo-customer-info-box-name">
318 <?php echo (isset($customer['country_img']) ? $customer['country_img'] . ' ' : ''); ?>
319
320 <?php if ($canDo->authorise('core.edit', 'com_vikbooking') && $canDo->authorise('core.vbo.management', 'com_vikbooking')): ?>
321 <a href="index.php?option=com_vikbooking&task=editcustomer&cid[]=<?php echo $customer['id']; ?>&goto=<?php echo base64_encode($gotouri); ?>"><?php echo ltrim($customer['first_name'] . ' ' . $customer['last_name']); ?></a>
322 <?php else: ?>
323 <?php echo ltrim($customer['first_name'] . ' ' . $customer['last_name']); ?>
324 <?php endif; ?>
325 </div>
326 <?php
327 if (!empty($customer['pic'])) {
328 $avatar_caption = ltrim($customer['first_name'] . ' ' . $customer['last_name']);
329 ?>
330 <div class="vbo-customer-info-box-avatar vbo-customer-avatar-small">
331 <span>
332 <img src="<?php echo strpos($customer['pic'], 'http') === 0 ? $customer['pic'] : VBO_SITE_URI . 'resources/uploads/' . $customer['pic']; ?>" data-caption="<?php echo htmlspecialchars($avatar_caption); ?>" />
333 </span>
334 </div>
335 <?php
336 }
337 ?>
338 </div>
339 </div>
340 </div>
341 <?php
342 }
343 if (!$printreceipt) {
344 ?>
345 <div class="vbo-bookdet-wrap">
346 <div class="vbo-bookdet-head">
347 <span><?php echo JText::translate('VBEDITORDERROOMSNUM'); ?></span>
348 </div>
349 <div class="vbo-bookdet-foot">
350 <?php echo $row['roomsnum']; ?>
351 </div>
352 </div>
353 <?php
354 }
355 ?>
356 <div class="vbo-bookdet-wrap">
357 <div class="vbo-bookdet-head">
358 <span><?php echo JText::translate('VBEDITORDERFOUR'); ?></span>
359 </div>
360 <div class="vbo-bookdet-foot">
361 <span><?php echo $row['days']; ?></span>
362 <?php
363 if ($row['split_stay']) {
364 ?>
365 <span class="hasTooltip" title="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_SPLIT_STAY')); ?>"><?php VikBookingIcons::e('random'); ?></span>
366 <?php
367 }
368 ?>
369 </div>
370 </div>
371 <div class="vbo-bookdet-wrap">
372 <div class="vbo-bookdet-head">
373 <span><?php echo JText::translate('VBEDITORDERFIVE'); ?></span>
374 </div>
375 <div class="vbo-bookdet-foot">
376 <?php
377 $checkin_info = getdate($row['checkin']);
378 $short_wday = JText::translate('VB'.strtoupper(substr($checkin_info['weekday'], 0, 3)));
379 ?>
380 <?php echo $short_wday.', '.date(str_replace("/", $datesep, $df).' H:i', $row['checkin']); ?>
381 </div>
382 </div>
383 <div class="vbo-bookdet-wrap">
384 <div class="vbo-bookdet-head">
385 <span><?php echo JText::translate('VBEDITORDERSIX'); ?></span>
386 </div>
387 <div class="vbo-bookdet-foot">
388 <?php
389 $checkout_info = getdate($row['checkout']);
390 $short_wday = JText::translate('VB'.strtoupper(substr($checkout_info['weekday'], 0, 3)));
391 ?>
392 <?php echo $short_wday.', '.date(str_replace("/", $datesep, $df).' H:i', $row['checkout']); ?>
393 </div>
394 </div>
395 <?php
396 if (!$printreceipt && $vbo_auth_bookings && $row['closure'] != 1 && $row['status'] == 'confirmed') {
397 // we don't need to check in the IF above "&& $row['checked'] != 0" because the registration is useful for all bookings.
398 $checked_btn = 'btn-primary';
399 switch ($row['checked']) {
400 case -1:
401 $checked_status = JText::translate('VBOCHECKEDSTATUSNOS');
402 $checked_btn = 'btn-danger';
403 break;
404 case 1:
405 $checked_status = JText::translate('VBOCHECKEDSTATUSIN');
406 $checked_btn = 'btn-success';
407 break;
408 case 2:
409 $checked_status = JText::translate('VBOCHECKEDSTATUSOUT');
410 $checked_btn = 'btn-warning';
411 break;
412 default:
413 $checked_status = JText::translate('VBOCHECKEDSTATUSZERO');
414 if (count($customer) && isset($customer['pax_data']) && !empty($customer['pax_data'])) {
415 // pre check-in performed via front-end
416 $checked_status = JText::translate('VBOCHECKEDSTATUSPRECHECKIN');
417 }
418 break;
419 }
420 ?>
421 <div class="vbo-bookdet-wrap pro-feature">
422 <div class="vbo-bookdet-head">
423 <span><?php echo JText::translate('VBOCHECKEDSTATUS'); ?></span>
424 </div>
425 <div class="vbo-bookdet-foot">
426 <button type="button" class="btn btn-small <?php echo $checked_btn; ?>" onclick="vboOpenJModal('vbo-checkin-booking', 'index.php?option=com_vikbooking&task=bookingcheckin&cid[]=<?php echo $row['id']; ?>&tmpl=component');">
427 <?php echo $checked_status; ?>
428 </button>
429 </div>
430 </div>
431 <?php
432 //Prepare modal (Registration)
433 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-checkin-booking', JText::translate('VBOMANAGECHECKSINOUT')));
434 //end Prepare modal
435 }
436
437 /**
438 * Check whether the booking can be refunded.
439 *
440 * @since 1.14 (J) - 1.4.0 (WP)
441 */
442
443 // refundable up to 3 days after check-out day
444 $max_refund_ts = mktime(23, 59, 59, $checkout_info['mon'], ($checkout_info['mday'] + 3), $checkout_info['year']);
445 // current payment driver must be set
446 $tn_driver = is_array($payment) ? $payment['file'] : null;
447 // transaction data validation callback
448 $tn_data_callback = function($data) use ($tn_driver) {
449 return (is_object($data) && isset($data->driver) && basename($data->driver, '.php') == basename($tn_driver, '.php'));
450 };
451 $prev_tn_data = $history_obj->getEventsWithData(array('P0', 'PN'), $tn_data_callback);
452 $refundable = ($row['status'] != 'standby' && $max_refund_ts >= time() && is_array($prev_tn_data) && count($prev_tn_data));
453 if ($refundable) {
454 // prepare modal (refundtn) with a custom function to trigger the opening
455 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-refund-tn', JText::translate('VBO_ISSUE_REFUND')));
456 echo $vbo_app->getJmodalScript('Refund', 'vboDetectRefundChanges();');
457 // count the number of refunds made
458 $refunds = $history_obj->getEventsWithData('RF', null, false);
459 $refunds = !is_array($refunds) ? array() : $refunds;
460 ?>
461 <script type="text/javascript">
462 var vbo_refund_performed = false;
463 function vboDetectRefundChanges() {
464 if (vbo_refund_performed === true) {
465 location.reload();
466 }
467 }
468 </script>
469
470 <div class="vbo-bookdet-wrap">
471 <div class="vbo-bookdet-head">
472 <span><?php echo JText::translate('VBO_ISSUE_REFUND'); ?></span>
473 </div>
474 <div class="vbo-bookdet-foot">
475 <button type="button" class="btn btn-small btn-danger vbo-dorefund-btn"<?php echo count($refunds) ? ' data-totrefunds="' . count($refunds) . '"' : ''; ?> onclick="vboOpenJModalRefund('vbo-refund-tn', 'index.php?option=com_vikbooking&task=refundtn&cid[]=<?php echo $row['id']; ?>&tmpl=component');">
476 <?php echo JText::translate('VBO_REFUND'); ?>
477 </button>
478 </div>
479 </div>
480 <?php
481 }
482 //
483
484 if (!$printreceipt && !empty($row['channel'])) {
485 $ota_logo_img = VikBooking::getVcmChannelsLogo($row['channel']);
486 if ($ota_logo_img === false) {
487 $ota_logo_img = $otachannel_name;
488 } else {
489 $ota_logo_img = '<img src="'.$ota_logo_img.'" class="vbo-channelimg-medium"/>';
490 }
491 ?>
492 <div class="vbo-bookdet-wrap">
493 <div class="vbo-bookdet-head">
494 <span><?php echo JText::translate('VBPVIEWORDERCHANNEL'); ?></span>
495 </div>
496 <div class="vbo-bookdet-foot">
497 <span><?php echo $ota_logo_img; ?></span>
498 </div>
499 </div>
500 <?php
501 } elseif (!$printreceipt && class_exists('VCMOtaBooking')) {
502 /**
503 * Vik Channel Manager booking assignable channels.
504 *
505 * @since 1.16.3 (J) - 1.6.3 (WP)
506 */
507 $assignable_channels = VCMOtaBooking::getInstance($row, true)->getChannelsAssignable();
508 if ($assignable_channels) {
509 JText::script('VBO_ASSIGN_BOOKING_TO_OTA_CONFIRM');
510 JFactory::getDocument()->addScriptDeclaration(
511 <<<JS
512 function vboConfirmAssignChannel(ch_key, ch_name) {
513 if (!ch_key || !ch_name) {
514 return true;
515 }
516 if (confirm(Joomla.JText._('VBO_ASSIGN_BOOKING_TO_OTA_CONFIRM').replace('%s', ch_name))) {
517 document.adminForm.submit();
518 return true;
519 } else {
520 return false;
521 }
522 }
523 JS
524 );
525 ?>
526 <div class="vbo-bookdet-wrap">
527 <div class="vbo-bookdet-head">
528 <span><?php echo JText::translate('VBPVIEWORDERCHANNEL'); ?></span>
529 </div>
530 <div class="vbo-bookdet-foot">
531 <select name="vcm_assign_channel" class="vbo-select-small" onchange="return vboConfirmAssignChannel(this.value, this.options[this.selectedIndex].text);">
532 <option value=""><?php echo JText::translate('VBORDFROMSITE'); ?></option>
533 <?php
534 foreach ($assignable_channels as $assign_ch_key => $assign_ch_name) {
535 ?>
536 <option value="<?php echo JHtml::fetch('esc_attr', $assign_ch_key); ?>"><?php echo $assign_ch_name; ?></option>
537 <?php
538 }
539 ?>
540 </select>
541 </div>
542 </div>
543 <?php
544 }
545 }
546 if (!$printreceipt) {
547 ?>
548 <div class="vbo-bookdet-wrap">
549 <div class="vbo-bookdet-head">
550 <span><?php echo JText::translate('VBSTATUS'); ?></span>
551 </div>
552 <div class="vbo-bookdet-foot">
553 <span><?php echo $saystaus; ?></span>
554 </div>
555 </div>
556 <?php
557 if (is_array($this->vcm_pre_approval)) {
558 ?>
559 <div class="vbo-bookdet-wrap">
560 <div class="vbo-bookdet-head">
561 <span><?php echo $this->vcm_pre_approval[1]; ?></span>
562 </div>
563 <div class="vbo-bookdet-foot">
564 <span>
565 <?php
566 if (empty($this->vcm_pre_approval[2]) || !empty($this->vcm_pre_approval[3])) {
567 // no pre-approvals before, or withdrawn before
568 ?>
569 <a href="index.php?option=com_vikchannelmanager&task=sendSpecialOffer&vbo_oid=<?php echo $row['id']; ?>&spo_type=preapproval&spo_action=send&ota_thread_id=<?php echo $this->vcm_pre_approval[0]; ?>" class="btn btn-small btn-primary vcm-btn-channel-<?php echo strtolower($this->vcm_pre_approval[1]); ?>"><?php VikBookingIcons::e('thumbs-up'); ?> <?php echo JText::translate('VBO_PREAPPROVE_INQUIRY'); ?></a>
570 <?php
571 } else {
572 // pre-approved before, pass the ID
573 ?>
574 <a href="index.php?option=com_vikchannelmanager&task=sendSpecialOffer&vbo_oid=<?php echo $row['id']; ?>&spo_type=preapproval&spo_action=withdraw&ota_thread_id=<?php echo $this->vcm_pre_approval[0]; ?>&spo_id=<?php echo $this->vcm_pre_approval[2]; ?>" class="btn btn-small btn-danger"><?php VikBookingIcons::e('thumbs-down'); ?> <?php echo JText::translate('VBO_WITHDRAW_PREAPPROVAL'); ?></a>
575 <?php
576 }
577 ?>
578 </span>
579 </div>
580 </div>
581 <?php
582 }
583 if (!empty($row['channel']) && stripos($row['channel'], 'booking.com') !== false && $row['checkin'] <= time() && strtotime('+ 7 days', $row['checkout']) >= time()) {
584 /**
585 * Guest misconduct reporting API for Booking.com.
586 * Only after reservation check-in date and no later than 7 days after check-out date.
587 *
588 * @since 1.13.5 - VCM 1.7.2
589 */
590 $misconduct_reported = $history_obj->hasEvent('GM');
591 ?>
592 <div class="vbo-bookdet-wrap">
593 <div class="vbo-bookdet-head">
594 <span><?php echo JText::translate('VBOGUESTMISCONDUCT'); ?></span>
595 </div>
596 <div class="vbo-bookdet-foot">
597 <?php
598 if ($misconduct_reported === false) {
599 // allow to report the guest misconduct
600 ?>
601 <button type="button" class="btn btn-small btn-danger" onclick="vboRenderGuestMisconduct();"><?php VikBookingIcons::e('user-slash'); ?> <?php echo JText::translate('VBOREPORTMISCONDUCT'); ?></button>
602 <?php
603 } else {
604 // guest misconduct already reported
605 ?>
606 <button type="button" class="btn btn-small btn-warning" onclick="vboShowGuestMisconductReported();"><?php VikBookingIcons::e('user-slash'); ?> <?php echo $misconduct_reported; ?></button>
607 <?php
608 }
609 ?>
610 <a id="vbo-gm-reloadlink" style="display: none;" href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>"></a>
611 </div>
612 </div>
613
614 <div class="vbo-modal-overlay-block vbo-modal-overlay-block-guestmisconduct">
615 <a class="vbo-modal-overlay-close" href="javascript: void(0);"></a>
616 <div class="vbo-modal-overlay-content vbo-modal-overlay-content-guestmisconduct">
617 <div class="vbo-modal-overlay-content-head vbo-modal-overlay-content-head-guestmisconduct">
618 <h3><?php VikBookingIcons::e('exclamation-circle'); ?> <?php echo JText::sprintf('VBOREPGUESTMISCONDUCTTO', 'Booking.com'); ?> <span class="vbo-modal-overlay-close-times" onclick="hideVboDialogGuestMisconduct();">&times;</span></h3>
619 </div>
620 <div class="vbo-modal-overlay-content-body">
621 <div class="vbo-modal-guestmisconduct-addnew" data-bid="<?php echo $row['id']; ?>" data-otabid="<?php echo $row['idorderota']; ?>">
622 <div class="vbo-modal-guestmisconduct-report-elems"></div>
623 <div class="vbo-modal-guestmisconduct-addnew-save">
624 <button type="button" id="vbo-guest-misconduct-submit-btn" class="btn btn-success" onclick="vboSubmitGuestMisconduct();" style="display: none;"><?php echo JText::translate('VBCHANNELMANAGERSENDRQ'); ?></button>
625 <button type="button" class="btn btn-danger" onclick="hideVboDialogGuestMisconduct();"><?php echo JText::translate('VBOCLOSE'); ?></button>
626 </div>
627 </div>
628 </div>
629 </div>
630 </div>
631
632 <script type="text/javascript">
633 var vbodialogguestmisconduct_on = false;
634 var vbo_guest_misconduct_fields = new Array;
635
636 function vboShowGuestMisconductReported() {
637 // this is like simulating the navigation to the booking history tab
638 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
639 vbToggleHistory(document.getElementById('vbo-trig-bookhistory'));
640 }
641
642 function vboRenderGuestMisconduct() {
643 // empty content
644 jQuery('.vbo-modal-guestmisconduct-report-elems').html('<?php echo $this->escape(JText::translate('VIKLOADING') . '...'); ?>');
645 vbo_guest_misconduct_fields = new Array;
646 // display modal
647 jQuery('.vbo-modal-overlay-block-guestmisconduct').fadeIn();
648 vbodialogguestmisconduct_on = true;
649 // make AJAX request to VCM to always reload the form fields
650 var jqxhr = jQuery.ajax({
651 type: "POST",
652 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikchannelmanager&task=get_bcom_misconduct_categories'); ?>",
653 data: { tmpl: "component" }
654 }).done(function(res) {
655 // parse the JSON response that contains the categories object with all fields for the reporting
656 try {
657 var misconduct_fields_rs = JSON.parse(res);
658 console.log(misconduct_fields_rs);
659
660 // make sure the request was successful
661 if (!misconduct_fields_rs.status) {
662 alert(misconduct_fields_rs.error);
663 hideVboDialogGuestMisconduct();
664 return false;
665 }
666
667 // render form from response obtained
668 var misconduct_html = '';
669 var misconduct_fields = misconduct_fields_rs.data;
670 if (!misconduct_fields.hasOwnProperty('categories') || !misconduct_fields.hasOwnProperty('fields')) {
671 alert('Unexptected response. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
672 hideVboDialogGuestMisconduct();
673 return false;
674 }
675
676 // main category of misconduct
677 misconduct_html += '<div class="vbo-modal-form-addnew-elem vbo-modal-guestmisconduct-addnew-elem">' + "\n";
678 misconduct_html += '<label for="vbo-gm-category">' + misconduct_fields['labels']['category'] + '</label>';
679 misconduct_html += '<select id="vbo-gm-category" data-gmname="category_id" onchange="vboGuestMisconductChangeCategory(this.value);">' + "\n";
680 for (var category in misconduct_fields['categories']) {
681 if (!misconduct_fields['categories'].hasOwnProperty(category)) {
682 continue;
683 }
684 misconduct_html += '<option value="' + misconduct_fields['categories'][category]['id'] + '">' + misconduct_fields['categories'][category]['title'] + '</option>' + "\n";
685 }
686 misconduct_html += '</select>' + "\n";
687 misconduct_html += '</div>' + "\n";
688 // push category field in fields list for later submit
689 vbo_guest_misconduct_fields.push('vbo-gm-category');
690
691 // sub-categories or additional fields of misconduct categories
692 for (var category in misconduct_fields['categories']) {
693 if (!misconduct_fields['categories'].hasOwnProperty(category)) {
694 continue;
695 }
696 if (!misconduct_fields['categories'][category].hasOwnProperty('subcategories') && !misconduct_fields['categories'][category].hasOwnProperty('additional_fields')) {
697 // at least one of these two properties must be set
698 continue;
699 }
700 if (misconduct_fields['categories'][category].hasOwnProperty('subcategories') && misconduct_fields['categories'][category]['subcategories'].length) {
701 // sub-categories in drop down
702 var subcat_field_id = 'vbo-gm-subcategory' + misconduct_fields['categories'][category]['id'];
703 misconduct_html += '<div class="vbo-modal-form-addnew-elem vbo-modal-guestmisconduct-addnew-elem vbo-modal-guestmisconduct-addnew-cond" data-gmcid="' + misconduct_fields['categories'][category]['id'] + '" style="display: none;">' + "\n";
704 misconduct_html += '<label for="' + subcat_field_id + '">' + misconduct_fields['labels']['subcategory'] + '</label>';
705 misconduct_html += '<select id="' + subcat_field_id + '" data-gmname="subcategory_id">' + "\n";
706 for (var subcategory in misconduct_fields['categories'][category]['subcategories']) {
707 if (!misconduct_fields['categories'][category]['subcategories'].hasOwnProperty(subcategory)) {
708 continue;
709 }
710 misconduct_html += '<option value="' + misconduct_fields['categories'][category]['subcategories'][subcategory]['id'] + '">' + misconduct_fields['categories'][category]['subcategories'][subcategory]['title'] + '</option>' + "\n";
711 }
712 misconduct_html += '</select>' + "\n";
713 misconduct_html += '</div>' + "\n";
714 // push sub-category field in fields list for later submit
715 if (vbo_guest_misconduct_fields.indexOf(subcat_field_id) < 0) {
716 vbo_guest_misconduct_fields.push(subcat_field_id);
717 }
718 } else if (misconduct_fields['categories'][category].hasOwnProperty('additional_fields') && misconduct_fields['categories'][category]['additional_fields'].length) {
719 // additional fields
720 for (var extra_field in misconduct_fields['categories'][category]['additional_fields']) {
721 if (!misconduct_fields['categories'][category]['additional_fields'].hasOwnProperty(extra_field)) {
722 continue;
723 }
724 var field_id = 'vbo-gm-extrafield-' + misconduct_fields['categories'][category]['additional_fields'][extra_field]['name'];
725 var field_name = misconduct_fields['categories'][category]['additional_fields'][extra_field]['name'];
726 misconduct_html += '<div class="vbo-modal-form-addnew-elem vbo-modal-guestmisconduct-addnew-elem vbo-modal-guestmisconduct-addnew-cond" data-gmcid="' + misconduct_fields['categories'][category]['id'] + '" style="display: none;">' + "\n";
727 misconduct_html += '<label for="' + field_id + '">' + misconduct_fields['categories'][category]['additional_fields'][extra_field]['label'] + '</label>';
728 if (misconduct_fields['categories'][category]['additional_fields'][extra_field]['type'] == 'number') {
729 misconduct_html += '<input data-gmname="' + field_name + '" type="number" id="' + field_id + '" value="" step="any" min="0" />';
730 } else if (misconduct_fields['categories'][category]['additional_fields'][extra_field]['type'] == 'text') {
731 misconduct_html += '<input data-gmname="' + field_name + '" type="text" id="' + field_id + '" value="" />';
732 } else if (misconduct_fields['categories'][category]['additional_fields'][extra_field]['type'] == 'text') {
733 misconduct_html += '<input data-gmname="' + field_name + '" type="text" id="' + field_id + '" value="" />';
734 } else if (misconduct_fields['categories'][category]['additional_fields'][extra_field]['type'] == 'textarea') {
735 misconduct_html += '<textarea data-gmname="' + field_name + '" id="' + field_id + '" rows="5" cols="50" maxlength="240"></textarea>';
736 } else if (misconduct_fields['categories'][category]['additional_fields'][extra_field]['type'] == 'select') {
737 misconduct_html += '<select data-gmname="' + field_name + '" id="' + field_id + '">';
738 for (var choicekey in misconduct_fields['categories'][category]['additional_fields'][extra_field]['choices']) {
739 // this is either an array when keys are numeric from 0, or an object when keys start from like 1, but with choicekey we take the proper key in the object
740 if (!misconduct_fields['categories'][category]['additional_fields'][extra_field]['choices'].hasOwnProperty(choicekey)) {
741 continue;
742 }
743 misconduct_html += '<option value="' + choicekey + '">' + misconduct_fields['categories'][category]['additional_fields'][extra_field]['choices'][choicekey] + '</option>';
744 }
745 misconduct_html += '</select>';
746 }
747 misconduct_html += '</div>' + "\n";
748 // push additional field in fields list for later submit
749 vbo_guest_misconduct_fields.push(field_id);
750 }
751 }
752 }
753
754 // mandatory fields for all categories of guest misconduct reporting
755 for (var mandfield in misconduct_fields['fields']) {
756 if (!misconduct_fields['fields'].hasOwnProperty(mandfield)) {
757 continue;
758 }
759 var field_id = 'vbo-gm-mandfield-' + misconduct_fields['fields'][mandfield]['name'];
760 var field_name = misconduct_fields['fields'][mandfield]['name'];
761 misconduct_html += '<div class="vbo-modal-form-addnew-elem vbo-modal-guestmisconduct-addnew-elem">' + "\n";
762 misconduct_html += '<label for="' + field_id + '">' + misconduct_fields['fields'][mandfield]['label'] + '</label>';
763 if (misconduct_fields['fields'][mandfield]['type'] == 'number') {
764 misconduct_html += '<input data-gmname="' + field_name + '" type="number" id="' + field_id + '" value="" step="any" min="0" />';
765 } else if (misconduct_fields['fields'][mandfield]['type'] == 'text') {
766 misconduct_html += '<input data-gmname="' + field_name + '" type="text" id="' + field_id + '" value="" />';
767 } else if (misconduct_fields['fields'][mandfield]['type'] == 'text') {
768 misconduct_html += '<input data-gmname="' + field_name + '" type="text" id="' + field_id + '" value="" />';
769 } else if (misconduct_fields['fields'][mandfield]['type'] == 'textarea') {
770 misconduct_html += '<textarea data-gmname="' + field_name + '" id="' + field_id + '" rows="5" cols="50" maxlength="240"></textarea>';
771 } else if (misconduct_fields['fields'][mandfield]['type'] == 'select') {
772 misconduct_html += '<select data-gmname="' + field_name + '" id="' + field_id + '">';
773 for (var choicekey in misconduct_fields['fields'][mandfield]['choices']) {
774 if (!misconduct_fields['fields'][mandfield]['choices'].hasOwnProperty(choicekey)) {
775 continue;
776 }
777 misconduct_html += '<option value="' + choicekey + '">' + misconduct_fields['fields'][mandfield]['choices'][choicekey] + '</option>';
778 }
779 misconduct_html += '</select>';
780 }
781 misconduct_html += '</div>' + "\n";
782 // push mandatory field in fields list for later submit
783 vbo_guest_misconduct_fields.push(field_id);
784 }
785
786 // display HTML content and submit button
787 jQuery('.vbo-modal-guestmisconduct-report-elems').html(misconduct_html);
788 jQuery('#vbo-guest-misconduct-submit-btn').show();
789 // trigger change of main category drop down
790 jQuery('#vbo-gm-category').trigger('change');
791 } catch (e) {
792 console.log(res);
793 alert('Invalid response. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
794 hideVboDialogGuestMisconduct();
795 return false;
796 }
797 }).fail(function() {
798 alert('Request failed. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
799 hideVboDialogGuestMisconduct();
800 });
801 }
802
803 function vboSubmitGuestMisconduct() {
804 if (!vbo_guest_misconduct_fields.length) {
805 alert('Empty data to submit. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
806 return false;
807 }
808
809 // prevent double submissions
810 vboGuestMisconductDisableSubmit();
811 //
812
813 var submit_fields = {
814 tmpl: "component",
815 bid: jQuery('.vbo-modal-guestmisconduct-addnew').attr('data-bid'),
816 otabid: jQuery('.vbo-modal-guestmisconduct-addnew').attr('data-otabid'),
817 bcom_keys: new Array
818 };
819 for (var elemid in vbo_guest_misconduct_fields) {
820 if (!vbo_guest_misconduct_fields.hasOwnProperty(elemid)) {
821 continue;
822 }
823 if (!jQuery('#' + vbo_guest_misconduct_fields[elemid]).length || !jQuery('#' + vbo_guest_misconduct_fields[elemid]).closest('.vbo-modal-guestmisconduct-addnew-elem').length) {
824 // form element not found, or parent container not found
825 continue;
826 }
827 if (jQuery('#' + vbo_guest_misconduct_fields[elemid]).closest('.vbo-modal-guestmisconduct-addnew-elem').is(':visible')) {
828 // we include this value in the AJAX request
829 var field_name = jQuery('#' + vbo_guest_misconduct_fields[elemid]).attr('data-gmname');
830 var submit_key = 'bcom_' + field_name;
831 submit_fields[submit_key] = jQuery('#' + vbo_guest_misconduct_fields[elemid]).val();
832 submit_fields['bcom_keys'].push(submit_key);
833 }
834 }
835
836 // make the AJAX request to VCM
837 var jqxhr = jQuery.ajax({
838 type: "POST",
839 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikchannelmanager&task=submit_bcom_guestmisconduct'); ?>",
840 data: submit_fields
841 }).done(function(res) {
842 try {
843 var misconduct_rs = JSON.parse(res);
844 console.log(submit_fields, misconduct_rs);
845
846 // make sure the request was successful
847 if (!misconduct_rs.status) {
848 alert(misconduct_rs.error);
849 vboGuestMisconductEnableSubmit();
850 return false;
851 }
852
853 // make another AJAX request (now on VBO) to update the booking history
854 var event_descr = jQuery('#vbo-gm-mandfield-details_text').length ? jQuery('#vbo-gm-mandfield-details_text').val() : '';
855 jQuery.ajax({
856 type: "POST",
857 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=store_booking_history_event'); ?>",
858 data: {
859 tmpl: "component",
860 bid: jQuery('.vbo-modal-guestmisconduct-addnew').attr('data-bid'),
861 event: 'GM',
862 descr: event_descr
863 }
864 }).done(function(res) {
865 // just reload the page in case of success
866 document.location.href = jQuery('#vbo-gm-reloadlink').attr('href');
867 }).fail(function() {
868 // we reload the page even in case of failure
869 document.location.href = jQuery('#vbo-gm-reloadlink').attr('href');
870 });
871 } catch (e) {
872 console.log(res);
873 alert('Invalid update response. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
874 vboGuestMisconductEnableSubmit();
875 hideVboDialogGuestMisconduct();
876 return false;
877 }
878 }).fail(function() {
879 alert('Update Request failed. Vik Channel Manager needs to be installed, configured and updated to the latest version.');
880 vboGuestMisconductEnableSubmit();
881 return false;
882 });
883 }
884
885 function hideVboDialogGuestMisconduct() {
886 if (vbodialogguestmisconduct_on === true) {
887 jQuery(".vbo-modal-overlay-block-guestmisconduct").fadeOut(400, function () {
888 jQuery(".vbo-modal-overlay-content-guestmisconduct").show();
889 });
890 // turn flag off
891 vbodialogguestmisconduct_on = false;
892 }
893 }
894
895 function vboGuestMisconductChangeCategory(gmcid) {
896 jQuery('.vbo-modal-guestmisconduct-addnew-cond').each(function() {
897 if (jQuery(this).attr('data-gmcid') == gmcid) {
898 jQuery(this).show();
899 } else {
900 jQuery(this).hide();
901 }
902 });
903 }
904
905 function vboGuestMisconductDisableSubmit() {
906 jQuery('#vbo-guest-misconduct-submit-btn').prepend('<i class="<?php echo VikBookingIcons::i('refresh', 'fa-spin fa-fw'); ?>"></i> ').prop('disabled', true);
907 }
908
909 function vboGuestMisconductEnableSubmit() {
910 jQuery('#vbo-guest-misconduct-submit-btn').prop('disabled', false).find('i').remove();
911 }
912 </script>
913 <?php
914 }
915 if ($this->vcm_host_to_guest_review) {
916 ?>
917 <div class="vbo-bookdet-wrap">
918 <div class="vbo-bookdet-head">
919 <span><?php echo JText::translate('VBO_REVIEW_YOUR_GUEST'); ?></span>
920 </div>
921 <div class="vbo-bookdet-foot">
922 <button type="button" class="btn btn-small btn-primary vcm-btn-channel-airbnbapi" onclick="vboOpenJModal('vbo-vcm-host-to-guest-review', 'index.php?option=com_vikchannelmanager&task=hostguestreview&cid[]=<?php echo $row['id']; ?>&tmpl=component');">
923 <?php VikBookingIcons::e('smile'); ?>
924 <?php echo JText::translate('VBO_WRITE_REVIEW'); ?>
925 </button>
926 </div>
927 </div>
928 <?php
929 // prepare modal (host-to-guest review)
930 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-vcm-host-to-guest-review', JText::translate('VBO_REVIEW_YOUR_GUEST')));
931
932 // check if a notification was clicked
933 if (VikRequest::getString('notif_action', '', 'request') == 'airbnb_host_guest_review') {
934 JFactory::getDocument()->addScriptDeclaration(
935 <<<JS
936 jQuery(function() {
937 setTimeout(() => {
938 jQuery('.vcm-btn-channel-airbnbapi').trigger('click');
939 }, 500);
940 });
941 JS
942 );
943 }
944 }
945 }
946 ?>
947 </div>
948
949 <?php
950 if (!$printreceipt && $this->allows_conversion !== false) {
951 ?>
952 <div class="vbo-bookdet-container vbo-bookdet-conv-currency">
953 <div class="vbo-bookdet-conv-currency-inner">
954 <div class="vbo-bookdet-conv-currency-info">
955 <span><?php echo JText::sprintf('VBO_CONV_RES_OTA_CURRENCY', $this->conv_from_currency, $this->conv_to_currency); ?></span>
956 <span><?php echo JText::sprintf('VBO_CONV_RES_OTA_CURRENCY_EXC', ($this->conv_from_currency . ' ' . VikBooking::numberFormat($row['total'])), ($this->conv_to_currency . ' ' . VikBooking::numberFormat($this->allows_conversion))); ?></span>
957 </div>
958 <div class="vbo-bookdet-conv-currency-apply">
959 <a class="btn vbo-config-btn" onclick="return confirm(Joomla.JText._('VBO_CONV_RES_OTA_CURRENCY_APPLY') + '?');" href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>&do_ota_curr_conv=1"><?php VikBookingIcons::e('exchange-alt'); ?> <?php echo JText::translate('VBO_CONV_RES_OTA_CURRENCY_APPLY'); ?></a>
960 </div>
961 </div>
962 </div>
963 <?php
964 }
965
966 if (!$printreceipt && $row['status'] == "standby" && empty($row['idorderota']) && !strcasecmp($row['type'], 'Inquiry')) {
967 // website pending reservation inquiry
968 $ir_data_callback = function($data) {
969 return (is_object($data) && !empty($data->av_type));
970 };
971 $prev_ir_data = $history_obj->getEventsWithData('IR', $ir_data_callback, true);
972 if (is_array($prev_ir_data) && count($prev_ir_data)) {
973 // display a message about the availability type at the time of creation of the inquiry reservation
974
975 // parse original stay dates into DateTime objects
976 $orig_checkin_dt_obj = new JDate($prev_ir_data[0]->checkin_date);
977 $orig_checkout_dt_obj = new JDate($prev_ir_data[0]->checkout_date);
978 ?>
979 <div class="vbo-bookdet-container vbo-bookdet-inquiry-alert">
980 <div class="vbo-bookdet-inquiry-alert-dismiss">
981 <button type="button" class="btn btn-warning" onclick="jQuery('.vbo-bookdet-inquiry-alert').remove();"><?php VikBookingIcons::e('times-circle'); ?> <?php echo JText::translate('VBOBTNKEEPREMIND'); ?></button>
982 </div>
983 <div class="vbo-bookdet-inquiry-alert-message">
984 <div class="vbo-bookdet-inquiry-alert-top">
985 <span><?php echo JText::translate('VBO_WEB_INQUIRY_ALERT'); ?></span>
986 </div>
987 <div class="vbo-bookdet-inquiry-alert-avtype">
988 <span class="vbo-bookdet-inquiry-alert-mess-avtype"><?php
989 // explain what was the availability at the time of inquiry
990 if ($prev_ir_data[0]->av_type === 1) {
991 echo JText::translate('VBO_WEB_INQUIRY_AVTYPE_1');
992 } elseif ($prev_ir_data[0]->av_type === 2) {
993 echo JText::translate('VBO_WEB_INQUIRY_AVTYPE_2');
994 } elseif ($prev_ir_data[0]->av_type === 3) {
995 echo JText::translate('VBO_WEB_INQUIRY_AVTYPE_3');
996 } else {
997 echo JText::translate('VBO_WEB_INQUIRY_AVTYPE_4');
998 }
999 ?></span>
1000 <span class="vbo-bookdet-inquiry-alert-mess-origrq">
1001 <strong><?php echo JText::translate('VBO_WEB_INQUIRY_ORIGRQ') . ':'; ?></strong>
1002 <span class="badge"><?php echo JText::translate('VBPICKUPAT') . ': ' . $orig_checkin_dt_obj->format('D, d M Y', true); ?></span>
1003 <span class="badge"><?php echo JText::translate('VBRELEASEAT') . ': ' . $orig_checkout_dt_obj->format('D, d M Y', true); ?></span>
1004 <span class="badge"><?php echo JText::translate('VBEDITORDERADULTS') . ': ' . $prev_ir_data[0]->adults; ?></span>
1005 <?php
1006 if (!empty($prev_ir_data[0]->children)) {
1007 ?>
1008 <span class="badge"><?php echo JText::translate('VBEDITORDERCHILDREN') . ': ' . $prev_ir_data[0]->children; ?></span>
1009 <?php
1010 }
1011 ?>
1012 </span>
1013 </div>
1014 <div class="vbo-bookdet-inquiry-alert-bottom">
1015 <span><?php echo JText::translate('VBO_WEB_INQUIRY_SUGG'); ?></span>
1016 </div>
1017 </div>
1018 </div>
1019 <?php
1020 }
1021 }
1022 ?>
1023
1024 <div class="vbo-bookingdet-innertop">
1025 <div class="vbo-bookingdet-commands">
1026 <?php
1027 if ($busy || $row['status'] == "standby") {
1028 ?>
1029 <div class="vbo-bookingdet-command">
1030 <button onclick="document.location.href='index.php?option=com_vikbooking&task=editbusy&cid[]=<?php echo $row['id']; ?>';" class="btn vbo-config-btn" type="button"><i class="icon-pencil"></i> <?php echo JText::translate('VBMODRES'); ?></button>
1031 </div>
1032 <?php
1033 }
1034 if ((array_key_exists(1, $tars) && count($tars[1]) > 0) || ($is_package || $is_cust_cost)) {
1035
1036 if (VBOPlatformDetection::isWordPress()) {
1037 /**
1038 * @wponly display warning message if no valid Shortcodes found
1039 */
1040 $model = JModel::getInstance('vikbooking', 'shortcodes');
1041 $itemid = $model->best('booking');
1042 if (!$itemid) {
1043 VikError::raiseWarning('', 'No Shortcodes found, or no Shortcodes being used in Pages/Posts.');
1044 }
1045 }
1046
1047 ?>
1048 <div class="vbo-bookingdet-command">
1049 <button onclick="window.open('<?php echo VikBooking::externalroute('index.php?option=com_vikbooking&view=booking&sid='.(!empty($row['sid']) ? $row['sid'] : $row['idorderota']).'&ts='.$row['ts'], false); ?>', '_blank');" type="button" class="btn vbo-config-btn"><?php VikBookingIcons::e('external-link'); ?> <?php echo JText::translate('VBVIEWORDFRONT'); ?></button>
1050 </div>
1051 <?php
1052 }
1053 if (($row['status'] == "confirmed" || ($row['status'] == "standby" && !empty($row['custmail']))) && ((array_key_exists(1, $tars) && count($tars[1]) > 0) || ($is_package || $is_cust_cost))) {
1054 ?>
1055 <div class="vbo-bookingdet-command">
1056 <button class="btn vbo-config-btn" type="button" onclick="document.location.href='index.php?option=com_vikbooking&task=resendordemail&cid[]=<?php echo $row['id']; ?>';"><?php VikBookingIcons::e('envelope'); ?> <?php echo JText::translate('VBRESENDORDEMAIL'); ?></button>
1057 </div>
1058 <?php
1059 }
1060 if (is_array($this->vcm_special_offer)) {
1061 if (empty($this->vcm_special_offer[3]) || !empty($this->vcm_special_offer[4])) {
1062 // no special offer sent before, or withdrawn
1063 ?>
1064 <div class="vbo-bookingdet-command">
1065 <button type="button" class="btn btn-primary vcm-btn-channel-<?php echo strtolower($this->vcm_special_offer[2]); ?>" onclick="vboOpenJModal('vbo-vcm-special-offer', 'index.php?option=com_vikchannelmanager&task=specialoffer&bid=<?php echo $row['id']; ?>&listing_id=<?php echo $this->vcm_special_offer[0]; ?>&ota_thread_id=<?php echo $this->vcm_special_offer[1]; ?>&tmpl=component');"><?php VikBookingIcons::e('certificate'); ?> <?php echo JText::sprintf('VBO_VCM_SPECIAL_OFFER', $this->vcm_special_offer[2]); ?></button>
1066 </div>
1067 <?php
1068 // prepare modal (VCM prepare special offer)
1069 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-vcm-special-offer', JText::sprintf('VBO_VCM_SPECIAL_OFFER', $this->vcm_special_offer[2])));
1070 // end prepare modal
1071 } else {
1072 // special offer sent before, link to withdraw it
1073 ?>
1074 <div class="vbo-bookingdet-command">
1075 <a href="index.php?option=com_vikchannelmanager&task=sendSpecialOffer&vbo_oid=<?php echo $row['id']; ?>&spo_type=special_offer&spo_action=withdraw&ota_thread_id=<?php echo $this->vcm_special_offer[1]; ?>&spo_id=<?php echo $this->vcm_special_offer[3]; ?>" class="btn btn-danger"><?php VikBookingIcons::e('ban'); ?> <?php echo JText::translate('VBO_WITHDRAW_SPOFFER'); ?></a>
1076 </div>
1077 <?php
1078 }
1079 }
1080 if ($row['status'] == "standby" || ($row['status'] == "cancelled" && $row['checkout'] >= time())) {
1081 ?>
1082 <div class="vbo-bookingdet-command">
1083 <button class="btn btn-success" type="button" onclick="if (confirm('<?php echo htmlspecialchars(JText::translate('VBSETORDCONFIRMED')); ?> ?')) {document.location.href='index.php?option=com_vikbooking&task=setordconfirmed&cid[]=<?php echo $row['id'] . ($row['status'] == "cancelled" ? '&skip_notification=1' : ''); ?>';}"><?php VikBookingIcons::e('check'); ?> <?php echo JText::translate('VBSETORDCONFIRMED'); ?></button>
1084 </div>
1085 <?php
1086 }
1087 if ($row['status'] == "cancelled" && !$row['closure']) {
1088 ?>
1089 <div class="vbo-bookingdet-command">
1090 <button type="button" class="btn btn-warning vbo-context-menu-btn vbo-context-menu-actionscanc">
1091 <span class="vbo-context-menu-lbl"><?php echo JText::translate('VBCRONACTIONS'); ?> &#8230;</span>
1092 <span class="vbo-context-menu-ico"><?php VikBookingIcons::e('sort-down'); ?></span>
1093 </button>
1094 </div>
1095
1096 <script type="text/javascript">
1097 jQuery(function() {
1098 jQuery('.vbo-context-menu-actionscanc').vboContextMenu({
1099 placement: 'bottom-right',
1100 buttons: [
1101 <?php
1102 if (!empty($row['custmail'])) :
1103 ?>
1104 {
1105 icon: '<?php echo VikBookingIcons::i('envelope'); ?>',
1106 text: Joomla.JText._('VBSENDCANCORDEMAIL'),
1107 class: 'vbo-context-menu-entry-danger',
1108 separator: true,
1109 action: (root, config) => {
1110 document.location.href = 'index.php?option=com_vikbooking&task=sendcancordemail&cid[]=<?php echo $row['id']; ?>';
1111 },
1112 },
1113 <?php
1114 endif;
1115 ?>
1116 {
1117 icon: '<?php echo VikBookingIcons::i('hourglass-half'); ?>',
1118 text: Joomla.JText._('VBO_SET_STANDBY'),
1119 class: 'vbo-context-menu-entry-warning',
1120 separator: false,
1121 action: (root, config) => {
1122 document.location.href = 'index.php?option=com_vikbooking&task=bookings.set_to_pending&bid=<?php echo $row['id']; ?>';
1123 },
1124 },
1125 ],
1126 });
1127 });
1128 </script>
1129 <?php
1130 }
1131 if ($row['status'] == 'confirmed' && $row['closure'] < 1) {
1132 ?>
1133 <div class="vbo-bookingdet-command pro-feature">
1134 <button type="button" class="btn vbo-config-btn" onclick="document.getElementById('invnotes-hid').value=document.getElementById('invnotes').value;document.getElementById('vbo-gen-invoice').submit();"><?php VikBookingIcons::e('file-text-o'); ?> <?php echo JText::translate('VBOGENBOOKINGINVOICE'); ?></button>
1135 </div>
1136 <?php
1137 }
1138 if ($row['status'] == 'confirmed' && $row['closure'] < 1) {
1139 ?>
1140 <div class="vbo-bookingdet-command pro-feature">
1141 <button type="button" class="btn vbo-config-btn" onclick="window.open('index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>&print=1&tmpl=component', '_blank');"><?php VikBookingIcons::e('print'); ?> <?php echo JText::translate('VBOPRINTRECEIPT'); ?></button>
1142 </div>
1143 <?php
1144 }
1145 if ($row['status'] != 'confirmed' || $row['closure'] > 0 || $this->vcm_cancel_active_res) {
1146 if ($this->vcm_decline_actions) {
1147 // this booking requires some decline actions before being removed
1148 ?>
1149 <div class="vbo-bookingdet-command">
1150 <button type="button" class="btn btn-danger" onclick="vboOpenJModal('vbo-vcm-decline-booking', 'index.php?option=com_vikchannelmanager&task=declinebooking&cid[]=<?php echo $row['id']; ?>&tmpl=component');"><?php VikBookingIcons::e('trash'); ?> <?php echo JText::translate('VBMAINEBUSYDEL'); ?></button>
1151 </div>
1152 <?php
1153 // prepare modal (VCM decline booking)
1154 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-vcm-decline-booking', JText::translate('VBMAINEBUSYDEL')));
1155 // end prepare modal
1156 } elseif ($this->vcm_cancel_active_res) {
1157 // the active OTA booking can be cancelled
1158 ?>
1159 <div class="vbo-bookingdet-command">
1160 <button type="button" class="btn btn-danger" onclick="vboOpenJModal('vbo-vcm-cancel-reservation', 'index.php?option=com_vikchannelmanager&task=cancelreservation&vbo_oid=<?php echo $row['id']; ?>&tmpl=component');"><?php VikBookingIcons::e('trash'); ?> <?php echo JText::translate('VBMAINEBUSYDEL'); ?></button>
1161 </div>
1162 <?php
1163 // prepare modal (VCM cancel reservation)
1164 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-vcm-cancel-reservation', JText::translate('VBMAINEBUSYDEL')));
1165 // end prepare modal
1166 } else {
1167 // regular remove button with confirmation
1168 ?>
1169 <div class="vbo-bookingdet-command">
1170 <button type="button" class="btn btn-danger" onclick="if (confirm(Joomla.JText._('VBDELCONFIRM'))){document.location.href='index.php?option=com_vikbooking&task=removeorders&cid[]=<?php echo $row['id']; ?>&goto=<?php echo $row['id']; ?>';}"><?php VikBookingIcons::e('trash'); ?> <?php echo $row['status'] == 'cancelled' ? JText::translate('VBO_PURGERM_RESERVATION') : JText::translate('VBMAINEBUSYDEL'); ?></button>
1171 </div>
1172 <?php
1173 }
1174 }
1175 ?>
1176
1177 <!-- Define role to detect the supported hook -->
1178 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorder","key":"buttons","type":"field"} -->
1179
1180 <?php
1181 if (isset($bookingPanelForms['buttons']))
1182 {
1183 echo $bookingPanelForms['buttons'];
1184 }
1185 ?>
1186 </div>
1187
1188 <div class="vbo-bookingdet-tabs">
1189 <div class="vbo-bookingdet-tab vbo-bookingdet-tab-active" data-vbotab="vbo-tab-details"><?php echo JText::translate('VBOBOOKDETTABDETAILS'); ?></div>
1190 <div class="vbo-bookingdet-tab" data-vbotab="vbo-tab-admin"><?php echo JText::translate('VBOBOOKDETTABADMIN'); ?></div>
1191 </div>
1192 </div>
1193
1194 <div class="vbo-bookingdet-tab-cont" id="vbo-tab-details" style="display: block;">
1195 <div class="vbo-bookingdet-innercontainer">
1196 <div class="vbo-bookingdet-customer">
1197 <div class="vbo-bookingdet-detcont<?php echo $row['closure'] > 0 ? ' vbo-bookingdet-closure' : ''; ?>">
1198 <?php
1199 $custdata_parts = explode("\n", $row['custdata']);
1200 if (count($custdata_parts) > 2 && strpos($custdata_parts[0], ':') !== false && strpos($custdata_parts[1], ':') !== false) {
1201 //attempt to format labels and values
1202 foreach ($custdata_parts as $custdet) {
1203 if (strlen($custdet) < 1) {
1204 continue;
1205 }
1206 $custdet_parts = explode(':', $custdet);
1207 $custd_lbl = '';
1208 $custd_val = '';
1209 if (count($custdet_parts) < 2) {
1210 $custd_val = $custdet;
1211 } else {
1212 $custd_lbl = $custdet_parts[0];
1213 if ($custd_lbl == 'http' || $custd_lbl == 'https') {
1214 // shift values
1215 $custdet_parts[2] = $custdet_parts[1];
1216 $custdet_parts[1] = $custdet_parts[0];
1217 $custd_lbl = '';
1218 }
1219 unset($custdet_parts[0]);
1220 if ((!strcasecmp(trim($custdet_parts[1]), 'http') || !strcasecmp(trim($custdet_parts[1]), 'https')) && !empty($custdet_parts[2]) && strpos($custdet_parts[2], '//') !== false) {
1221 // this is a URI
1222 $custd_val = '<a href="' . trim(implode(':', $custdet_parts)) . '" target="_blank"><i class="' . VikBookingIcons::i('external-link') . '"></i></a>';
1223 } else {
1224 $custd_val = trim(implode(':', $custdet_parts));
1225 }
1226 }
1227 ?>
1228 <div class="vbo-bookingdet-userdetail">
1229 <?php
1230 if (strlen($custd_lbl)) {
1231 ?>
1232 <span class="vbo-bookingdet-userdetail-lbl"><?php echo VikBooking::tnCustomerRawDataLabel($custd_lbl); ?></span>
1233 <?php
1234 }
1235 if (strlen($custd_val)) {
1236 ?>
1237 <span class="vbo-bookingdet-userdetail-val"><?php echo $custd_val; ?></span>
1238 <?php
1239 }
1240 ?>
1241 </div>
1242 <?php
1243 }
1244 } else {
1245 if ($row['closure'] > 0) {
1246 ?>
1247 <div class="vbo-bookingdet-userdetail">
1248 <span class="vbo-bookingdet-userdetail-val"><?php echo nl2br($row['custdata']); ?></span>
1249 </div>
1250 <?php
1251 } else {
1252 echo nl2br($row['custdata']);
1253 ?>
1254 <div class="vbo-bookingdet-userdetail">
1255 <span class="vbo-bookingdet-userdetail-val">&nbsp;</span>
1256 </div>
1257 <?php
1258 }
1259 }
1260 if (!empty($row['ujid'])) {
1261 $orig_user = JFactory::getUser($row['ujid']);
1262 $author_name = is_object($orig_user) && property_exists($orig_user, 'name') && !empty($orig_user->name) ? $orig_user->name : '';
1263 ?>
1264 <div class="vbo-bookingdet-userdetail">
1265 <span class="vbo-bookingdet-userdetail-val"><?php echo JText::sprintf('VBOBOOKINGCREATEDBY', $row['ujid'].(!empty($author_name) ? ' ('.$author_name.')' : '')); ?></span>
1266 </div>
1267 <?php
1268 }
1269 ?>
1270
1271 <!-- Define role to detect the supported hook -->
1272 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderSidebar","key":"userdetails","type":"field"} -->
1273
1274 <?php
1275 if (isset($bookingSidebarForms['userdetails']))
1276 {
1277 echo $bookingSidebarForms['userdetails'];
1278 }
1279 ?>
1280
1281 </div>
1282
1283 <?php
1284 $invoiced = file_exists(VBO_SITE_PATH.DS.'helpers'.DS.'invoices'.DS.'generated'.DS.$row['id'].'_'.$row['sid'].'.pdf');
1285 if (!$printreceipt && ((!empty($row['channel']) && !empty($row['idorderota'])) || strlen($row['confirmnumber']) > 0 || $invoiced)) {
1286 ?>
1287 <div class="vbo-bookingdet-detcont vbo-bookingdet-detcont-labels-wrap vbo-hidein-print">
1288 <?php
1289 if (!empty($row['channel']) && !empty($row['idorderota'])) {
1290 ?>
1291 <div class="vbo-bookingdet-detcont-label vbo-bookingdet-detcont-label-idorderota">
1292 <span class="label label-info">
1293 <span><?php echo $otachannel_name . ' ID'; ?></span>
1294 <span class="badge"><?php echo !strcasecmp($row['type'], 'Inquiry') && $row['status'] == 'standby' ? '-----' : $row['idorderota']; ?></span>
1295 </span>
1296 </div>
1297 <?php
1298 }
1299 if (strlen($row['confirmnumber']) > 0) {
1300 ?>
1301 <div class="vbo-bookingdet-detcont-label vbo-bookingdet-detcont-label-confirmnumber">
1302 <span class="label label-success">
1303 <span><?php echo JText::translate('VBCONFIRMNUMB'); ?></span>
1304 <span class="badge"><?php echo $row['confirmnumber']; ?></span>
1305 </span>
1306 </div>
1307 <?php
1308 }
1309 if ($invoiced) {
1310 ?>
1311 <div class="vbo-bookingdet-detcont-label vbo-bookingdet-detcont-label-invoice">
1312 <span class="label label-success">
1313 <span><?php echo JText::translate('VBOCOLORTAGRULEINVONE'); ?></span>
1314 <span class="badge"><a href="<?php echo VBO_SITE_URI; ?>helpers/invoices/generated/<?php echo $row['id'].'_'.$row['sid']; ?>.pdf" target="_blank"><?php VikBookingIcons::e('download'); ?> <?php echo JText::translate('VBOINVDOWNLOAD'); ?></a></span>
1315 </span>
1316 </div>
1317 <?php
1318 }
1319 if (count($this->vcm_review)) {
1320 ?>
1321 <div class="vbo-bookingdet-detcont-label vbo-bookingdet-detcont-label-review">
1322 <span class="label label-warning">
1323 <a href="index.php?option=com_vikchannelmanager&task=reviews&revid=<?php echo $this->vcm_review['id']; ?>" target="_blank" style="color: #fff;"><i class="vboicn-star-full"></i> <?php echo JText::translate('VBOSEEGUESTREVIEW'); ?></a>
1324 </span>
1325 </div>
1326 <?php
1327 }
1328 ?>
1329
1330 <!-- Define role to detect the supported hook -->
1331 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderSidebar","key":"invoice","type":"field"} -->
1332
1333 <?php
1334 if (isset($bookingSidebarForms['invoice']))
1335 {
1336 echo $bookingSidebarForms['invoice'];
1337 }
1338 ?>
1339
1340 </div>
1341 <?php
1342 }
1343 if (!$printreceipt && $row['closure'] < 1) {
1344 ?>
1345 <div class="vbo-bookingdet-detcont vbo-hidein-print">
1346 <div class="vbo-bookingdet-lblcont">
1347 <label for="custmail"><?php echo JText::translate('VBCUSTEMAIL'); ?></label>
1348 </div>
1349 <div class="vbo-bookingdet-inpwrap">
1350 <div class="vbo-bookingdet-inpcont">
1351 <input type="text" name="custmail" id="custmail" value="<?php echo $this->escape($row['custmail']); ?>" size="25" onkeyup="vboKeyupEmail(event);"/>
1352 </div>
1353 <div class="vbo-bookingdet-btncont vbo-bookingdet-save-email" style="display: none;">
1354 <button type="button" class="btn btn-success" onclick="document.adminForm.submit();"><?php VikBookingIcons::e('save'); ?> <?php echo JText::translate('VBSAVE'); ?></button>
1355 </div>
1356 <?php if (!empty($row['custmail'])) : ?>
1357 <div class="vbo-bookingdet-btncont">
1358 <button type="button" class="btn vbo-config-btn" onclick="vboToggleSendEmail();" style="vertical-align: top;"><?php VikBookingIcons::e('envelope'); ?> <?php echo JText::translate('VBSENDEMAILACTION'); ?></button>
1359 </div>
1360 <?php endif; ?>
1361 </div>
1362
1363 <!-- Define role to detect the supported hook -->
1364 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderSidebar","key":"email","type":"field"} -->
1365
1366 <?php
1367 if (isset($bookingSidebarForms['email']))
1368 {
1369 echo $bookingSidebarForms['email'];
1370 }
1371 ?>
1372
1373 </div>
1374 <div class="vbo-bookingdet-detcont vbo-hidein-print">
1375 <div class="vbo-bookingdet-lblcont">
1376 <label for="custphone"><?php echo JText::translate('VBCUSTOMERPHONE'); ?></label>
1377 </div>
1378 <div class="vbo-bookingdet-inpwrap">
1379 <div class="vbo-bookingdet-inpcont">
1380 <?php echo $vbo_app->printPhoneInputField(array('name' => 'custphone', 'id' => 'custphone', 'value' => $this->escape($row['phone'])), array('nationalMode' => false, 'fullNumberOnBlur' => true)); ?>
1381 </div>
1382 <?php if (!empty($row['phone'])) : ?>
1383 <div class="vbo-bookingdet-btncont">
1384 <button type="button" class="btn vbo-config-btn" onclick="vboToggleSendSMS();" style="vertical-align: top;"><?php VikBookingIcons::e('comment-dots'); ?> <?php echo JText::translate('VBSENDSMSACTION'); ?></button>
1385 </div>
1386 <?php endif; ?>
1387 </div>
1388
1389 <!-- Define role to detect the supported hook -->
1390 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderSidebar","key":"phone","type":"field"} -->
1391
1392 <?php
1393 if (isset($bookingSidebarForms['phone']))
1394 {
1395 echo $bookingSidebarForms['phone'];
1396 }
1397 ?>
1398
1399 </div>
1400
1401 <!-- Define role to detect the supported hook -->
1402 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderSidebar","type":"fieldset"} -->
1403
1404 <?php
1405 foreach ($bookingSidebarForms as $legend => $form)
1406 {
1407 if (in_array($legend, ['userdetails', 'invoice', 'email', 'phone']))
1408 {
1409 // skip default forms
1410 continue;
1411 }
1412 ?>
1413 <div class="vbo-bookingdet-detcont vbo-hidein-print">
1414 <h3><?php echo JText::translate($legend); ?></h3>
1415
1416 <?php echo $form; ?>
1417 </div>
1418 <?php
1419 }
1420 ?>
1421
1422 <?php
1423 }
1424 ?>
1425 </div>
1426
1427 <?php
1428 $all_id_prices = array();
1429 $used_indexes_map = array();
1430 ?>
1431 <div class="vbo-bookingdet-summary">
1432 <div class="table-responsive">
1433 <table class="table">
1434 <?php
1435 // room stay dates in case of split stay (or modified room nights)
1436 $room_stay_dates = [];
1437 $room_stay_records = [];
1438 if ($row['split_stay']) {
1439 if ($row['status'] == 'confirmed') {
1440 $room_stay_dates = $av_helper->loadSplitStayBusyRecords($row['id']);
1441 } else {
1442 $room_stay_dates = VBOFactory::getConfig()->getArray('split_stay_' . $row['id'], []);
1443 }
1444 } elseif (!$row['split_stay'] && $row['roomsnum'] > 1 && $row['days'] > 1 && $row['status'] == 'confirmed') {
1445 // load the occupied stay dates for each room in case they were modified
1446 $room_stay_records = $av_helper->loadSplitStayBusyRecords($row['id']);
1447 }
1448
1449 // parse all rooms booked
1450 foreach ($rooms as $ind => $or) {
1451 $num = $ind + 1;
1452 $room_icon = $row['split_stay'] && $ind > 0 ? 'random' : 'bed';
1453 $room_stay_nights = $row['days'];
1454 ?>
1455 <tr class="vbo-bookingdet-summary-room">
1456 <td class="vbo-bookingdet-summary-room-firstcell">
1457 <div class="vbo-bookingdet-summary-room-wrap">
1458 <div class="vbo-bookingdet-summary-roomnum"><?php VikBookingIcons::e($room_icon); ?> <?php echo JText::translate('VBEDITORDERTHREE').' '.$num; ?></div>
1459 <?php
1460 //Room Specific Unit
1461 if (!$row['closure'] && $row['status'] == "confirmed" && !empty($or['params'])) {
1462 $room_params = json_decode($or['params'], true);
1463 $arr_features = array();
1464 $unavailable_indexes = VikBooking::getRoomUnitNumsUnavailable($row, $or['idroom']);
1465 if (is_array($room_params) && array_key_exists('features', $room_params) && !empty($room_params['features'])) {
1466 foreach ($room_params['features'] as $rind => $rfeatures) {
1467 if (in_array($rind, $unavailable_indexes) || (isset($used_indexes_map[$or['idroom']]) && in_array($rind, $used_indexes_map[$or['idroom']]))) {
1468 continue;
1469 }
1470 foreach ($rfeatures as $fname => $fval) {
1471 if (strlen($fval)) {
1472 $arr_features[$rind] = '#'.$rind.' - '.JText::translate($fname).': '.$fval;
1473 break;
1474 }
1475 }
1476 }
1477 }
1478 if (count($arr_features)) {
1479 // $or['id'] equals to the ID of each matching record in _ordersrooms
1480 ?>
1481 <div class="vbo-bookingdet-summary-roomnum-chunit">
1482 <?php echo !$printreceipt ? $vbo_app->getNiceSelect($arr_features, $or['roomindex'], 'roomindex['.$or['id'].']', JText::translate('VBOFEATASSIGNUNIT'), JText::translate('VBOFEATASSIGNUNITEMPTY'), '', 'document.adminForm.submit();', $or['id']) : (!empty($or['roomindex']) && isset($arr_features[$or['roomindex']]) ? $arr_features[$or['roomindex']] : ''); ?>
1483 </div>
1484 <?php
1485 if (!empty($or['idroom']) && !empty($or['roomindex'])) {
1486 if (!array_key_exists($or['idroom'], $used_indexes_map)) {
1487 $used_indexes_map[$or['idroom']] = array();
1488 }
1489 $used_indexes_map[$or['idroom']][] = $or['roomindex'];
1490 }
1491 }
1492 }
1493 //
1494 ?>
1495 </div>
1496 <div class="vbo-bookingdet-summary-roomguests">
1497 <?php VikBookingIcons::e('male'); ?>
1498 <div class="vbo-bookingdet-summary-roomadults">
1499 <span><?php echo JText::translate('VBEDITORDERADULTS'); ?>:</span> <?php echo $arrpeople[$num]['adults']; ?>
1500 </div>
1501 <?php
1502 if ($arrpeople[$num]['children'] > 0) {
1503 $age_str = '';
1504 if (!empty($arrpeople[$num]['children_age'])) {
1505 $json_child = json_decode($arrpeople[$num]['children_age'], true);
1506 if (is_array($json_child) && isset($json_child['age']) && is_array($json_child['age']) && count($json_child['age'])) {
1507 $age_str = ' '.JText::sprintf('VBORDERCHILDAGES', implode(', ', $json_child['age']));
1508 }
1509 }
1510 ?>
1511 <div class="vbo-bookingdet-summary-roomchildren">
1512 <span><?php echo JText::translate('VBEDITORDERCHILDREN'); ?>:</span> <?php echo $arrpeople[$num]['children'].$age_str; ?>
1513 </div>
1514 <?php
1515 }
1516 if ($arrpeople[$num]['pets'] > 0) {
1517 ?>
1518 <div class="vbo-bookingdet-summary-roompets">
1519 <span><?php VikBookingIcons::e('dog'); ?> <?php echo JText::translate('VBO_PETS'); ?>:</span> <?php echo $arrpeople[$num]['pets']; ?>
1520 </div>
1521 <?php
1522 }
1523 ?>
1524 </div>
1525 <?php
1526 if (!empty($arrpeople[$num]['t_first_name'])) {
1527 ?>
1528 <div class="vbo-bookingdet-summary-guestname">
1529 <span><?php echo $arrpeople[$num]['t_first_name'].' '.$arrpeople[$num]['t_last_name']; ?></span>
1530 </div>
1531 <?php
1532 }
1533 ?>
1534 </td>
1535 <td>
1536 <div class="vbo-bookingdet-summary-roomname"><?php echo $or['name']; ?></div>
1537 <div class="vbo-bookingdet-summary-roomrate">
1538 <?php
1539 $active_rplan_id = 0;
1540 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
1541 if (!empty($or['pkg_name'])) {
1542 //package
1543 echo $or['pkg_name'];
1544 } else {
1545 //custom cost can have an OTA Rate Plan name
1546 if (!empty($or['otarplan'])) {
1547 echo ucwords($or['otarplan']);
1548 } else {
1549 echo JText::translate('VBOROOMCUSTRATEPLAN');
1550 }
1551 }
1552 } elseif (array_key_exists($num, $tars) && !empty($tars[$num][0]['idprice'])) {
1553 $active_rplan_id = $tars[$num][0]['idprice'];
1554 $all_id_prices[] = $tars[$num][0]['idprice'];
1555 echo VikBooking::getPriceName($tars[$num][0]['idprice']);
1556 if (!empty($tars[$num][0]['attrdata'])) {
1557 ?>
1558 <div>
1559 <?php echo VikBooking::getPriceAttr($tars[$num][0]['idprice']).": ".$tars[$num][0]['attrdata']; ?>
1560 </div>
1561 <?php
1562 }
1563 } elseif (!empty($or['otarplan'])) {
1564 echo ucwords($or['otarplan']);
1565 } elseif ($row['closure'] < 1) {
1566 echo JText::translate('VBOROOMNORATE');
1567 }
1568 ?>
1569 </div>
1570 <?php
1571 // meals included in the room rate
1572 if (!empty($or['meals'])) {
1573 // display included meals defined at room-reservation record
1574 $included_meals = VBOMealplanManager::getInstance()->roomRateIncludedMeals($or);
1575 } else {
1576 // fetch default included meals in the selected rate plan
1577 $included_meals = $active_rplan_id ? VBOMealplanManager::getInstance()->ratePlanIncludedMeals($active_rplan_id) : [];
1578 }
1579 if (!$included_meals && empty($or['meals']) && !empty($row['idorderota']) && !empty($row['channel']) && !empty($row['custdata'])) {
1580 // attempt to fetch the included meal plans from the raw customer data or OTA reservation and room
1581 $included_meals = VBOMealplanManager::getInstance()->otaDataIncludedMeals($row, $or);
1582 }
1583 if ($included_meals) {
1584 ?>
1585 <div class="vbo-bookingdet-summary-roomrate vbo-bookingdet-summary-roommeals vbo-wider-badges-wrap">
1586 <?php
1587 foreach ($included_meals as $included_meal) {
1588 ?>
1589 <span class="badge badge-info"><?php echo $included_meal; ?></span>
1590 <?php
1591 }
1592 ?>
1593 </div>
1594 <?php
1595 }
1596
1597 if ($row['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$ind]) && $room_stay_dates[$ind]['idroom'] == $or['idroom']) {
1598 // print split stay information for this room
1599 $room_stay_checkin = !empty($room_stay_dates[$ind]['checkin_ts']) ? $room_stay_dates[$ind]['checkin_ts'] : $room_stay_dates[$ind]['checkin'];
1600 $room_stay_checkout = !empty($room_stay_dates[$ind]['checkout_ts']) ? $room_stay_dates[$ind]['checkout_ts'] : $room_stay_dates[$ind]['checkout'];
1601 $room_stay_nights = $av_helper->countNightsOfStay($room_stay_checkin, $room_stay_checkout);
1602 ?>
1603 <div class="vbo-cal-splitstay-details vbo-bookdet-splitstay-details">
1604 <div class="vbo-cal-splitstay-dates">
1605 <span class="vbo-cal-splitstay-room-nights"><?php VikBookingIcons::e('moon'); ?> <?php echo $room_stay_nights . ' ' . ($room_stay_nights > 1 ? JText::translate('VBDAYS') : JText::translate('VBDAY')); ?></span>
1606 <span class="vbo-cal-splitstay-dates-in" title="<?php echo date('H:i', $room_stay_checkin); ?>"><?php VikBookingIcons::e('plane-arrival'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_stay_checkin); ?></span>
1607 <span class="vbo-cal-splitstay-dates-out" title="<?php echo date('H:i', $room_stay_checkout); ?>"><?php VikBookingIcons::e('plane-departure'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_stay_checkout); ?></span>
1608 </div>
1609 </div>
1610 <?php
1611 } elseif (!$row['split_stay'] && count($room_stay_records) && isset($room_stay_records[$ind]) && $room_stay_records[$ind]['idroom'] == $or['idroom']) {
1612 // print modified stay dates information for this room
1613 $room_stay_checkin = $room_stay_records[$ind]['checkin'];
1614 $room_stay_checkout = $room_stay_records[$ind]['checkout'];
1615 $room_stay_nights = $av_helper->countNightsOfStay($room_stay_checkin, $room_stay_checkout);
1616 if ($room_stay_checkin != $row['checkin'] || $room_stay_checkout != $row['checkout']) {
1617 ?>
1618 <div class="vbo-cal-splitstay-details vbo-bookdet-splitstay-details vbo-bookdet-roomdatesmod-details">
1619 <div class="vbo-cal-splitstay-dates">
1620 <span class="vbo-cal-splitstay-room-nights"><?php VikBookingIcons::e('moon'); ?> <?php echo $room_stay_nights . ' ' . ($room_stay_nights > 1 ? JText::translate('VBDAYS') : JText::translate('VBDAY')); ?></span>
1621 <span class="vbo-cal-splitstay-dates-in" title="<?php echo date('H:i', $room_stay_checkin); ?>"><?php VikBookingIcons::e('plane-arrival'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_stay_checkin); ?></span>
1622 <span class="vbo-cal-splitstay-dates-out" title="<?php echo date('H:i', $room_stay_checkout); ?>"><?php VikBookingIcons::e('plane-departure'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_stay_checkout); ?></span>
1623 </div>
1624 </div>
1625 <?php
1626 }
1627 }
1628 ?>
1629 </td>
1630 <td>
1631 <div class="vbo-bookingdet-summary-price">
1632 <?php
1633 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
1634 echo $currencyname.' '.VikBooking::numberFormat($or['cust_cost']);
1635 } elseif (array_key_exists($num, $tars) && !empty($tars[$num][0]['idprice'])) {
1636 $display_rate = !empty($or['room_cost']) ? $or['room_cost'] : $tars[$num][0]['cost'];
1637 echo $currencyname.' '.VikBooking::numberFormat(($after_tax ? VikBooking::sayCostPlusIva($display_rate, $tars[$num][0]['idprice']) : $display_rate));
1638 }
1639 ?>
1640 </div>
1641 </td>
1642 </tr>
1643 <?php
1644 //Options
1645 if (!empty($or['optionals'])) {
1646 $stepo = explode(";", $or['optionals']);
1647 $counter = 0;
1648 foreach ($stepo as $roptkey => $oo) {
1649 if (empty($oo)) {
1650 continue;
1651 }
1652 $stept = explode(":", $oo);
1653 $q = "SELECT * FROM `#__vikbooking_optionals` WHERE `id`=".(int)$stept[0].";";
1654 $dbo->setQuery($q);
1655 $dbo->execute();
1656 if ($dbo->getNumRows() != 1) {
1657 continue;
1658 }
1659 $counter++;
1660 $actopt = $dbo->loadAssocList();
1661 $chvar = '';
1662 if (!empty($actopt[0]['ageintervals']) && $or['children'] > 0 && strstr($stept[1], '-') != false) {
1663 $optagenames = VikBooking::getOptionIntervalsAges($actopt[0]['ageintervals']);
1664 $optagepcent = VikBooking::getOptionIntervalsPercentage($actopt[0]['ageintervals']);
1665 $optageovrct = VikBooking::getOptionIntervalChildOverrides($actopt[0], $or['adults'], $or['children']);
1666 $child_num = VikBooking::getRoomOptionChildNumber($or['optionals'], $actopt[0]['id'], $roptkey, $or['children']);
1667 $optagecosts = VikBooking::getOptionIntervalsCosts(isset($optageovrct['ageintervals_child' . ($child_num + 1)]) ? $optageovrct['ageintervals_child' . ($child_num + 1)] : $actopt[0]['ageintervals']);
1668 $agestept = explode('-', $stept[1]);
1669 $stept[1] = $agestept[0];
1670 $chvar = $agestept[1];
1671 if (array_key_exists(($chvar - 1), $optagepcent) && $optagepcent[($chvar - 1)] == 1) {
1672 //percentage value of the adults tariff
1673 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
1674 $optagecosts[($chvar - 1)] = $or['cust_cost'] * $optagecosts[($chvar - 1)] / 100;
1675 } else {
1676 $display_rate = !empty($or['room_cost']) ? $or['room_cost'] : $tars[$num][0]['cost'];
1677 $optagecosts[($chvar - 1)] = $display_rate * $optagecosts[($chvar - 1)] / 100;
1678 }
1679 } elseif (array_key_exists(($chvar - 1), $optagepcent) && $optagepcent[($chvar - 1)] == 2) {
1680 //VBO 1.10 - percentage value of room base cost
1681 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
1682 $optagecosts[($chvar - 1)] = $or['cust_cost'] * $optagecosts[($chvar - 1)] / 100;
1683 } else {
1684 $display_rate = isset($tars[$num][0]['room_base_cost']) ? $tars[$num][0]['room_base_cost'] : (!empty($or['room_cost']) ? $or['room_cost'] : $tars[$num][0]['cost']);
1685 $optagecosts[($chvar - 1)] = $display_rate * $optagecosts[($chvar - 1)] / 100;
1686 }
1687 }
1688 if (!isset($optagenames[($chvar - 1)])) {
1689 $optagenames[($chvar - 1)] = '';
1690 }
1691 if (!isset($optagecosts[($chvar - 1)])) {
1692 $optagecosts[($chvar - 1)] = 0;
1693 }
1694 $actopt[0]['chageintv'] = $chvar;
1695 $actopt[0]['name'] .= ' ('.$optagenames[($chvar - 1)].')';
1696 $realcost = (intval($actopt[0]['perday']) == 1 ? (floatval($optagecosts[($chvar - 1)]) * $room_stay_nights * $stept[1]) : (floatval($optagecosts[($chvar - 1)]) * $stept[1]));
1697 } else {
1698 // VBO 1.11 - options percentage cost of the room total fee
1699 if ($is_package === true || (!empty($or['cust_cost']) && $or['cust_cost'] > 0.00)) {
1700 $deftar_basecosts = $or['cust_cost'];
1701 } else {
1702 $use_def_tar = isset($tars[$num]) && isset($tars[$num][0]) ? $tars[$num][0]['cost'] : 0;
1703 $deftar_basecosts = !empty($or['room_cost']) ? $or['room_cost'] : $use_def_tar;
1704 }
1705 $actopt[0]['cost'] = (int)$actopt[0]['pcentroom'] ? ($deftar_basecosts * $actopt[0]['cost'] / 100) : $actopt[0]['cost'];
1706 //
1707 $realcost = (intval($actopt[0]['perday']) == 1 ? ($actopt[0]['cost'] * $room_stay_nights * $stept[1]) : ($actopt[0]['cost'] * $stept[1]));
1708 }
1709 if ($actopt[0]['maxprice'] > 0 && $realcost > $actopt[0]['maxprice']) {
1710 $realcost = $actopt[0]['maxprice'];
1711 if (intval($actopt[0]['hmany']) == 1 && intval($stept[1]) > 1) {
1712 $realcost = $actopt[0]['maxprice'] * $stept[1];
1713 }
1714 }
1715 $realcost = $actopt[0]['perperson'] == 1 ? ($realcost * $arrpeople[$num]['adults']) : $realcost;
1716 $tmpopr = VikBooking::sayOptionalsPlusIva($realcost, $actopt[0]['idiva']);
1717 ?>
1718 <tr class="vbo-bookingdet-summary-options">
1719 <td class="vbo-bookingdet-summary-options-title"><?php echo $counter == 1 ? JText::translate('VBEDITORDEREIGHT') : '&nbsp;'; ?></td>
1720 <td>
1721 <span class="vbo-bookingdet-summary-lbl"><?php echo ($stept[1] > 1 ? $stept[1]." " : "").$actopt[0]['name']; ?></span>
1722 </td>
1723 <td>
1724 <span class="vbo-bookingdet-summary-cost"><?php echo $currencyname." ".VikBooking::numberFormat(($after_tax ? $tmpopr : $realcost)); ?></span>
1725 </td>
1726 </tr>
1727 <?php
1728 }
1729 }
1730 //Custom extra costs
1731 if (!empty($or['extracosts'])) {
1732 $counter = 0;
1733 $cur_extra_costs = json_decode($or['extracosts'], true);
1734 foreach ($cur_extra_costs as $eck => $ecv) {
1735 $counter++;
1736 $ecv['idtax'] = isset($ecv['idtax']) ? $ecv['idtax'] : 0;
1737 ?>
1738 <tr class="vbo-bookingdet-summary-custcosts">
1739 <td class="vbo-bookingdet-summary-custcosts-title"><?php echo $counter == 1 ? JText::translate('VBPEDITBUSYEXTRACOSTS') : '&nbsp;'; ?></td>
1740 <td>
1741 <span class="vbo-bookingdet-summary-lbl"><?php echo $ecv['name']; ?></span>
1742 </td>
1743 <td>
1744 <span class="vbo-bookingdet-summary-cost"><?php echo $currencyname." ".VikBooking::numberFormat(($after_tax ? VikBooking::sayOptionalsPlusIva($ecv['cost'], $ecv['idtax']) : $ecv['cost'])); ?></span>
1745 </td>
1746 </tr>
1747 <?php
1748 }
1749 }
1750 }
1751 //vikbooking 1.1 coupon
1752 if (strlen((string)$row['coupon']) > 0) {
1753 $expcoupon = explode(";", $row['coupon']);
1754 ?>
1755 <tr class="vbo-bookingdet-summary-coupon">
1756 <td><?php echo JText::translate('VBCOUPON'); ?></td>
1757 <td>
1758 <span class="vbo-bookingdet-summary-lbl"><?php echo $expcoupon[2]; ?></span>
1759 </td>
1760 <td>
1761 <span class="vbo-bookingdet-summary-cost">- <?php echo $currencyname; ?> <?php echo VikBooking::numberFormat($expcoupon[1]); ?></span>
1762 </td>
1763 </tr>
1764 <?php
1765 }
1766 if ($row['refund'] > 0) {
1767 ?>
1768 <tr class="vbo-bookingdet-summary-totpaid vbo-bookingdet-summary-totrefunded">
1769 <td>
1770 <strong><?php echo JText::translate('VBOBOOKHISTORYTRF'); ?></strong>
1771 </td>
1772 <td>
1773 <span class="vbo-amount-refunded-lbl"><?php echo JText::translate('VBO_AMOUNT_REFUNDED'); ?></span>
1774 </td>
1775 <td>
1776 <div id="vbo-amountrefunded-cont">
1777 <span id="vbo-amountrefunded-current"><?php echo $currencyname.' '.VikBooking::numberFormat($row['refund']); ?></span>
1778 <span id="vbo-amountrefunded-edit" style="margin-left: 5px; cursor: pointer;"><?php VikBookingIcons::e('edit'); ?></span>
1779 </div>
1780 <div id="vbo-amountrefunded-modcont" style="display: none;">
1781 <span id="vbo-amountrefunded-cancedit" style="margin-right: 5px; cursor: pointer;"><?php VikBookingIcons::e('times'); ?></span>
1782 <span id="vbo-amountrefunded-new"><input type="number" step="any" name="newamountrefunded" value="" min="0" style="margin: 0;" placeholder="<?php echo $row['refund']; ?>" disabled /></span>
1783 <span id="vbo-amountrefunded-save"><button type="submit" class="btn btn-success"><?php echo JText::translate('VBAPPLYDISCOUNTSAVE'); ?></button></span>
1784 </div>
1785 </td>
1786 </tr>
1787 <?php
1788 }
1789 //Reservation Total
1790 //Taxes Breakdown (only if tot_taxes is greater than 0)
1791 $tax_breakdown = array();
1792 $base_aliq = 0;
1793 if (count($all_id_prices) > 0 && $row['tot_taxes'] > 0) {
1794 //only last type of price assuming that the tax breakdown is equivalent in case of different rates
1795 $q = "SELECT `p`.`id`,`p`.`name`,`p`.`idiva`,`t`.`aliq`,`t`.`breakdown` FROM `#__vikbooking_prices` AS `p` LEFT JOIN `#__vikbooking_iva` `t` ON `p`.`idiva`=`t`.`id` WHERE `p`.`id`=".intval(array_pop($all_id_prices))." LIMIT 1;";
1796 $dbo->setQuery($q);
1797 $dbo->execute();
1798 if ($dbo->getNumRows() > 0) {
1799 $breakdown_info = $dbo->loadAssoc();
1800 if (!empty($breakdown_info['breakdown']) && !empty($breakdown_info['aliq'])) {
1801 $tax_breakdown = json_decode($breakdown_info['breakdown'], true);
1802 $tax_breakdown = is_array($tax_breakdown) && count($tax_breakdown) > 0 ? $tax_breakdown : array();
1803 $base_aliq = $breakdown_info['aliq'];
1804 }
1805 }
1806 }
1807 //
1808 if ($printreceipt && $row['tot_taxes'] > 0) {
1809 // only when printing the receipt we display an additional row for the total amount of tax
1810 ?>
1811 <tr class="vbo-bookingdet-summary-total vbo-bookingdet-summary-totaltax">
1812 <td>
1813
1814 </td>
1815 <td>
1816 <span class="vbo-bookingdet-summary-lbl"><?php echo JText::translate('VBTOTALVAT'); ?></span>
1817 </td>
1818 <td>
1819 <span class="vbo-bookingdet-summary-cost"><?php echo $currencyname; ?> <?php echo VikBooking::numberFormat($row['tot_taxes']); ?></span>
1820 </td>
1821 </tr>
1822 <?php
1823 }
1824 ?>
1825 <tr class="vbo-bookingdet-summary-total">
1826 <td>
1827 <?php
1828 if (!$printreceipt) {
1829 ?>
1830 <span class="vbapplydiscsp" onclick="toggleDiscount(this);">
1831 <i class="<?php echo VikBookingIcons::i('chevron-down'); ?>" title="<?php echo htmlspecialchars(JText::translate('VBAPPLYDISCOUNT')); ?>"></i>
1832 </span>
1833 <?php
1834 }
1835 ?>
1836 </td>
1837 <td>
1838 <span class="vbo-bookingdet-summary-lbl"><?php echo JText::translate('VBEDITORDERNINE'); ?></span>
1839
1840 <div class="vbdiscenter" id="vbdiscenter" style="display: none;">
1841 <div class="vbdiscenter-entry">
1842 <span class="vbdiscenter-label"><?php echo JText::translate('VBTOTALVAT'); ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <input type="number" step="any" name="tot_taxes" value="<?php echo $row['tot_taxes']; ?>" size="4"/></span>
1843 </div>
1844 <?php
1845 if (count($tax_breakdown)) {
1846 foreach ($tax_breakdown as $tbkk => $tbkv) {
1847 $tax_break_cost = $row['tot_taxes'] * floatval($tbkv['aliq']) / $base_aliq;
1848 ?>
1849 <div class="vbdiscenter-entry vbdiscenter-entry-breakdown">
1850 <span class="vbdiscenter-label"><?php echo $tbkv['name']; ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <?php echo VikBooking::numberFormat($tax_break_cost); ?></span>
1851 </div>
1852 <?php
1853 }
1854 }
1855 ?>
1856 <div class="vbdiscenter-entry">
1857 <span class="vbdiscenter-label"><?php echo JText::translate('VBTOTALCITYTAX'); ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <input type="number" step="any" name="tot_city_taxes" value="<?php echo $row['tot_city_taxes']; ?>" size="4"/></span>
1858 </div>
1859 <div class="vbdiscenter-entry">
1860 <span class="vbdiscenter-label"><?php echo JText::translate('VBTOTALFEES'); ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <input type="number" step="any" name="tot_fees" value="<?php echo $row['tot_fees']; ?>" size="4"/></span>
1861 </div>
1862 <div class="vbdiscenter-entry">
1863 <span class="vbdiscenter-label hasTooltip"<?php echo !empty($otachannel_name) ? ' title="'.$otachannel_name.'"' : ''; ?>><?php echo JText::translate('VBTOTALCOMMISSIONS'); ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <input type="number" step="any" name="cmms" value="<?php echo $row['cmms']; ?>" size="4"/></span>
1864 </div>
1865 <div class="vbdiscenter-entry">
1866 <span class="vbdiscenter-label"><?php echo JText::translate('VBAPPLYDISCOUNT'); ?>:</span><span class="vbdiscenter-value"><?php echo $currencyname; ?> <input type="number" step="any" name="admindisc" value="<?php echo isset($expcoupon) ? (float)$expcoupon[1] : ''; ?>" size="4"/></span>
1867 </div>
1868 <div class="vbdiscenter-entrycentered">
1869 <button type="submit" class="btn btn-success"><?php echo JText::translate('VBAPPLYDISCOUNTSAVE'); ?></button>
1870 </div>
1871 </div>
1872 </td>
1873 <td>
1874 <span class="vbo-bookingdet-summary-cost"><?php echo (strlen($otacurrency) > 0 ? '('.$otacurrency.') '.$currencyname : $currencyname); ?> <?php echo VikBooking::numberFormat($row['total']); ?></span>
1875 </td>
1876 </tr>
1877 <?php
1878 if ($row['total'] > 0 && !$row['closure']) {
1879 $has_paid = ($row['totpaid'] > 0);
1880 $diff_to_pay = $has_paid ? ($row['total'] - $row['totpaid']) : 0;
1881 if ($has_paid || $row['status'] != 'standby') {
1882 ?>
1883 <tr class="vbo-bookingdet-summary-totpaid">
1884 <td>&nbsp;</td>
1885 <td><?php echo JText::translate('VBAMOUNTPAID'); ?></td>
1886 <td>
1887 <div id="vbo-amountpaid-cont">
1888 <span id="vbo-amountpaid-current"><?php echo $has_paid ? ($currencyname . ' ' . VikBooking::numberFormat($row['totpaid'])) : ''; ?></span>
1889 <span id="vbo-amountpaid-edit" style="margin-left: 5px; cursor: pointer;"><?php VikBookingIcons::e('edit'); ?></span>
1890 </div>
1891 <div id="vbo-amountpaid-modcont" style="display: none;">
1892 <span id="vbo-amountpaid-cancedit" style="margin-right: 5px; cursor: pointer;"><?php VikBookingIcons::e('times'); ?></span>
1893 <span id="vbo-amountpaid-new"><input type="number" step="any" name="newamountpaid" value="" min="0" style="margin: 0;" placeholder="<?php echo $has_paid ? $row['totpaid'] : ''; ?>" disabled /></span>
1894 <?php
1895 if (is_array($payments)) {
1896 ?>
1897 <span id="vbo-amountpaid-paymeth" style="margin: 0 5px; max-width: 160px;">
1898 <select name="newamountpaymeth" style="margin: 0;">
1899 <option value=""><?php echo JText::translate('VBPAYMENTMETHOD'); ?></option>
1900 <?php
1901 foreach ($payments as $pay) {
1902 ?>
1903 <option value="<?php echo JHtml::fetch('esc_attr', $pay['id'] . '_' . $pay['name']); ?>"><?php echo $pay['name']; ?></option>
1904 <?php
1905 }
1906 ?>
1907 </select>
1908 </span>
1909 <?php
1910 }
1911 ?>
1912 <span id="vbo-amountpaid-save"><button type="submit" class="btn btn-success"><?php echo JText::translate('VBAPPLYDISCOUNTSAVE'); ?></button></span>
1913 </div>
1914 </td>
1915 </tr>
1916 <?php
1917 }
1918 if ($diff_to_pay > 1 && $row['status'] != 'cancelled') {
1919 ?>
1920 <tr class="vbo-bookingdet-summary-totpaid vbo-bookingdet-summary-totremaining">
1921 <td>&nbsp;</td>
1922 <td>
1923 <div><?php echo JText::translate('VBTOTALREMAINING'); ?></div>
1924 <?php
1925 // enable second payment
1926 if (!$printreceipt && $row['status'] == 'confirmed' && !($row['paymcount'] > 0) && VikBooking::multiplePayments() && is_array($payment) && !empty($payment['id'])) {
1927 ?>
1928 <div style="margin-top: 5px;">
1929 <a href="index.php?option=com_vikbooking&amp;task=editorder&amp;makepay=1&amp;cid[]=<?php echo $row['id']; ?>" class="vbo-makepayable-link"><?php VikBookingIcons::e('credit-card'); ?> <?php echo JText::translate('VBMAKEORDERPAYABLE'); ?></a>
1930 </div>
1931 <?php
1932 }
1933 ?>
1934 </td>
1935 <td><?php echo $currencyname . ' ' . VikBooking::numberFormat($diff_to_pay); ?></td>
1936 </tr>
1937 <?php
1938 }
1939 }
1940 if (!$printreceipt && $row['status'] == 'confirmed' && VikBooking::multiplePayments() && is_array($payment) && !empty($payment['id']) && $row['checkout'] > time()) {
1941 /**
1942 * The amount payable can be modified by the admin.
1943 *
1944 * @since 1.14 (J) - 1.4.0 (WP)
1945 */
1946 ?>
1947 <tr class="vbo-bookingdet-summary-totpaid vbo-bookingdet-summary-totpayable">
1948 <td>&nbsp;</td>
1949 <td>
1950 <span class="vbo-amount-payable-lbl<?php echo $row['payable'] > 0 ? ' vbo-amount-payable-lbl-requested' : ''; ?>"><?php echo $row['payable'] > 0 ? JText::translate('VBO_AMOUNT_PAYABLE') : JText::translate('VBO_AMOUNT_PAYABLE_RQ'); ?></span>
1951 </td>
1952 <td>
1953 <div id="vbo-amountpayable-cont">
1954 <?php
1955 if ($row['payable'] > 0) {
1956 ?>
1957 <span id="vbo-amountpayable-current"><?php echo $currencyname . ' ' . VikBooking::numberFormat($row['payable']); ?></span>
1958 <?php
1959 }
1960 ?>
1961 <span id="vbo-amountpayable-edit" style="margin-left: 5px; cursor: pointer;"><?php VikBookingIcons::e('edit'); ?></span>
1962 </div>
1963 <div id="vbo-amountpayable-modcont" style="display: none;">
1964 <span id="vbo-amountpayable-cancedit" style="margin-right: 5px; cursor: pointer;"><?php VikBookingIcons::e('times'); ?></span>
1965 <span id="vbo-amountpayable-new"><input type="number" step="any" name="newamountpayable" value="" min="0" style="margin: 0;" placeholder="<?php echo $row['payable']; ?>" disabled /></span>
1966 <span id="vbo-amountpayable-save"><button type="submit" class="btn btn-success"><?php echo JText::translate('VBAPPLYDISCOUNTSAVE'); ?></button></span>
1967 </div>
1968 </td>
1969 </tr>
1970 <?php
1971 }
1972
1973 /**
1974 * Cancellation fee for cancelled bookings after the deadline.
1975 *
1976 * @since 1.16.0 (J) - 1.6.0 (WP)
1977 */
1978 if ($row['status'] == 'cancelled' && !$row['closure'] && $row['total'] > 0) {
1979 ?>
1980 <tr class="vbo-bookingdet-summary-cancfee">
1981 <td>&nbsp;</td>
1982 <td><?php echo JText::translate('VBO_CANC_FEE'); ?></td>
1983 <td>
1984 <div id="vbo-cancfee-cont">
1985 <span id="vbo-cancfee-current"><?php echo $currencyname.' '.VikBooking::numberFormat($row['canc_fee']); ?></span>
1986 <span id="vbo-cancfee-edit" style="margin-left: 5px; cursor: pointer;"><?php VikBookingIcons::e('edit'); ?></span>
1987 </div>
1988 <div id="vbo-cancfee-modcont" style="display: none;">
1989 <span id="vbo-cancfee-cancedit" style="margin-right: 5px; cursor: pointer;"><?php VikBookingIcons::e('times'); ?></span>
1990 <span id="vbo-cancfee-new"><input type="number" step="any" name="newcancfee" value="" min="0" style="margin: 0;" placeholder="<?php echo $row['canc_fee']; ?>" disabled /></span>
1991 <span id="vbo-cancfee-save"><button type="submit" class="btn btn-success"><?php echo JText::translate('VBAPPLYDISCOUNTSAVE'); ?></button></span>
1992 </div>
1993 </td>
1994 </tr>
1995 <?php
1996 }
1997 ?>
1998 </table>
1999 </div>
2000
2001 <!-- Define role to detect the supported hook -->
2002 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorder","type":"fieldset"} -->
2003
2004 <?php
2005 foreach ($bookingPanelForms as $legend => $form)
2006 {
2007 if (in_array($legend, ['buttons']))
2008 {
2009 // skip default forms
2010 continue;
2011 }
2012 ?>
2013 <div class="table-responsive">
2014 <h3><?php echo JText::translate($legend); ?></h3>
2015
2016 <?php echo $form; ?>
2017 </div>
2018 <?php
2019 }
2020 ?>
2021
2022 </div>
2023 </div>
2024 <?php
2025 if ($printreceipt) {
2026 $receipt_notes = VikBooking::getReceiptNotes();
2027 ?>
2028 <div class="vbo-receipt-notes-container">
2029 <div class="vbo-receipt-notes-inner">
2030 <div class="vbo-receipt-notes-val vbo-showin-print" id="vbo-receipt-notes-val"><?php echo $receipt_notes; ?></div>
2031 <div class="vbo-receipt-notes-tarea vbo-hidein-print">
2032 <textarea id="vbo-receipt-notes" placeholder="<?php echo JText::translate('VBORECEIPTNOTESDEF'); ?>"><?php echo htmlspecialchars($receipt_notes); ?></textarea>
2033 </div>
2034 </div>
2035 </div>
2036 <?php
2037 }
2038 ?>
2039 </div>
2040
2041 <div class="vbo-bookingdet-tab-cont" id="vbo-tab-admin" style="display: none;">
2042 <div class="vbo-bookingdet-innercontainer">
2043 <div class="vbo-bookingdet-admindata">
2044 <?php
2045 if (!$row['closure']) {
2046 ?>
2047 <div class="vbo-bookingdet-admin-entry">
2048 <label for="vbo-searchcust"><?php echo JText::translate(count($customer) ? 'VBOASSIGNNEWCUST' : 'VBFILLCUSTFIELDS'); ?></label>
2049 <span style="display: block;"><?php echo JText::translate('VBOSEARCHEXISTCUST'); ?></span>
2050 <span class="vbo-eorder-assigncust" style="margin-bottom: 1px;">
2051 <input type="text" id="vbo-searchcust" autocomplete="off" value="" placeholder="<?php echo JText::translate('VBOSEARCHCUSTBY'); ?>" size="30" style="margin-bottom: 0;" />
2052 </span>
2053 <span id="vbo-searchcust-loading">
2054 <?php VikBookingIcons::e('hourglass-half'); ?>
2055 </span>
2056 <input type="hidden" name="newcustid" id="newcustid" value="" />
2057 <div id="vbo-searchcust-res" style="position: absolute; background-color: #fff;"></div>
2058 <span class="vbo-eorder-assignnewcust" style="display: block; margin-top: 10px;">
2059 <a class="vbo-assign-customer" href="index.php?option=com_vikbooking&task=newcustomer&bid=<?php echo $row['id']; ?>&goto=<?php echo base64_encode($gotouri.'#tab-admin'); ?>">
2060 <?php VikBookingIcons::e('user-circle'); ?>
2061 <span><?php echo JText::translate('VBOCREATENEWCUST'); ?></span>
2062 </a>
2063 </span>
2064
2065 <?php
2066 if (isset($adminSidebarForms['customer']))
2067 {
2068 echo $adminSidebarForms['customer'];
2069 }
2070 ?>
2071
2072 </div>
2073 <?php
2074 }
2075 ?>
2076 <div class="vbo-bookingdet-admin-entry">
2077 <label for="newpayment"><?php echo JText::translate('VBPAYMENTMETHOD'); ?></label>
2078 <?php
2079 if (is_array($payment)) {
2080 ?>
2081 <span><?php echo $payment['name']; ?></span>
2082 <?php
2083 }
2084 $chpayment = '';
2085 if (is_array($payments)) {
2086 $chpayment = '<div><select name="newpayment" id="newpayment" onchange="changePayment();"><option value="">'.JText::translate('VBCHANGEPAYLABEL').'</option>';
2087 foreach($payments as $pay) {
2088 $chpayment .= '<option value="'.$pay['id'].'">'.(is_array($payment) && $payment['id'] == $pay['id'] ? ' ::' : '').$pay['name'].'</option>';
2089 }
2090 $chpayment .= '</select></div>';
2091 }
2092 echo $chpayment;
2093 ?>
2094
2095 <!-- Define role to detect the supported hook -->
2096 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderAdministrationSidebar","key":"payment","type":"field"} -->
2097
2098 <?php
2099 if (isset($adminSidebarForms['payment']))
2100 {
2101 echo $adminSidebarForms['payment'];
2102 }
2103 ?>
2104
2105 </div>
2106 <?php
2107 $tn = VikBooking::getTranslator();
2108 $all_langs = $tn->getLanguagesList();
2109 if (count($all_langs) > 1) {
2110 ?>
2111 <div class="vbo-bookingdet-admin-entry">
2112 <label for="newlang"><?php echo JText::translate('VBOBOOKINGLANG'); ?></label>
2113 <select name="newlang" id="newlang" onchange="document.adminForm.submit();">
2114 <?php
2115 foreach ($all_langs as $lk => $lv) {
2116 ?>
2117 <option value="<?php echo $lk; ?>"<?php echo $row['lang'] == $lk ? ' selected="selected"' : ''; ?>><?php echo isset($lv['nativeName']) ? $lv['nativeName'] : $lv['name']; ?></option>
2118 <?php
2119 }
2120 ?>
2121 </select>
2122
2123 <!-- Define role to detect the supported hook -->
2124 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderAdministrationSidebar","key":"language","type":"field"} -->
2125
2126 <?php
2127 if (isset($adminSidebarForms['language']))
2128 {
2129 echo $adminSidebarForms['language'];
2130 }
2131 ?>
2132 </div>
2133 <?php
2134 }
2135 ?>
2136
2137 <!-- Define role to detect the supported hook -->
2138 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderAdministrationSidebar","type":"fieldset"} -->
2139
2140 <?php
2141 foreach ($adminSidebarForms as $legend => $form)
2142 {
2143 if (in_array($legend, ['customer', 'payment', 'language']))
2144 {
2145 // skip default forms
2146 continue;
2147 }
2148 ?>
2149 <div class="vbo-bookingdet-admin-entry">
2150 <h3><?php echo JText::translate($legend); ?></h3>
2151
2152 <?php echo $form; ?>
2153 </div>
2154 <?php
2155 }
2156 ?>
2157
2158 </div>
2159 <div class="vbo-bookingdet-noteslogs">
2160 <?php
2161 $history = $history_obj->loadHistory();
2162 ?>
2163 <div class="vbo-bookingdet-noteslogs-btns">
2164 <div class="vbo-bookingdet-noteslogs-btn vbo-bookingdet-noteslogs-btn-active" data-id="notes">
2165 <a href="javascript: void(0);" id="vbo-trig-notes" onclick="javascript: vbToggleNotes(this);"><?php VikBookingIcons::e('user-lock'); ?> <?php echo JText::translate('VBADMINNOTESTOGGLE'); ?></a>
2166 </div>
2167 <?php
2168 /**
2169 * Initialize chat instance by getting the proper channel name
2170 *
2171 * @since 1.12
2172 */
2173 if (empty($row['channel'])) {
2174 // front-end reservation chat handler
2175 $chat_channel = 'vikbooking';
2176 } else {
2177 $channelparts = explode('_', $row['channel']);
2178 // check if this is a meta search channel
2179 $is_meta_search = false;
2180 if (preg_match("/(customer).*[0-9]$/", $channelparts[0]) || !strcasecmp($channelparts[0], 'googlehotel') || !strcasecmp($channelparts[0], 'trivago')) {
2181 $is_meta_search = empty($row['idorderota']);
2182 }
2183 if ($is_meta_search) {
2184 // customer of type sales channel should use front-end reservation chat handler
2185 $chat_channel = 'vikbooking';
2186 } else {
2187 // let the getInstance method validate the channel chat handler
2188 $chat_channel = $row['channel'];
2189 }
2190 }
2191 $messaging = VikBooking::getVcmChatInstance($row['id'], $chat_channel);
2192 //
2193 if (!$printreceipt && !is_null($messaging)) {
2194 ?>
2195 <div class="vbo-bookingdet-noteslogs-btn" data-id="messaging">
2196 <a name="messaging" href="javascript: void(0);" id="vbo-trig-messaging" onclick="javascript: vbToggleMessaging(this);"><?php VikBookingIcons::e('comment-dots'); ?> <?php echo JText::translate('VBO_GUEST_MESSAGING'); ?></a>
2197 </div>
2198 <?php
2199 }
2200 if (!empty($row['paymentlog'])) {
2201 ?>
2202 <div class="vbo-bookingdet-noteslogs-btn" data-id="paylogs">
2203 <a href="javascript: void(0);" id="vbo-trig-paylogs" onclick="javascript: vbToggleLog(this);"><?php VikBookingIcons::e('credit-card'); ?> <?php echo JText::translate('VBPAYMENTLOGTOGGLE'); ?></a>
2204 <a name="paymentlog" href="javascript: void(0);"></a>
2205 </div>
2206 <?php
2207 }
2208 if (count($history)) {
2209 ?>
2210 <div class="vbo-bookingdet-noteslogs-btn" data-id="history">
2211 <a href="javascript: void(0);" id="vbo-trig-bookhistory" onclick="javascript: vbToggleHistory(this);"><?php VikBookingIcons::e('history'); ?> <?php echo JText::translate('VBOBOOKHISTORYTAB'); ?></a>
2212 </div>
2213 <script type="text/javascript">
2214 if (window.location.hash == '#bookhistory') {
2215 setTimeout(function() {
2216 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
2217 vbToggleHistory(document.getElementById('vbo-trig-bookhistory'));
2218 }, 500);
2219 }
2220 </script>
2221 <?php
2222 }
2223 ?>
2224 <div class="vbo-bookingdet-noteslogs-btn pro-feature" data-id="invnotes">
2225 <a href="javascript: void(0);" class="hasTooltip" id="vbo-trig-invnotes" onclick="javascript: vbToggleInvNotes(this);" title="<?php echo addslashes(JText::translate('VBBOOKINGINVNOTESHELP')); ?>"><?php VikBookingIcons::e('file-invoice'); ?> <?php echo JText::translate('VBBOOKINGINVNOTES'); ?></a>
2226 </div>
2227
2228 <!-- Define role to detect the supported hook -->
2229 <!-- {"rule":"customizer","event":"onDisplayViewVikBookingEditorderAdministration","type":"fieldset"} -->
2230
2231 <?php
2232 foreach ($adminPanelForms as $legend => $form)
2233 {
2234 $legendId = preg_replace("/[^a-zA-Z0-9_\-]+/", '', $legend);
2235 ?>
2236 <div class="vbo-bookingdet-noteslogs-btn" data-id="<?php echo $legendId; ?>">
2237 <a href="javascript: void(0);" class="hasTooltip" id="vbo-trig-<?php echo $legendId; ?>" onclick="javascript: vbToggleDynamicPanel(this, '#vboextrapanel-<?php echo $legendId; ?>');">
2238 <?php
2239 VikBookingIcons::e(!empty($adminFormsSetup->icons[$legend]) ? $adminFormsSetup->icons[$legend] : 'plug');
2240 echo JText::translate($legend);
2241 ?>
2242 </a>
2243 </div>
2244 <?php
2245 }
2246 ?>
2247 </div>
2248 <div class="vbo-bookingdet-noteslogs-cont">
2249 <div id="vbadminnotesdiv" class="vbo-extra-panel" style="display: block;">
2250 <textarea name="adminnotes" class="vbadminnotestarea"><?php echo strip_tags((string)$row['adminnotes']); ?></textarea>
2251 <input type="submit" name="updadmnotes" value="<?php echo JText::translate('VBADMINNOTESUPD'); ?>" class="btn btn-success" />
2252 </div>
2253 <?php
2254 if (count($history)) {
2255 ?>
2256 <div id="vbhistorydiv" class="vbo-extra-panel" style="display: none;">
2257 <div class="vbo-booking-history-container table-responsive">
2258 <table class="table">
2259 <thead>
2260 <tr class="vbo-booking-history-firstrow">
2261 <td class="vbo-booking-history-td-type"><?php echo JText::translate('VBOBOOKHISTORYLBLTYPE'); ?></td>
2262 <td class="vbo-booking-history-td-date"><?php echo JText::translate('VBOBOOKHISTORYLBLDATE'); ?></td>
2263 <td class="vbo-booking-history-td-descr"><?php echo JText::translate('VBOBOOKHISTORYLBLDESC'); ?></td>
2264 <td class="vbo-booking-history-td-totpaid"><?php echo JText::translate('VBOBOOKHISTORYLBLTPAID'); ?></td>
2265 <td class="vbo-booking-history-td-tot"><?php echo JText::translate('VBOBOOKHISTORYLBLTOT'); ?></td>
2266 </tr>
2267 </thead>
2268 <tbody>
2269 <?php
2270 foreach ($history as $hist) {
2271 $hdescr = strpos($hist['descr'], '<') !== false ? $hist['descr'] : nl2br($hist['descr']);
2272 ?>
2273 <tr class="vbo-booking-history-row">
2274 <td><?php echo $history_obj->validType($hist['type'], true); ?></td>
2275 <td><?php echo JHtml::fetch('date', $hist['dt'], 'Y-m-d H:i:s'); ?></td>
2276 <td><?php echo $hdescr; ?></td>
2277 <td><?php echo $currencyname.' '.VikBooking::numberFormat($hist['totpaid']); ?></td>
2278 <td><?php echo $currencyname.' '.VikBooking::numberFormat($hist['total']); ?></td>
2279 </tr>
2280 <?php
2281 }
2282 ?>
2283 </tbody>
2284 </table>
2285 </div>
2286 </div>
2287 <?php
2288 }
2289 ?>
2290 <div id="vbinvnotesdiv" class="vbo-extra-panel" style="display: none;">
2291 <textarea name="invnotes" id="invnotes" class="vbadminnotestarea"><?php echo $row['inv_notes']; ?></textarea>
2292 <input type="submit" name="updinvnotes" value="<?php echo JText::translate('VBADMINNOTESUPD'); ?>" class="btn btn-success" />
2293 <button type="button" class="btn vbo-config-btn btn-secondary pull-right" onclick="document.getElementById('invnotes-hid').value=document.getElementById('invnotes').value;document.getElementById('vbo-gen-invoice').submit();"><?php VikBookingIcons::e('file-invoice'); ?> <?php echo JText::translate('VBOGENBOOKINGINVOICE'); ?></button>
2294 </div>
2295 <?php
2296 if (!empty($row['paymentlog'])) {
2297 ?>
2298 <div id="vbpaymentlogdiv" class="vbo-extra-panel" style="display: none;">
2299 <?php
2300 // PCI Data Retrieval
2301 $cc_acl_denied = false;
2302 if (!empty($row['idorderota']) && !empty($row['channel'])) {
2303 $channel_source = $row['channel'];
2304 if (strpos($row['channel'], '_') !== false) {
2305 $channelparts = explode('_', $row['channel']);
2306 $channel_source = $channelparts[0];
2307 }
2308 $checkout_info = getdate($row['checkout']);
2309
2310 // validate ACL for credit card details
2311 if (!$canDo->authorise('core.admin', 'com_vikchannelmanager')) {
2312 // permissions to access VCM are required
2313 $cc_acl_denied = true;
2314 ?>
2315 <p class="err"><?php echo JText::translate('JERROR_ALERTNOAUTHOR'); ?></p>
2316 <?php
2317 } else {
2318 /**
2319 * Limit for accessing the credit card details has been changed to check-out
2320 * day at 23:59:59 + 10 extra days. It used to be at 23:59:59 on check-out day.
2321 *
2322 * @since 1.13
2323 */
2324 $cardlimit = mktime(23, 59, 59, $checkout_info['mon'], ($checkout_info['mday'] + 10), $checkout_info['year']);
2325 if (time() < $cardlimit) {
2326 $plain_log = htmlspecialchars($row['paymentlog']);
2327 if (stripos($plain_log, 'card number') !== false && strpos($plain_log, '****') !== false) {
2328 // log contains credit card details
2329 // Prepare modal (Credit Card Details)
2330 array_push($vbo_modals_html, $vbo_app->getJmodalHtml('vbo-vcm-pcid', JText::translate('GETFULLCARDDETAILS'), '', 'width: 80%; height: 60%; margin-left: -40%; top: 20% !important;'));
2331 // end Prepare modal
2332 ?>
2333 <div class="vcm-notif-pcidrq-container">
2334 <a class="vcm-pcid-launch" onclick="vboOpenJModal('vbo-vcm-pcid', 'index.php?option=com_vikchannelmanager&task=execpcid&channel_source=<?php echo $channel_source; ?>&otaid=<?php echo $row['idorderota']; ?>&tmpl=component');" href="javascript: void(0);"><?php echo JText::translate('GETFULLCARDDETAILS'); ?></a>
2335 </div>
2336 <?php
2337 }
2338 }
2339 }
2340 } elseif (empty($row['idorderota']) && !empty($row['paymentlog']) && $row['status'] == 'standby') {
2341 ?>
2342 <div class="vbo-eorder-emptyccdata">
2343 <a class="btn btn-warning" href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>&unset_cc=1" onclick="return confirm(Joomla.JText._('VBDELCONFIRM'));"><?php VikBookingIcons::e('broom'); ?> <?php echo JText::translate('VBO_EMPTY_DATA'); ?></a>
2344 </div>
2345 <?php
2346 }
2347
2348 if (!$cc_acl_denied) {
2349 ?>
2350 <pre style="min-height: 100%;"><?php echo htmlspecialchars($row['paymentlog']); ?></pre>
2351 <?php
2352 }
2353 ?>
2354 </div>
2355
2356 <script type="text/javascript">
2357 if (window.location.hash == '#paymentlog') {
2358 setTimeout(function() {
2359 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
2360 vbToggleLog(document.getElementById('vbo-trig-paylogs'));
2361 }, 500);
2362 }
2363 </script>
2364 <?php
2365 }
2366 if (!$printreceipt && !is_null($messaging)) {
2367 ?>
2368 <div id="vbmessagingdiv" class="vbo-extra-panel" style="display: none;">
2369 <?php echo $messaging->renderChat(); ?>
2370 </div>
2371 <script type="text/javascript">
2372 jQuery(function() {
2373 if (window.location.hash == '#messaging') {
2374 setTimeout(function() {
2375 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
2376 vbToggleMessaging(document.getElementById('vbo-trig-messaging'));
2377 }, 100);
2378 }
2379 });
2380 </script>
2381 <?php
2382 }
2383
2384 foreach ($adminPanelForms as $legend => $form)
2385 {
2386 $legendId = preg_replace("/[^a-zA-Z0-9_\-]+/", '', $legend);
2387 ?>
2388 <div class="vbo-extra-panel" id="vboextrapanel-<?php echo $legendId; ?>" style="display: none;">
2389 <?php echo $form; ?>
2390 </div>
2391 <?php
2392 }
2393 ?>
2394 </div>
2395 </div>
2396 </div>
2397 </div>
2398
2399 <input type="hidden" name="task" value="editorder">
2400 <input type="hidden" name="vbo_active_tab" id="vbo_active_tab" value="">
2401 <input type="hidden" name="whereup" value="<?php echo $row['id']; ?>">
2402 <input type="hidden" name="cid[]" value="<?php echo $row['id']; ?>">
2403 <input type="hidden" name="option" value="com_vikbooking">
2404 <?php
2405 $tmpl = VikRequest::getVar('tmpl');
2406 if ($tmpl == 'component') {
2407 echo '<input type="hidden" name="tmpl" value="component" />';
2408 }
2409 $pgoto = VikRequest::getString('goto', '', 'request');
2410 if (in_array($pgoto, ['overv', 'ratesoverv'])) {
2411 echo '<input type="hidden" name="goto" value="' . $pgoto . '" />';
2412 }
2413 ?>
2414 </form>
2415 </div>
2416 <?php
2417 foreach ($vbo_modals_html as $modalhtml) {
2418 echo $modalhtml;
2419 }
2420 ?>
2421 <form action="index.php?option=com_vikbooking&amp;task=orders" method="post" id="vbo-gen-invoice">
2422 <input type="hidden" name="option" value="com_vikbooking" />
2423 <input type="hidden" name="task" value="orders" />
2424 <input type="hidden" name="cid[]" value="<?php echo $row['id']; ?>" />
2425 <input type="hidden" name="invnotes" id="invnotes-hid" value="" />
2426 </form>
2427
2428 <div class="vbo-modal-overlay-block vbo-modal-overlay-block-sms-email">
2429 <a class="vbo-modal-overlay-close" href="javascript: void(0);"></a>
2430 <div class="vbo-modal-overlay-content vbo-modal-overlay-content-large vbo-modal-overlay-content-sms-email">
2431
2432 <div class="vbo-modal-overlay-content-head vbo-modal-overlay-content-sms-email-head">
2433 <h3>
2434 <span></span>
2435 <span class="vbo-modal-overlay-close-times" onclick="vboToggleSendEmail();">&times;</span>
2436 </h3>
2437 </div>
2438
2439 <div class="vbo-modal-overlay-content-body vbo-modal-overlay-content-body-scroll">
2440
2441 <div id="vbo-overlay-sms-cont" style="display: none;">
2442 <h4 style="display: none;"><?php echo JText::translate('VBSENDSMSACTION'); ?>: <span id="smstophone-lbl"><?php echo $row['phone']; ?></span></h4>
2443 <form action="index.php?option=com_vikbooking" method="post" id="vbo-modal-form-sms">
2444 <div class="vbo-calendar-cfield-entry">
2445 <label for="smscont"><?php echo JText::translate('VBSENDSMSCUSTCONT'); ?></label>
2446 <span><textarea name="smscont" id="smscont" style="width: 99%; min-width: 99%;max-width: 99%; height: 120px;"></textarea></span>
2447 </div>
2448 <input type="hidden" name="phone" id="smstophone" value="<?php echo $row['phone']; ?>" />
2449 <input type="hidden" name="goto" value="<?php echo urlencode('index.php?option=com_vikbooking&task=editorder&cid[]='.$row['id']); ?>" />
2450 <input type="hidden" name="task" value="sendcustomsms" />
2451 </form>
2452 </div>
2453
2454 <div id="vbo-overlay-email-cont" style="display: none;">
2455 <h4 style="display: none;"><?php echo JText::translate('VBSENDEMAILACTION'); ?>: <span id="emailto-lbl"><?php echo $row['custmail']; ?></span></h4>
2456 <form action="index.php?option=com_vikbooking" method="post" enctype="multipart/form-data" id="vbo-modal-form-email">
2457 <input type="hidden" name="bid" value="<?php echo $row['id']; ?>" />
2458 <?php
2459 $cur_emtpl = array();
2460 $q = "SELECT `setting` FROM `#__vikbooking_config` WHERE `param`='customemailtpls';";
2461 $dbo->setQuery($q);
2462 $dbo->execute();
2463 if ($dbo->getNumRows() > 0) {
2464 $cur_emtpl = $dbo->loadResult();
2465 $cur_emtpl = empty($cur_emtpl) ? array() : json_decode($cur_emtpl, true);
2466 $cur_emtpl = is_array($cur_emtpl) ? $cur_emtpl : array();
2467 }
2468 if (count($cur_emtpl) > 0) {
2469 ?>
2470 <div class="vbo-calendar-custmail-tpls-wrap">
2471 <select id="emtpl-customemail" onchange="vboLoadEmailTpl(this.value);">
2472 <option value=""><?php echo JText::translate('VBEMAILCUSTFROMTPL'); ?></option>
2473 <?php
2474 foreach ($cur_emtpl as $emk => $emv) {
2475 ?>
2476 <optgroup label="<?php echo $emv['emailsubj']; ?>">
2477 <option value="<?php echo $emk; ?>"><?php echo JText::translate('VBEMAILCUSTFROMTPLUSE'); ?></option>
2478 <option value="rm<?php echo $emk; ?>"><?php echo JText::translate('VBEMAILCUSTFROMTPLRM'); ?></option>
2479 </optgroup>
2480 <?php
2481 }
2482 ?>
2483 </select>
2484 </div>
2485 <?php
2486 }
2487
2488 /**
2489 * Load all conditional text special tags.
2490 *
2491 * @since 1.14 (J) - 1.4.0 (WP)
2492 */
2493 $extra_btns = array();
2494 $condtext_tags = VikBooking::getConditionalRulesInstance()->getSpecialTags();
2495 if (count($condtext_tags)) {
2496 $condtext_tags = array_keys($condtext_tags);
2497 foreach ($condtext_tags as $tag) {
2498 array_push($extra_btns, '<button type="button" class="btn btn-secondary btn-small vbo-condtext-specialtag-btn" onclick="setSpecialTplTag(\'emailcont\', \'' . $tag . '\');">' . $tag . '</button>');
2499 }
2500 }
2501 //
2502 ?>
2503 <div class="vbo-calendar-cfields-wrap">
2504 <div class="vbo-calendar-cfield-entry">
2505 <label for="emailsubj"><?php echo JText::translate('VBSENDEMAILCUSTSUBJ'); ?></label>
2506 <span><input type="text" name="emailsubj" id="emailsubj" value="" size="30" /></span>
2507 </div>
2508 <div class="vbo-calendar-cfield-entry">
2509 <label for="emailcont"><?php echo JText::translate('VBSENDEMAILCUSTCONT'); ?></label>
2510 <?php
2511 $special_tags_base = array(
2512 '{customer_name}',
2513 '{booking_id}',
2514 '{checkin_date}',
2515 '{checkout_date}',
2516 '{num_nights}',
2517 '{rooms_booked}',
2518 '{rooms_names}',
2519 '{tot_adults}',
2520 '{tot_children}',
2521 '{tot_guests}',
2522 '{total}',
2523 '{total_paid}',
2524 '{remaining_balance}',
2525 '{booking_link}',
2526 );
2527
2528 $special_tags_base_html = '';
2529 foreach ($special_tags_base as $sp_tag) {
2530 $special_tags_base_html .= '<button type="button" class="btn btn-secondary btn-small" onclick="setSpecialTplTag(\'emailcont\', \'' . $sp_tag . '\');">' . $sp_tag . '</button>' . "\n";
2531 }
2532
2533 /**
2534 * Use the rich text editor (visual editor) to build custom email messages.
2535 *
2536 * @since 1.15.0 (J) - 1.5.0 (WP)
2537 */
2538 $tarea_attr = array(
2539 'id' => 'emailcont',
2540 'rows' => '7',
2541 'cols' => '170',
2542 'style' => 'width: 99%; min-width: 99%; max-width: 99%; height: 120px; margin-bottom: 1px;',
2543 );
2544 $editor_opts = array(
2545 'modes' => array(
2546 'text',
2547 'visual',
2548 ),
2549 );
2550 $editor_btns = $special_tags_base;
2551 if (count($condtext_tags)) {
2552 $editor_btns = array_merge($editor_btns, $condtext_tags);
2553 }
2554 echo $vbo_app->renderVisualEditor('emailcont', '', $tarea_attr, $editor_opts, $editor_btns);
2555 ?>
2556 <div class="btn-group pull-left vbo-smstpl-bgroup vbo-custmail-bgroup vik-contentbuilder-textmode-sptags">
2557 <?php echo $special_tags_base_html . "\n" . implode("\n", $extra_btns); ?>
2558 </div>
2559 </div>
2560 <div class="vbo-calendar-cfield-entry">
2561 <label for="emailattch"><?php echo JText::translate('VBSENDEMAILCUSTATTCH'); ?></label>
2562 <span><input type="file" name="emailattch" id="emailattch" /></span>
2563 </div>
2564 <div class="vbo-calendar-cfield-entry">
2565 <label for="emailfrom"><?php echo JText::translate('VBSENDEMAILCUSTFROM'); ?></label>
2566 <span><input type="text" name="emailfrom" id="emailfrom" value="<?php echo VikBooking::getSenderMail(); ?>" size="30" /></span>
2567 </div>
2568 </div>
2569 <input type="hidden" name="email" id="emailto" value="<?php echo $row['custmail']; ?>" />
2570 <input type="hidden" name="goto" value="<?php echo urlencode('index.php?option=com_vikbooking&task=editorder&cid[]='.$row['id']); ?>" />
2571 <input type="hidden" name="task" value="sendcustomemail" />
2572 </form>
2573 </div>
2574
2575 </div>
2576
2577 <div class="vbo-modal-overlay-content-footer">
2578 <div class="vbo-modal-overlay-content-footer-right">
2579 <div id="vbo-modal-footer-sms" style="display: none;">
2580 <button type="submit" class="btn vbo-config-btn" onclick="document.getElementById('vbo-modal-form-sms').submit();"><?php VikBookingIcons::e('comment'); ?> <?php echo JText::translate('VBSENDSMSACTION'); ?></button>
2581 </div>
2582 <div id="vbo-modal-footer-email" style="display: none;">
2583 <button type="submit" class="btn vbo-config-btn" onclick="document.getElementById('vbo-modal-form-email').submit();"><?php VikBookingIcons::e('envelope'); ?> <?php echo JText::translate('VBSENDEMAILACTION'); ?></button>
2584 </div>
2585 </div>
2586 </div>
2587
2588 </div>
2589 </div>
2590
2591 <script type="text/javascript">
2592 var vbo_overlay_on = false;
2593 var vbo_print_only = false;
2594 if (jQuery.isFunction(jQuery.fn.tooltip)) {
2595 jQuery(".hasTooltip").tooltip();
2596 }
2597 function vboToggleSendSMS() {
2598 var cur_phone = jQuery("#smstophone").val();
2599 var phone_set = jQuery("#custphone").trigger('vboupdatephonenumber').val();
2600 if (phone_set.length && phone_set != cur_phone) {
2601 jQuery("#smstophone").val(phone_set);
2602 jQuery("#smstophone-lbl").text(phone_set);
2603 }
2604
2605 // toggle email/sms contents
2606 jQuery("#vbo-overlay-email-cont, #vbo-modal-footer-email").hide();
2607 jQuery("#vbo-overlay-sms-cont, #vbo-modal-footer-sms").show();
2608 var use_modal_title = jQuery("#vbo-overlay-sms-cont").find('h4').first().html();
2609 jQuery('.vbo-modal-overlay-content-sms-email-head').find('h3').find('span').first().html(use_modal_title);
2610
2611 jQuery(".vbo-modal-overlay-block-sms-email").fadeToggle(400, function() {
2612 if (jQuery(".vbo-modal-overlay-block-sms-email").is(":visible")) {
2613 vbo_overlay_on = true;
2614 } else {
2615 vbo_overlay_on = false;
2616 }
2617 });
2618 }
2619 function vboToggleSendEmail() {
2620 var cur_email = jQuery("#emailto").val();
2621 var email_set = jQuery("#custmail").val();
2622 if (email_set.length && email_set != cur_email) {
2623 jQuery("#emailto").val(email_set);
2624 jQuery("#emailto-lbl").text(email_set);
2625 }
2626
2627 // toggle email/sms contents
2628 jQuery("#vbo-overlay-sms-cont, #vbo-modal-footer-sms").hide();
2629 jQuery("#vbo-overlay-email-cont, #vbo-modal-footer-email").show();
2630 var use_modal_title = jQuery("#vbo-overlay-email-cont").find('h4').first().html();
2631 jQuery('.vbo-modal-overlay-content-sms-email-head').find('h3').find('span').first().html(use_modal_title);
2632
2633 jQuery(".vbo-modal-overlay-block-sms-email").fadeToggle(400, function() {
2634 if (jQuery(".vbo-modal-overlay-block-sms-email").is(":visible")) {
2635 vbo_overlay_on = true;
2636 } else {
2637 vbo_overlay_on = false;
2638 }
2639 });
2640 }
2641 function vboKeyupEmail(event) {
2642 if (event.key && event.key == 'Enter') {
2643 event.preventDefault();
2644 document.adminForm.submit();
2645 return;
2646 }
2647 jQuery('.vbo-bookingdet-save-email').show();
2648 }
2649 function setSpecialTplTag(taid, tpltag) {
2650 var tplobj = document.getElementById(taid);
2651 if (tplobj != null) {
2652 var start = tplobj.selectionStart;
2653 var end = tplobj.selectionEnd;
2654 tplobj.value = tplobj.value.substring(0, start) + tpltag + tplobj.value.substring(end);
2655 tplobj.selectionStart = tplobj.selectionEnd = start + tpltag.length;
2656 tplobj.focus();
2657 }
2658 }
2659 jQuery(function() {
2660 // register to the event emitted when a new payment is made through the virtual terminal widget
2661 document.addEventListener('vbo_new_payment_transaction', (e) => {
2662 if (!e || !e.detail || !e.detail.hasOwnProperty('tn') || !e.detail['tn']) {
2663 // do nothing
2664 return;
2665 }
2666 // reload the page to display the updated information
2667 location.reload();
2668 });
2669 // sessionStorage for current tab
2670 if (typeof sessionStorage !== 'undefined' && !window.location.hash && <?php echo $printreceipt ? 'false' : 'true'; ?>) {
2671 var curtab = sessionStorage.getItem('vboEditOrderTab<?php echo $row['id']; ?>');
2672
2673 setTimeout(() => {
2674 let link = jQuery('.vbo-bookingdet-noteslogs-btn[data-id="' + curtab + '"] a');
2675
2676 if (link.length) {
2677 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
2678 link.trigger('click');
2679 }
2680 }, 128);
2681 }
2682 if (window.location.hash == '#tab-admin') {
2683 setTimeout(function() {
2684 jQuery(".vbo-bookingdet-tab[data-vbotab='vbo-tab-admin']").trigger('click');
2685 }, 100);
2686 }
2687 // Search customer - Start
2688 var vbocustsdelay = (function() {
2689 var timer = 0;
2690 return function(callback, ms) {
2691 clearTimeout(timer);
2692 timer = setTimeout(callback, ms);
2693 };
2694 })();
2695 function vboCustomerSearch(words) {
2696 jQuery("#vbo-searchcust-res").hide().html("");
2697 jQuery("#vbo-searchcust-loading").show();
2698 var jqxhr = jQuery.ajax({
2699 type: "POST",
2700 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=searchcustomer'); ?>",
2701 data: {
2702 kw: words,
2703 tmpl: "component"
2704 }
2705 }).done(function(cont) {
2706 if (cont) {
2707 var obj_res = typeof cont === 'string' ? JSON.parse(cont) : cont;
2708 customers_search_vals = obj_res[0];
2709 jQuery("#vbo-searchcust-res").html(obj_res[1]);
2710 } else {
2711 customers_search_vals = "";
2712 jQuery("#vbo-searchcust-res").html("----");
2713 }
2714 jQuery("#vbo-searchcust-res").show();
2715 jQuery("#vbo-searchcust-loading").hide();
2716 }).fail(function() {
2717 jQuery("#vbo-searchcust-loading").hide();
2718 alert("Error Searching.");
2719 });
2720 }
2721 jQuery("#vbo-searchcust").keyup(function(event) {
2722 vbocustsdelay(function() {
2723 var keywords = jQuery("#vbo-searchcust").val();
2724 var chars = keywords.length;
2725 if (chars > 1) {
2726 if ((event.which > 96 && event.which < 123) || (event.which > 64 && event.which < 91) || event.which == 13) {
2727 vboCustomerSearch(keywords);
2728 }
2729 } else {
2730 if (jQuery("#vbo-searchcust-res").is(":visible")) {
2731 jQuery("#vbo-searchcust-res").hide();
2732 }
2733 }
2734 }, 600);
2735 });
2736 jQuery("body").on("click", ".vbo-custsearchres-entry", function() {
2737 var custid = jQuery(this).attr("data-custid");
2738 if (confirm('<?php echo addslashes(JText::translate('VBOASSIGNNEWCUSTCONF')); ?>')) {
2739 jQuery('#newcustid').val(custid);
2740 document.adminForm.submit();
2741 return;
2742 }
2743 });
2744 // Search customer - End
2745 jQuery(document).mouseup(function(e) {
2746 if (!vbo_overlay_on) {
2747 return false;
2748 }
2749 var vbo_overlay_cont = jQuery(".vbo-modal-overlay-content-sms-email");
2750 if (!vbo_overlay_cont.is(e.target) && vbo_overlay_cont.has(e.target).length === 0 && !jQuery(e.target).is('svg')) {
2751 jQuery(".vbo-modal-overlay-block-sms-email").fadeOut();
2752 vbo_overlay_on = false;
2753 }
2754 });
2755 jQuery(document).keyup(function(e) {
2756 if (e.keyCode == 27 && vbo_overlay_on) {
2757 jQuery(".vbo-modal-overlay-block-sms-email").fadeOut();
2758 vbo_overlay_on = false;
2759 }
2760 });
2761 jQuery(".vbo-bookingdet-tab").click(function() {
2762 var newtabrel = jQuery(this).attr('data-vbotab');
2763 var oldtabrel = jQuery(".vbo-bookingdet-tab-active").attr('data-vbotab');
2764 if (newtabrel == oldtabrel) {
2765 return;
2766 }
2767 if (newtabrel == 'vbo-tab-details' && typeof sessionStorage !== 'undefined') {
2768 sessionStorage.setItem('vboEditOrderTab<?php echo $row['id']; ?>', 'details');
2769 }
2770 jQuery(".vbo-bookingdet-tab").removeClass("vbo-bookingdet-tab-active");
2771 jQuery(this).addClass("vbo-bookingdet-tab-active");
2772 jQuery("#"+oldtabrel).hide();
2773 jQuery("#"+newtabrel).fadeIn();
2774 jQuery("#vbo_active_tab").val(newtabrel);
2775 });
2776 jQuery(".vbo-bookingdet-tab[data-vbotab='<?php echo $pactive_tab; ?>']").trigger('click');
2777 // edit amount paid
2778 jQuery('#vbo-amountpaid-edit').click(function() {
2779 jQuery('#vbo-amountpaid-cont').hide();
2780 jQuery('#vbo-amountpaid-modcont').show();
2781 jQuery('input[name="newamountpaid"]').prop('disabled', false);
2782 if (jQuery('input[name="newamountrefunded"]').length) {
2783 jQuery('input[name="newamountrefunded"]').val('');
2784 }
2785 });
2786 jQuery('#vbo-amountpaid-cancedit').click(function() {
2787 jQuery('#vbo-amountpaid-modcont').hide();
2788 jQuery('#vbo-amountpaid-cont').show();
2789 });
2790 // edit amount refunded
2791 jQuery('#vbo-amountrefunded-edit').click(function() {
2792 jQuery('#vbo-amountrefunded-cont').hide();
2793 jQuery('#vbo-amountrefunded-modcont').show();
2794 jQuery('input[name="newamountrefunded"]').prop('disabled', false);
2795 if (jQuery('input[name="newamountpaid"]').length) {
2796 jQuery('input[name="newamountpaid"]').val('');
2797 }
2798 });
2799 jQuery('#vbo-amountrefunded-cancedit').click(function() {
2800 jQuery('#vbo-amountrefunded-modcont').hide();
2801 jQuery('#vbo-amountrefunded-cont').show();
2802 });
2803 // edit amount payable
2804 jQuery('#vbo-amountpayable-edit').click(function() {
2805 jQuery('#vbo-amountpayable-cont').hide();
2806 jQuery('#vbo-amountpayable-modcont').show();
2807 jQuery('input[name="newamountpayable"]').prop('disabled', false);
2808 });
2809 jQuery('#vbo-amountpayable-cancedit').click(function() {
2810 jQuery('#vbo-amountpayable-modcont').hide();
2811 jQuery('#vbo-amountpayable-cont').show();
2812 });
2813 // edit cancellation fee
2814 jQuery('#vbo-cancfee-edit').click(function() {
2815 jQuery('#vbo-cancfee-cont').hide();
2816 jQuery('#vbo-cancfee-modcont').show();
2817 jQuery('input[name="newcancfee"]').prop('disabled', false);
2818 });
2819 jQuery('#vbo-cancfee-cancedit').click(function() {
2820 jQuery('#vbo-cancfee-modcont').hide();
2821 jQuery('#vbo-cancfee-cont').show();
2822 });
2823 // chat listener
2824 if (typeof VCMChat !== 'undefined') {
2825 jQuery(window).on('chatsync', function(e) {
2826 if (!jQuery("#vcm-chat-audio-notification").length) {
2827 jQuery("body").append("<audio id=\"vcm-audio-notification\" preload=\"auto\"><source type=\"audio/mp3\" src=\"<?php echo VCM_ADMIN_URI; ?>assets/css/audio/new_chat_message.mp3\"></source></audio>");
2828 }
2829 try {
2830 var promise = document.getElementById('vcm-audio-notification').play();
2831 console.log(promise);
2832 } catch (err) {
2833 console.warn('Could not play sound', err);
2834 }
2835 });
2836 }
2837
2838 // zoom-able avatars
2839 jQuery('.vbo-customer-info-box-avatar').each(function() {
2840 var img = jQuery(this).find('img');
2841 if (!img.length) {
2842 return;
2843 }
2844 // register click listener
2845 img.on('click', function(e) {
2846 // stop events propagation
2847 e.preventDefault();
2848 e.stopPropagation();
2849
2850 // check for caption
2851 var caption = jQuery(this).attr('data-caption');
2852
2853 // build modal content
2854 var zoom_modal = jQuery('<div></div>').addClass('vbo-modal-overlay-block vbo-modal-overlay-zoom-image').css('display', 'block');
2855 var zoom_dismiss = jQuery('<a></a>').addClass('vbo-modal-overlay-close');
2856 zoom_dismiss.on('click', function() {
2857 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
2858 });
2859 zoom_modal.append(zoom_dismiss);
2860 var zoom_content = jQuery('<div></div>').addClass('vbo-modal-overlay-content vbo-modal-overlay-content-zoom-image');
2861 var zoom_head = jQuery('<div></div>').addClass('vbo-modal-overlay-content-head');
2862 var zoom_head_title = jQuery('<span></span>');
2863 if (caption) {
2864 zoom_head_title.text(caption);
2865 }
2866 var zoom_head_close = jQuery('<span></span>').addClass('vbo-modal-overlay-close-times').html('&times;');
2867 zoom_head_close.on('click', function() {
2868 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
2869 });
2870 zoom_head.append(zoom_head_title).append(zoom_head_close);
2871 var zoom_body = jQuery('<div></div>').addClass('vbo-modal-overlay-content-body vbo-modal-overlay-content-body-scroll');
2872 var zoom_image = jQuery('<div></div>').addClass('vbo-modal-zoom-image-wrap');
2873 zoom_image.append(jQuery(this).clone());
2874 zoom_body.append(zoom_image);
2875 zoom_content.append(zoom_head).append(zoom_body);
2876 zoom_modal.append(zoom_content);
2877 // append modal to body
2878 if (jQuery('.vbo-modal-overlay-zoom-image').length) {
2879 jQuery('.vbo-modal-overlay-zoom-image').remove();
2880 }
2881 jQuery('body').append(zoom_modal);
2882 });
2883 });
2884
2885 });
2886 var cur_emtpl = <?php echo json_encode($cur_emtpl); ?>;
2887 function vboLoadEmailTpl(tplind) {
2888 if (!(tplind.length > 0)) {
2889 jQuery('#emailsubj').val('');
2890 jQuery('#emailcont').val('').trigger('change');
2891 return true;
2892 }
2893 if (tplind.substr(0, 2) == 'rm') {
2894 if (confirm(Joomla.JText._('VBDELCONFIRM'))) {
2895 document.location.href = 'index.php?option=com_vikbooking&task=rmcustomemailtpl&cid[]=<?php echo $row['id']; ?>&tplind='+tplind.substr(2);
2896 }
2897 return false;
2898 }
2899 if (!cur_emtpl.hasOwnProperty(tplind)) {
2900 jQuery('#emailsubj').val('');
2901 jQuery('#emailcont').val('').trigger('change');
2902 return true;
2903 }
2904 jQuery('#emailsubj').val(cur_emtpl[tplind]['emailsubj']);
2905 jQuery('#emailcont').val(cur_emtpl[tplind]['emailcont']).trigger('change');
2906 jQuery('#emailfrom').val(cur_emtpl[tplind]['emailfrom']);
2907 return true;
2908 }
2909 <?php
2910 $pcustomemail = VikRequest::getInt('customemail', '', 'request');
2911 if ($pcustomemail > 0) {
2912 ?>
2913 vboToggleSendEmail();
2914 <?php
2915 }
2916 if ($printreceipt) {
2917 ?>
2918 jQuery(function() {
2919 jQuery('button, .vbo-bookingdet-innertop').hide();
2920 jQuery('body').find('a').each(function(k, v) {
2921 jQuery(this).replaceWith(jQuery(this).html());
2922 });
2923 jQuery('body').find("input[type='text']").each(function(k, v) {
2924 jQuery(this).replaceWith(jQuery(this).val());
2925 });
2926 });
2927 function vboMakePrintOnly() {
2928 vbo_print_only = true;
2929 jQuery(".vbo-receipt-numdate-block").remove();
2930 jQuery("#vbo-receipt-print-btn-name").text("<?php echo addslashes(JText::translate('VBOPRINT')); ?>");
2931 }
2932 function vboLaunchPrintReceipt() {
2933 var rcnotes = jQuery('#vbo-receipt-notes').val();
2934 var rnewnum = jQuery('#vbo-receipt-num-inp').val();
2935 if (rcnotes.length) {
2936 if (rcnotes.indexOf('<') < 0) {
2937 rcnotes = rcnotes.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br />$2');
2938 }
2939 jQuery('#vbo-receipt-notes-val').html(rcnotes);
2940 } else {
2941 jQuery('.vbo-receipt-notes-container').remove();
2942 }
2943 if (vbo_print_only === true) {
2944 window.print();
2945 return;
2946 }
2947 jQuery.ajax({
2948 type: "POST",
2949 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=updatereceiptnum'); ?>",
2950 data: {
2951 newnum: rnewnum,
2952 newnotes: rcnotes,
2953 oid: "<?php echo $row['id']; ?>"
2954 }
2955 }).done(function(res) {
2956 window.print();
2957 }).fail(function() {
2958 alert('Could not update the next receipt number.')
2959 window.print();
2960 });
2961 }
2962 <?php
2963 }
2964 ?>
2965 </script>
2966