PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.7
VikBooking Hotel Booking Engine & PMS v1.8.7
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 / orders / tmpl / default.php

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

1,330 lines 55.6 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 $rows = $this->rows;
14 $allrooms = $this->allrooms;
15 $lim0 = $this->lim0;
16 $navbut = $this->navbut;
17 $orderby = $this->orderby;
18 $ordersort = $this->ordersort;
19
20 // list of IDs for which VCM should monitor the guest messages in the chat
21 $vcm_bids = array();
22
23 $dbo = JFactory::getDbo();
24 $app = JFactory::getApplication();
25
26 $vbo_app = VikBooking::getVboApplication();
27 $vbo_app->loadDatePicker();
28 $vbo_app->loadContextMenuAssets();
29
30 // JS lang def
31 JText::script('VBOGENINVOICES');
32 JText::script('VBCONFIRMGENINV');
33 JText::script('VBADMINNOTESTOGGLE');
34 JText::script('VBDASHUPRESONE');
35 JText::script('VBOCHANNEL');
36 JText::script('VBCOUPON');
37 JText::script('VBCUSTOMERNOMINATIVE');
38
39 $nowdf = VikBooking::getDateFormat(true);
40 if ($nowdf == "%d/%m/%Y") {
41 $df = 'd/m/Y';
42 } elseif ($nowdf == "%m/%d/%Y") {
43 $df = 'm/d/Y';
44 } else {
45 $df = 'Y/m/d';
46 }
47 $datesep = VikBooking::getDateSeparator(true);
48 $juidf = $nowdf == "%d/%m/%Y" ? 'dd/mm/yy' : ($nowdf == "%m/%d/%Y" ? 'mm/dd/yy' : 'yy/mm/dd');
49
50 $cid = VikRequest::getVar('cid', array());
51 $pcust_id = $app->getUserStateFromRequest("vbo.orders.cust_id", 'cust_id', 0, 'int');
52 $pconfirmnumber = VikRequest::getString('confirmnumber', '', 'request');
53 //Color tags
54 $colortags = VikBooking::loadBookingsColorTags();
55 $bctags_tip = '';
56 if (count($colortags) > 0) {
57 $bctags_tip = '<div class=\"vbo-blist-tip-bctag-subtip-inner\">';
58 foreach ($colortags as $ctagk => $ctagv) {
59 $bctags_tip .= '<div class=\"vbo-blist-tip-bctag-subtip-circle hasTooltip\" data-ctagkey=\"'.$ctagk.'\" data-ctagcolor=\"'.$ctagv['color'].'\" title=\"'.addslashes(JText::translate($ctagv['name'])).'\"><div class=\"vbo-blist-tip-bctag-subtip-circlecont\" style=\"background-color: '.$ctagv['color'].';\"></div></div>';
60 }
61 $bctags_tip .= '</div>';
62 }
63 //
64
65 if (empty($rows)) {
66 $rows = array();
67 ?>
68 <p class="warn"><?php echo JText::translate('VBNOORDERSFOUND'); ?></p>
69 <?php
70 if (VBOPlatformDetection::isWordPress()) {
71 /**
72 * In case of no bookings found, we check whether bookings can be imported from third party plugins.
73 *
74 * @wponly we do this only on WP.
75 *
76 * @since 1.3.5
77 */
78 $supported_plugins = VikBooking::canImportBookingsFromThirdPartyPlugins();
79 if ($supported_plugins !== false) {
80 $tpp_key = '';
81 foreach ($supported_plugins as $spkey => $spn) {
82 $tpp_key = $spkey;
83 break;
84 }
85 ?>
86 <div class="notice is-dismissible notice-info">
87 <div class="vbo-import-wrap">
88 <p>
89 <span><?php echo JText::sprintf('VBO_IMPBFROM_INTO_VBO', (isset($supported_plugins[$tpp_key]) ? $supported_plugins[$tpp_key] : '')); ?></span>
90 <a class="btn btn-success" href="admin.php?option=com_vikbooking&view=importbftpp"><?php echo JText::translate('VBO_IMPBFTPP_DOIMPORT_SHORT'); ?></a>
91 </p>
92 </div>
93 </div>
94 <?php
95 }
96 }
97 }
98
99 // filter by channel
100 $all_channels = array();
101 $q = "SELECT `channel` FROM `#__vikbooking_orders` WHERE `channel` IS NOT NULL GROUP BY `channel`;";
102 $dbo->setQuery($q);
103 $ord_channels = $dbo->loadAssocList();
104 if ($ord_channels) {
105 foreach ($ord_channels as $o_channel) {
106 $channel_parts = explode('_', $o_channel['channel']);
107 $channel_name = count($channel_parts) > 1 ? trim($channel_parts[1]) : trim($channel_parts[0]);
108 if (in_array($channel_name, $all_channels)) {
109 continue;
110 }
111 $all_channels[] = $channel_name;
112 }
113 }
114
115 // prepare modal
116 echo $vbo_app->getJmodalScript();
117 echo $vbo_app->getJmodalHtml('vbo-export-csv', JText::translate('VBCSVEXPORT'), '', 'width: 80%; height: 60%; margin-left: -40%; top: 20% !important;');
118 echo $vbo_app->getJmodalHtml('vbo-export-ics', JText::translate('VBICSEXPORT'), '', 'width: 80%; height: 60%; margin-left: -40%; top: 20% !important;');
119
120 $filters_set = false;
121
122 ?>
123
124 <script type="text/javascript">
125 function vboClearFilters() {
126 jQuery('#filter-bar, #vbo-search-tools-cont').find('input, select').val('');
127 jQuery('#adminForm').append('<input type=\'hidden\' name=\'limitstart\' value=\'0\' />');
128 document.getElementById('cust_id').value = '';
129 document.adminForm.submit();
130 }
131
132 function vboKeyupSearch(event) {
133 if (event && event.key && event.key == 'Enter') {
134 event.preventDefault();
135 document.adminForm.submit();
136 return;
137 }
138 }
139
140 function vboHandleSearchType(search_hint) {
141 if (!search_hint) {
142 search_hint = '';
143 } else {
144 search_hint += ': ';
145 }
146 jQuery('#confirmnumber').val(search_hint).focus();
147 }
148
149 jQuery(function() {
150
151 // register context menu
152 jQuery('.vbo-context-menu-searchtype').vboContextMenu({
153 placement: 'bottom-left',
154 buttons: [
155 {
156 icon: '<?php echo VikBookingIcons::i('search'); ?>',
157 text: Joomla.JText._('VBDASHUPRESONE'),
158 separator: false,
159 action: (root, config) => {
160 vboHandleSearchType('id');
161 },
162 },
163 {
164 icon: '<?php echo VikBookingIcons::i('search'); ?>',
165 text: Joomla.JText._('VBDASHUPRESONE') + ' (' + Joomla.JText._('VBOCHANNEL') + ')',
166 separator: false,
167 action: (root, config) => {
168 vboHandleSearchType('otaid');
169 },
170 },
171 {
172 icon: '<?php echo VikBookingIcons::i('user-tag'); ?>',
173 text: Joomla.JText._('VBCOUPON'),
174 separator: false,
175 action: (root, config) => {
176 vboHandleSearchType('coupon');
177 },
178 },
179 {
180 icon: '<?php echo VikBookingIcons::i('user'); ?>',
181 text: Joomla.JText._('VBCUSTOMERNOMINATIVE'),
182 separator: false,
183 action: (root, config) => {
184 vboHandleSearchType('name');
185 },
186 },
187 ],
188 });
189
190 // register to the event emitted when a booking is modified through an admin widget
191 document.addEventListener('vbo_booking_modified', (e) => {
192 if (!e || !e.detail || !e.detail.hasOwnProperty('bid') || !e.detail['bid']) {
193 // do nothing
194 return;
195 }
196 // reload the page to display the new information about the booking just modified
197 location.reload();
198 });
199
200 });
201 </script>
202
203 <form action="index.php?option=com_vikbooking" method="post" name="adminForm" id="adminForm" class="vbo-allbookings-fm">
204
205 <div id="filter-bar" class="btn-toolbar vbo-btn-toolbar" style="width: 100%; display: inline-block;">
206 <div class="btn-group pull-right">
207 <a href="javascript: void(0);" onclick="vboOpenJModal('vbo-export-csv', 'index.php?option=com_vikbooking&task=csvexportprepare&tmpl=component');" class="vbcsvexport"><?php VikBookingIcons::e('table'); ?> <span><?php echo JText::translate('VBCSVEXPORT'); ?></span></a>
208 <a href="javascript: void(0);" onclick="vboOpenJModal('vbo-export-ics', 'index.php?option=com_vikbooking&task=icsexportprepare&tmpl=component');" class="vbicsexport"><?php VikBookingIcons::e('calendar'); ?> <span><?php echo JText::translate('VBICSEXPORT'); ?></span></a>
209 </div>
210 <div class="btn-group pull-left input-append">
211 <button type="button" class="btn btn-secondary vbo-context-menu-btn vbo-context-menu-searchtype">
212 <span class="vbo-context-menu-ico"><?php VikBookingIcons::e('sort-down'); ?></span>
213 </button>
214 <input type="text" name="confirmnumber" id="confirmnumber" autocomplete="off" placeholder="<?php echo JHtml::fetch('esc_attr', JText::translate('VBOFILTCONFNUMCUST')); ?>" value="<?php echo strlen($pconfirmnumber) ? JHtml::fetch('esc_attr', $pconfirmnumber) : ''; ?>" onkeyup="vboKeyupSearch(event);" size="30" />
215 <button type="submit" class="btn"><i class="icon-search"></i></button>
216 </div>
217 <?php
218 $cust_id_filter = false;
219 if (is_array($rows) && isset($rows[0]) && array_key_exists('customer_fullname', $rows[0])) {
220 //customer ID filter
221 $cust_id_filter = true;
222 }
223 ?>
224 <div class="btn-group pull-left input-append">
225 <a style="display: none;" id="vbo-unset-cust-filter" href="index.php?option=com_vikbooking&task=orders&cust_id=0"></a>
226 <div id="vbo-allbsearchcust-res" class="vbo-allbsearchcust-res" style="display: none;"></div>
227 <input type="text" id="customernominative" autocomplete="off" placeholder="<?php echo JText::translate('VBCUSTOMERNOMINATIVE'); ?>" value="<?php echo $cust_id_filter ? htmlspecialchars($rows[0]['customer_fullname']) : ''; ?>" size="30" />
228 <button type="button" class="btn" onclick="<?php echo $cust_id_filter ? 'document.location.href=jQuery(\'#vbo-unset-cust-filter\').attr(\'href\');' : 'document.getElementById(\'customernominative\').focus();'; ?>"><i class="<?php echo $cust_id_filter ? 'icon-remove' : 'icon-user'; ?>"></i></button>
229 </div>
230 <div class="btn-group pull-left">
231 <button type="button" class="btn" id="vbo-search-tools-btn" onclick="if(jQuery(this).hasClass('btn-primary')){jQuery('#vbo-search-tools-cont').hide();jQuery(this).removeClass('btn-primary');}else{jQuery('#vbo-search-tools-cont').show();jQuery(this).addClass('btn-primary');}"><?php echo JText::translate('JSEARCH_TOOLS'); ?> <span class="caret"></span></button>
232 </div>
233 <div class="btn-group pull-left">
234 <button type="button" class="btn" onclick="vboClearFilters();"><?php echo JText::translate('JSEARCH_FILTER_CLEAR'); ?></button>
235 </div>
236
237 <div id="vbo-search-tools-cont" class="js-stools-container-filters clearfix" style="display: none;">
238 <div class="btn-group pull-left">
239 <select name="channel">
240 <option value=""><?php echo JText::translate('VBCHANNELFILTER'); ?></option>
241 <?php
242 $pchannel = $app->getUserStateFromRequest("vbo.orders.channel", 'channel', '', 'string');
243 if (count($all_channels) > 0) {
244 $filters_set = !empty($pchannel) || $filters_set;
245 ?>
246 <option value="-1"<?php echo $pchannel == '-1' ? ' selected="selected"' : ''; ?>>- <?php echo JText::translate('VBORDFROMSITE'); ?></option>
247 <?php
248 foreach ($all_channels as $o_channel) {
249 ?>
250 <option value="<?php echo $o_channel; ?>"<?php echo $pchannel == $o_channel ? ' selected="selected"' : ''; ?>>- <?php echo ucwords($o_channel); ?></option>
251 <?php
252 }
253 }
254 ?>
255 </select>
256 </div>
257 <div class="btn-group pull-left">
258 <?php
259 $pidroom = $app->getUserStateFromRequest("vbo.orders.idroom", 'idroom', 0, 'int');
260 if (count($allrooms) > 0) {
261 $filters_set = !empty($pidroom) || $filters_set;
262 $rsel = '<select name="idroom"><option value="">'.JText::translate('VBROOMFILTER').'</option>';
263 foreach ($allrooms as $room) {
264 $rsel .= '<option value="'.$room['id'].'"'.(!empty($pidroom) && $pidroom == $room['id'] ? ' selected="selected"' : '').'>'.$room['name'].'</option>';
265 }
266 $rsel .= '</select>';
267 }
268 echo $rsel;
269 ?>
270 </div>
271 <?php
272 $pcategory_id = $app->getUserStateFromRequest("vbo.orders.category_id", 'category_id', 0, 'int');
273 if (count($this->categories)) {
274 $filters_set = !empty($pcategory_id) || $filters_set;
275 ?>
276 <div class="btn-group pull-left">
277 <select name="category_id">
278 <option value=""><?php echo JText::translate('VBOCATEGORYFILTER'); ?></option>
279 <?php
280 foreach ($this->categories as $catid => $catname) {
281 ?>
282 <option value="<?php echo $catid; ?>"<?php echo $catid == $pcategory_id ? ' selected="selected"' : ''; ?>><?php echo $catname; ?></option>
283 <?php
284 }
285 ?>
286 </select>
287 </div>
288 <?php
289 }
290 ?>
291 <div class="btn-group pull-left">
292 <select name="idpayment">
293 <option value=""><?php echo JText::translate('VBOFILTERBYPAYMENT'); ?></option>
294 <?php
295 $pidpayment = $app->getUserStateFromRequest("vbo.orders.idpayment", 'idpayment', 0, 'int');
296 $payment_filter = '';
297 if (!empty($pidpayment)) {
298 $filters_set = !empty($pidpayment) || $filters_set;
299 $payment_filter = '&amp;idpayment='.$pidpayment;
300 }
301 $q = "SELECT `id`,`name` FROM `#__vikbooking_gpayments` ORDER BY `name` ASC;";
302 $dbo->setQuery($q);
303 $allpayments = $dbo->loadAssocList();
304 foreach ($allpayments as $paym) {
305 ?>
306 <option value="<?php echo $paym['id']; ?>"<?php echo $paym['id'] == $pidpayment ? ' selected="selected"' : ''; ?>><?php echo $paym['name']; ?></option>
307 <?php
308 }
309 ?>
310 </select>
311 </div>
312 <div class="btn-group pull-left">
313 <select name="status">
314 <option value=""><?php echo JText::translate('VBOFILTERBYSTATUS'); ?></option>
315 <?php
316 $pstatus = $app->getUserStateFromRequest("vbo.orders.status", 'status', '', 'string');
317 $filters_set = !empty($pstatus) || $filters_set;
318 $status_filter = !empty($pstatus) ? '&amp;status='.$pstatus : '';
319 ?>
320 <optgroup label="<?php echo JText::translate('VBSTATUS'); ?>">
321 <option value="confirmed"<?php echo $pstatus == 'confirmed' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBCONFIRMED'); ?></option>
322 <option value="standby"<?php echo $pstatus == 'standby' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBSTANDBY'); ?></option>
323 <option value="cancelled"<?php echo $pstatus == 'cancelled' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBCANCELLED'); ?></option>
324 <option value="closure"<?php echo $pstatus == 'closure' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBDBTEXTROOMCLOSED'); ?></option>
325 <option value="inquiry"<?php echo $pstatus == 'inquiry' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_BTYPE_INQUIRY'); ?></option>
326 <option value="request"<?php echo $pstatus == 'request' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_BTYPE_REQUEST'); ?></option>
327 <option value="split_stay"<?php echo $pstatus == 'split_stay' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_SPLIT_STAY'); ?></option>
328 <option value="overbooking"<?php echo $pstatus == 'overbooking' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_BTYPE_OVERBOOKING'); ?></option>
329 </optgroup>
330 <optgroup label="<?php echo JText::translate('VBOCHECKEDSTATUS'); ?>">
331 <option value="checkedin"<?php echo $pstatus == 'checkedin' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSIN'); ?></option>
332 <option value="checkedout"<?php echo $pstatus == 'checkedout' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSOUT'); ?></option>
333 <option value="noshow"<?php echo $pstatus == 'noshow' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSNOS'); ?></option>
334 <option value="none"<?php echo $pstatus == 'none' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSZERO'); ?></option>
335 </optgroup>
336 </select>
337 </div>
338 <div class="btn-group pull-left">
339 <?php
340 $dates_filter = '';
341 $pdatefilt = $app->getUserStateFromRequest("vbo.orders.datefilt", 'datefilt', 0, 'int');
342 $pdatefiltfrom = $app->getUserStateFromRequest("vbo.orders.datefiltfrom", 'datefiltfrom', '', 'string');
343 $pdatefiltto = $app->getUserStateFromRequest("vbo.orders.datefiltto", 'datefiltto', '', 'string');
344 if (!empty($pdatefilt) && (!empty($pdatefiltfrom) || !empty($pdatefiltto))) {
345 $filters_set = true;
346 $dates_filter = '&amp;datefilt='.$pdatefilt.(!empty($pdatefiltfrom) ? '&amp;datefiltfrom='.$pdatefiltfrom : '').(!empty($pdatefiltto) ? '&amp;datefiltto='.$pdatefiltto : '');
347 }
348 $datesel = '<select name="datefilt" onchange="vboToggleDateFilt(this.value);"><option value="">'.JText::translate('VBOFILTERBYDATES').'</option>';
349 $datesel .= '<option value="1"'.(!empty($pdatefilt) && $pdatefilt == 1 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEBOOK').'</option>';
350 $datesel .= '<option value="2"'.(!empty($pdatefilt) && $pdatefilt == 2 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEIN').'</option>';
351 $datesel .= '<option value="3"'.(!empty($pdatefilt) && $pdatefilt == 3 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEOUT').'</option>';
352 $datesel .= '</select>';
353 echo $datesel;
354 ?>
355 </div>
356 <div class="btn-group pull-left" id="vbo-dates-cont" style="display: <?php echo (!empty($pdatefilt) && (!empty($pdatefiltfrom) || !empty($pdatefiltto)) ? 'inline-block' : 'none'); ?>;">
357 <input type="text" id="vbo-date-from" placeholder="<?php echo JText::translate('VBNEWSEASONONE'); ?>" value="<?php echo $pdatefiltfrom; ?>" size="10" name="datefiltfrom" autocomplete="off" />&nbsp;-&nbsp;<input type="text" id="vbo-date-to" placeholder="<?php echo JText::translate('VBNEWSEASONTWO'); ?>" value="<?php echo $pdatefiltto; ?>" size="10" name="datefiltto" autocomplete="off" />
358 </div>
359 <div class="btn-group pull-left">
360 <button type="submit" class="btn btn-primary"><i class="icon-search"></i> <?php echo JText::translate('VBPVIEWORDERSSEARCHSUBM'); ?></button>
361 </div>
362 </div>
363 </div>
364
365 <div class="table-responsive">
366 <table cellpadding="4" cellspacing="0" border="0" width="100%" class="table table-striped vbo-bookingslist-table">
367 <thead>
368 <tr>
369 <th width="20">
370 <input type="checkbox" onclick="Joomla.checkAll(this)" value="" name="checkall-toggle">
371 </th>
372 <th class="title center" width="20" align="center">
373 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=id&amp;vbordersort=<?php echo ($orderby == "id" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "id" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "id" ? "vbo-bookingslist-activesort" : "")); ?>">
374 <?php echo 'ID'.($orderby == "id" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "id" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
375 </a>
376 </th>
377 <th class="title left" width="110">
378 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=ts&amp;vbordersort=<?php echo ($orderby == "ts" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "ts" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "ts" ? "vbo-bookingslist-activesort" : "")); ?>">
379 <?php echo JText::translate('VBPVIEWORDERSONE').($orderby == "ts" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "ts" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
380 </a>
381 </th>
382 <th class="title left" width="200"><span><?php echo JText::translate('VBPVIEWORDERSTWO'); ?></span></th>
383 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERSTHREE'); ?></span></th>
384 <th class="title left" width="120"><span><?php echo JText::translate('VBPVIEWORDERSPEOPLE'); ?></span></th>
385 <th class="title left" width="110">
386 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=checkin&amp;vbordersort=<?php echo ($orderby == "checkin" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "checkin" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "checkin" ? "vbo-bookingslist-activesort" : "")); ?>">
387 <?php echo JText::translate('VBPVIEWORDERSFOUR').($orderby == "checkin" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "checkin" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
388 </a>
389 </th>
390 <th class="title left" width="110">
391 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=checkout&amp;vbordersort=<?php echo ($orderby == "checkout" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "checkout" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "checkout" ? "vbo-bookingslist-activesort" : "")); ?>">
392 <?php echo JText::translate('VBPVIEWORDERSFIVE').($orderby == "checkout" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "checkout" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
393 </a>
394 </th>
395 <th class="title center" width="60" align="center">
396 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=days&amp;vbordersort=<?php echo ($orderby == "days" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "days" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "days" ? "vbo-bookingslist-activesort" : "")); ?>">
397 <?php echo JText::translate('VBPVIEWORDERSSIX').($orderby == "days" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "days" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
398 </a>
399 </th>
400 <th class="title center" width="110" align="center">
401 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=total&amp;vbordersort=<?php echo ($orderby == "total" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "total" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "total" ? "vbo-bookingslist-activesort" : "")); ?>">
402 <?php echo JText::translate('VBPVIEWORDERSSEVEN').($orderby == "total" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "total" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
403 </a>
404 </th>
405 <th class="title center" width="30" align="center"><span>&nbsp;</span></th>
406 <th class="title center" width="50" align="center"><span>&nbsp;</span></th>
407 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERSEIGHT'); ?></span></th>
408 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERCHANNEL'); ?></span></th>
409 </tr>
410 </thead>
411 <?php
412 $currencysymb = VikBooking::getCurrencySymb();
413 $monsmap = array(
414 JText::translate('VBSHORTMONTHONE'),
415 JText::translate('VBSHORTMONTHTWO'),
416 JText::translate('VBSHORTMONTHTHREE'),
417 JText::translate('VBSHORTMONTHFOUR'),
418 JText::translate('VBSHORTMONTHFIVE'),
419 JText::translate('VBSHORTMONTHSIX'),
420 JText::translate('VBSHORTMONTHSEVEN'),
421 JText::translate('VBSHORTMONTHEIGHT'),
422 JText::translate('VBSHORTMONTHNINE'),
423 JText::translate('VBSHORTMONTHTEN'),
424 JText::translate('VBSHORTMONTHELEVEN'),
425 JText::translate('VBSHORTMONTHTWELVE')
426 );
427 $vcm_logos = VikBooking::getVcmChannelsLogo('', true);
428 $kk = 0;
429 $i = 0;
430 for ($i = 0, $n = count($rows); $i < $n; $i++) {
431 $row = $rows[$i];
432 if (!$row['closure']) {
433 array_push($vcm_bids, $row['id']);
434 }
435 $rooms = VikBooking::loadOrdersRoomsData($row['id']);
436 $peoplestr = '';
437 $guest_nums = [];
438 $room_names = array();
439 if (is_array($rooms)) {
440 $totadults = 0;
441 $totchildren = 0;
442 $totpets = 0;
443 foreach ($rooms as $rr) {
444 $totadults += $rr['adults'];
445 $totchildren += $rr['children'];
446 $totpets += $rr['pets'];
447 $room_names[] = $rr['room_name'];
448 if ($row['split_stay']) {
449 // do not sum the guests in case of split stay rooms
450 $totadults = $rr['adults'];
451 $totchildren = $rr['children'];
452 }
453 }
454 $guest_nums[] = $totadults . " " . ($totadults > 1 ? JText::translate('VBMAILADULTS') : JText::translate('VBMAILADULT'));
455 if ($totchildren > 0) {
456 $guest_nums[] = $totchildren . " " . ($totchildren > 1 ? JText::translate('VBMAILCHILDREN') : JText::translate('VBMAILCHILD'));
457 }
458 if ($totpets > 0) {
459 $guest_nums[] = $totpets . " " . ($totpets > 1 ? JText::translate('VBO_PETS') : JText::translate('VBO_PET'));
460 }
461 $peoplestr = implode(', ', $guest_nums);
462 }
463 $isdue = $row['total'];
464 $otachannel = '';
465 $otacurrency = '';
466 if (!empty($row['channel'])) {
467 $channelparts = explode('_', $row['channel']);
468 $otachannel = array_key_exists(1, $channelparts) && strlen($channelparts[1]) > 0 ? $channelparts[1] : ucwords($channelparts[0]);
469 $otachannelclass = $otachannel;
470 if (strstr($otachannelclass, '.') !== false) {
471 $otaccparts = explode('.', $otachannelclass);
472 $otachannelclass = $otaccparts[0];
473 }
474 $otacurrency = strlen((string)$row['chcurrency']) ? $row['chcurrency'] : '';
475 }
476 //Customer Details
477 $custdata = $row['custdata'];
478 $custdata_parts = explode("\n", $row['custdata']);
479 if (count($custdata_parts) > 2 && strpos($custdata_parts[0], ':') !== false && strpos($custdata_parts[1], ':') !== false) {
480 //get the first two fields
481 $custvalues = array();
482 foreach ($custdata_parts as $custdet) {
483 if (strlen($custdet) < 1) {
484 continue;
485 }
486 $custdet_parts = explode(':', $custdet);
487 if (count($custdet_parts) >= 2) {
488 unset($custdet_parts[0]);
489 array_push($custvalues, trim(implode(':', $custdet_parts)));
490 }
491 if (count($custvalues) > 1) {
492 break;
493 }
494 }
495 if (count($custvalues) > 1) {
496 $custdata = implode(' ', $custvalues);
497 }
498 }
499 if (strlen($custdata) > 45) {
500 if (function_exists('mb_substr')) {
501 $custdata = mb_substr($custdata, 0, 45, 'UTF-8') . " ...";
502 } else {
503 $custdata = substr($custdata, 0, 45) . " ...";
504 }
505 }
506
507 // customer profile picture
508 $customer_avatar = null;
509
510 $q = "SELECT `c`.*,`co`.`idorder` FROM `#__vikbooking_customers` AS `c` LEFT JOIN `#__vikbooking_customers_orders` `co` ON `c`.`id`=`co`.`idcustomer` WHERE `co`.`idorder`=".$row['id'];
511 $dbo->setQuery($q, 0, 1);
512 $cust_country = $dbo->loadAssoc();
513 if ($cust_country) {
514 if (!empty($cust_country['first_name'])) {
515 $custdata = $cust_country['first_name'].' '.$cust_country['last_name'];
516 if (!empty($cust_country['country'])) {
517 if (file_exists(VBO_ADMIN_PATH.DS.'resources'.DS.'countries'.DS.$cust_country['country'].'.png')) {
518 $custdata .= '<img src="'.VBO_ADMIN_URI.'resources/countries/'.$cust_country['country'].'.png'.'" title="'.$cust_country['country'].'" class="vbo-country-flag vbo-country-flag-left"/>';
519 }
520 }
521 }
522 if (!empty($cust_country['pic'])) {
523 $customer_avatar = $cust_country['pic'];
524 }
525 }
526 $custdata = $row['closure'] > 0 || JText::translate('VBDBTEXTROOMCLOSED') == $row['custdata'] ? '<span class="vbordersroomclosed"><i class="'.VikBookingIcons::i('ban').'"></i> '.JText::translate('VBDBTEXTROOMCLOSED').'</span>' : $custdata;
527
528 if ($row['status'] == "confirmed") {
529 $saystaus = '<span class="label label-success vbo-status-label">' . JText::translate('VBCONFIRMED') . '</span>';
530 if (!empty($row['type']) && !strcasecmp($row['type'], 'overbooking')) {
531 $saystaus .= '<div class="vbo-orders-substatus"><span class="label label-error">' . JText::translate('VBO_BTYPE_' . strtoupper($row['type'])) . '</span></div>';
532 }
533 } elseif ($row['status'] == "standby") {
534 $status_type = !empty($row['type']) ? JText::translate('VBO_BTYPE_' . strtoupper($row['type'])) : JText::translate('VBSTANDBY');
535 $saystaus = '<span class="label label-warning vbo-status-label">' . $status_type . '</span>';
536 } else {
537 $saystaus = '<span class="label label-error vbo-status-label">' . JText::translate('VBCANCELLED') . '</span>';
538 }
539 $ts_info = getdate($row['ts']);
540 $ts_wday = JText::translate('VB'.strtoupper(substr($ts_info['weekday'], 0, 3)));
541 $checkin_info = getdate($row['checkin']);
542 $checkin_wday = JText::translate('VB'.strtoupper(substr($checkin_info['weekday'], 0, 3)));
543 $checkout_info = getdate($row['checkout']);
544 $checkout_wday = JText::translate('VB'.strtoupper(substr($checkout_info['weekday'], 0, 3)));
545 ?>
546
547 <tr class="row<?php echo $kk; ?>">
548 <td class="skip">
549 <input type="checkbox" id="cb<?php echo $i;?>" name="cid[]" value="<?php echo $row['id']; ?>" onclick="Joomla.isChecked(this.checked);">
550 </td>
551 <td class="center">
552 <a class="vbo-bookingid" href="index.php?option=com_vikbooking&amp;task=editorder&amp;cid[]=<?php echo $row['id']; ?>"><?php echo $row['id']; ?></a>
553 </td>
554 <td>
555 <a class="vbo-bookingslist-viewdet-link" href="index.php?option=com_vikbooking&amp;task=editorder&amp;cid[]=<?php echo $row['id']; ?>">
556 <div class="vbo-bookingslist-viewdet">
557 <div class="vbo-bookingslist-viewdet-open">
558 <?php VikBookingIcons::e('external-link'); ?>
559 </div>
560 <div class="vbo-bookingslist-viewdet-fulldate">
561 <div class="vbo-bookingslist-viewdet-date">
562 <?php
563 if (strpos($df, 'd') < strpos($df, 'm')) {
564 //assuming d/m/Y or similar
565 ?>
566 <span><?php echo $ts_info['mday']; ?></span>
567 <span><?php echo $monsmap[($ts_info['mon'] - 1)]; ?></span>
568 <?php
569 } else {
570 //assuming m/d/Y or similar
571 ?>
572 <span><?php echo $monsmap[($ts_info['mon'] - 1)]; ?></span>
573 <span><?php echo $ts_info['mday']; ?></span>
574 <?php
575 }
576 ?>
577 <span><?php echo $ts_info['year']; ?></span>
578 </div>
579 <div class="vbo-bookingslist-viewdet-time">
580 <span class="vbo-bookingslist-viewdet-wday"><?php echo $ts_wday; ?></span>
581 <span class="vbo-bookingslist-viewdet-hour"><?php echo date('H:i', $row['ts']); ?></span>
582 </div>
583 </div>
584 </div>
585 </a>
586 </td>
587 <td>
588 <?php
589 if (!empty($customer_avatar)) {
590 // build caption name
591 $avatar_caption = '';
592 if (isset($cust_country) && !empty($cust_country) && !empty($cust_country['first_name'])) {
593 $avatar_caption = $cust_country['first_name'] . ' ' . $cust_country['last_name'];
594 }
595 ?>
596 <div class="vbo-customer-info-box">
597 <div class="vbo-customer-info-box-name">
598 <?php echo $custdata; ?>
599 </div>
600 <div class="vbo-customer-info-box-avatar vbo-customer-avatar-small">
601 <span>
602 <img src="<?php echo strpos($customer_avatar, 'http') === 0 ? $customer_avatar : VBO_SITE_URI . 'resources/uploads/' . $customer_avatar; ?>" data-caption="<?php echo htmlspecialchars($avatar_caption); ?>" decoding="async" loading="lazy" />
603 </span>
604 </div>
605 </div>
606 <?php
607 } else {
608 echo $custdata;
609 }
610 ?>
611 <span class="vbo-orders-review-link" title="<?php echo $this->escape(JText::translate('VBOSEEGUESTREVIEW')); ?>" data-bid="<?php echo $row['id']; ?>" style="display: none;"></span>
612 </td>
613 <td class="center">
614 <?php
615 if (count($room_names) > 1) {
616 if ($row['split_stay']) {
617 ?>
618 <div class="vbo-booking-with-splitstay">
619 <span class="hasTooltip vbo-tip-small vbo-room-sharedcalendar vbo-booking-has-splitstay" title="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_SPLIT_STAY')); ?>"><?php VikBookingIcons::e('random'); ?></span>
620 <span class="hasTooltip vbo-tip-small vbo-bookingslist-numrooms" title="<?php echo implode(', ', $room_names); ?>"><?php echo $row['roomsnum']; ?></span>
621 </div>
622 <?php
623 } else {
624 ?>
625 <span class="hasTooltip vbo-tip-small vbo-bookingslist-numrooms" title="<?php echo implode(', ', $room_names); ?>"><?php echo $row['roomsnum']; ?></span>
626 <?php
627 }
628 } else {
629 ?>
630 <span class="vbo-bookingslist-roomname"><?php echo $row['roomsnum'] == 1 && count($room_names) > 0 ? $room_names[0] : $row['roomsnum']; ?></span>
631 <?php
632 $room_number = '';
633 if ($rooms && !empty($rooms[0]) && !empty($rooms[0]['roomindex']) && !empty($rooms[0]['params'])) {
634 // print the room number when it's just one room booked
635 $room_params = json_decode($rooms[0]['params'], true);
636 if (is_array($room_params) && !empty($room_params['features']) && is_array($room_params['features'])) {
637 // parse distinctive features
638 foreach ($room_params['features'] as $rind => $rfeatures) {
639 if ($rind != $rooms[0]['roomindex']) {
640 continue;
641 }
642 foreach ($rfeatures as $fname => $fval) {
643 if (strlen($fval)) {
644 $room_number = '#' . $fval;
645 break 2;
646 }
647 }
648 }
649 }
650 }
651 if ($room_number) {
652 ?>
653 <span class="vbo-bookingslist-roomunit"><?php echo $room_number; ?></span>
654 <?php
655 }
656 }
657 ?>
658 </td>
659 <td>
660 <span class="vbo-tooltip vbo-tooltip-top badge badge-info vbo-bookslist-snapshot" data-tooltiptext="<?php echo JHtml::fetch('esc_attr', JText::translate('VBOPREVIEW')); ?>" data-bid="<?php echo $row['id']; ?>"><?php VikBookingIcons::e('eye'); ?></span>
661 <span><?php echo $peoplestr; ?></span>
662 </td>
663 <td>
664 <div class="vbo-bookingslist-booktime vbo-bookingslist-booktime-checkin">
665 <div class="vbo-bookingslist-booktime-fulldate">
666 <div class="vbo-bookingslist-booktime-date">
667 <span><?php echo date(str_replace("/", $datesep, $df), $row['checkin']); ?></span>
668 </div>
669 <div class="vbo-bookingslist-booktime-time">
670 <span class="vbo-bookingslist-booktime-twrap">
671 <span class="vbo-bookingslist-booktime-wday"><?php echo $checkin_wday; ?></span>
672 <span class="vbo-bookingslist-booktime-hour"><?php echo date('H:i', $row['checkin']); ?></span>
673 </span>
674 <?php
675 if ($row['checked'] == 1) {
676 //checked in
677 ?>
678 <span class="vbo-bookingslist-booktime-checkedin"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSIN'); ?>"></i></span>
679 <?php
680 } elseif ($row['checked'] < 0) {
681 //no show
682 ?>
683 <span class="vbo-bookingslist-booktime-noshow"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSNOS'); ?>"></i></span>
684 <?php
685 }
686 ?>
687 </div>
688 </div>
689 </div>
690 </td>
691 <td>
692 <div class="vbo-bookingslist-booktime vbo-bookingslist-booktime-checkin">
693 <div class="vbo-bookingslist-booktime-fulldate">
694 <div class="vbo-bookingslist-booktime-date">
695 <span><?php echo date(str_replace("/", $datesep, $df), $row['checkout']); ?></span>
696 </div>
697 <div class="vbo-bookingslist-booktime-time">
698 <span class="vbo-bookingslist-booktime-twrap">
699 <span class="vbo-bookingslist-booktime-wday"><?php echo $checkout_wday; ?></span>
700 <span class="vbo-bookingslist-booktime-hour"><?php echo date('H:i', $row['checkout']); ?></span>
701 </span>
702 <?php
703 if ($row['checked'] == 2) {
704 //checked out
705 ?>
706 <span class="vbo-bookingslist-booktime-checkedout"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSOUT'); ?>"></i></span>
707 <?php
708 }
709 ?>
710 </div>
711 </div>
712 </div>
713 </td>
714 <td class="center">
715 <span class="vbo-bookingslist-numnights"><?php echo $row['days']; ?></span>
716 </td>
717 <td class="center">
718 <div class="vbo-bookingslist-total-wrap">
719 <div class="vbo-bookingslist-total-amount">
720 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($isdue), ($otacurrency ?: $currencysymb), ['<span>%s</span>', '<span>%s</span>']); ?>
721 </div>
722 <?php
723 if (!is_null($row['totpaid'])) {
724 ?>
725 <div class="vbo-bookingslist-total-totpaid">
726 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($row['totpaid']), $currencysymb, ['<span>%s</span>', '<span>%s</span>']); ?>
727 <?php
728 if ($row['refund'] > 0) {
729 ?>
730 <span class="vbo-bookingslist-total-refunded">
731 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($row['refund']), $currencysymb, ['<span>%s</span>', '<span>%s</span>']); ?>
732 </span>
733 <?php
734 }
735 ?>
736 </div>
737 <?php
738 } elseif ($row['refund'] > 0) {
739 ?>
740 <div class="vbo-bookingslist-total-totpaid">
741 <span class="vbo-bookingslist-total-refunded">
742 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($row['refund']), $currencysymb, ['<span>%s</span>', '<span>%s</span>']); ?>
743 </span>
744 </div>
745 <?php
746 }
747 ?>
748 </div>
749 </td>
750 <td class="center">
751 <?php
752 $bcolortag = VikBooking::applyBookingColorTag($row, $colortags);
753 if (count($bcolortag) > 0) {
754 $bcolortag['name'] = JText::translate($bcolortag['name']);
755 ?>
756 <div class="vbo-colortag-circle hasTooltip" style="background-color: <?php echo $bcolortag['color']; ?>;" title="<?php echo $bcolortag['name']; ?>" data-ctagcolor="<?php echo $bcolortag['color']; ?>" data-bid="<?php echo $row['id']; ?>"></div>
757 <?php
758 }
759 ?>
760 </td>
761 <td class="center">
762 <?php
763 if (!empty($row['adminnotes'])) {
764 ?>
765 <span class="vbo-admin-tipsicon vbo-admin-notes-icn" data-bid="<?php echo $row['id']; ?>"><?php VikBookingIcons::e('sticky-note'); ?></span>&nbsp;
766 <div class="vbo-order-admin-notes-cnt" data-bid="<?php echo $row['id']; ?>" style="display: none;"><?php echo nl2br($row['adminnotes']); ?></div>
767 <?php
768 }
769
770 // build the proper invoice SID for bc
771 $inv_sid = $row['sid'] ?: $row['idorderota'] ?: '';
772 if (empty($row['sid']) && is_file(implode(DIRECTORY_SEPARATOR, [VBO_SITE_PATH, 'helpers', 'invoices', 'generated', "{$row['id']}_{$row['sid']}.pdf"]))) {
773 // use the old file name signature for OTA bookings
774 $inv_sid = $row['sid'];
775 }
776 $invoice_path = implode(DIRECTORY_SEPARATOR, [VBO_SITE_PATH, 'helpers', 'invoices', 'generated', "{$row['id']}_{$inv_sid}.pdf"]);
777
778 echo (is_file($invoice_path) ? '<a class="hasTooltip vbo-admin-invoiceicon" href="'.VBO_SITE_URI.'helpers/invoices/generated/'.$row['id'].'_'.$row['sid'].'.pdf" target="_blank" title="' . htmlspecialchars(JText::translate('VBOINVDOWNLOAD')) . '"><i class="' . VikBookingIcons::i('invoice') . '"></i></a>' : '');
779 ?>
780 <span class="vbo-bookings-guestmessages-bubble-cont vbo-admin-tipsicon" style="display: none;" data-bid="<?php echo $row['id']; ?>">
781 <a href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>#messaging">
782 <i class="<?php echo VikBookingIcons::i('commenting'); ?>" data-message-count="0"></i>
783 </a>
784 </span>
785 </td>
786 <td class="center">
787 <?php echo $saystaus; ?>
788 </td>
789 <td class="center">
790 <?php
791 if (!empty($row['channel'])) {
792 //VBO 1.10: use of strtolower($otachannelclass) next to the class 'vbotasp' is deprecated. Fetch the OTA logo from VCM
793 $ota_logo_img = is_object($vcm_logos) ? $vcm_logos->setProvenience($otachannel, $row['channel'])->getLogoURL() : false;
794 if ($ota_logo_img !== false) {
795 ?>
796 <img src="<?php echo $ota_logo_img; ?>" class="vbo-channelimg-medium"/>
797 <?php
798 } else {
799 ?>
800 <span class="vbo-provenience"><?php echo $otachannel; ?></span>
801 <?php
802 }
803 } else {
804 ?>
805 <span class="vbo-provenience"><?php echo JText::translate('VBORDFROMSITE'); ?></span>
806 <?php
807 }
808 ?>
809 </td>
810 </tr>
811 <?php
812 $kk = 1 - $kk;
813
814 }
815 ?>
816
817 </table>
818 </div>
819 <input type="hidden" name="option" value="com_vikbooking" />
820 <input type="hidden" name="cust_id" id="cust_id" value="<?php echo !empty($pcust_id) ? $pcust_id : ''; ?>" />
821 <input type="hidden" name="task" value="orders" />
822 <input type="hidden" name="boxchecked" value="0" />
823 <?php echo JHtml::fetch('form.token'); ?>
824 <?php echo $navbut; ?>
825 </form>
826
827 <script type="text/javascript">
828 if (typeof jQuery.fn.tooltip === 'function') {
829 jQuery(".hasTooltip").tooltip();
830 } else {
831 jQuery.fn.tooltip = function(){};
832 }
833 function vboToggleDateFilt(dtype) {
834 if (!(dtype.length > 0)) {
835 document.getElementById('vbo-dates-cont').style.display = 'none';
836 document.getElementById('vbo-date-from').value = '';
837 document.getElementById('vbo-date-to').value = '';
838 return true;
839 }
840 document.getElementById('vbo-dates-cont').style.display = 'inline-block';
841 return true;
842 }
843 var bctags_tip = "<?php echo $bctags_tip; ?>";
844 var applying_tag = false;
845 var bctags_tip_on = false;
846
847 jQuery(function() {
848
849 jQuery(document.body).on('click', '.vbo-colortag-circle', function() {
850 if (!jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").length) {
851 jQuery(".vbo-blist-tip-bctag-subtip").remove();
852 var cur_color = jQuery(this).attr("data-ctagcolor");
853 var cur_bid = jQuery(this).attr("data-bid");
854 jQuery(this).after("<div class=\"vbo-blist-tip-bctag-subtip\">"+bctags_tip+"</div>");
855 jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").find(".vbo-blist-tip-bctag-subtip-circle[data-ctagcolor='"+cur_color+"']").addClass("vbo-blist-tip-bctag-activecircle").css('border-color', cur_color);
856 jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").find(".vbo-blist-tip-bctag-subtip-circle").attr('data-bid', cur_bid);
857 jQuery(".vbo-blist-tip-bctag-subtip .hasTooltip").tooltip();
858 bctags_tip_on = true;
859 } else {
860 jQuery(".vbo-blist-tip-bctag-subtip").remove();
861 bctags_tip_on = false;
862 }
863 });
864
865 jQuery(document.body).on('click', '.vbo-blist-tip-bctag-subtip-circle', function() {
866 if (applying_tag === true) {
867 return false;
868 }
869 applying_tag = true;
870 var clickelem = jQuery(this);
871 var ctagkey = clickelem.attr('data-ctagkey');
872 var bid = clickelem.attr('data-bid');
873 // set opacity to circles as loading
874 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '0.6');
875
876 VBOCore.doAjax(
877 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=setbookingtag'); ?>",
878 {
879 tmpl: "component",
880 idorder: bid,
881 tagkey: ctagkey
882 },
883 (res) => {
884 applying_tag = false;
885 if (res.indexOf('e4j.error') >= 0) {
886 console.log(res);
887 alert(res.replace("e4j.error.", ""));
888 //restore loading opacity in circles
889 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '1');
890 } else {
891 var obj_res = JSON.parse(res);
892 jQuery(clickelem).closest(".vbo-blist-tip-bctag-subtip").parent().find(".vbo-colortag-circle").css("background-color", obj_res.color).attr('data-ctagcolor', obj_res.color).attr('data-original-title', obj_res.name);
893 jQuery(".vbo-blist-tip-bctag-subtip").remove();
894 bctags_tip_on = false;
895 }
896 },
897 (err) => {
898 applying_tag = false;
899 alert("Request Failed");
900 //restore loading opacity in circles
901 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '1');
902 }
903 );
904 });
905
906 jQuery('.vbo-bookingslist-viewdet-link').click(function(e) {
907 if (e && e.target.tagName.toUpperCase() == 'I') {
908 //open the link in a new window
909 e.preventDefault();
910 window.open(jQuery(this).attr('href'), '_blank');
911 }
912 });
913
914 jQuery('#vbo-date-from').datepicker({
915 showOn: 'focus',
916 dateFormat: '<?php echo $juidf; ?>',
917 onSelect: function( selectedDate ) {
918 jQuery('#vbo-date-to').datepicker('option', 'minDate', selectedDate);
919 }
920 });
921
922 jQuery('#vbo-date-to').datepicker({
923 showOn: 'focus',
924 dateFormat: '<?php echo $juidf; ?>',
925 onSelect: function( selectedDate ) {
926 jQuery('#vbo-date-from').datepicker('option', 'maxDate', selectedDate);
927 }
928 });
929
930 //Search customer - Start
931 var vbocustsdelay = (function() {
932 var timer = 0;
933 return function(callback, ms) {
934 clearTimeout (timer);
935 timer = setTimeout(callback, ms);
936 };
937 })();
938
939 function vboCustomerSearch(words) {
940 jQuery("#vbo-allbsearchcust-res").hide().html("");
941 jQuery("#customernominative").addClass('vbo-allbsearchcust-loading-inp');
942
943 VBOCore.doAjax(
944 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=searchcustomer'); ?>",
945 {
946 kw: words,
947 nopin: 1,
948 tmpl: "component"
949 },
950 (cont) => {
951 if (cont) {
952 var obj_res = typeof cont === 'string' ? JSON.parse(cont) : cont;
953 jQuery("#vbo-allbsearchcust-res").html(obj_res[1]);
954 } else {
955 jQuery("#vbo-allbsearchcust-res").html("");
956 }
957 jQuery("#vbo-allbsearchcust-res").show();
958 jQuery("#customernominative").removeClass('vbo-allbsearchcust-loading-inp');
959 },
960 (err) => {
961 jQuery("#customernominative").removeClass('vbo-allbsearchcust-loading-inp');
962 alert("Error Searching.");
963 }
964 );
965 }
966
967 jQuery("#customernominative").keyup(function(event) {
968 vbocustsdelay(function() {
969 var keywords = jQuery("#customernominative").val();
970 if (keywords.length > 1) {
971 if ((event.which > 96 && event.which < 123) || (event.which > 64 && event.which < 91) || event.which == 13) {
972 vboCustomerSearch(keywords);
973 }
974 } else {
975 if (jQuery("#vbo-allbsearchcust-res").is(":visible")) {
976 jQuery("#vbo-allbsearchcust-res").hide();
977 }
978 }
979 }, 600);
980 });
981
982 jQuery(document).on('click', '.vbo-custsearchres-entry', function() {
983 var customer_id = jQuery(this).attr('data-custid');
984 if (customer_id.length) {
985 document.location.href = 'index.php?option=com_vikbooking&task=orders&cust_id='+customer_id;
986 }
987 });
988 //Search customer - End
989
990 jQuery(document).keydown(function(e) {
991 if ( e.keyCode == 27 && bctags_tip_on === true ) {
992 jQuery(".vbo-blist-tip-bctag-subtip").remove();
993 bctags_tip_on = false;
994 }
995 if (e.keyCode == 13 && !e.altKey && !e.ctrlKey && !e.shiftKey) {
996 //prevent form-submit by hitting enter
997 e.preventDefault();
998 return false;
999 }
1000 });
1001
1002 jQuery(document).mouseup(function(e) {
1003 if (!bctags_tip_on) {
1004 return;
1005 }
1006 if (jQuery(".vbo-blist-tip-bctag-subtip").length) {
1007 var vbo_overlay_subtip_cont = jQuery(".vbo-blist-tip-bctag-subtip-inner");
1008 if (!vbo_overlay_subtip_cont.is(e.target) && vbo_overlay_subtip_cont.has(e.target).length === 0) {
1009 jQuery(".vbo-blist-tip-bctag-subtip").remove();
1010 bctags_tip_on = false;
1011 return;
1012 }
1013 }
1014 });
1015
1016 jQuery(".vbo-bookingslist-table tr td").not(".skip").click(function() {
1017 //the checkbox for the booking is on the first TD of the row
1018 var trcbox = jQuery(this).parent("tr").find("td").first().find("input[type='checkbox']");
1019 if (!trcbox || !trcbox.length) {
1020 return;
1021 }
1022 trcbox.prop('checked', !(trcbox.prop('checked')));
1023 if (typeof Joomla !== 'undefined' && Joomla != null) {
1024 Joomla.isChecked(trcbox.prop('checked'));
1025 }
1026 });
1027
1028 jQuery(".vbo-bookingslist-table tr").dblclick(function() {
1029 if (document.selection && document.selection.empty) {
1030 document.selection.empty();
1031 } else if (window.getSelection) {
1032 var sel = window.getSelection();
1033 sel.removeAllRanges();
1034 }
1035 //the link to the booking details page is on the third TD of the row
1036 var olink = jQuery(this).find("td").first().next().next().find("a");
1037 if (!olink || !olink.length) {
1038 return;
1039 }
1040 document.location.href = olink.attr("href");
1041 });
1042
1043 <?php
1044 if ($filters_set) {
1045 ?>
1046 jQuery("#vbo-search-tools-btn").trigger("click");
1047 <?php
1048 }
1049 ?>
1050
1051 // count unread guest messages
1052 vcmCountGuestMessages();
1053
1054 // load guest reviews
1055 VBOCore.doAjax(
1056 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings_have_reviews'); ?>",
1057 {
1058 tmpl: "component",
1059 bids: <?php echo json_encode($vcm_bids); ?>
1060 },
1061 (res) => {
1062 try {
1063 // loop through all bookings with a review
1064 var obj = typeof res === 'object' ? res : JSON.parse(res);
1065 for (let bid in obj) {
1066 if (!obj.hasOwnProperty(bid)) {
1067 continue;
1068 }
1069
1070 // the review ID
1071 let review_id = obj[bid];
1072
1073 // click-able element
1074 var rev_elem = jQuery('<a></a>').addClass('vbo-staropen-greview').html('<?php VikBookingIcons::e('star'); ?>');
1075 rev_elem.on('click', (e) => {
1076 e.stopPropagation();
1077 VBOCore.handleDisplayWidgetNotification({widget_id: 'guest_reviews'}, {review_id: review_id});
1078 });
1079
1080 // review trigger element
1081 var trigger = jQuery('.vbo-orders-review-link[data-bid="' + bid + '"]');
1082 trigger.append(rev_elem);
1083 trigger.fadeIn();
1084 }
1085 } catch(err) {
1086 console.error(err);
1087 }
1088 },
1089 (err) => {
1090 console.log('request failed for loading booking reviews');
1091 }
1092 );
1093
1094 // zoom-able avatars
1095 jQuery('.vbo-customer-info-box-avatar').each(function() {
1096 var img = jQuery(this).find('img');
1097 if (!img.length) {
1098 return;
1099 }
1100 // register click listener
1101 img.on('click', function(e) {
1102 // stop events propagation
1103 e.preventDefault();
1104 e.stopPropagation();
1105
1106 // check for caption
1107 var caption = jQuery(this).attr('data-caption');
1108
1109 // build modal content
1110 var zoom_modal = jQuery('<div></div>').addClass('vbo-modal-overlay-block vbo-modal-overlay-zoom-image').css('display', 'block');
1111 var zoom_dismiss = jQuery('<a></a>').addClass('vbo-modal-overlay-close');
1112 zoom_dismiss.on('click', function() {
1113 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
1114 });
1115 zoom_modal.append(zoom_dismiss);
1116 var zoom_content = jQuery('<div></div>').addClass('vbo-modal-overlay-content vbo-modal-overlay-content-zoom-image');
1117 var zoom_head = jQuery('<div></div>').addClass('vbo-modal-overlay-content-head');
1118 var zoom_head_title = jQuery('<span></span>');
1119 if (caption) {
1120 zoom_head_title.text(caption);
1121 }
1122 var zoom_head_close = jQuery('<span></span>').addClass('vbo-modal-overlay-close-times').html('&times;');
1123 zoom_head_close.on('click', function() {
1124 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
1125 });
1126 zoom_head.append(zoom_head_title).append(zoom_head_close);
1127 var zoom_body = jQuery('<div></div>').addClass('vbo-modal-overlay-content-body vbo-modal-overlay-content-body-scroll');
1128 var zoom_image = jQuery('<div></div>').addClass('vbo-modal-zoom-image-wrap');
1129 zoom_image.append(jQuery(this).clone());
1130 zoom_body.append(zoom_image);
1131 zoom_content.append(zoom_head).append(zoom_body);
1132 zoom_modal.append(zoom_content);
1133 // append modal to body
1134 if (jQuery('.vbo-modal-overlay-zoom-image').length) {
1135 jQuery('.vbo-modal-overlay-zoom-image').remove();
1136 }
1137 jQuery('body').append(zoom_modal);
1138 });
1139 });
1140
1141 // open admin notes for a booking
1142 jQuery('.vbo-admin-notes-icn').click(function(e) {
1143 e.stopPropagation();
1144 var now_bid = jQuery(this).attr('data-bid');
1145 var hid_elm = jQuery('.vbo-order-admin-notes-cnt[data-bid="' + now_bid + '"]');
1146 if (!hid_elm || !hid_elm.length) {
1147 return;
1148 }
1149 VBOCore.displayModal({
1150 extra_class: 'vbo-modal-rounded',
1151 title: '<span class="label label-info">' + now_bid + '</span> ' + Joomla.JText._('VBADMINNOTESTOGGLE'),
1152 body: hid_elm.html(),
1153 });
1154 });
1155
1156 // view booking snapshot
1157 jQuery('.vbo-bookslist-snapshot').on('click', function(e) {
1158 e.stopPropagation();
1159 VBOCore.handleDisplayWidgetNotification({widget_id: 'booking_details'}, {booking_id: jQuery(this).attr('data-bid')});
1160 });
1161
1162 });
1163
1164 function vcmCountGuestMessages() {
1165 <?php
1166 // VCM Chat Guest Messages (if VCM is installed)
1167 if (count($vcm_bids) && is_file(VCM_SITE_PATH . DIRECTORY_SEPARATOR . 'helpers' . DIRECTORY_SEPARATOR . 'lib.vikchannelmanager.php')) {
1168 ?>
1169 var all_bids = <?php echo json_encode($vcm_bids); ?>;
1170 VBOCore.doAjax(
1171 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikchannelmanager&task=chat.count_unread_messages'); ?>",
1172 {
1173 tmpl: "component",
1174 id_order: all_bids
1175 },
1176 (res) => {
1177 var counters = JSON.parse(res);
1178 for (var bid in all_bids) {
1179 if (!all_bids.hasOwnProperty(bid)) {
1180 continue;
1181 }
1182 var booking_bubble = jQuery('.vbo-bookings-guestmessages-bubble-cont[data-bid="'+all_bids[bid]+'"]');
1183 if (!booking_bubble || !booking_bubble.length) {
1184 continue;
1185 }
1186 if (!counters.hasOwnProperty(all_bids[bid])) {
1187 // 0 messages to be read
1188 booking_bubble.find('i').attr('data-message-count', '0');
1189 booking_bubble.hide();
1190 continue;
1191 }
1192 booking_bubble.find('i').attr('data-message-count', counters[all_bids[bid]]);
1193 if (parseInt(counters[all_bids[bid]]) > 0) {
1194 booking_bubble.fadeIn();
1195 } else {
1196 booking_bubble.hide();
1197 }
1198 }
1199 },
1200 (err) => {
1201 console.error('AJAX request failed for counting guest messages from VCM');
1202 }
1203 );
1204 <?php
1205 }
1206 ?>
1207 }
1208 </script>
1209 <?php
1210
1211 //Invoices
1212 $pconfirmgen = VikRequest::getInt('confirmgen', '', 'request');
1213 if (count($cid) > 0 && !empty($cid[0])) {
1214 $oldinvdate = '';
1215 $nextinvnum = VikBooking::getNextInvoiceNumber();
1216 $invsuff = VikBooking::getInvoiceNumberSuffix();
1217 $companyinfo = VikBooking::getInvoiceCompanyInfo();
1218 //if editing an invoice (re-creating an existing invoice for a booking), do not increment the invoice number
1219 if (count($cid) == 1) {
1220 //the generate invoice btn of the booking details page can pass the invoice notes field via hidden field. If not empty, update invoice notes for this id
1221 $pinvnotes = VikRequest::getString('invnotes', '', 'request', VIKREQUEST_ALLOWHTML);
1222 if (!empty($pinvnotes)) {
1223 $pinvnotes = strpos($pinvnotes, '<br') !== false ? $pinvnotes : nl2br($pinvnotes);
1224 $q = "UPDATE `#__vikbooking_orders` SET `inv_notes`=".$dbo->quote($pinvnotes)." WHERE `id`=".(int)$cid[0].";";
1225 $dbo->setQuery($q);
1226 $dbo->execute();
1227 }
1228 //
1229 $q = "SELECT `number`,`for_date` FROM `#__vikbooking_invoices` WHERE `idorder`=" . (int)$cid[0];
1230 $dbo->setQuery($q, 0, 1);
1231 $prev_data = $dbo->loadAssoc();
1232 if ($prev_data) {
1233 $oldinvdate = $prev_data['for_date'];
1234 $prev_inv_number = intval(str_replace($invsuff, '', $prev_data['number']));
1235 if ($prev_inv_number > 0) {
1236 $nextinvnum = $prev_inv_number;
1237 }
1238 }
1239 }
1240 //
1241 ?>
1242 <div class="vbo-gen-invoices-helper" style="display: none;">
1243 <form action="index.php?option=com_vikbooking" method="post" id="vbo-geninv-form">
1244 <div class="vbo-calendar-cfield-entry">
1245 <label for="invoice_num"><?php echo JText::translate('VBINVSTARTNUM'); ?></label>
1246 <span><input type="number" min="1" size="4" value="<?php echo $nextinvnum; ?>" id="invoice_num" name="invoice_num" /></span>
1247 </div>
1248 <div class="vbo-calendar-cfield-entry">
1249 <label for="invoice_suff"><?php echo JText::translate('VBINVNUMSUFFIX'); ?></label>
1250 <span><input type="text" size="7" value="<?php echo $invsuff; ?>" id="invoice_suff" name="invoice_suff" /></span>
1251 </div>
1252 <div class="vbo-calendar-cfield-entry">
1253 <label for="invoice_date"><?php echo JText::translate('VBINVUSEDATE'); ?></label>
1254 <span>
1255 <select id="invoice_date" name="invoice_date">
1256 <?php
1257 if (!empty($oldinvdate)) {
1258 ?>
1259 <option value="<?php echo date($df, $oldinvdate); ?>"><?php echo date($df, $oldinvdate); ?></option>
1260 <?php
1261 }
1262 ?>
1263 <option value="<?php echo date($df, time()); ?>"><?php echo date($df, time()); ?></option>
1264 <option value="0"><?php echo JText::translate('VBINVUSEDATEBOOKING'); ?></option>
1265 </select>
1266 </span>
1267 </div>
1268 <div class="vbo-calendar-cfield-entry">
1269 <label for="company_info"><?php echo JText::translate('VBINVCOMPANYINFO'); ?></label>
1270 <span><textarea name="company_info" id="company_info" style="width: 98%; min-width: 98%; max-width: 98%; height: 70px;"><?php echo $companyinfo; ?></textarea></span>
1271 </div>
1272 <div class="vbo-calendar-cfield-entry">
1273 <label for="invoice_send"><i class="vboicn-envelop"></i><?php echo JText::translate('VBINVSENDVIAMAIL'); ?></label>
1274 <span><select id="invoice_send" name="invoice_send"><option value=""><?php echo JText::translate('VBNO'); ?></option><option value="1"><?php echo JText::translate('VBYES'); ?></option></select></span>
1275 </div>
1276 <div class="vbo-calendar-cfields-bottom">
1277
1278 </div>
1279 <?php
1280 foreach ($cid as $invid) {
1281 echo '<input type="hidden" name="cid[]" value="'.$invid.'" />';
1282 }
1283 if ($pconfirmgen > 0) {
1284 echo '<input type="hidden" name="confirmgen" value="'.$cid[0].'" />';
1285 }
1286 ?>
1287 <input type="hidden" name="option" value="com_vikbooking" />
1288 <input type="hidden" name="task" value="geninvoices" />
1289 </form>
1290 </div>
1291
1292 <script type="text/javascript">
1293 jQuery(function() {
1294
1295 // render modal to generate the invoice(s)
1296 var gen_invoices_modal_body = VBOCore.displayModal({
1297 suffix: 'invoices',
1298 extra_class: 'vbo-modal-rounded vbo-modal-tall',
1299 title: Joomla.JText._('VBOGENINVOICES') + ' (<?php echo count($cid); ?>)',
1300 footer_right: '<button type="button" class="btn btn-success" onclick="document.getElementById(\'vbo-geninv-form\').submit();"><i class="vboicn-file-text2"></i><?php echo addslashes(JText::translate('VBOGENINVOICES')); ?></button>',
1301 <?php
1302 if (count($cid) === 1) {
1303 ?>
1304 footer_left: '<a href="index.php?option=com_vikbooking&task=editbusy&cid[]=<?php echo $cid[0]; ?>&frominv=1" class="btn vbo-config-btn"><?php echo addslashes(JText::translate('VBINVEDITBINFO')); ?></a>',
1305 <?php
1306 }
1307 ?>
1308 onDismiss: () => {
1309 jQuery('#vbo-geninv-form').appendTo('.vbo-gen-invoices-helper');
1310 },
1311 });
1312
1313 // set modal content
1314 jQuery('#vbo-geninv-form').appendTo(gen_invoices_modal_body);
1315
1316 <?php
1317 if ($pconfirmgen > 0) {
1318 ?>
1319 // prompt for immediate generation
1320 if (confirm(Joomla.JText._('VBCONFIRMGENINV'))) {
1321 document.getElementById('vbo-geninv-form').submit();
1322 }
1323 <?php
1324 }
1325 ?>
1326 });
1327 </script>
1328 <?php
1329 }
1330