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

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