PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.8
VikBooking Hotel Booking Engine & PMS v1.8.8
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
vikbooking / admin / layouts / quote / manage / html.php

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

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