PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.9
VikBooking Hotel Booking Engine & PMS v1.8.9
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.9, at admin/layouts/quote/manage/html.php

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