PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.16
VikBooking Hotel Booking Engine & PMS v1.8.16
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 / layouts / quote / manage / html.php

html.php in VikBooking Hotel Booking Engine & PMS 1.8.16, at admin/layouts/quote/manage/html.php

684 lines 37.1 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 core
5 * @author E4J s.r.l.
6 * @copyright Copyright (C) 2026 E4J s.r.l. All Rights Reserved.
7 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
8 * @link https://vikwp.com
9 */
10
11 // No direct access
12 defined('ABSPATH') or die('No script kiddies please!');
13
14 /**
15 * Obtain vars from arguments received in the layout file.
16 *
17 * @var ?object $quote Optional quote record to edit.
18 * @var array $customer Optional customer default values.
19 * @var array $inquiry Optional inquiry values to populate.
20 * @var ?int $session_id Optional Chat Session ID source.
21 * @var array $prefMessages Optional list of preferred message objects.
22 */
23 extract($displayData);
24
25 // get VBO application
26 $vbo_app = VikBooking::getVboApplication();
27
28 // currency symbol
29 $currencysymb = VikBooking::getCurrencySymb();
30
31 // load all option records
32 $optionRecords = VBORoomHelper::getInstance()->loadAnyOptions();
33
34 // load all tax rates
35 $taxRates = VikBooking::getAvailabilityInstance()->getTaxRates();
36
37 // load all payment methods
38 $paymentMethods = VBOMvcModel::getInstance('payment')->getItems(
39 // clauses
40 [
41 // exclude those payment methods that automatically confirm the booking
42 // quote solutions (bookings) must be confirmed by placing an online payment
43 'setconfirmed' => 0,
44 ],
45 // start
46 0,
47 // lim
48 0,
49 // cols
50 [],
51 // ordering
52 [
53 'published' => 'DESC',
54 'name' => 'ASC',
55 ]
56 );
57
58 // build default message template
59 $defaultMessage = '';
60 $siteLogo = VBOFactory::getConfig()->get('sitelogo');
61 $companyName = VikBooking::getFrontTitle();
62 if ($siteLogo) {
63 $logoSrc = VBO_ADMIN_URI . 'resources/' . $siteLogo;
64 $logoAlt = htmlspecialchars($companyName);
65 $defaultMessage .= <<<HTML
66 <p style="text-align: center;"><img src="$logoSrc" alt="$defaultMessage" /></p>
67 HTML;
68 }
69 $messageBody = preg_replace('/<br\s*\/?\s*>\R/', '<br>', nl2br(JText::translate('VBO_QUOTE_DEF_MESS')));
70 $defaultMessage .= <<<HTML
71 <h1 style="text-align: center;">
72 <span style="font-family: verdana;">$companyName</span>
73 </h1>
74 <hr class="vbo-editor-hl-mailwrapper">
75 $messageBody
76 <p>$companyName</p>
77 <hr class="vbo-editor-hl-mailwrapper">
78 <p><br></p>
79 HTML;
80
81 ?>
82 <div class="vbo-quote-wrapper">
83 <div class="vbo-quote-sections">
84
85 <?php
86 if ($quote) {
87 // route quote URI
88 $quoteUri = VikBooking::externalroute(
89 "index.php?option=com_vikbooking&view=quote&ref={$quote->uuid}" . (($quote->solutions[0]->lang ?? null) ? '&lang=' . $quote->solutions[0]->lang : ''),
90 false
91 );
92 ?>
93 <div class="vbo-quote-section vbo-quote-section-current" data-quote-id="<?php echo $quote->id; ?>">
94 <div class="vbo-quote-section-head vbo-quote-section-head-sb">
95 <div class="vbo-quote-section-head-title">
96 <span class="vbo-bg-icon"><?php VikBookingIcons::e('file-alt'); ?></span>
97 <span class="vbo-quote-section-name"><?php echo sprintf('%s #%d', JText::translate('VBO_BTYPE_QUOTE'), $quote->id); ?></span>
98 </div>
99 <div class="vbo-quote-edit-link">
100 <a class="btn btn-small vbo-config-btn" target="_blank" href="<?php echo $quoteUri; ?>"><?php VikBookingIcons::e('external-link'); ?> <?php echo JText::translate('VBVIEWORDFRONT'); ?></a>
101 </div>
102 </div>
103 <div class="vbo-quote-section-body">
104 <div class="vbo-quote-edit-dt">
105 <label><?php echo JText::translate('VBOINVCREATIONDATE'); ?></label>
106 <span><?php echo sprintf('%s (%s)', JHtml::fetch('date', $quote->created_on, 'd M Y H:i'), $quote->created_by ?? ''); ?></span>
107 </div>
108 <div class="vbo-quote-edit-uuid" data-quote-uuid="<?php echo $quote->uuid; ?>">
109 <label>UUID</label>
110 <span class="label"><?php echo $quote->uuid; ?></span>
111 </div>
112 </div>
113 </div>
114 <?php
115 }
116 ?>
117
118 <div class="vbo-quote-section vbo-quote-section-customer">
119 <div class="vbo-quote-section-head">
120 <span class="vbo-bg-icon"><?php VikBookingIcons::e('user'); ?></span>
121 <span class="vbo-quote-section-name"><?php echo JText::translate('VBOCUSTOMER'); ?></span>
122 </div>
123 <div class="vbo-quote-section-body">
124 <div class="vbo-quote-customer-choose">
125 <div class="vbo-singleselect-inline-elems-wrap vbo-search-elems-wrap">
126 <?php
127 /**
128 * Display a search elements dropdown for searching customers.
129 */
130 $selectedCustomer = [];
131 if (!empty($customer['id'])) {
132 $selectedCustomer = [
133 'id' => $customer['id'],
134 'text' => sprintf('%s %s', $customer['first_name'] ?? '', $customer['last_name'] ?? ''),
135 ];
136 } elseif (!empty($quote->idcustomer)) {
137 $selectedCustomer = [
138 'id' => $quote->idcustomer,
139 'text' => sprintf('%s %s', $quote->first_name ?? '', $quote->last_name ?? ''),
140 ];
141 }
142 echo $vbo_app->renderSearchElementsDropDown([
143 'id' => 'vbo-quote-search-customer',
144 'elements' => 'customers',
145 'placeholder' => JText::translate('VBOSEARCHEXISTCUST'),
146 'allow_clear' => true,
147 'attributes' => [
148 'name' => 'quote[customer][id]',
149 'data-field' => 'customer-id',
150 ],
151 'style_selection' => true,
152 'selection_class' => 'vbo-sel2-selected-search-elem-full',
153 'selection_event' => 'vbo-quote-customer-chosen',
154 'load_assets' => false,
155 'selected_value' => $selectedCustomer ?: null,
156 'width' => '300px',
157 ]);
158 ?>
159 </div>
160 </div>
161 <div class="vbo-quote-customer-fields">
162 <div class="vbo-quote-customer-field">
163 <label for="vbo-quote-customer-fname"><?php echo JText::translate('VBCUSTOMERFIRSTNAME'); ?></label>
164 <input type="text" id="vbo-quote-customer-fname" data-field="customer-firstname" value="<?php echo JHtml::fetch('esc_attr', $customer['first_name'] ?? $quote->first_name ?? ''); ?>" />
165 </div>
166 <div class="vbo-quote-customer-field">
167 <label for="vbo-quote-customer-lname"><?php echo JText::translate('VBCUSTOMERLASTNAME'); ?></label>
168 <input type="text" id="vbo-quote-customer-lname" data-field="customer-lastname" value="<?php echo JHtml::fetch('esc_attr', $customer['last_name'] ?? $quote->last_name ?? ''); ?>" />
169 </div>
170 <div class="vbo-quote-customer-field">
171 <label for="vbo-quote-customer-email"><?php echo JText::translate('VBCUSTOMEREMAIL'); ?></label>
172 <input type="email" id="vbo-quote-customer-email" data-field="customer-email" value="<?php echo JHtml::fetch('esc_attr', $customer['email'] ?? $quote->email ?? ''); ?>" />
173 </div>
174 <div class="vbo-quote-customer-field">
175 <label for="vbo-quote-customer-phone"><?php echo JText::translate('VBCUSTOMERPHONE'); ?></label>
176 <?php
177 echo $vbo_app->printPhoneInputField([
178 'id' => 'vbo-quote-customer-phone',
179 'name' => 'quote[customer][phone]',
180 'value' => JHtml::fetch('esc_attr', $customer['phone'] ?? $quote->phone ?? ''),
181 'class' => 'vbo-calendar-cfield-phone',
182 'data-field' => 'customer-phone',
183 'data-isphone' => '1',
184 ], [
185 'fullNumberOnBlur' => true,
186 'countryDataEvent' => 'vbo-quote-get-phone-country-data',
187 ]);
188 ?>
189 <input type="hidden" data-field="customer-country" value="<?php echo JHtml::fetch('esc_attr', $customer['country'] ?? $quote->country_3_code ?? ''); ?>" />
190 </div>
191 </div>
192 </div>
193 </div>
194
195 <div class="vbo-quote-section vbo-quote-section-options">
196 <div class="vbo-quote-section-head">
197 <span class="vbo-bg-icon"><?php VikBookingIcons::e('clipboard-list'); ?></span>
198 <span class="vbo-quote-section-name"><?php echo JText::translate('VBO_QUOTE_OPTIONS'); ?></span>
199 </div>
200 <div class="vbo-quote-section-body" data-section="options">
201 <?php
202 // if in edit-mode, display the current quote booking solutions
203 foreach ((array) ($quote->solutions ?? []) as $solIndex => $solution) {
204 // count booking solution values
205 $totRooms = count($solution->rooms);
206 $totAdults = array_sum(array_column($solution->rooms, 'adults'));
207 $totChildren = array_sum(array_column($solution->rooms, 'children'));
208 ?>
209 <div class="vbo-quote-new-option-wrap" data-active="0">
210 <div class="vbo-quote-option-title">
211 <h4><?php echo JText::translate('VBO_OPTION'); ?> #<span class="vbo-quote-option-number"><?php echo ++$solIndex; ?></span></h4>
212 <div class="vbo-quote-option-summary">
213 <span class="vbo-quote-option-summary-id"><?php VikBookingIcons::e('hashtag'); ?> <?php echo JText::translate('VBDASHUPRESONE'); ?> <span><?php echo $solution->id; ?></span></span>
214 <?php
215 // display booking solution status badge
216 if ($solution->status == 'confirmed') {
217 ?>
218 <span class="badge-medium badge-icon badge-success vbo-bold"><?php VikBookingIcons::e('check'); ?> <?php echo JText::translate('VBCONFIRMED'); ?></span>
219 <?php
220 } elseif ($solution->status == 'standby') {
221 ?>
222 <span class="badge-medium badge-icon badge-warning vbo-bold"><?php VikBookingIcons::e('clock'); ?> <?php echo JText::translate('VBSTANDBY'); ?></span>
223 <?php
224 } elseif ($solution->status == 'cancelled') {
225 ?>
226 <span class="badge-medium badge-icon badge-error vbo-bold"><?php VikBookingIcons::e('ban'); ?> <?php echo JText::translate('VBCANCELLED'); ?></span>
227 <?php
228 }
229 ?>
230 <span class="vbo-quote-option-summary-nights"><?php VikBookingIcons::e('moon'); ?> <?php echo JText::translate('VBDAYS'); ?> <span data-counter="nights"><?php echo $solution->nights; ?></span></span>
231 <span class="vbo-quote-option-summary-rooms"><?php VikBookingIcons::e('bed'); ?> <?php echo JText::translate('VBPVIEWORDERSTHREE'); ?> <span data-counter="rooms"><?php echo $totRooms; ?></span></span>
232 <span class="vbo-quote-option-summary-guests"><?php VikBookingIcons::e('users'); ?> <?php echo JText::translate('VBPVIEWORDERSPEOPLE'); ?> <span data-counter="guests"><?php echo $totAdults + $totChildren; ?></span></span>
233 </div>
234 </div>
235 <div class="vbo-quote-option-dates">
236 <div class="vbo-quote-option-date">
237 <label><?php echo JText::translate('VBPICKUPAT'); ?></label>
238 <div class="input-append">
239 <input type="text" autocomplete="off" size="10" data-field="checkin" readonly value="<?php echo date('Y-m-d', $solution->checkin); ?>" />
240 <button type="button" class="btn btn-secondary"><?php VikBookingIcons::e('calendar', 'icn-nomargin'); ?></button>
241 </div>
242 </div>
243 <div class="vbo-quote-option-date">
244 <label><?php echo JText::translate('VBRELEASEAT'); ?></label>
245 <div class="input-append">
246 <input type="text" autocomplete="off" size="10" data-field="checkout" readonly value="<?php echo date('Y-m-d', $solution->checkout); ?>" />
247 <button type="button" class="btn btn-secondary"><?php VikBookingIcons::e('calendar', 'icn-nomargin'); ?></button>
248 </div>
249 </div>
250 </div>
251 <div class="vbo-quote-option-rooms">
252 <?php
253 foreach ($solution->rooms as $roomSolIndex => $roomSolution) {
254 ?>
255 <div class="vbo-quote-option-new-room-wrap">
256 <div class="vbo-quote-option-room-title">
257 <h4><?php VikBookingIcons::e('bed'); ?> <span><?php echo JText::translate('VBEDITORDERTHREE'); ?> #<span class="vbo-quote-option-room-number"><?php echo ++$roomSolIndex; ?></span></span></h4>
258 </div>
259 <div class="vbo-quote-option-room-values">
260 <div class="vbo-quote-option-room-value" data-type="listing">
261 <label><?php echo JText::translate('VBO_LISTING'); ?></label>
262 <span><?php echo $roomSolution->name; ?></span>
263 </div>
264 <div class="vbo-quote-option-room-value" data-type="adults">
265 <label><?php echo JText::translate('VBEDITORDERADULTS'); ?></label>
266 <span><?php echo $roomSolution->adults; ?></span>
267 </div>
268 <div class="vbo-quote-option-room-value" data-type="children">
269 <label><?php echo JText::translate('VBEDITORDERCHILDREN'); ?></label>
270 <span><?php echo $roomSolution->children; ?></span>
271 </div>
272 <?php
273 if (!empty($roomSolution->optionals)) {
274 // raw string expected
275 $optionsList = array_values(array_unique(array_map(function($optStr) use ($optionRecords) {
276 // get the option ID
277 $optId = explode(':', $optStr)[0];
278 // find the corresponding name
279 foreach ($optionRecords as $optionRecord) {
280 if ($optionRecord['id'] == $optId) {
281 return $optionRecord['name'];
282 }
283 }
284 // default to option ID
285 return $optId;
286 }, array_filter(explode(';', $roomSolution->optionals)))));
287 ?>
288 <div class="vbo-quote-option-room-value" data-type="options">
289 <label><?php echo JText::translate('VBPEDITBUSYEIGHT'); ?></label>
290 <span><?php echo implode(', ', $optionsList); ?></span>
291 </div>
292 <?php
293 }
294 if (!empty($roomSolution->extracosts)) {
295 // array of arrays expected
296 ?>
297 <div class="vbo-quote-option-room-value" data-type="extras">
298 <label><?php echo JText::translate('VBPEDITBUSYEXTRACOSTS'); ?></label>
299 <span><?php echo implode(', ', array_column($roomSolution->extracosts, 'name')); ?></span>
300 </div>
301 <?php
302 }
303 ?>
304 </div>
305 </div>
306 <?php
307 }
308 ?>
309 </div>
310 <div class="vbo-quote-option-edit-booking">
311 <a href="index.php?option=com_vikbooking&task=editbusy&cid[]=<?php echo $solution->id; ?>" target="_blank" class="btn"><?php VikBookingIcons::e('edit'); ?> <?php echo JText::translate('VBMODRES'); ?></a>
312 </div>
313 <div class="vbo-quote-option-total">
314 <h4><?php VikBookingIcons::e('file-invoice-dollar'); ?> <span><?php echo JText::translate('VBPVIEWORDERSSEVEN'); ?></span> <span class="vbo-quote-option-total-cost"><?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($solution->total), $currencysymb); ?></span></h4>
315 </div>
316 </div>
317 <?php
318 }
319 ?>
320 </div>
321 <div class="vbo-quote-section-footer" style="<?php echo $quote ? 'display: none;' : ''; ?>">
322 <button type="button" class="btn vbo-quote-option-add-btn"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBO_NEW_OPTION'); ?></button>
323 </div>
324 </div>
325
326 <div class="vbo-quote-section vbo-quote-section-message">
327 <div class="vbo-quote-section-head-wrap">
328 <div class="vbo-quote-section-head">
329 <span class="vbo-bg-icon"><?php VikBookingIcons::e('comment'); ?></span>
330 <span class="vbo-quote-section-name"><?php echo JText::translate('VBSENDSMSCUSTCONT'); ?></span>
331 </div>
332 <?php
333 if ($prefMessages) {
334 ?>
335 <div class="vbo-quote-section-floating">
336 <label for="vbo-quote-message-preftpl"><?php VikBookingIcons::e('star'); ?> <?php echo JText::translate('VBO_SEL_PREF_MESS'); ?></label>
337 <select id="vbo-quote-message-preftpl" data-field="message-preferred-tpl">
338 <option value=""></option>
339 <?php
340 foreach ($prefMessages as $prefMessage) {
341 ?>
342 <option value="<?php echo $prefMessage->id; ?>"<?php echo $quote && $quote->id == $prefMessage->id ? ' selected="selected"' : ''; ?>><?php echo sprintf('%s (%s)', $prefMessage->name, JHtml::fetch('date', $prefMessage->created_on, 'd M Y H:i')); ?></option>
343 <?php
344 }
345 ?>
346 </select>
347 </div>
348 <?php
349 }
350 ?>
351 </div>
352 <div class="vbo-quote-section-body">
353 <div class="vbo-quote-mail-subject">
354 <label for="vbo-quote-mail-subject"><?php echo JText::translate('VBSENDEMAILCUSTSUBJ'); ?></label>
355 <input type="text" id="vbo-quote-mail-subject" data-field="mail-subject" value="<?php echo JHtml::fetch('esc_attr', ($quote->subject ?? '')); ?>" />
356 </div>
357 <div class="vbo-quote-mail-message">
358 <?php
359 echo $vbo_app->renderVisualEditor(
360 'quote_message_content',
361 ($quote ? $quote->message : $defaultMessage),
362 [
363 'id' => 'vbo-quote-message-content',
364 'style' => 'min-height: 50px; width: 100%;',
365 ],
366 [
367 'modes' => [
368 'visual',
369 'text',
370 ],
371 'gen_ai' => [
372 'placeholders' => 1,
373 'environment' => 'quote',
374 ],
375 ],
376 [
377 '{first_name}',
378 '{last_name}',
379 '{checkin_date}',
380 '{checkout_date}',
381 '{num_nights}',
382 '{tot_adults}',
383 '{tot_children}',
384 '{tot_guests}',
385 '{quote_link}',
386 ]
387 );
388 ?>
389 </div>
390 <div class="vbo-quote-notes">
391 <label for="vbo-quote-notes"><?php echo JText::translate('VBPSHOWPAYMENTSTHREE'); ?></label>
392 <textarea id="vbo-quote-notes" data-field="notes"><?php echo JHtml::fetch('esc_textarea', ($quote->notes ?? '')); ?></textarea>
393 <div class="vbo-quote-label-help"><?php echo JText::translate('VBO_QUOTE_NOTES_HELP'); ?></div>
394 </div>
395 <div class="vbo-quote-mail-preferred vbo-toggle-mini">
396 <label for="quote_message_preferred-on"><?php echo JText::translate('VBO_SAVE_PREF'); ?></label>
397 <?php echo $vbo_app->printYesNoButtons('quote_message_preferred', JText::translate('VBYES'), JText::translate('VBNO'), (!$quote || !empty($quote->preferred) ? 1 : 0), 1, 0); ?>
398 <div class="vbo-quote-label-help"><?php echo JText::translate('VBO_PREF_MESS_HELP'); ?></div>
399 </div>
400 </div>
401 </div>
402
403 <div class="vbo-quote-section vbo-quote-section-validity">
404 <div class="vbo-quote-section-head">
405 <span class="vbo-bg-icon"><?php VikBookingIcons::e('clock'); ?></span>
406 <span class="vbo-quote-section-name"><?php echo JText::translate('VBO_VALIDITY'); ?></span>
407 </div>
408 <div class="vbo-quote-section-body">
409 <div class="vbo-quote-validity-date">
410 <label for="vbo-quote-valid-until"><?php echo JText::translate('VBO_QUOTE_VALIDITY'); ?> <span class="vbo-quote-validity-date-help"><?php VikBookingIcons::e('circle-question', 'icn-nomargin'); ?></span></label>
411 <?php
412 $validUntilVal = JFactory::getDate('+2 days 23:59')->format('Y-m-d H:i');
413 if ($quote) {
414 if (!empty($quote->valid_until)) {
415 $validUntilVal = JHtml::fetch('date', $quote->valid_until, 'Y-m-d H:i');
416 } else {
417 $validUntilVal = '';
418 }
419 }
420 echo $vbo_app->renderDateTimePicker([
421 'id' => 'vbo-quote-valid-until',
422 'min' => JFactory::getDate('now')->format('Y-m-d\TH:i'),
423 'value' => $validUntilVal,
424 'attributes' => [
425 'data-field' => 'valid-until',
426 ],
427 ]);
428 ?>
429 </div>
430 <?php
431 if ($paymentMethods) {
432 ?>
433 <div class="vbo-quote-payment-block">
434 <label for="vbo-quote-payment-id"><?php echo JText::translate('VBLIBPAYNAME'); ?></label>
435 <select id="vbo-quote-payment-id" data-field="quote-payment">
436 <option value="">- <?php echo JText::translate('VBO_USE_DEFAULT'); ?> -</option>
437 <?php
438 foreach ($paymentMethods as $paymentMethod) {
439 $paymentIdentifier = sprintf('%d=%s', $paymentMethod->id, $paymentMethod->name);
440 $isPaymentSel = ($quote && ($quote->solutions[0]->idpayment ?? '') == $paymentIdentifier);
441 ?>
442 <option value="<?php echo JHtml::fetch('esc_attr', $paymentIdentifier); ?>"<?php echo $isPaymentSel ? ' selected="selected"' : ''; ?>><?php echo $paymentMethod->name; ?></option>
443 <?php
444 }
445 ?>
446 </select>
447 </div>
448 <?php
449 }
450 ?>
451 <div class="vbo-quote-name-block">
452 <label for="vbo-quote-ref-name"><?php echo JText::translate('VBO_QUOTE_NAME'); ?></label>
453 <input type="text" id="vbo-quote-ref-name" data-field="quote-name" placeholder="<?php echo date('Y-m-d H:i'); ?>" value="<?php echo $quote ? JHtml::fetch('esc_attr', $quote->name) : ''; ?>" />
454 </div>
455 </div>
456 </div>
457
458 <div class="vbo-quote-section-buttons">
459 <?php
460 if ($quote) {
461 ?>
462 <div class="vbo-quote-section-delete">
463 <button type="button" class="btn btn-large btn-danger vbo-quote-delete-btn"><?php VikBookingIcons::e('ban'); ?> <?php echo JText::translate('VBELIMINA'); ?></button>
464 </div>
465 <?php
466 }
467 ?>
468
469 <div class="vbo-quote-section-send">
470 <a name="quote-apply"></a>
471 <?php
472 if ($quote) {
473 ?>
474 <button type="button" class="btn btn-large vbo-config-btn vbo-quote-update-btn"><?php VikBookingIcons::e('check'); ?> <?php echo JText::translate('VBADMINNOTESUPD'); ?></button>
475 <?php
476 } else {
477 ?>
478 <div class="vbo-quote-send-later vbo-toggle-mini">
479 <label for="quote_send_later-on"><?php echo JText::translate('VBO_SEND_LATER'); ?></label>
480 <?php echo $vbo_app->printYesNoButtons('quote_send_later', JText::translate('VBYES'), JText::translate('VBNO'), 0, 1, 0); ?>
481 </div>
482 <button type="button" class="btn btn-large vbo-config-btn vbo-quote-submit-btn"><?php VikBookingIcons::e('paper-plane'); ?> <?php echo JText::translate('VBO_SEND_QUOTE'); ?></button>
483 <?php
484 }
485 ?>
486 </div>
487 </div>
488
489 </div>
490 </div>
491
492 <div class="vbo-quote-helper" style="display: none;">
493
494 <div class="vbo-quote-new-option-wrap" data-active="0">
495 <div class="vbo-quote-option-title">
496 <h4><?php echo JText::translate('VBO_OPTION'); ?> #<span class="vbo-quote-option-number"></span></h4>
497 <div class="vbo-quote-option-summary">
498 <span class="vbo-quote-option-summary-nights"><?php VikBookingIcons::e('moon'); ?> <?php echo JText::translate('VBDAYS'); ?> <span data-counter="nights">0</span></span>
499 <span class="vbo-quote-option-summary-rooms"><?php VikBookingIcons::e('bed'); ?> <?php echo JText::translate('VBPVIEWORDERSTHREE'); ?> <span data-counter="rooms">0</span></span>
500 <span class="vbo-quote-option-summary-guests"><?php VikBookingIcons::e('users'); ?> <?php echo JText::translate('VBPVIEWORDERSPEOPLE'); ?> <span data-counter="guests">0</span></span>
501 </div>
502 <div class="vbo-quote-option-delete">
503 <button type="button" class="btn btn-small vbo-btn-transparent vbo-quote-option-remove-btn"><?php VikBookingIcons::e('trash', 'no-margin'); ?></button>
504 </div>
505 </div>
506 <div class="vbo-quote-option-dates">
507 <div class="vbo-quote-option-date">
508 <label><?php echo JText::translate('VBPICKUPAT'); ?></label>
509 <div class="input-append">
510 <input type="text" autocomplete="off" size="10" data-field="checkin" />
511 <button type="button" class="btn btn-secondary checkindate-trig"><?php VikBookingIcons::e('calendar', 'icn-nomargin'); ?></button>
512 </div>
513 </div>
514 <div class="vbo-quote-option-date">
515 <label><?php echo JText::translate('VBRELEASEAT'); ?></label>
516 <div class="input-append">
517 <input type="text" autocomplete="off" size="10" data-field="checkout" />
518 <button type="button" class="btn btn-secondary checkoutdate-trig"><?php VikBookingIcons::e('calendar', 'icn-nomargin'); ?></button>
519 </div>
520 </div>
521 </div>
522 <div class="vbo-quote-option-rooms"></div>
523 <div class="vbo-quote-option-rooms-add">
524 <button type="button" class="btn vbo-quote-option-room-add-btn"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBOBOOKADDROOM'); ?></button>
525 </div>
526 <div class="vbo-quote-option-total" style="display: none;">
527 <h4><?php VikBookingIcons::e('file-invoice-dollar'); ?> <span><?php echo JText::translate('VBPVIEWORDERSSEVEN'); ?></span> <span class="vbo-quote-option-total-cost"><?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat(0), $currencysymb); ?></span></h4>
528 </div>
529 </div>
530
531 <div class="vbo-quote-option-new-room-wrap">
532 <div class="vbo-quote-option-room-title">
533 <h4><?php VikBookingIcons::e('bed'); ?> <span><?php echo JText::translate('VBEDITORDERTHREE'); ?> #<span class="vbo-quote-option-room-number"></span></span></h4>
534 <div class="vbo-quote-option-room-delete">
535 <button type="button" class="btn btn-small vbo-btn-transparent vbo-quote-option-room-remove-btn"><?php VikBookingIcons::e('trash', 'no-margin'); ?></button>
536 </div>
537 </div>
538 <div class="vbo-quote-option-availability">
539 <span></span>
540 </div>
541 <div class="vbo-quote-option-room-values">
542 <div class="vbo-quote-option-room-value" data-type="listing">
543 <label><?php echo JText::translate('VBO_LISTING'); ?></label>
544 <select data-field="listing">
545 <option value=""></option>
546 <?php
547 foreach (VikBooking::getAvailabilityInstance(true)->loadRooms([], 0, true) as $listing) {
548 ?>
549 <option value="<?php echo $listing['id']; ?>"><?php echo $listing['name']; ?></option>
550 <?php
551 }
552 ?>
553 </select>
554 </div>
555 <div class="vbo-quote-option-room-value" data-type="adults">
556 <label><?php echo JText::translate('VBEDITORDERADULTS'); ?></label>
557 <input type="number" data-field="adults" value="2" step="1" min="0" />
558 </div>
559 <div class="vbo-quote-option-room-value" data-type="children">
560 <label><?php echo JText::translate('VBEDITORDERCHILDREN'); ?></label>
561 <input type="number" data-field="children" value="0" step="1" min="0" />
562 </div>
563 <div class="vbo-quote-option-room-value" data-type="roomrate">
564 <label><?php echo JText::translate('VBOROVWSELRPLAN'); ?></label>
565 <select data-field="roomrate">
566 <option value=""></option>
567 </select>
568 <div class="vbo-quote-label-help text-red" data-type="rate-error" style="display: none;"></div>
569 </div>
570 <div class="vbo-quote-option-room-value" data-type="customrate">
571 <div class="vbo-quote-customrate-value">
572 <label><?php echo JText::translate('VBOROOMCUSTRATEPLANADD'); ?></label>
573 <div class="vbo-input-currency-wrap">
574 <span><?php echo VikBooking::getCurrencySymb(); ?></span>
575 <input type="number" data-field="customrate" value="" min="0" />
576 </div>
577 </div>
578 <?php
579 if ($taxRates) {
580 ?>
581 <div class="vbo-quote-customrate-idtax" style="display: none;">
582 <label><?php echo JText::translate('VBNEWOPTFOUR'); ?></label>
583 <select data-field="customrate-idtax">
584 <option value=""></option>
585 <?php
586 foreach ($taxRates as $taxRate) {
587 ?>
588 <option value="<?php echo $taxRate['id']; ?>"><?php echo sprintf('%s - %s', (string) $taxRate['name'], $taxRate['aliq'] . '%'); ?></option>
589 <?php
590 }
591 ?>
592 </select>
593 </div>
594 <?php
595 }
596 ?>
597 </div>
598 </div>
599 <div class="vbo-editbooking-room-services vbo-quote-option-room-fees">
600 <h4><?php echo JText::translate('VBPEDITBUSYEIGHT'); ?></h4>
601 <div class="vbo-editbooking-room-services-wrap">
602 <?php
603 // display all option records, hidden by default
604 foreach ($optionRecords as $optionRecord) {
605 $isMultiQuantity = boolval($optionRecord['hmany']);
606 $isCostPercent = boolval($optionRecord['pcentroom']);
607 $isChildAge = (!empty($optionRecord['ifchildren']) && !empty($optionRecord['ageintervals']));
608 $displayCost = $isCostPercent ? $optionRecord['cost'] . '%' : VikBooking::formatCurrencyNumber(VikBooking::numberFormat($optionRecord['cost']), $currencysymb);
609 ?>
610 <div class="vbo-editbooking-room-service" data-eligible="0" data-child-age="<?php echo (int) $isChildAge; ?>" data-option-id="<?php echo $optionRecord['id']; ?>" style="display: none;">
611 <div class="vbo-editbooking-room-service-inner">
612 <label><?php echo $optionRecord['name']; ?></label>
613 <div class="vbo-editbooking-room-service-price" data-cost-value="<?php echo $optionRecord['cost']; ?>" data-cost-pcent="<?php echo (int) $isCostPercent; ?>"><?php echo $displayCost; ?></div>
614 </div>
615 <div class="vbo-editbooking-room-service-check" data-multiple-quantity="<?php echo (int) $isMultiQuantity; ?>">
616 <?php
617 if (!$isChildAge) {
618 // display an input field by default
619 if ($isMultiQuantity) {
620 // multiple quantity
621 ?>
622 <input type="number" min="0" data-field="option" data-option-id="<?php echo $optionRecord['id']; ?>" value="" />
623 <?php
624 } else {
625 // single quantity
626 ?>
627 <input type="checkbox" data-field="option" data-option-id="<?php echo $optionRecord['id']; ?>" value="1" />
628 <?php
629 }
630 }
631 ?>
632 </div>
633 </div>
634 <?php
635 }
636 ?>
637 </div>
638 </div>
639 <div class="vbo-quote-option-room-extras">
640 <div class="vbo-quote-option-room-extras-inner">
641 <h4><?php echo JText::translate('VBPEDITBUSYEXTRACOSTS'); ?></h4>
642 <button type="button" class="btn vbo-quote-option-room-extra-add-btn"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBPEDITBUSYADDEXTRAC'); ?></button>
643 </div>
644 <div class="vbo-quote-option-room-extras-list"></div>
645 </div>
646 </div>
647
648 <div class="vbo-quote-option-room-new-extra-wrap">
649 <div class="vbo-editbooking-room-extracost">
650 <div class="vbo-ebusy-extracosts-cellname">
651 <input type="text" value="" data-field="extra-name" placeholder="<?php echo JHtml::fetch('esc_attr', JText::translate('VBPEDITBUSYEXTRACNAME')); ?>" />
652 </div>
653 <div class="vbo-ebusy-extracosts-cellcost">
654 <div class="vbo-input-currency-wrap">
655 <span><?php echo VikBooking::getCurrencySymb(); ?></span>
656 <input type="number" data-field="extra-cost" value="" min="0" />
657 </div>
658 </div>
659 <?php
660 if ($taxRates) {
661 ?>
662 <div class="vbo-ebusy-extracosts-celltax">
663 <select data-field="extra-taxrate">
664 <option value=""><?php echo JText::translate('VBNEWOPTFOUR'); ?></option>
665 <?php
666 foreach ($taxRates as $taxRate) {
667 ?>
668 <option value="<?php echo $taxRate['id']; ?>"><?php echo sprintf('%s - %s', (string) $taxRate['name'], $taxRate['aliq'] . '%'); ?></option>
669 <?php
670 }
671 ?>
672 </select>
673 </div>
674 <?php
675 }
676 ?>
677 <div class="vbo-ebusy-extracosts-cellrm">
678 <button type="button" class="btn btn-small vbo-btn-transparent vbo-quote-option-extra-remove-btn"><?php VikBookingIcons::e('trash', 'no-margin'); ?></button>
679 </div>
680 </div>
681 </div>
682
683 </div>
684