PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.8
VikBooking Hotel Booking Engine & PMS v1.6.8
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.8, at admin/views/editorder/tmpl/default.php

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