Merge pull request #475 from shreesh-webkul/qlo-occupancy-update
Added Feature: Occupancy wise search and booking
This commit is contained in:
@@ -50,6 +50,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
// buttons text align
|
||||
.btn-left {
|
||||
text-align: left;
|
||||
}
|
||||
.btn-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
|
||||
// Alternate buttons
|
||||
// --------------------------------------------------
|
||||
@@ -140,8 +148,6 @@
|
||||
.btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
// Vertically space out multiple block buttons
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
{l s='Cart Details'}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="col-lg-12 table-responsive">
|
||||
<table class="table" id="customer_cart_details_table">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -31,6 +31,9 @@
|
||||
<th><span class="title_box">{l s='Room Image'}</th>
|
||||
<th><span class="title_box">{l s='Room Type'}</span></th>
|
||||
<th><span class="title_box">{l s='Duration'}</span></th>
|
||||
{if $occupancy_required_for_booking}
|
||||
<th><span class="fixed-width-lg title_box">{l s='Occupancy'}</span></th>
|
||||
{/if}
|
||||
<th><span class="title_box">{l s='Unit Price (tax excl)'}</span></th>
|
||||
<th><span class="title_box">{l s='Additinal Facilities (tax excl)'}</span></th>
|
||||
<th><span class="title_box">{l s='Total Rooms Price (tax excl)'}</span></th>
|
||||
@@ -42,7 +45,7 @@
|
||||
{if isset($cart_detail_data) && $cart_detail_data}
|
||||
{assign var=curr_id value=$cart->id_currency|intval}
|
||||
{foreach from=$cart_detail_data item=data}
|
||||
<tr>
|
||||
<tr data-id-booking-data="{$data.id}" data-id-product="{$data.id_product}" data-id-room="{$data.id_room}" data-date-from="{$data.date_from}" data-date-to="{$data.date_to}" >
|
||||
<td>{$data.room_num|escape:'html':'UTF-8'}</td>
|
||||
<td><img src="{$data.image_link|escape:'html':'UTF-8'}" title="Room image" /></td>
|
||||
<td>
|
||||
@@ -58,13 +61,71 @@
|
||||
{/if}
|
||||
</td>
|
||||
<td>{dateFormat date=$data.date_from} - {dateFormat date=$data.date_to}</td>
|
||||
{if $occupancy_required_for_booking}
|
||||
<td>
|
||||
<div class="dropdown">
|
||||
<button class="booking_guest_occupancy btn btn-default btn-left btn-block input-occupancy" type="button">
|
||||
<span>
|
||||
{if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}
|
||||
</span>
|
||||
</button>
|
||||
<div class="dropdown-menu booking_occupancy_wrapper fixed-width-xxl">
|
||||
<div class="booking_occupancy_inner">
|
||||
<input type="hidden" class="max_adults" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_children" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_children']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_guests" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_guests']|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="occupancy_info_block selected" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><span class="room_num_wrapper">{l s='Room - 1'}</span></div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6 occupancy_count_block">
|
||||
<div class="col-sm-12">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="{$data['adults']}" min="1" max="{$data['room_type_info']['max_adults']|escape:'html':'UTF-8'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-6 occupancy_count_block">
|
||||
<div class="col-sm-12">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="{$data['children']}" min="0" max="{$data['room_type_info']['max_children']|escape:'html':'UTF-8'}">
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" {if !isset($data['child_ages']) || !$data['child_ages']}style="display:none"{/if}>
|
||||
<div class="col-sm-12">
|
||||
<label class="col-sm-12">{l s='All Children'}</label>
|
||||
<div class="col-sm-12">
|
||||
<div class="row children_ages">
|
||||
{if isset($data['child_ages']) && $data['child_ages']}
|
||||
{foreach $data['child_ages'] as $childAge}
|
||||
<p class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<select class="guest_child_age room_occupancies" name="occupancy[0][child_ages][]">
|
||||
<option value="-1" {if $childAge == -1}selected{/if}>{l s='Select 1'}</option>
|
||||
<option value="0" {if $childAge == 0}selected{/if}>{l s='Under 1'}</option>
|
||||
{for $age=1 to ($max_child_age-1)}
|
||||
<option value="{$age|escape:'htmlall':'UTF-8'}" {if $childAge == $age}selected{/if}>{$age|escape:'htmlall':'UTF-8'}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</p>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
{/if}
|
||||
<td id="cart_detail_data_unit_price_{$data.id|escape:'html':'UTF-8'}">
|
||||
{if $data.feature_price_diff != 0}
|
||||
{assign var=shown_room_type_price value=$data.feature_price_tax_excl}
|
||||
{else}
|
||||
{assign var=shown_room_type_price value=$data.product_price_tax_excl}
|
||||
{/if}
|
||||
<input type="text" class="room_unit_price" data-id-booking-data="{$data.id}" data-id-product="{$data.id_product}" data-id-room="{$data.id_room}" data-date-from="{$data.date_from}" data-date-to="{$data.date_to}" value="{$shown_room_type_price|escape:'html':'UTF-8'}">
|
||||
<input type="text" class="room_unit_price" value="{$shown_room_type_price|escape:'html':'UTF-8'}">
|
||||
</td>
|
||||
<td>
|
||||
{if isset($data.extra_demands) && $data.extra_demands}
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
</div>
|
||||
</center>
|
||||
</td>
|
||||
<td style="display:none;" class="text-center" colspan="2">
|
||||
<td style="display:none;" class="text-center">
|
||||
<center>
|
||||
<div class="row">
|
||||
<div class="input-group fixed-width-xl">
|
||||
@@ -83,17 +83,66 @@
|
||||
</div>
|
||||
</center>
|
||||
</td>
|
||||
<td style="display:none;" class="productQuantity text-center">
|
||||
<center>
|
||||
<input type="number" class="form-control fixed-width-sm" name="add_product[product_quantity]" id="add_product_product_quantity" value="1" disabled="disabled" min="1"/>
|
||||
</center>
|
||||
|
||||
<td style="display:none;" class="productQuantity text-center" colspan="2">
|
||||
{if $order->with_occupancy}
|
||||
<div class="booking_occupancy">
|
||||
<div class="dropdown">
|
||||
<button class="booking_guest_occupancy btn btn-default btn-left btn-block input-occupancy disabled" type="button">
|
||||
<span>{l s='Select occupancy'}</span>
|
||||
</button>
|
||||
<input type="hidden" class="max_avail_type_qty" value="">
|
||||
<div class="dropdown-menu booking_occupancy_wrapper fixed-width-xxl well well-sm">
|
||||
<div class="booking_occupancy_inner">
|
||||
<input type="hidden" class="max_adults" value="">
|
||||
<input type="hidden" class="max_children" value="">
|
||||
<input type="hidden" class="max_guests" value="">
|
||||
<div class="occupancy_info_block col-sm-12" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">{l s='Room - 1'}</label></div>
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="1" min="1">
|
||||
</div>
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="0" min="0" {if $max_child_in_room}max="{$max_child_in_room}"{/if}>
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" style="display:none">
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="">{l s='All Children'}</label>
|
||||
<div class="">
|
||||
<div class="row children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator col-sm-12">
|
||||
</div>
|
||||
<div class="add_occupancy_block">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room'}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<center>
|
||||
<input type="number" class="form-control fixed-width-sm" name="add_product[product_quantity]" id="add_product_product_quantity" value="1" disabled="disabled" min="1"/>
|
||||
</center>
|
||||
{/if}
|
||||
|
||||
</td>
|
||||
{*{if ($order->hasBeenPaid())}<td style="display:none;" class="productQuantity"></td>{/if}
|
||||
{if $display_warehouse}<td></td>{/if}
|
||||
{if ($order->hasBeenDelivered())}<td style="display:none;" class="productQuantity"></td>{/if}
|
||||
<td style="display:none;" class="productQuantity" id="add_product_product_stock">0</td>*}
|
||||
<td style="display:none;" id="add_product_product_total" class="text-center">{displayPrice price=0 currency=$currency->id}</td>
|
||||
<td style="display:none;" colspan="2" class="text-center">
|
||||
<td style="display:none;" class="text-center">
|
||||
{if sizeof($invoices_collection)}
|
||||
<select class="form-control" name="add_product[invoice]" id="add_product_product_invoice" disabled="disabled">
|
||||
<optgroup class="existing" label="{l s='Existing'}">
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<div class="fixed-width-xl room_check_in_div">
|
||||
<div class="input-group">
|
||||
<div class="input-group-addon">{l s='Check In'}</div>
|
||||
<input type="text" class="form-control add_product_date_from" name="add_product[date_from]" value="{$data.date_from|date_format:"%d-%m-%Y"}" readonly/>
|
||||
<input type="text" class="form-control edit_product_date_from" name="edit_product[date_from]" value="{$data.date_from|date_format:"%d-%m-%Y"}" readonly/>
|
||||
<div class="input-group-addon"><i class="icon-calendar"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -70,7 +70,7 @@
|
||||
<div class="fixed-width-xl room_check_out_div">
|
||||
<div class="input-group">
|
||||
<div class="input-group-addon">{l s='Check Out'}</div>
|
||||
<input type="text" class="form-control add_product_date_to" name="add_product[date_to]" value="{$data.date_to|date_format:"%d-%m-%Y"}" readonly/>
|
||||
<input type="text" class="form-control edit_product_date_to" name="edit_product[date_to]" value="{$data.date_to|date_format:"%d-%m-%Y"}" readonly/>
|
||||
<div class="input-group-addon"><i class="icon-calendar"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -78,6 +78,87 @@
|
||||
</div>
|
||||
{/if}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
{if $order->with_occupancy && $data['children']}
|
||||
<div class="dropdown booking_occupancy_show">
|
||||
<button class="btn btn-default btn-left btn-block" data-toggle="dropdown" type="button">
|
||||
<span>{if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}</span>
|
||||
</button>
|
||||
<div class="dropdown-menu well well-sm">
|
||||
<label>{l s='Children Ages'}</label>
|
||||
{if isset($data['child_ages']) && $data['child_ages']}
|
||||
{foreach $data['child_ages'] as $childAge}
|
||||
<p class="">
|
||||
{l s='Child %s : %s years' sprintf=[$childAge@iteration, $childAge]}
|
||||
</p>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<span class="booking_occupancy_show">{if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}</span>
|
||||
{/if}
|
||||
{if $order->with_occupancy}
|
||||
<div class="booking_occupancy_edit" style="display:none;">
|
||||
<div class="dropdown">
|
||||
<button class="booking_guest_occupancy btn btn-default btn-left btn-block input-occupancy" type="button">
|
||||
<span>
|
||||
{if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}
|
||||
</span>
|
||||
</button>
|
||||
<div class="dropdown-menu booking_occupancy_wrapper fixed-width-xxl well well-sm">
|
||||
<div class="booking_occupancy_inner">
|
||||
<input type="hidden" class="max_adults" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_children" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_children']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_guests" value="{if isset($data['room_type_info'])}{$data['room_type_info']['max_guests']|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="occupancy_info_block" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><span class="room_num_wrapper">{l s='Room - 1'}</span></div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6 occupancy_count_block">
|
||||
<div class="col-sm-12">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="{$data['adults']}" min="1" max="{$data['room_type_info']['max_adults']|escape:'html':'UTF-8'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-6 occupancy_count_block">
|
||||
<div class="col-sm-12">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="{$data['children']}" min="0" max="{$data['room_type_info']['max_children']|escape:'html':'UTF-8'}">
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" {if !isset($data['child_ages']) || !$data['child_ages']}style="display:none"{/if}>
|
||||
<div class="col-sm-12">
|
||||
<label class="col-sm-12">{l s='All Children'}</label>
|
||||
<div class="col-sm-12">
|
||||
<div class="row children_ages">
|
||||
{if isset($data['child_ages']) && $data['child_ages']}
|
||||
{foreach $data['child_ages'] as $childAge}
|
||||
<p class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<select class="guest_child_age room_occupancies" name="occupancy[0][child_ages][]">
|
||||
<option value="-1" {if $childAge == -1}selected{/if}>{l s='Select 1'}</option>
|
||||
<option value="0" {if $childAge == 0}selected{/if}>{l s='Under 1'}</option>
|
||||
{for $age=1 to ($max_child_age-1)}
|
||||
<option value="{$age|escape:'htmlall':'UTF-8'}" {if $childAge == $age}selected{/if}>{$age|escape:'htmlall':'UTF-8'}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</p>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<span class="booking_occupancy_edit" style="display:none;">{if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="room_unit_price_show">
|
||||
|
||||
@@ -241,12 +241,13 @@
|
||||
e.preventDefault();
|
||||
var cart_row = $(this).closest('tr');
|
||||
var params = {
|
||||
id_booking_data: parseInt($(this).attr('data-id-booking-data')),
|
||||
id_product: parseInt($(this).attr('data-id-product')),
|
||||
id_room: parseInt($(this).attr('data-id-room')),
|
||||
date_from: $(this).attr('data-date-from'),
|
||||
date_to: $(this).attr('data-date-to'),
|
||||
price: $(this).val(),
|
||||
id_booking_data: parseInt($(cart_row).attr('data-id-booking-data')),
|
||||
id_product: parseInt($(cart_row).attr('data-id-product')),
|
||||
id_room: parseInt($(cart_row).attr('data-id-room')),
|
||||
date_from: $(cart_row).attr('data-date-from'),
|
||||
date_to: $(cart_row).attr('data-date-to'),
|
||||
price: new Number($(this).val().replace(",",".")).toFixed(4).toString(),
|
||||
id_cart: id_cart
|
||||
};
|
||||
updateProductPrice(params, cart_row);
|
||||
})
|
||||
@@ -272,6 +273,7 @@
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
resetBind();
|
||||
|
||||
$('#customer').focus();
|
||||
@@ -332,6 +334,205 @@
|
||||
$('#search-customer-form-group').show();
|
||||
$(this).blur();
|
||||
});
|
||||
|
||||
{literal}
|
||||
$(document).on('click', '.booking_occupancy_wrapper .remove-room-link', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
booking_occupancy_inner = $(this).closest('.booking_occupancy_inner');
|
||||
$(this).closest('.occupancy_info_block').remove();
|
||||
$(booking_occupancy_inner).find('.room_num_wrapper').each(function(key, val) {
|
||||
$(this).text(room_txt + ' - '+ (key+1) );
|
||||
});
|
||||
setRoomTypeGuestOccupancy($(booking_occupancy_inner).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('change', '.num_occupancy', function(e) {
|
||||
let current_room_occupancy = 0;
|
||||
$(this).closest('.occupancy_info_block').find('.num_occupancy').each(function(){
|
||||
current_room_occupancy += parseInt($(this).val());
|
||||
});
|
||||
let max_guests_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_guests').val();
|
||||
let max_allowed_for_current = (max_guests_in_room - current_room_occupancy) + parseInt($(this).val());
|
||||
if ($(this).val() > $(this).attr('max')) {
|
||||
$(this).val($(this).attr('max'));
|
||||
}
|
||||
if ($(this).val() > max_allowed_for_current) {
|
||||
$(this).val(max_allowed_for_current);
|
||||
}
|
||||
if ($(this).hasClass('num_children')) {
|
||||
var totalChilds = $(this).closest('.occupancy_info_block').find('.guest_child_age').length;
|
||||
if (totalChilds < $(this).val()) {
|
||||
if (totalChilds < max_child_in_room) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').show();
|
||||
while ($(this).closest('.occupancy_info_block').find('.guest_child_age').length < $(this).val()) {
|
||||
|
||||
|
||||
var roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index'));
|
||||
|
||||
var childAgeSelect = '<p class="col-xs-12 col-sm-12 col-md-6 col-lg-6">';
|
||||
childAgeSelect += '<select class="guest_child_age room_occupancies" name="occupancy[' +roomBlockIndex+ '][child_ages][]">';
|
||||
childAgeSelect += '<option value="-1">' + select_age_txt + '</option>';
|
||||
childAgeSelect += '<option value="0">' + under_1_age + '</option>';
|
||||
for (let age = 1; age < max_child_age; age++) {
|
||||
childAgeSelect += '<option value="'+age+'">'+age+'</option>';
|
||||
}
|
||||
childAgeSelect += '</select>';
|
||||
childAgeSelect += '</p>';
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let child = $(this).val();
|
||||
$(this).closest('.occupancy_info_block').find('.guest_child_age').each(function(ind, element) {
|
||||
if (child <= ind) {
|
||||
$(element).parent().remove();
|
||||
}
|
||||
});
|
||||
if (child == 0) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').hide();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper'));
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(document).on('click', '.booking_guest_occupancy', function(e) {
|
||||
$(this).parent().toggleClass('open');
|
||||
});
|
||||
|
||||
$(document).on('click', function(e) {
|
||||
if ($('.booking_occupancy_wrapper:visible').length) {
|
||||
var occupancy_wrapper = $('.booking_occupancy_wrapper:visible');
|
||||
$(occupancy_wrapper).find(".occupancy_info_block").addClass('selected');
|
||||
if (!($(e.target).closest(".booking_occupancy_wrapper").length || $(e.target).closest(".booking_guest_occupancy").length || $(e.target).closest(".ajax_add_to_cart_button").length || $(e.target).closest(".exclusive.book_now_submit").length)) {
|
||||
let hasErrors = 0;
|
||||
|
||||
let adults = $(occupancy_wrapper).find(".num_adults").map(function(){return $(this).val();}).get();
|
||||
let children = $(occupancy_wrapper).find(".num_children").map(function(){return $(this).val();}).get();
|
||||
let child_ages = $(occupancy_wrapper).find(".guest_child_age").map(function(){return $(this).val();}).get();
|
||||
|
||||
// start validating above values
|
||||
if (!adults.length || (adults.length != children.length)) {
|
||||
hasErrors = 1;
|
||||
showErrorMessage(invalid_occupancy_txt);
|
||||
} else {
|
||||
$(occupancy_wrapper).find('.occupancy_count').removeClass('error_border');
|
||||
|
||||
// validate values of adults and children
|
||||
adults.forEach(function (item, index) {
|
||||
if (isNaN(item) || parseInt(item) < 1) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
if (isNaN(children[index])) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
});
|
||||
|
||||
// validate values of selected child ages
|
||||
$(occupancy_wrapper).find('.guest_child_age').parent().removeClass('has-error');
|
||||
child_ages.forEach(function (age, index) {
|
||||
age = parseInt(age);
|
||||
if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".guest_child_age").eq(index).parent().addClass('has-error');
|
||||
}
|
||||
});
|
||||
}
|
||||
if (hasErrors == 0) {
|
||||
$(occupancy_wrapper).parent().removeClass('open');
|
||||
$(document).trigger( "QloApps:updateRoomOccupancy", [occupancy_wrapper]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on('QloApps:updateRoomOccupancy', function (e, occupancy_wrapper) {
|
||||
e.preventDefault();
|
||||
let cart_row = $(occupancy_wrapper).closest('tr');
|
||||
let occupancy = getBookingOccupancyDetails(cart_row);
|
||||
let params = {
|
||||
id_cart: id_cart,
|
||||
id_booking_data: parseInt($(cart_row).attr('data-id-booking-data')),
|
||||
occupancy : occupancy.shift(),
|
||||
};
|
||||
updateRoomOccupancy(params, cart_row);
|
||||
});
|
||||
|
||||
function getBookingOccupancyDetails(bookingform)
|
||||
{
|
||||
let occupancy = [];
|
||||
let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected")
|
||||
if (selected_occupancy.length) {
|
||||
$(selected_occupancy).each(function(ind, element) {
|
||||
if (parseInt($(element).find('.num_adults').val())) {
|
||||
let child_ages = [];
|
||||
$(element).find('.guest_child_age').each(function(index) {
|
||||
if ($(this).val() > -1) {
|
||||
child_ages.push($(this).val());
|
||||
}
|
||||
});
|
||||
if ($(element).find('.num_children').val()) {
|
||||
if (child_ages.length != $(element).find('.num_children').val()) {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
}
|
||||
}
|
||||
occupancy.push({
|
||||
'adults': $(element).find('.num_adults').val(),
|
||||
'children': $(element).find('.num_children').val(),
|
||||
'child_ages': child_ages
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
}
|
||||
|
||||
function setRoomTypeGuestOccupancy(booking_occupancy_wrapper)
|
||||
{
|
||||
var adults = 0;
|
||||
var children = 0;
|
||||
var rooms = $(booking_occupancy_wrapper).find('.occupancy_info_block').length;
|
||||
|
||||
$(booking_occupancy_wrapper).find(".num_adults" ).each(function(key, val) {
|
||||
adults += parseInt($(this).val());
|
||||
});
|
||||
$(booking_occupancy_wrapper).find(".num_children" ).each(function(key, val) {
|
||||
children += parseInt($(this).val());
|
||||
});
|
||||
|
||||
var guestButtonVal = parseInt(adults) + ' ';
|
||||
if (parseInt(adults) > 1) {
|
||||
guestButtonVal += adults_txt;
|
||||
} else {
|
||||
guestButtonVal += adult_txt;
|
||||
}
|
||||
if (parseInt(children) > 0) {
|
||||
if (parseInt(children) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt;
|
||||
}
|
||||
}
|
||||
// if (parseInt(rooms) > 1) {
|
||||
// guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt;
|
||||
// } else {
|
||||
// guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt;
|
||||
// }
|
||||
// console.log($(booking_occupancy_wrapper).siblings('.booking_guest_occupancy > span'));
|
||||
$(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(guestButtonVal);
|
||||
}
|
||||
{/literal}
|
||||
});
|
||||
|
||||
function resetBind()
|
||||
@@ -389,12 +590,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
function updateProductPrice(params, cart_row) {
|
||||
$.extend(params, {
|
||||
id_cart: id_cart,
|
||||
price: new Number(params.price.replace(",",".")).toFixed(4).toString(),
|
||||
});
|
||||
|
||||
function updateProductPrice(params, cart_row)
|
||||
{
|
||||
$.ajax({
|
||||
type:"POST",
|
||||
url: "{$link->getAdminLink('AdminCarts')|addslashes}",
|
||||
@@ -414,6 +611,29 @@
|
||||
});
|
||||
}
|
||||
|
||||
function updateRoomOccupancy(params, cart_row)
|
||||
{
|
||||
debugger;
|
||||
$.ajax({
|
||||
type:"POST",
|
||||
url: "{$link->getAdminLink('AdminCarts')|addslashes}",
|
||||
async: true,
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
ajax: "1",
|
||||
token: "{getAdminToken tab='AdminCarts'}",
|
||||
tab: "AdminCarts",
|
||||
action: "updateRoomOccupancy",
|
||||
params: params,
|
||||
},
|
||||
success : function(response) {
|
||||
updateCartLine(response.curr_booking_info, cart_row);
|
||||
updateCartSummaryData(response.cart_info);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function updateCartLine(data, cart_row) {
|
||||
$(cart_row).find('.cart_line_total_rooms_price').html(data.amt_with_qty);
|
||||
$(cart_row).find('.cart_line_total_price').html(data.total_price);
|
||||
@@ -1807,6 +2027,23 @@
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{strip}
|
||||
{addJsDef max_child_age=$max_child_age}
|
||||
{addJsDef max_child_in_room=$max_child_in_room}
|
||||
{addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL}
|
||||
{addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL}
|
||||
{addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL}
|
||||
{addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL}
|
||||
{addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL}
|
||||
{addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL}
|
||||
{addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL}
|
||||
{addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL}
|
||||
{addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL}
|
||||
{/strip}
|
||||
|
||||
<div id="loader_container">
|
||||
<div id="loader"></div>
|
||||
|
||||
@@ -1112,6 +1112,7 @@
|
||||
<th class="text-center"><span class="title_box">{l s='Room Type'}</span></th>
|
||||
<th class="text-center"><span class="title_box">{l s='Hotel Name'}</span></th>
|
||||
<th class="text-center"><span class="title_box">{l s='Duration'}</span></th>
|
||||
<th class="text-center fixed-width-lg"><span class="title_box">{l s='Occupancy'}</span></th>
|
||||
<th class="text-center"><span class="title_box">{l s='Unit Price (Tax excl.)'}</span></th>
|
||||
<th class="text-center"><span class="title_box">{l s='Total Price (Tax incl.)'}</span></th>
|
||||
{if isset($refundReqBookings) && $refundReqBookings}
|
||||
@@ -1548,6 +1549,21 @@
|
||||
{addJsDefL name=txtSomeErr}{l s='Some error occurred. Please try again.' js=1}{/addJsDefL}
|
||||
{addJsDefL name=txtDeleteSucc}{l s='Deleted successfully' js=1}{/addJsDefL}
|
||||
{addJsDefL name=txtInvalidDemandVal}{l s='Invalid demand value found' js=1}{/addJsDefL}
|
||||
{addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL}
|
||||
{addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL}
|
||||
{addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL}
|
||||
{addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL}
|
||||
{addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL}
|
||||
{addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL}
|
||||
{addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL}
|
||||
{addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL}
|
||||
{addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL}
|
||||
{addJsDef max_child_age=$max_child_age|escape:'quotes':'UTF-8'}
|
||||
{addJsDef max_child_in_room=$max_child_in_room|escape:'quotes':'UTF-8'}
|
||||
{/strip}
|
||||
|
||||
{* Apply javascript for the page *}
|
||||
|
||||
@@ -24,27 +24,25 @@
|
||||
<h3 class="tab"> <i class="icon-users"></i> {l s='Occupancy'}</h3>
|
||||
|
||||
<div class="alert alert-info">
|
||||
{l s='Set the occupancy of this room type. Enter how much adults and children this room type can accomodate.'}
|
||||
<br /><br />
|
||||
<b>{l s='Note'} : {l s='These occupancy settings will not affect "ROOM TYPE ADDITIONAL FACILITIES" any way. It will work separately.'}</b>
|
||||
{l s='Below, enter the base occupancy of this room type.'}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="base_adults">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s=''}">
|
||||
{l s='Adults'}
|
||||
{l s='Base adults'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="base_adults" type="text" name="base_adults" class="form-control" {if isset($roomTypeInfo)}value="{$roomTypeInfo['adult']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input id="base_adults" type="text" name="base_adults" class="form-control" {if isset($roomTypeInfo)}value="{$roomTypeInfo['adults']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="base_children">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s=''}">
|
||||
{l s='Children'}
|
||||
{l s='Base children'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-sm-3">
|
||||
@@ -53,6 +51,46 @@
|
||||
</div>
|
||||
<input id="is_occupancy_submit" type="hidden" name="is_occupancy_submit" class="form-control" value="0">
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="alert alert-info">
|
||||
{l s='Below, enter the maximum of adults or children which can be accommodated in a room of this room type. Also, enter maximum number of guests for this room type.'}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="max_adults">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s='Enter maximum number of adults can be accommodated in a room of this room type.'}">
|
||||
{l s='Maximum adults'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="max_adults" type="text" name="max_adults" class="form-control" {if isset($roomTypeInfo)}value="{$roomTypeInfo['max_adults']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="max_children">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s='Enter maximum number of children can be accommodated in a room of this room type.'}">
|
||||
{l s='Maximum children'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="max_children" type="text" name="max_children" class="form-control" {if isset($roomTypeInfo)}value="{$roomTypeInfo['max_children']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="max_guests">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s='Enter maximum number of guests can be accommodated in a room of this room type.'}">
|
||||
{l s='Maximum room occupancy'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="max_guests" type="text" name="max_guests" class="form-control" {if isset($roomTypeInfo)}value="{$roomTypeInfo['max_guests']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-footer">
|
||||
<a href="{$link->getAdminLink('AdminProducts')|escape:'html':'UTF-8'}{if isset($smarty.request.page) && $smarty.request.page > 1}&submitFilterproduct={$smarty.request.page|intval}{/if}" class="btn btn-default">
|
||||
<i class="process-icon-cancel"></i>
|
||||
|
||||
@@ -4389,7 +4389,7 @@ class CartCore extends ObjectModel
|
||||
// lets validate the cart booking data first
|
||||
if (isset($bookingRows) && count($bookingRows)) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
$objBookingDtl = new HotelBookingDetail();
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$errors = array();
|
||||
$idCustomer = $objCart->id_customer;
|
||||
$idCurrency = $objCart->id_currency;
|
||||
@@ -4431,24 +4431,20 @@ class CartCore extends ObjectModel
|
||||
}
|
||||
|
||||
if (!count($errors)) {
|
||||
$numDays = $objBookingDtl->getNumberOfDays($dateFrom, $dateTo);
|
||||
$numDays = $objBookingDetail->getNumberOfDays($dateFrom, $dateTo);
|
||||
$prodQty = $prodQty * (int) $numDays;
|
||||
$reqRooms = 1;
|
||||
|
||||
if ($hotelRoomData = $objBookingDtl->DataForFrontSearch(
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$idHotel,
|
||||
$idProduct,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
$idCart,
|
||||
$idGuest
|
||||
)) {
|
||||
$bookingParams = array(
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'hotel_id' => $idHotel,
|
||||
'id_room_type' => $idProduct,
|
||||
'only_search_data' => 1,
|
||||
'id_cart' => $idCart,
|
||||
'id_guest' => $idGuest,
|
||||
);
|
||||
if ($hotelRoomData = $objBookingDetail->dataForFrontSearch($bookingParams)) {
|
||||
if (isset($hotelRoomData['stats']['num_avail'])) {
|
||||
$totalAvailRooms = $hotelRoomData['stats']['num_avail'];
|
||||
if ($totalAvailRooms < $reqRooms) {
|
||||
@@ -4489,7 +4485,7 @@ class CartCore extends ObjectModel
|
||||
if (!$hasErrors) {
|
||||
$update_quantity = $objCart->updateQty($prodQty, $idProduct, 0, 0, Tools::getValue('op', 'up'), $this->id_address_delivery);
|
||||
$chkQty = 0;
|
||||
if ($hotelAvailRomms = $hotelRoomData['rm_data'][0]['data']['available']) {
|
||||
if ($hotelAvailRomms = $hotelRoomData['rm_data'][$idProduct]['data']['available']) {
|
||||
foreach ($hotelAvailRomms as $key_hotel_room_info => $val_hotel_room_info) {
|
||||
if ($chkQty < $reqRooms) {
|
||||
$objCartBooking = new HotelCartBookingData();
|
||||
|
||||
@@ -354,6 +354,20 @@ abstract class PaymentModuleCore extends Module
|
||||
PrestaShopLogger::addLog('PaymentModule::validateOrder - Order is about to be added', 1, null, 'Cart', (int)$id_cart, true);
|
||||
}
|
||||
|
||||
if ($this->name == 'wsorder') {
|
||||
$order->with_occupancy = 0;
|
||||
} else {
|
||||
if (defined('_PS_ADMIN_DIR_')) {
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$order->with_occupancy = 1;
|
||||
}
|
||||
} else {
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$order->with_occupancy = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// advance payment information
|
||||
$order->is_advance_payment = $this->context->cart->is_advance_payment;
|
||||
if ($order->is_advance_payment) {
|
||||
@@ -785,6 +799,9 @@ abstract class PaymentModuleCore extends Module
|
||||
$objBookingDetail->date_to = $objCartBookingData->date_to;
|
||||
$objBookingDetail->total_price_tax_excl = Tools::ps_round($total_price['total_price_tax_excl'], 6);
|
||||
$objBookingDetail->total_price_tax_incl = Tools::ps_round($total_price['total_price_tax_incl'], 6);
|
||||
$objBookingDetail->adults = $objCartBookingData->adults;
|
||||
$objBookingDetail->children = $objCartBookingData->children;
|
||||
$objBookingDetail->child_ages = $objCartBookingData->child_ages;
|
||||
|
||||
// Save hotel information/location/contact
|
||||
if (Validate::isLoadedObject($objRoom = new HotelRoomInformation($objCartBookingData->id_room))) {
|
||||
@@ -807,10 +824,6 @@ abstract class PaymentModuleCore extends Module
|
||||
$objBookingDetail->phone = $hotelAddress['phone'];
|
||||
}
|
||||
}
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($idProduct)) {
|
||||
$objBookingDetail->adult = $roomTypeInfo['adult'];
|
||||
$objBookingDetail->children = $roomTypeInfo['children'];
|
||||
}
|
||||
|
||||
/*for saving details of the advance payment product wise*/
|
||||
$objBookingDetail->total_paid_amount = Tools::ps_round($total_price['total_price_tax_incl'], 5);
|
||||
@@ -1427,8 +1440,6 @@ abstract class PaymentModuleCore extends Module
|
||||
$cart_htl_data[$type_key]['cover_img'] = $cover_img;
|
||||
$cart_htl_data[$type_key]['name'] = $product->name;
|
||||
$cart_htl_data[$type_key]['hotel_name'] = $rm_dtl['hotel_name'];
|
||||
$cart_htl_data[$type_key]['adult'] = $rm_dtl['adult'];
|
||||
$cart_htl_data[$type_key]['children'] = $rm_dtl['children'];
|
||||
|
||||
foreach ($cart_bk_data as $data_k => $data_v) {
|
||||
$date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']);
|
||||
@@ -1438,6 +1449,9 @@ abstract class PaymentModuleCore extends Module
|
||||
|
||||
$num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] += $data_v['children'];
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] += $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] += $data_v['total_price_tax_incl'];
|
||||
@@ -1477,6 +1491,8 @@ abstract class PaymentModuleCore extends Module
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] = $data_v['children'];
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] = $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'];
|
||||
|
||||
@@ -5623,7 +5623,7 @@ class ProductCore extends ObjectModel
|
||||
WHERE `id_product` = '.(int)$this->id
|
||||
);
|
||||
|
||||
// save room type info adult, child, hotel info
|
||||
// save room type info adults, child, hotel info
|
||||
$postData = trim(file_get_contents('php://input'));
|
||||
libxml_use_internal_errors(true);
|
||||
$xml = simplexml_load_string(utf8_decode($postData));
|
||||
@@ -5631,7 +5631,7 @@ class ProductCore extends ObjectModel
|
||||
$roomtypeData = json_decode(json_encode($xml), true);
|
||||
|
||||
// set room map info for the hotel from request
|
||||
return Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'htl_room_type` (`id_product`, `id_hotel`, `adult`, `children`, `date_add`, `date_upd`) VALUES ('.(int)$this->id.', '.(int) $roomtypeData['room_type']['id_hotel'].', '.(int) $roomtypeData['room_type']['adults'].', '.(int) $roomtypeData['room_type']['children'].', \''.date('Y-m-d h:i:s').'\', \''.date('Y-m-d h:i:s').'\')');
|
||||
return Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'htl_room_type` (`id_product`, `id_hotel`, `adults`, `children`, `date_add`, `date_upd`) VALUES ('.(int)$this->id.', '.(int) $roomtypeData['room_type']['id_hotel'].', '.(int) $roomtypeData['room_type']['adults'].', '.(int) $roomtypeData['room_type']['children'].', \''.date('Y-m-d h:i:s').'\', \''.date('Y-m-d h:i:s').'\')');
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -6060,7 +6060,7 @@ class ProductCore extends ObjectModel
|
||||
public function getWsAdults()
|
||||
{
|
||||
return Db::getInstance()->getValue(
|
||||
'SELECT `adult` FROM `'._DB_PREFIX_.'htl_room_type` WHERE `id_product` = '.(int)$this->id.' ORDER BY `id` ASC'
|
||||
'SELECT `adults` FROM `'._DB_PREFIX_.'htl_room_type` WHERE `id_product` = '.(int)$this->id.' ORDER BY `id` ASC'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -435,6 +435,15 @@ class FrontControllerCore extends Controller
|
||||
$compared_products = CompareProduct::getCompareProducts($this->context->cookie->id_compare);
|
||||
}
|
||||
|
||||
$isOccupancyWiseSearch = false;
|
||||
if (Configuration::get('PS_FRONT_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) {
|
||||
$isOccupancyWiseSearch = true;
|
||||
}
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
$this->context->smarty->assign(array(
|
||||
// Useful for layout.tpl
|
||||
'mobile_device' => $this->context->getMobileDevice(),
|
||||
@@ -482,6 +491,10 @@ class FrontControllerCore extends Controller
|
||||
'currencySign' => $currency->sign, // backward compat, see global.tpl
|
||||
'currencyFormat' => $currency->format, // backward compat
|
||||
'currencyBlank' => $currency->blank, // backward compat
|
||||
'is_occupancy_wise_search' => $isOccupancyWiseSearch,
|
||||
'occupancy_required_for_booking' => $occupancyRequiredForBooking,
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
));
|
||||
|
||||
// Add the tpl files directory for mobile
|
||||
@@ -1059,6 +1072,12 @@ class FrontControllerCore extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->addJS(_PS_JS_DIR_.'daterangepicker/moment.min.js');
|
||||
$this->addjqueryPlugin('daterangepicker.min', _PS_JS_DIR_.'daterangepicker/');
|
||||
$this->addJS(_PS_JS_DIR_.'daterangepicker/qlodaterangepicker.js');
|
||||
|
||||
$this->addCSS(_THEME_CSS_DIR_.'daterangepicker.css');
|
||||
|
||||
if (Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) {
|
||||
$this->addJqueryUI('ui.sortable');
|
||||
$this->addjqueryPlugin('fancybox');
|
||||
|
||||
@@ -190,6 +190,11 @@ class OrderCore extends ObjectModel
|
||||
*/
|
||||
public $advance_paid_amount;
|
||||
|
||||
/**
|
||||
* @var int is occupancy provided in this order
|
||||
*/
|
||||
public $with_occupancy;
|
||||
|
||||
/**
|
||||
* @see ObjectModel::$definition
|
||||
*/
|
||||
@@ -242,8 +247,9 @@ class OrderCore extends ObjectModel
|
||||
'source' => array('type' => self::TYPE_STRING),
|
||||
'valid' => array('type' => self::TYPE_BOOL),
|
||||
'reference' => array('type' => self::TYPE_STRING),
|
||||
'is_advance_payment' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'default' => 0),
|
||||
'advance_paid_amount' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
|
||||
'is_advance_payment' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'default' => 0),
|
||||
'advance_paid_amount' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
|
||||
'with_occupancy' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'default' => 0),
|
||||
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
),
|
||||
|
||||
@@ -352,8 +352,6 @@ class HTMLTemplateInvoiceCore extends HTMLTemplate
|
||||
|
||||
$cart_htl_data[$type_key]['id_product'] = $type_value['product_id'];
|
||||
$cart_htl_data[$type_key]['cover_img'] = $cover_img;
|
||||
$cart_htl_data[$type_key]['adult'] = $rm_dtl['adult'];
|
||||
$cart_htl_data[$type_key]['children'] = $rm_dtl['children'];
|
||||
$cart_htl_data[$type_key]['hotel_name'] = $rm_dtl['hotel_name'];
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
foreach ($order_bk_data as $data_k => $data_v) {
|
||||
@@ -400,6 +398,8 @@ class HTMLTemplateInvoiceCore extends HTMLTemplate
|
||||
);
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] += $data_v['children'];
|
||||
|
||||
$num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
|
||||
@@ -446,6 +446,9 @@ class HTMLTemplateInvoiceCore extends HTMLTemplate
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = Tools::displayDate($data_v['date_from']);
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = Tools::displayDate($data_v['date_to']);
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] = $data_v['children'];
|
||||
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
|
||||
@@ -951,6 +951,79 @@ class AdminCartsControllerCore extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
public function ajaxProcessupdateRoomOccupancy()
|
||||
{
|
||||
$params = Tools::getValue('params');
|
||||
$idBookingData = (int) $params['id_booking_data'];
|
||||
$idCart = (int) $params['id_cart'];
|
||||
$occupancy = $params['occupancy'];
|
||||
|
||||
$this->context->cart = new Cart($idCart);
|
||||
|
||||
if ($this->tabAccess['edit'] === '1') {
|
||||
// validate occupancy is correct
|
||||
$hasError = false;
|
||||
if (is_array($occupancy)) {
|
||||
if (!$occupancy['adults'] || !Validate::isUnsignedInt($occupancy['adults'])) {
|
||||
$hasError = true;
|
||||
}
|
||||
if (!Validate::isUnsignedInt($occupancy['children'])) {
|
||||
$hasError = true;
|
||||
}
|
||||
if ($occupancy['children']) {
|
||||
if (!isset($occupancy['child_ages']) || $occupancy['children'] != count($occupancy['child_ages'])) {
|
||||
$hasError = true;
|
||||
} else {
|
||||
foreach($occupancy['child_ages'] as $age) {
|
||||
if (!Validate::isUnsignedInt($occupancy['adults'])) {
|
||||
$hasError = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$hasError = true;
|
||||
}
|
||||
|
||||
if (!$hasError) {
|
||||
$objHotelCartBookingData = new HotelCartBookingData($idBookingData);
|
||||
$objRoomType = new HotelRoomType();
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($objHotelCartBookingData->id_product)) {
|
||||
if ($occupancy['adults'] > $roomTypeInfo['max_adults']) {
|
||||
$hasError = true;
|
||||
}
|
||||
if ($occupancy['children'] > $roomTypeInfo['max_children']) {
|
||||
$hasError = true;
|
||||
}
|
||||
if ($occupancy['adults'] + $occupancy['children'] > $roomTypeInfo['max_guests']) {
|
||||
$hasError = true;
|
||||
}
|
||||
if (!$hasError) {
|
||||
$objHotelCartBookingData->adults = $occupancy['adults'];
|
||||
$objHotelCartBookingData->children = $occupancy['children'];
|
||||
$objHotelCartBookingData->child_ages = json_encode($occupancy['child_ages']);
|
||||
$objHotelCartBookingData->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
$objHotelCartBookingData = new HotelCartBookingData();
|
||||
$bookingsInfo = $objHotelCartBookingData->getCartFormatedBookinInfoByIdCart($idCart);
|
||||
foreach ($bookingsInfo as &$bookingInfo) {
|
||||
if ($bookingInfo['id'] == $idBookingData) {
|
||||
$amtWithQty = $bookingInfo['amt_with_qty'];
|
||||
$bookingInfo['amt_with_qty'] = Tools::displayPrice($amtWithQty);
|
||||
$bookingInfo['total_price'] = Tools::displayPrice($amtWithQty + $bookingInfo['demand_price']);
|
||||
$response = array(
|
||||
'curr_booking_info' => $bookingInfo,
|
||||
'cart_info' => $this->ajaxReturnVars(),
|
||||
);
|
||||
|
||||
die(json_encode($response));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process to get extra demands of any room while order creation process form.tpl
|
||||
public function ajaxProcessGetRoomTypeCartDemands()
|
||||
{
|
||||
|
||||
@@ -219,6 +219,11 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$cart_detail_data = array();
|
||||
$cart_detail_data_obj = new HotelCartBookingData();
|
||||
if ($cart_detail_data = $cart_detail_data_obj->getCartFormatedBookinInfoByIdCart((int) $id_cart)) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
foreach ($cart_detail_data as $key => $cart_data) {
|
||||
|
||||
$cart_detail_data[$key]['room_type_info'] = $objRoomType->getRoomTypeInfoByIdProduct($cart_data['id_product']);
|
||||
}
|
||||
$this->context->smarty->assign('cart_detail_data', $cart_detail_data);
|
||||
} else {
|
||||
// if no rooms added in the cart and user visits add order page then redirect to BOOK NOW page
|
||||
@@ -241,6 +246,11 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$payment_modules[] = Module::getInstanceById((int)$p_module['id_module']);
|
||||
}
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
$this->context->smarty->assign(array(
|
||||
'recyclable_pack' => (int)Configuration::get('PS_RECYCLABLE_PACK'),
|
||||
'gift_wrapping' => (int)Configuration::get('PS_GIFT_WRAPPING'),
|
||||
@@ -254,8 +264,10 @@ class AdminOrdersControllerCore extends AdminController
|
||||
'toolbar_btn' => $this->toolbar_btn,
|
||||
'toolbar_scroll' => $this->toolbar_scroll,
|
||||
'PS_CATALOG_MODE' => Configuration::get('PS_CATALOG_MODE'),
|
||||
'title' => array($this->l('Orders'), $this->l('Create order'))
|
||||
|
||||
'title' => array($this->l('Orders'), $this->l('Create order')),
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
'occupancy_required_for_booking' => $occupancyRequiredForBooking,
|
||||
));
|
||||
$this->content .= $this->createTemplate('form.tpl')->fetch();
|
||||
}
|
||||
@@ -455,8 +467,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
$room_swapped = $obj_booking_dtl->reallocateRoomWithAvailableSameRoomType($current_room_id, $date_from, $date_to, $realloc_room_id);
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$room_swapped = $objBookingDetail->reallocateRoomWithAvailableSameRoomType($current_room_id, $date_from, $date_to, $realloc_room_id);
|
||||
if (!$room_swapped) {
|
||||
$this->errors[] = Tools::displayError('Some error occured. Please try again.');
|
||||
} else {
|
||||
@@ -490,8 +502,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
$room_swapped = $obj_booking_dtl->swapRoomWithAvailableSameRoomType($current_room_id, $date_from, $date_to, $swapped_room_id);
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$room_swapped = $objBookingDetail->swapRoomWithAvailableSameRoomType($current_room_id, $date_from, $date_to, $swapped_room_id);
|
||||
if (!$room_swapped) {
|
||||
$this->errors[] = Tools::displayError('Some error occured. Please try again.');
|
||||
} else {
|
||||
@@ -1450,6 +1462,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$totalDemandsPriceTI = 0;
|
||||
if ($order_detail_data = $objBookingDetail->getOrderFormatedBookinInfoByIdOrder($order->id)) {
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
$objHotelRoomType = new HotelRoomType();
|
||||
foreach ($order_detail_data as $key => $value) {
|
||||
$order_detail_data[$key]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$order->id,
|
||||
@@ -1503,6 +1516,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$order_detail_data[$key]['unit_amt_tax_incl'] = $value['total_price_tax_incl']/$num_days;
|
||||
$order_detail_data[$key]['amt_with_qty_tax_excl'] = $value['total_price_tax_excl'];
|
||||
$order_detail_data[$key]['amt_with_qty_tax_incl'] = $value['total_price_tax_incl'];
|
||||
$order_detail_data[$key]['room_type_info'] = $objHotelRoomType->getRoomTypeInfoByIdProduct($value['id_product']);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1518,7 +1533,6 @@ class AdminOrdersControllerCore extends AdminController
|
||||
|
||||
// hotel booking statuses
|
||||
$htlOrderStatus = HotelBookingDetail::getAllHotelOrderStatus();
|
||||
|
||||
$this->tpl_view_vars = array(
|
||||
// refund info
|
||||
'refund_allowed' => (int) $order->isReturnable(),
|
||||
@@ -1534,6 +1548,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
'htl_booking_order_data' => $bookingOrderInfo,
|
||||
'hotel_order_status' => $htlOrderStatus,
|
||||
'order_detail_data' => $order_detail_data,
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
/*END*/
|
||||
'order' => $order,
|
||||
'cart' => new Cart($order->id_cart),
|
||||
@@ -1668,7 +1684,13 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
|
||||
if ($products = Product::searchByName((int)$this->context->language->id, pSQL(Tools::getValue('product_search')), null, $idHotel)) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
foreach ($products as &$product) {
|
||||
// get product room type informatin
|
||||
if ($roomTypeDetail = $objRoomType->getRoomTypeInfoByIdProduct($product['id_product'])) {
|
||||
$product['room_type_info'] = $roomTypeDetail;
|
||||
}
|
||||
|
||||
// Formatted price
|
||||
$product['formatted_price'] = Tools::displayPrice(Tools::convertPrice($product['price_tax_incl'], $currency), $currency);
|
||||
// Concret price
|
||||
@@ -1801,6 +1823,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$date_from = date('Y-m-d', strtotime($product_informations['date_from']));
|
||||
$date_to = date('Y-m-d', strtotime($product_informations['date_to']));
|
||||
$curr_date = date('Y-m-d');
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
/*Validations*/
|
||||
if ($date_from == '') {
|
||||
die(json_encode(array(
|
||||
@@ -1832,6 +1855,45 @@ class AdminOrdersControllerCore extends AdminController
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Check out Date Should be after Check In date.'),
|
||||
)));
|
||||
}
|
||||
if ($order->with_occupancy) {
|
||||
if ($occupancy) {
|
||||
foreach($occupancy as $key =>$roomOccupancy) {
|
||||
if (!$roomOccupancy['adults'] || !Validate::isUnsignedInt($roomOccupancy['adults'])) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => sprintf(Tools::displayError('Invalid number of adults for Room %s.'), ($key + 1)),
|
||||
)));
|
||||
} elseif (!Validate::isUnsignedInt($roomOccupancy['children'])) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => sprintf(Tools::displayError('Invalid number of children for Room %s.'), ($key + 1)),
|
||||
)));
|
||||
}
|
||||
if ($roomOccupancy['children'] > 0) {
|
||||
if (!isset($roomOccupancy['child_ages']) || ($roomOccupancy['children'] != count($roomOccupancy['child_ages']))) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => sprintf(Tools::displayError('Please provide all children age for Room %s.'), ($key + 1)),
|
||||
)));
|
||||
} else {
|
||||
foreach($roomOccupancy['child_ages'] as $childAge) {
|
||||
if (!Validate::isUnsignedInt($childAge)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => sprintf(Tools::displayError('Invalid children age for Room %s.'), ($key + 1)),
|
||||
)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid occupancy.'),
|
||||
)));
|
||||
}
|
||||
} elseif (!Validate::isUnsignedInt($product_informations['product_quantity'])) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
@@ -1839,8 +1901,13 @@ class AdminOrdersControllerCore extends AdminController
|
||||
)));
|
||||
}
|
||||
|
||||
|
||||
if ($order->with_occupancy) {
|
||||
$req_rm = count($occupancy);
|
||||
} else {
|
||||
$req_rm = $product_informations['product_quantity'];
|
||||
}
|
||||
$obj_booking_detail = new HotelBookingDetail();
|
||||
$req_rm = $product_informations['product_quantity'];
|
||||
$num_days = $obj_booking_detail->getNumberOfDays($date_from, $date_to);
|
||||
$product_informations['product_quantity'] = $product_informations['product_quantity'] * (int) $num_days;
|
||||
|
||||
@@ -1851,9 +1918,17 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$id_hotel = $room_info_by_id_product['id_hotel'];
|
||||
|
||||
if ($id_hotel) {
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
$hotel_room_data = $obj_booking_dtl->DataForFrontSearch($date_from, $date_to, $id_hotel, $product_informations['product_id'], 1, 0, 0, -1, 0, 0, $id_cart, $id_guest);
|
||||
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $product_informations['product_id'],
|
||||
'only_search_data' => 1,
|
||||
'id_cart' => $id_cart,
|
||||
'id_guest' => $id_guest,
|
||||
);
|
||||
$hotel_room_data = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
$total_available_rooms = $hotel_room_data['stats']['num_avail'];
|
||||
|
||||
if ($total_available_rooms < $req_rm) {
|
||||
@@ -1924,54 +1999,40 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$this->context->cart = $cart;
|
||||
$this->context->customer = new Customer($order->id_customer);
|
||||
|
||||
// always add taxes even if there are not displayed to the customer
|
||||
$use_taxes = true;
|
||||
$initial_product_price_tax_incl = Product::getPriceStatic(
|
||||
$product->id,
|
||||
$use_taxes,
|
||||
isset($combination) ? $combination->id : null,
|
||||
2,
|
||||
null,
|
||||
false,
|
||||
true,
|
||||
1,
|
||||
false,
|
||||
$order->id_customer,
|
||||
$cart->id,
|
||||
$order->{Configuration::get('PS_TAX_ADDRESS_TYPE', null, null, $order->id_shop)}
|
||||
);
|
||||
|
||||
// create feature price if needed
|
||||
$createFeaturePrice = $product_informations['product_price_tax_incl'] != $initial_product_price_tax_incl;
|
||||
$featurePriceParams = array();
|
||||
if ($createFeaturePrice) {
|
||||
$featurePriceParams = array(
|
||||
'id_cart' => $this->context->cart->id,
|
||||
'id_guest' => $this->context->cookie->id_guest,
|
||||
'price' => $product_informations['product_price_tax_excl'],
|
||||
'id_product' => $product->id,
|
||||
);
|
||||
if ($order->with_occupancy) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
$roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($id_product);
|
||||
}
|
||||
|
||||
/*By Webkul to make entries in HotelCartBookingData */
|
||||
$hotel_room_info_arr = $hotel_room_data['rm_data'][0]['data']['available'];
|
||||
$hotel_room_info_arr = $hotel_room_data['rm_data'][$idProduct]['data']['available'];
|
||||
$chkQty = 0;
|
||||
if ($hotel_room_info_arr) {
|
||||
foreach ($hotel_room_info_arr as $room_info) {
|
||||
foreach ($hotel_room_info_arr as $key => $room_info) {
|
||||
if ($chkQty < $req_rm) {
|
||||
$obj_htl_cart_booking_data = new HotelCartBookingData();
|
||||
$obj_htl_cart_booking_data->id_cart = $this->context->cart->id;
|
||||
$obj_htl_cart_booking_data->id_guest = $this->context->cookie->id_guest;
|
||||
$obj_htl_cart_booking_data->id_customer = $this->context->customer->id;
|
||||
$obj_htl_cart_booking_data->id_currency = $order->id_currency;
|
||||
$obj_htl_cart_booking_data->id_product = $room_info['id_product'];
|
||||
$obj_htl_cart_booking_data->id_room = $room_info['id_room'];
|
||||
$obj_htl_cart_booking_data->id_hotel = $room_info['id_hotel'];
|
||||
$obj_htl_cart_booking_data->booking_type = HotelBookingDetail::ALLOTMENT_AUTO;
|
||||
$obj_htl_cart_booking_data->quantity = $num_days;
|
||||
$obj_htl_cart_booking_data->date_from = $date_from;
|
||||
$obj_htl_cart_booking_data->date_to = $date_to;
|
||||
$obj_htl_cart_booking_data->save();
|
||||
$objCartBookingData = new HotelCartBookingData();
|
||||
$objCartBookingData->id_cart = $this->context->cart->id;
|
||||
$objCartBookingData->id_guest = $this->context->cookie->id_guest;
|
||||
$objCartBookingData->id_customer = $this->context->customer->id;
|
||||
$objCartBookingData->id_currency = $order->id_currency;
|
||||
$objCartBookingData->id_product = $room_info['id_product'];
|
||||
$objCartBookingData->id_room = $room_info['id_room'];
|
||||
$objCartBookingData->id_hotel = $room_info['id_hotel'];
|
||||
$objCartBookingData->booking_type = HotelBookingDetail::ALLOTMENT_AUTO;
|
||||
$objCartBookingData->quantity = $num_days;
|
||||
$objCartBookingData->date_from = $date_from;
|
||||
$objCartBookingData->date_to = $date_to;
|
||||
|
||||
if ($order->with_occupancy) {
|
||||
$room_occupancy = array_shift($occupancy);
|
||||
$objCartBookingData->adults = $room_occupancy['adults'];
|
||||
$objCartBookingData->children = $room_occupancy['children'];
|
||||
$objCartBookingData->child_ages = $room_occupancy['children'] ? json_encode($room_occupancy['child_ages']) : json_encode(array());
|
||||
} else {
|
||||
$objCartBookingData->adults = $roomTypeInfo['adults'];
|
||||
$objCartBookingData->children = $roomTypeInfo['children'];
|
||||
$objCartBookingData->child_ages = json_encode(array());
|
||||
}
|
||||
$objCartBookingData->save();
|
||||
++$chkQty;
|
||||
|
||||
// create feature price if needed
|
||||
@@ -1986,10 +2047,52 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
}
|
||||
/*END*/
|
||||
// always add taxes even if there are not displayed to the customer
|
||||
$use_taxes = true;
|
||||
|
||||
$initial_product_price_tax_incl = Product::getPriceStatic(
|
||||
$product->id,
|
||||
$use_taxes,
|
||||
isset($combination) ? $combination->id : null,
|
||||
2,
|
||||
null,
|
||||
false,
|
||||
true,
|
||||
1,
|
||||
false,
|
||||
$order->id_customer,
|
||||
$cart->id,
|
||||
$order->id_address_tax
|
||||
);
|
||||
|
||||
// Creating specific price if needed
|
||||
if ($product_informations['product_price_tax_incl'] != $initial_product_price_tax_incl) {
|
||||
$specific_price = new SpecificPrice();
|
||||
$specific_price->id_shop = 0;
|
||||
$specific_price->id_shop_group = 0;
|
||||
$specific_price->id_currency = 0;
|
||||
$specific_price->id_country = 0;
|
||||
$specific_price->id_group = 0;
|
||||
$specific_price->id_customer = $order->id_customer;
|
||||
$specific_price->id_product = $product->id;
|
||||
if (isset($combination)) {
|
||||
$specific_price->id_product_attribute = $combination->id;
|
||||
} else {
|
||||
$specific_price->id_product_attribute = 0;
|
||||
}
|
||||
$specific_price->price = $product_informations['product_price_tax_excl'];
|
||||
$specific_price->from_quantity = 1;
|
||||
$specific_price->reduction = 0;
|
||||
$specific_price->reduction_type = 'amount';
|
||||
$specific_price->reduction_tax = 0;
|
||||
$specific_price->from = '0000-00-00 00:00:00';
|
||||
$specific_price->to = '0000-00-00 00:00:00';
|
||||
$specific_price->add();
|
||||
}
|
||||
|
||||
// Add product to cart
|
||||
$update_quantity = $cart->updateQty(
|
||||
$product_informations['product_quantity'],
|
||||
($req_rm * $num_days),
|
||||
$product->id,
|
||||
isset($product_informations['product_attribute_id']) ? $product_informations['product_attribute_id'] : null,
|
||||
isset($combination) ? $combination->id : null,
|
||||
@@ -2216,76 +2319,79 @@ class AdminOrdersControllerCore extends AdminController
|
||||
|
||||
/*By Webkul Entry into table HotelbookingDetail*/
|
||||
$objRoomType = new HotelRoomType();
|
||||
$objHtlBkDtl = new HotelBookingDetail();
|
||||
$inserted_id_order_detail = $objHtlBkDtl->getLastInsertedIdOrderDetail($order->id);
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$inserted_id_order_detail = $objBookingDetail->getLastInsertedIdOrderDetail($order->id);
|
||||
$idLang = (int)$this->context->cart->id_lang;
|
||||
$obj_cart_bk_data = new HotelCartBookingData();
|
||||
if ($cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData(
|
||||
$objCartBookingData = new HotelCartBookingData();
|
||||
if ($cartBookingData = $objCartBookingData->getOnlyCartBookingData(
|
||||
$this->context->cart->id,
|
||||
$this->context->cart->id_guest,
|
||||
$idProduct
|
||||
)) {
|
||||
foreach ($cart_bk_data as $cb_k => $cb_v) {
|
||||
$obj_cart_bk_data = new HotelCartBookingData($cb_v['id']);
|
||||
$obj_cart_bk_data->id_order = $order->id;
|
||||
$obj_cart_bk_data->save();
|
||||
foreach ($cartBookingData as $cb_k => $cb_v) {
|
||||
$objCartBookingData = new HotelCartBookingData($cb_v['id']);
|
||||
$objCartBookingData->id_order = $order->id;
|
||||
$objCartBookingData->save();
|
||||
|
||||
$objHtlBkDtl = new HotelBookingDetail();
|
||||
$objHtlBkDtl->id_product = $idProduct;
|
||||
$objHtlBkDtl->id_order = $order->id;
|
||||
$objHtlBkDtl->id_order_detail = $inserted_id_order_detail;
|
||||
$objHtlBkDtl->id_cart = $this->context->cart->id;
|
||||
$objHtlBkDtl->id_room = $obj_cart_bk_data->id_room;
|
||||
$objHtlBkDtl->id_hotel = $obj_cart_bk_data->id_hotel;
|
||||
$objHtlBkDtl->id_customer = $this->context->customer->id;
|
||||
$objHtlBkDtl->booking_type = $obj_cart_bk_data->booking_type;
|
||||
$objHtlBkDtl->id_status = 1;
|
||||
$objHtlBkDtl->comment = $obj_cart_bk_data->comment;
|
||||
$objHtlBkDtl->room_type_name = Product::getProductName($idProduct, null, $order->id_lang);
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$objBookingDetail->id_product = $idProduct;
|
||||
$objBookingDetail->id_order = $order->id;
|
||||
$objBookingDetail->id_order_detail = $inserted_id_order_detail;
|
||||
$objBookingDetail->id_cart = $this->context->cart->id;
|
||||
$objBookingDetail->id_room = $objCartBookingData->id_room;
|
||||
$objBookingDetail->id_hotel = $objCartBookingData->id_hotel;
|
||||
$objBookingDetail->id_customer = $this->context->customer->id;
|
||||
$objBookingDetail->booking_type = $objCartBookingData->booking_type;
|
||||
$objBookingDetail->id_status = 1;
|
||||
$objBookingDetail->comment = $objCartBookingData->comment;
|
||||
$objBookingDetail->room_type_name = Product::getProductName($idProduct, null, $order->id_lang);
|
||||
|
||||
$objHtlBkDtl->date_from = $obj_cart_bk_data->date_from;
|
||||
$objHtlBkDtl->date_to = $obj_cart_bk_data->date_to;
|
||||
$objBookingDetail->date_from = $objCartBookingData->date_from;
|
||||
$objBookingDetail->date_to = $objCartBookingData->date_to;
|
||||
$objBookingDetail->adults = $objCartBookingData->adults;
|
||||
$objBookingDetail->children = $objCartBookingData->children;
|
||||
$objBookingDetail->child_ages = $objCartBookingData->child_ages;
|
||||
|
||||
$total_price = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice(
|
||||
$idProduct,
|
||||
$obj_cart_bk_data->date_from,
|
||||
$obj_cart_bk_data->date_to,
|
||||
$objCartBookingData->date_from,
|
||||
$objCartBookingData->date_to,
|
||||
0,
|
||||
Group::getCurrent()->id,
|
||||
$this->context->cart->id,
|
||||
$this->context->cookie->id_guest,
|
||||
$obj_cart_bk_data->id_room
|
||||
$objCartBookingData->id_room
|
||||
);
|
||||
|
||||
$objHtlBkDtl->total_price_tax_excl = $total_price['total_price_tax_excl'];
|
||||
$objHtlBkDtl->total_price_tax_incl = $total_price['total_price_tax_incl'];
|
||||
$objHtlBkDtl->total_paid_amount = Tools::ps_round($total_price['total_price_tax_incl'], 5);
|
||||
$objBookingDetail->total_price_tax_excl = $total_price['total_price_tax_excl'];
|
||||
$objBookingDetail->total_price_tax_incl = $total_price['total_price_tax_incl'];
|
||||
$objBookingDetail->total_paid_amount = Tools::ps_round($total_price['total_price_tax_incl'], 5);
|
||||
|
||||
// Save hotel information/location/contact
|
||||
if (Validate::isLoadedObject($objRoom = new HotelRoomInformation($obj_cart_bk_data->id_room))) {
|
||||
$objHtlBkDtl->room_num = $objRoom->room_num;
|
||||
if (Validate::isLoadedObject($objRoom = new HotelRoomInformation($objCartBookingData->id_room))) {
|
||||
$objBookingDetail->room_num = $objRoom->room_num;
|
||||
}
|
||||
if (Validate::isLoadedObject($objHotelBranch = new HotelBranchInformation(
|
||||
$obj_cart_bk_data->id_hotel,
|
||||
$objCartBookingData->id_hotel,
|
||||
$idLang
|
||||
))) {
|
||||
$addressInfo = $objHotelBranch->getAddress($obj_cart_bk_data->id_hotel);
|
||||
$objHtlBkDtl->hotel_name = $objHotelBranch->hotel_name;
|
||||
$objHtlBkDtl->city = $addressInfo['city'];
|
||||
$objHtlBkDtl->state = State::getNameById($addressInfo['id_state']);
|
||||
$objHtlBkDtl->country = Country::getNameById($idLang, $addressInfo['id_country']);
|
||||
$objHtlBkDtl->zipcode = $addressInfo['postcode'];;
|
||||
$objHtlBkDtl->phone = $addressInfo['phone'];
|
||||
$objHtlBkDtl->email = $objHotelBranch->email;
|
||||
$objHtlBkDtl->check_in_time = $objHotelBranch->check_in;
|
||||
$objHtlBkDtl->check_out_time = $objHotelBranch->check_out;
|
||||
$addressInfo = $objHotelBranch->getAddress($objCartBookingData->id_hotel);
|
||||
$objBookingDetail->hotel_name = $objHotelBranch->hotel_name;
|
||||
$objBookingDetail->city = $addressInfo['city'];
|
||||
$objBookingDetail->state = State::getNameById($addressInfo['id_state']);
|
||||
$objBookingDetail->country = Country::getNameById($idLang, $addressInfo['id_country']);
|
||||
$objBookingDetail->zipcode = $addressInfo['postcode'];;
|
||||
$objBookingDetail->phone = $addressInfo['phone'];
|
||||
$objBookingDetail->email = $objHotelBranch->email;
|
||||
$objBookingDetail->check_in_time = $objHotelBranch->check_in;
|
||||
$objBookingDetail->check_out_time = $objHotelBranch->check_out;
|
||||
}
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($idProduct)) {
|
||||
$objHtlBkDtl->adult = $roomTypeInfo['adult'];
|
||||
$objHtlBkDtl->children = $roomTypeInfo['children'];
|
||||
$objBookingDetail->adults = $objCartBookingData->adults;
|
||||
$objBookingDetail->children = $objCartBookingData->children;
|
||||
$objBookingDetail->child_ages = $objCartBookingData->child_ages;
|
||||
}
|
||||
|
||||
$objHtlBkDtl->save();
|
||||
$objBookingDetail->save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2396,7 +2502,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
|
||||
/*By webkul To edit Order and cart entries when edit rooms from the orderLine when editing the order*/
|
||||
$product_informations = $_POST['add_product'];
|
||||
$product_informations = $_POST['edit_product'];
|
||||
$new_date_from = trim(date('Y-m-d', strtotime($product_informations['date_from'])));
|
||||
$new_date_to = trim(date('Y-m-d', strtotime($product_informations['date_to'])));
|
||||
$old_date_from = trim(Tools::getValue('date_from'));
|
||||
@@ -2409,6 +2515,10 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$product_quantity = (int) $obj_booking_detail->getNumberOfDays($new_date_from, $new_date_to);
|
||||
$old_product_quantity = (int) $obj_booking_detail->getNumberOfDays($old_date_from, $old_date_to);
|
||||
$qty_diff = $product_quantity - $old_product_quantity;
|
||||
$occupancy = array_shift(Tools::getValue('occupancy'));
|
||||
$adults = $occupancy['adults'];
|
||||
$children = $occupancy['children'];
|
||||
$child_ages = $occupancy['child_ages'];
|
||||
|
||||
/*By webkul to validate fields before deleting the cart and order data form the tables*/
|
||||
if ($id_hotel == '') {
|
||||
@@ -2466,6 +2576,33 @@ class AdminOrdersControllerCore extends AdminController
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid quantity.'),
|
||||
)));
|
||||
} elseif (!isset($adults) || !$adults || !Validate::isUnsignedInt($adults)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid number of adults.'),
|
||||
)));
|
||||
} elseif (!Validate::isUnsignedInt($children)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid number of children.'),
|
||||
)));
|
||||
}
|
||||
if ($children > 0) {
|
||||
if (!isset($child_ages) || ($children != count($child_ages))) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Please provide all children age.'),
|
||||
)));
|
||||
} else {
|
||||
foreach($child_ages as $childAge) {
|
||||
if (!Validate::isUnsignedInt($childAge)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid children age.'),
|
||||
)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$rooms_booked = $obj_booking_detail->getRoomBookinInformationForDateRangeByOrder($id_room, $old_date_from, $old_date_to, $new_date_from, $new_date_to);
|
||||
@@ -2694,6 +2831,13 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$old_date_to
|
||||
);
|
||||
|
||||
// set occupancy details
|
||||
$occupancy = array(
|
||||
'adults' => $adults,
|
||||
'children' => $children,
|
||||
'child_ages' => $child_ages
|
||||
);
|
||||
|
||||
/*By webkul to edit the Hotel Cart and Hotel Order tables when editing the room for the order detail page*/
|
||||
$new_total_price = array(
|
||||
'tax_excl' => $totalRoomPriceAfterTE,
|
||||
@@ -2706,6 +2850,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$old_date_to,
|
||||
$new_date_from,
|
||||
$new_date_to,
|
||||
$occupancy,
|
||||
$new_total_price
|
||||
)) {
|
||||
// update extra demands total prices if dates are changes (price calc method for each day)
|
||||
|
||||
@@ -109,15 +109,91 @@ class AdminPPreferencesControllerCore extends AdminController
|
||||
'cast' => 'intval',
|
||||
'required' => false,
|
||||
'type' => 'bool'
|
||||
)
|
||||
),
|
||||
'submit' => array('title' => $this->l('Save'))
|
||||
),
|
||||
'search' => array(
|
||||
'title' => $this->l('Search'),
|
||||
'fields' => array(
|
||||
'PS_FRONT_SEARCH_TYPE' => array(
|
||||
'title' => $this->l('Front end search type'),
|
||||
'hint' => $this->l('Select search type for frontend. In "Occupancy wise search", occupancy field will be shown in the search panel and search will be based on required occupancy by the guest. In "Search without occupancy", All available room types will be shown for the search dates without any occupancy filter.'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::SEARCH_TYPE_OWS, 'name' => $this->l('Occupancy wise search')),
|
||||
array('id' => HotelBookingDetail::SEARCH_TYPE_NORMAL, 'name' => $this->l('Search without occupancy'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
'desc' => $this->l('Choose "Occupancy wise search" or "Search without occupancy". Occupancy search restriction will depend on this option selection at front end.'),
|
||||
),
|
||||
'PS_FRONT_OWS_SEARCH_ALGO_TYPE' => array(
|
||||
'title' => $this->l('Front end occupancy wise search algorithm'),
|
||||
'hint' => $this->l('In occupancy wise search at front end, you want to display only room types which are fully satisfying searched occupancy or you want to display all the available room types for the dates searched'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::SEARCH_EXACT_ROOM_TYPE_ALGO, 'name' => $this->l('Show room types satisfying required occupancy')),
|
||||
array('id' => HotelBookingDetail::SEARCH_ALL_ROOM_TYPE_ALGO, 'name' => $this->l('Show all available room types'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
'desc' => $this->l('This option is only for fully available rooms. For partially available rooms, always all possible rooms will be displayed.'),
|
||||
),
|
||||
'PS_FRONT_ROOM_UNIT_SELECTION_TYPE' => array(
|
||||
'title' => $this->l('In front-end, add rooms to cart with'),
|
||||
'hint' => $this->l('In Room occupancy, while adding rooms in cart customer has to select per room occupancy and in room quantity customer only has to select number of rooms.'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY, 'name' => $this->l('Room Occupancy')),
|
||||
array('id' => HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_QUANTITY, 'name' => $this->l('Rooms Quantity (No. of rooms)'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
),
|
||||
'PS_BACKOFFICE_SEARCH_TYPE' => array(
|
||||
'title' => $this->l('Back-office search type'),
|
||||
'hint' => $this->l('Select search type for Back-office. In "Occupancy wise search", occupancy field will be shown in the search panel and search will be based on required occupancy by the employee. In "Search without occupancy", All available room types will be shown for the search dates without any occupancy filter.'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::SEARCH_TYPE_OWS, 'name' => $this->l('Occupancy wise search')),
|
||||
array('id' => HotelBookingDetail::SEARCH_TYPE_NORMAL, 'name' => $this->l('Search without occupancy'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
'desc' => $this->l('Choose "Occupancy wise search" or "Search without occupancy". Occupancy search restriction will depend on this option selection at back-office.'),
|
||||
),
|
||||
'PS_BACKOFFICE_OWS_SEARCH_ALGO_TYPE' => array(
|
||||
'title' => $this->l('Back-office occupancy wise search algorithm'),
|
||||
'hint' => $this->l('In occupancy wise search at back-office, you want to display only room types which are fully satisfying searched occupancy or you want to display all the available room types for the dates searched.'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::SEARCH_EXACT_ROOM_TYPE_ALGO, 'name' => $this->l('Show room types satisfying required occupancy')),
|
||||
array('id' => HotelBookingDetail::SEARCH_ALL_ROOM_TYPE_ALGO, 'name' => $this->l('Show all available room types'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
'desc' => $this->l('This option is only for fully available rooms. For partially available rooms, always all possible rooms will be displayed.'),
|
||||
),
|
||||
'PS_BACKOFFICE_ROOM_BOOKING_TYPE' => array(
|
||||
'title' => $this->l('In back-office, add rooms to cart with'),
|
||||
'hint' => $this->l('In Room occupancy, while adding rooms in cart customer has to select per room occupancy and in room quantity customer only has to select number of rooms.'),
|
||||
'cast' => 'intval',
|
||||
'type' => 'select',
|
||||
'list' => array(
|
||||
array('id' => HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY, 'name' => $this->l('Room Occupancy')),
|
||||
array('id' => HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_QUANTITY, 'name' => $this->l('Rooms Quantity (No. of rooms)'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
),
|
||||
'PS_LOS_RESTRICTION_BO' => array(
|
||||
'title' => $this->l('Apply Min and Max lenght of stay restrictions for back-office bookings'),
|
||||
'hint' => $this->l('While creating bookings from back-office, apply minimum and maximum lenght of stay restrictions'),
|
||||
'title' => $this->l('Apply Min and Max lenght of stay restrictions for back-office search'),
|
||||
'hint' => $this->l('While searching for available rooms from back-office, apply minimum and maximum lenght of stay restrictions'),
|
||||
'validation' => 'isBool',
|
||||
'cast' => 'intval',
|
||||
'required' => false,
|
||||
'type' => 'bool'
|
||||
)
|
||||
),
|
||||
),
|
||||
'submit' => array('title' => $this->l('Save'))
|
||||
),
|
||||
@@ -356,9 +432,28 @@ class AdminPPreferencesControllerCore extends AdminController
|
||||
Db::getInstance()->execute($sql);
|
||||
}
|
||||
|
||||
if (Tools::getValue('PS_FRONT_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) {
|
||||
$_POST['PS_FRONT_ROOM_UNIT_SELECTION_TYPE'] = HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY;
|
||||
}
|
||||
|
||||
if (Tools::getValue('PS_BACKOFFICE_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) {
|
||||
$_POST['PS_BACKOFFICE_ROOM_BOOKING_TYPE'] = HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY;
|
||||
}
|
||||
|
||||
if (Tools::getIsset('PS_CATALOG_MODE')) {
|
||||
Tools::clearSmartyCache();
|
||||
Media::clearCache();
|
||||
}
|
||||
}
|
||||
|
||||
public function setMedia()
|
||||
{
|
||||
parent::setMedia();
|
||||
|
||||
Media::addJsDef(array(
|
||||
'SEARCH_TYPE_OWS' => HotelBookingDetail::SEARCH_TYPE_OWS
|
||||
));
|
||||
|
||||
$this->addJS(_PS_JS_DIR_.'admin/ppreferences.js');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,7 +213,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
LEFT JOIN `'._DB_PREFIX_.'address` aa ON (aa.`id_hotel` = hb.`id`)';
|
||||
|
||||
$this->_select .= ' (SELECT COUNT(hri.`id`) FROM `'._DB_PREFIX_.'htl_room_information` hri WHERE hri.`id_product` = a.`id_product`) as num_rooms, ';
|
||||
$this->_select .= 'hrt.`adult`, hrt.`children`, hb.`id` as id_hotel, aa.`city`, hbl.`hotel_name`, ';
|
||||
$this->_select .= 'hrt.`adults`, hrt.`children`, hb.`id` as id_hotel, aa.`city`, hbl.`hotel_name`, ';
|
||||
$this->_select .= 'shop.`name` AS `shopname`, a.`id_shop_default`, ';
|
||||
$this->_select .= $alias_image.'.`id_image` AS `id_image`, cl.`name` AS `name_category`, '.$alias.'.`price`, 0 AS `price_final`, a.`is_virtual`, pd.`nb_downloadable`, sav.`quantity` AS `sav_quantity`, '.$alias.'.`active`, IF(sav.`quantity`<=0, 1, 0) AS `badge_danger`';
|
||||
|
||||
@@ -255,9 +255,9 @@ class AdminProductsControllerCore extends AdminController
|
||||
'callback' => 'getHotelName',
|
||||
);
|
||||
}
|
||||
$this->fields_list['adult'] = array(
|
||||
$this->fields_list['adults'] = array(
|
||||
'title' => $this->l('Adults'),
|
||||
'filter_key' => 'hrt!adult',
|
||||
'filter_key' => 'hrt!adults',
|
||||
'align' => 'center',
|
||||
);
|
||||
$this->fields_list['child'] = array(
|
||||
@@ -3438,6 +3438,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
} else {
|
||||
$this->displayWarning($this->l('You must save this room type before managing occupancy.'));
|
||||
}
|
||||
$smartyVars['currency'] = $this->context->currency;
|
||||
$data->assign($smartyVars);
|
||||
$this->tpl_form_vars['custom_form'] = $data->fetch();
|
||||
}
|
||||
@@ -3454,16 +3455,48 @@ class AdminProductsControllerCore extends AdminController
|
||||
if (Validate::isLoadedObject($objRoomType = new HotelRoomType($idHtlRoomType))) {
|
||||
$baseAdults = Tools::getValue('base_adults');
|
||||
$baseChildren = Tools::getValue('base_children');
|
||||
$maxAdults = Tools::getValue('max_adults');
|
||||
$maxChildren = Tools::getValue('max_children');
|
||||
$maxGuests = Tools::getValue('max_guests');
|
||||
|
||||
if (!$baseAdults || !Validate::isUnsignedInt($baseAdults)) {
|
||||
$this->errors[] = Tools::displayError('Invalid base adults');
|
||||
}
|
||||
if (!Validate::isUnsignedInt($baseChildren)) {
|
||||
if ($baseChildren == '' || !Validate::isUnsignedInt($baseChildren)) {
|
||||
$this->errors[] = Tools::displayError('Invalid base children');
|
||||
} else if (Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM')) {
|
||||
if ($baseChildren > Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM')) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Base children cannot be greater than max childern allowed on your website (Max: %s)'), Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'));
|
||||
}
|
||||
}
|
||||
if (!$maxAdults || !Validate::isUnsignedInt($maxAdults)) {
|
||||
$this->errors[] = Tools::displayError('Invalid maximum number of adults');
|
||||
} elseif ($maxAdults < $baseAdults) {
|
||||
$this->errors[] = Tools::displayError('Maximum number of adults cannot be less than base adults');
|
||||
}
|
||||
if ($maxChildren == '' || !Validate::isUnsignedInt($maxChildren)) {
|
||||
$this->errors[] = Tools::displayError('Invalid maximum number of children');
|
||||
} else if (Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM')) {
|
||||
if ($maxChildren > Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM')) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Maximum number of children cannot be greater than max childern allowed on your website (Max: %s)'), Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'));
|
||||
}
|
||||
} elseif ($maxChildren < $baseChildren) {
|
||||
$this->errors[] = Tools::displayError('Maximum number of children cannot be less than base children');
|
||||
}
|
||||
if (!$maxGuests || !Validate::isUnsignedInt($maxGuests)) {
|
||||
$this->errors[] = Tools::displayError('Invalid maximum number of guests');
|
||||
} elseif ($maxGuests < ($baseAdults + $baseChildren)) {
|
||||
$this->errors[] = Tools::displayError('Maximum number of guests cannot be less than base occupancy of adults and children');
|
||||
} elseif ($maxGuests > ($maxChildren + $maxAdults)) {
|
||||
$this->errors[] = Tools::displayError('Maximum number of guests cannot be more than max occupancy of adults and children');
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
$objRoomType->adult = $baseAdults;
|
||||
$objRoomType->adults = $baseAdults;
|
||||
$objRoomType->children = $baseChildren;
|
||||
$objRoomType->max_adults = $maxAdults;
|
||||
$objRoomType->max_children = $maxChildren;
|
||||
$objRoomType->max_guests = $maxGuests;
|
||||
$objRoomType->save();
|
||||
}
|
||||
} else {
|
||||
@@ -3474,7 +3507,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// send information for the length of stay tab
|
||||
public function initFormLengthOfStay($product)
|
||||
{
|
||||
|
||||
@@ -903,7 +903,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
public static function getGuestsByDate($date, $idHotel = false)
|
||||
{
|
||||
return Db::getInstance()->getRow(
|
||||
'SELECT SUM(hbd.`adult`) AS `adults`, SUM(hbd.`children`) AS `children`
|
||||
'SELECT SUM(hbd.`adults`) AS `adults`, SUM(hbd.`children`) AS `children`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`is_refunded` = 0 AND hbd.`is_back_order` = 0
|
||||
AND hbd.`date_from` BETWEEN "'.pSQL($date).' 00:00:00" AND "'.pSQL($date).' 23:59:59"'.
|
||||
|
||||
@@ -176,15 +176,16 @@ class CartControllerCore extends FrontController
|
||||
$result = $objCartBooking->deleteCartBookingData($id_cart, $id_product, 0, 0, 0, 0);
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($id_product)) {
|
||||
if ($id_hotel = $roomTypeInfo['id_hotel']) {
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
if ($hotel_room_data = $obj_booking_dtl->DataForFrontSearch(
|
||||
$date_from,
|
||||
$date_to,
|
||||
$id_hotel,
|
||||
$id_product,
|
||||
1
|
||||
)) {
|
||||
$total_available_rooms = $hotel_room_data['stats']['num_avail'];
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $id_product,
|
||||
'only_search_data' => 1,
|
||||
);
|
||||
if ($hotelRoomData = $objBookingDetail->dataForFrontSearch($bookingParams)) {
|
||||
$total_available_rooms = $hotelRoomData['stats']['num_avail'];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -267,11 +268,27 @@ class CartControllerCore extends FrontController
|
||||
$date_to = Tools::getValue('dateTo');
|
||||
$date_from = date("Y-m-d", strtotime($date_from));
|
||||
$date_to = date("Y-m-d", strtotime($date_to));
|
||||
$operator = Tools::getValue('op', 'up');
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
if ($occupancyRequiredForBooking) {
|
||||
if ($occupancy = json_decode(Tools::getValue('occupancy'), true)) {
|
||||
$this->qty = count($occupancy);
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('Invalid occupnacy.');
|
||||
}
|
||||
} else {
|
||||
$occupancy = Tools::getValue('qty');
|
||||
$this->qty = $occupancy;
|
||||
}
|
||||
|
||||
$id_cart = $this->context->cart->id;
|
||||
$id_guest = $this->context->cart->id_guest;
|
||||
|
||||
|
||||
|
||||
if ($this->qty == 0) {
|
||||
$this->errors[] = Tools::displayError('Null quantity.', !Tools::getValue('ajax'));
|
||||
} elseif (!$this->id_product) {
|
||||
@@ -284,71 +301,106 @@ class CartControllerCore extends FrontController
|
||||
return;
|
||||
}
|
||||
|
||||
$qty_to_check = $this->qty;
|
||||
$cart_products = $this->context->cart->getProducts();
|
||||
|
||||
// By Webkul : This code is to check available quantity of Room before adding it to cart.
|
||||
// only check availability if qty is increasing
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
$objRoomType = new HotelRoomType();
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($this->id_product)) {
|
||||
if ($id_hotel = $roomTypeInfo['id_hotel']) {
|
||||
if (strtotime($date_from) < strtotime(date('Y-m-d'))) {
|
||||
$this->errors[] = Tools::displayError('You can\'t book room before current date');
|
||||
} elseif (strtotime($date_from) >= strtotime($date_to)) {
|
||||
$this->errors[] = Tools::displayError('Check-out date must be after check-in date');
|
||||
} elseif ($maxOrdDate = HotelOrderRestrictDate::getMaxOrderDate($id_hotel)) {
|
||||
// Check Order restrict condition before adding in to cart
|
||||
if (strtotime('-1 day', strtotime($maxOrdDate)) < strtotime($date_from)
|
||||
|| strtotime($maxOrdDate) < strtotime($date_to)
|
||||
) {
|
||||
$maxOrdDate = date('d-m-Y', strtotime($maxOrdDate));
|
||||
$this->errors[] = Tools::displayError('You can\'t book room after date '.$maxOrdDate);
|
||||
}
|
||||
// valdiate occupancy if providede
|
||||
if ($operator == 'up') {
|
||||
if ($occupancyRequiredForBooking) {
|
||||
foreach($occupancy as $key => $roomOccupancy) {
|
||||
if (!isset($roomOccupancy['adults']) || !$roomOccupancy['adults'] || !Validate::isUnsignedInt($roomOccupancy['adults'])) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Invalid number of adults for Room %s.'), ($key + 1));
|
||||
}
|
||||
if (isset($roomOccupancy['children'])) {
|
||||
if (!Validate::isUnsignedInt($roomOccupancy['children'])) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Invalid number of children for Room %s.'), ($key + 1));
|
||||
}
|
||||
if (!$this->errors) {
|
||||
$objBookingDtl = new HotelBookingDetail();
|
||||
$num_days = $objBookingDtl->getNumberOfDays($date_from, $date_to);
|
||||
$req_rm = $this->qty;
|
||||
$this->qty = $this->qty * (int) $num_days;
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
if ($hotel_room_data = $obj_booking_dtl->DataForFrontSearch(
|
||||
$date_from,
|
||||
$date_to,
|
||||
$id_hotel,
|
||||
$this->id_product,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
$id_cart,
|
||||
$id_guest
|
||||
)) {
|
||||
if (isset($hotel_room_data['stats']['num_avail'])) {
|
||||
$total_available_rooms = $hotel_room_data['stats']['num_avail'];
|
||||
if (Tools::getValue('op', 'up') == 'up') {
|
||||
if ($total_available_rooms < $req_rm) {
|
||||
die(json_encode(array('status' => 'unavailable_quantity', 'avail_rooms' => $total_available_rooms)));
|
||||
if ($roomOccupancy['children'] > 0) {
|
||||
if (!isset($roomOccupancy['child_ages']) || ($roomOccupancy['children'] != count($roomOccupancy['child_ages'])) || !is_array($roomOccupancy['child_ages'])) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Please provide all children age for Room %s.'), ($key + 1));
|
||||
} else {
|
||||
if (is_array($roomOccupancy['child_ages'])) {
|
||||
foreach($roomOccupancy['child_ages'] as $childAge) {
|
||||
if (!Validate::isUnsignedInt($childAge)) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Invalid children age for Room %s.'), ($key + 1));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('Rooms are unavailable. Please try with different dates');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// By Webkul : This code is to check available quantity of Room before adding it to cart.
|
||||
// only check availability if qty is increasing
|
||||
if (!$this->errors) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($this->id_product)) {
|
||||
if ($id_hotel = $roomTypeInfo['id_hotel']) {
|
||||
if (strtotime($date_from) < strtotime(date('Y-m-d'))) {
|
||||
$this->errors[] = Tools::displayError('You can\'t book room before current date');
|
||||
} elseif (strtotime($date_from) >= strtotime($date_to)) {
|
||||
$this->errors[] = Tools::displayError('Check-out date must be after check-in date');
|
||||
} elseif ($maxOrdDate = HotelOrderRestrictDate::getMaxOrderDate($id_hotel)) {
|
||||
// Check Order restrict condition before adding in to cart
|
||||
if (strtotime('-1 day', strtotime($maxOrdDate)) < strtotime($date_from)
|
||||
|| strtotime($maxOrdDate) < strtotime($date_to)
|
||||
) {
|
||||
$maxOrdDate = date('d-m-Y', strtotime($maxOrdDate));
|
||||
$this->errors[] = Tools::displayError('You can\'t book room after date '.$maxOrdDate);
|
||||
}
|
||||
}
|
||||
if ($occupancyRequiredForBooking) {
|
||||
foreach($occupancy as $key => $roomOccupancy) {
|
||||
if ($roomOccupancy['adults'] > $roomTypeInfo['max_adults']) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Room %s cannot have adults more than %s'), $key + 1, $roomTypeInfo['max_adults']);
|
||||
}
|
||||
if ($roomOccupancy['children'] > $roomTypeInfo['max_children']) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Room %s cannot have children more than %s'), $key + 1, $roomTypeInfo['max_children']);
|
||||
}
|
||||
if ($roomOccupancy['adults'] + $roomOccupancy['children'] > $roomTypeInfo['max_guests']) {
|
||||
$this->errors[] = sprintf(Tools::displayError('Room %s cannot have total guests more than %s'), $key + 1, $roomTypeInfo['max_guests']);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$this->errors) {
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$num_days = $objBookingDetail->getNumberOfDays($date_from, $date_to);
|
||||
$req_rm = $this->qty;
|
||||
$this->qty = $this->qty * (int) $num_days;
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $this->id_product,
|
||||
'only_search_data' => 1,
|
||||
'id_cart' => $id_cart,
|
||||
'id_guest' => $id_guest,
|
||||
);
|
||||
if ($hotelRoomData = $objBookingDetail->dataForFrontSearch($bookingParams)) {
|
||||
if (isset($hotelRoomData['stats']['num_avail'])) {
|
||||
$total_available_rooms = $hotelRoomData['stats']['num_avail'];
|
||||
if (Tools::getValue('op', 'up') == 'up') {
|
||||
if ($total_available_rooms < $req_rm) {
|
||||
die(json_encode(array('status' => 'unavailable_quantity', 'avail_rooms' => $total_available_rooms)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('Rooms are unavailable. Please try with different dates');
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('Rooms are unavailable. Please try with different dates');
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array('status' => 'failed3')));
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array('status' => 'failed4')));
|
||||
die(json_encode(array('status' => 'failed3')));
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array('status' => 'failed4')));
|
||||
}
|
||||
}
|
||||
|
||||
$cart_products = $this->context->cart->getProducts();
|
||||
$qty_to_check = $this->qty;
|
||||
if (is_array($cart_products)) {
|
||||
foreach ($cart_products as $cart_product) {
|
||||
if ((!isset($this->id_product_attribute) || $cart_product['id_product_attribute'] == $this->id_product_attribute) &&
|
||||
@@ -411,54 +463,37 @@ class CartControllerCore extends FrontController
|
||||
/*
|
||||
* To add Rooms in hotel cart
|
||||
*/
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
if (Tools::getValue('op', 'up') == 'up') {
|
||||
$update_quantity = $this->context->cart->updateQty($this->qty, $this->id_product, $this->id_product_attribute, $this->customization_id, Tools::getValue('op', 'up'), $this->id_address_delivery);
|
||||
$this->availQty = false;
|
||||
$id_customer = $this->context->cart->id_customer;
|
||||
$id_currency = $this->context->cart->id_currency;
|
||||
|
||||
$hotel_room_info_arr = $hotel_room_data['rm_data'][0]['data']['available'];
|
||||
$chkQty = 0;
|
||||
foreach ($hotel_room_info_arr as $key_hotel_room_info => $val_hotel_room_info) {
|
||||
if ($chkQty < $req_rm) {
|
||||
$roomDemand = Tools::getValue('roomDemands');
|
||||
$roomDemand = json_decode($roomDemand, true);
|
||||
$roomDemand = json_encode($roomDemand);
|
||||
$obj_htl_cart_booking_data = new HotelCartBookingData();
|
||||
$obj_htl_cart_booking_data->id_cart = $this->context->cart->id;
|
||||
$obj_htl_cart_booking_data->id_guest = $this->context->cart->id_guest;
|
||||
$obj_htl_cart_booking_data->id_customer = $id_customer;
|
||||
$obj_htl_cart_booking_data->id_currency = $id_currency;
|
||||
$obj_htl_cart_booking_data->id_product = $val_hotel_room_info['id_product'];
|
||||
$obj_htl_cart_booking_data->id_room = $val_hotel_room_info['id_room'];
|
||||
$obj_htl_cart_booking_data->id_hotel = $val_hotel_room_info['id_hotel'];
|
||||
$obj_htl_cart_booking_data->booking_type = HotelBookingDetail::ALLOTMENT_AUTO;
|
||||
$obj_htl_cart_booking_data->quantity = $num_days;
|
||||
$obj_htl_cart_booking_data->extra_demands = $roomDemand;
|
||||
$obj_htl_cart_booking_data->date_from = $date_from;
|
||||
$obj_htl_cart_booking_data->date_to = $date_to;
|
||||
$obj_htl_cart_booking_data->save();
|
||||
++$chkQty;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->availQty = $total_available_rooms - $req_rm;
|
||||
} else {
|
||||
$objCartBooking = new HotelCartBookingData();
|
||||
$update_quantity = $objCartBooking->deleteCartBookingData(
|
||||
$id_cart,
|
||||
$this->id_product,
|
||||
0,
|
||||
$date_from,
|
||||
$date_to
|
||||
);
|
||||
$this->availQty = $total_available_rooms + $req_rm;
|
||||
|
||||
}
|
||||
$this->context->cookie->avail_rooms = $this->availQty;
|
||||
$objHotelCartBookingData = new HotelCartBookingData();
|
||||
$roomDemand = json_decode(Tools::getValue('roomDemands'), true);
|
||||
$roomDemand = json_encode($roomDemand);
|
||||
$this->availQty = $total_available_rooms;
|
||||
$update_quantity = $objHotelCartBookingData->updateRoomCartBookingData(
|
||||
$this->id_product,
|
||||
$occupancy,
|
||||
$operator,
|
||||
$id_hotel,
|
||||
$date_from,
|
||||
$date_to,
|
||||
$roomDemand,
|
||||
$id_cart,
|
||||
$id_guest
|
||||
);
|
||||
if ($operator == 'up') {
|
||||
$this->availQty = $total_available_rooms - $req_rm;
|
||||
$this->context->cookie->currentAddedProduct = json_encode(array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'id_product' => $this->id_product,
|
||||
'occupancy' => $occupancy,
|
||||
'room_demand' => $roomDemand,
|
||||
'req_rm' => $req_rm
|
||||
));
|
||||
} else {
|
||||
$this->availQty = $total_available_rooms + $req_rm;
|
||||
}
|
||||
$this->context->cookie->avail_rooms = $this->availQty;
|
||||
|
||||
/*------ BY Webkul ------*/
|
||||
|
||||
if ($update_quantity < 0) {
|
||||
|
||||
@@ -57,6 +57,9 @@ class CategoryControllerCore extends FrontController
|
||||
));
|
||||
}
|
||||
|
||||
$this->addCSS(_THEME_CSS_DIR_.'occupancy.css');
|
||||
$this->addJS(_THEME_JS_DIR_.'occupancy.js');
|
||||
|
||||
$scenes = Scene::getScenes($this->category->id, $this->context->language->id, true, false);
|
||||
if ($scenes && count($scenes)) {
|
||||
$this->addJS(_THEME_JS_DIR_.'scenes.js');
|
||||
@@ -154,6 +157,9 @@ class CategoryControllerCore extends FrontController
|
||||
$date_to = date('Y-m-d', strtotime($date_from) + 86400);
|
||||
}
|
||||
|
||||
// get occupancy of the search
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
|
||||
$currency = new Currency($this->context->currency->id);
|
||||
|
||||
if (Module::isInstalled('hotelreservationsystem')) {
|
||||
@@ -164,8 +170,18 @@ class CategoryControllerCore extends FrontController
|
||||
$id_cart = $this->context->cart->id;
|
||||
$id_guest = $this->context->cookie->id_guest;
|
||||
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
$booking_data = $obj_booking_dtl->DataForFrontSearch($date_from, $date_to, $id_hotel, 0, 0, 0, 0, -1, 0, 0, $id_cart, $id_guest);
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'occupancy' => $occupancy,
|
||||
'hotel_id' => $id_hotel,
|
||||
'get_total_rooms' => 0,
|
||||
'id_cart' => $id_cart,
|
||||
'id_guest' => $id_guest,
|
||||
);
|
||||
|
||||
$booking_data = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
|
||||
$feat_img_dir = _PS_IMG_.'rf/';
|
||||
$ratting_img = _MODULE_DIR_.'hotelreservationsystem/views/img/Slices/icons-sprite.png';
|
||||
@@ -243,21 +259,24 @@ class CategoryControllerCore extends FrontController
|
||||
$date_to = Tools::getValue('date_to');
|
||||
$htl_id_category = Tools::getValue('id_category');
|
||||
|
||||
// occupancy of the search
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
|
||||
$sort_by = Tools::getValue('sort_by');
|
||||
$sort_value = Tools::getValue('sort_value');
|
||||
$filter_data = Tools::getValue('filter_data');
|
||||
|
||||
$adult = 0;
|
||||
$child = 0;
|
||||
$adults = 0;
|
||||
$children = 0;
|
||||
$amenities = 0;
|
||||
$price = 0;
|
||||
|
||||
if (!empty($filter_data)) {
|
||||
foreach ($filter_data as $key => $value) {
|
||||
if ($key == 'adult') {
|
||||
$adult = min($value);
|
||||
if ($key == 'adults') {
|
||||
$adults = min($value);
|
||||
} elseif ($key == 'children') {
|
||||
$child = min($value);
|
||||
$children = min($value);
|
||||
} elseif ($key == 'amenities') {
|
||||
$amenities = array();
|
||||
foreach ($value as $a_k => $a_v) {
|
||||
@@ -276,11 +295,21 @@ class CategoryControllerCore extends FrontController
|
||||
|
||||
$id_hotel = HotelBranchInformation::getHotelIdByIdCategory($htl_id_category);
|
||||
|
||||
$id_cart = $this->context->cart->id;
|
||||
$id_guest = $this->context->cookie->id_guest;
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
|
||||
$obj_booking_dtl = new HotelBookingDetail();
|
||||
$booking_data = $obj_booking_dtl->DataForFrontSearch($date_from, $date_to, $id_hotel, 0, 0, $adult, $child, -1, $amenities, $price, $id_cart, $id_guest);
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'hotel_id' => $id_hotel,
|
||||
'occupancy' => $occupancy,
|
||||
'amenities' => $amenities,
|
||||
'price' => $price,
|
||||
'get_total_rooms' => 0,
|
||||
'id_cart' => $this->context->cart->id,
|
||||
'id_guest' => $this->context->cookie->id_guest,
|
||||
);
|
||||
|
||||
$booking_data = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
// reset array keys from 0
|
||||
$booking_data['rm_data'] = array_values($booking_data['rm_data']);
|
||||
if ($sort_by && $sort_value) {
|
||||
|
||||
@@ -250,7 +250,7 @@ class GuestTrackingControllerCore extends FrontController
|
||||
|
||||
$cartHotelData[$type_key]['id_product'] = $type_value['product_id'];
|
||||
$cartHotelData[$type_key]['cover_img'] = $cover_img;
|
||||
$cartHotelData[$type_key]['adult'] = $rm_dtl['adult'];
|
||||
$cartHotelData[$type_key]['adults'] = $rm_dtl['adults'];
|
||||
$cartHotelData[$type_key]['children'] = $rm_dtl['children'];
|
||||
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
|
||||
@@ -155,8 +155,9 @@ class OrderConfirmationControllerCore extends FrontController
|
||||
|
||||
$cart_htl_data[$type_key]['id_product'] = $type_value['product_id'];
|
||||
$cart_htl_data[$type_key]['cover_img'] = $cover_img;
|
||||
$cart_htl_data[$type_key]['adult'] = $rm_dtl['adult'];
|
||||
$cart_htl_data[$type_key]['adults'] = $rm_dtl['adults'];
|
||||
$cart_htl_data[$type_key]['children'] = $rm_dtl['children'];
|
||||
|
||||
foreach ($order_bk_data as $data_k => $data_v) {
|
||||
$date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']);
|
||||
/*Product price when order was created*/
|
||||
@@ -176,6 +177,9 @@ class OrderConfirmationControllerCore extends FrontController
|
||||
$num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
$var_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'];
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] += $data_v['children'];
|
||||
|
||||
//// By webkul New way to calculate product prices with feature Prices
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
@@ -195,6 +199,10 @@ class OrderConfirmationControllerCore extends FrontController
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days;
|
||||
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults'];
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['children'] = $data_v['children'];
|
||||
|
||||
|
||||
// By webkul New way to calculate product prices with feature Prices
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
$cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
|
||||
@@ -321,8 +321,6 @@ class OrderDetailControllerCore extends FrontController
|
||||
$rm_dtl = $objRoomType->getRoomTypeInfoByIdProduct($type_value['product_id']);
|
||||
$cartHotelData[$type_key]['id_product'] = $type_value['product_id'];
|
||||
$cartHotelData[$type_key]['cover_img'] = $cover_img;
|
||||
$cartHotelData[$type_key]['adult'] = $rm_dtl['adult'];
|
||||
$cartHotelData[$type_key]['children'] = $rm_dtl['children'];
|
||||
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
foreach ($order_bk_data as $data_k => $data_v) {
|
||||
@@ -339,6 +337,9 @@ class OrderDetailControllerCore extends FrontController
|
||||
|
||||
$num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['adults'] += $data_v['adults'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['children'] += $data_v['children'];
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_excl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'];
|
||||
@@ -355,6 +356,8 @@ class OrderDetailControllerCore extends FrontController
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['num_days'] = $num_days;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['adults'] = $data_v['adults'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['children'] = $data_v['children'];
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days;
|
||||
@@ -428,7 +431,6 @@ class OrderDetailControllerCore extends FrontController
|
||||
|
||||
$redirectTermsLink = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id);
|
||||
}
|
||||
|
||||
$this->context->smarty->assign(
|
||||
array(
|
||||
'id_cms_refund_policy' => Configuration::get('WK_GLOBAL_REFUND_POLICY_CMS'),
|
||||
|
||||
@@ -46,10 +46,10 @@ class ProductControllerCore extends FrontController
|
||||
$this->addCSS(_THEME_CSS_DIR_.'product.css');
|
||||
$this->addCSS(_THEME_CSS_DIR_.'print.css', 'print');
|
||||
$this->addJqueryPlugin(array('fancybox', 'idTabs', 'scrollTo', 'serialScroll', 'bxslider'));
|
||||
$this->addCSS(_THEME_CSS_DIR_.'datepicker.css');
|
||||
|
||||
$this->addJS(array(
|
||||
_THEME_JS_DIR_.'tools.js', // retro compat themes 1.5
|
||||
_THEME_JS_DIR_.'product.js'
|
||||
_THEME_JS_DIR_.'product.js',
|
||||
));
|
||||
} else {
|
||||
$this->addJqueryPlugin(array('scrollTo', 'serialScroll'));
|
||||
@@ -60,6 +60,9 @@ class ProductControllerCore extends FrontController
|
||||
));
|
||||
}
|
||||
|
||||
$this->addCSS(_THEME_CSS_DIR_.'occupancy.css');
|
||||
$this->addJS(_THEME_JS_DIR_.'occupancy.js');
|
||||
|
||||
if (Configuration::get('PS_DISPLAY_JQZOOM') == 1) {
|
||||
$this->addJqueryPlugin('jqzoom');
|
||||
}
|
||||
@@ -291,7 +294,7 @@ class ProductControllerCore extends FrontController
|
||||
$obj_hotel_room_type = new HotelRoomType();
|
||||
$room_info_by_product_id = $obj_hotel_room_type->getRoomTypeInfoByIdProduct($this->product->id);
|
||||
$productCapacity = array();
|
||||
$productCapacity['adult'] = $room_info_by_product_id['adult'];
|
||||
$productCapacity['adults'] = $room_info_by_product_id['adults'];
|
||||
$productCapacity['children'] = $room_info_by_product_id['children'];
|
||||
$this->product->capacity = $productCapacity;
|
||||
$hotel_id = $room_info_by_product_id['id_hotel'];
|
||||
@@ -363,6 +366,7 @@ class ProductControllerCore extends FrontController
|
||||
|
||||
$this->context->smarty->assign(
|
||||
array(
|
||||
'room_type_info' => $room_info_by_product_id,
|
||||
'isHotelRefundable' => $hotel_branch_obj->isRefundable(),
|
||||
'max_order_date' => $max_order_date,
|
||||
'preparation_time' => $preparationTime,
|
||||
@@ -475,7 +479,7 @@ class ProductControllerCore extends FrontController
|
||||
$idProduct,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$quantity = 1,
|
||||
$occupancy = array(),
|
||||
$jsonDemands = ''
|
||||
) {
|
||||
$objProduct = new Product($idProduct, true, $this->context->language->id, $this->context->shop->id);
|
||||
@@ -513,23 +517,22 @@ class ProductControllerCore extends FrontController
|
||||
}
|
||||
|
||||
$numDays = $objBookingDetail->getNumberOfDays($dateFrom, $dateTo);
|
||||
|
||||
$hotelRoomData = $objBookingDetail->DataForFrontSearch(
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$idHotel,
|
||||
$idProduct,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
$idCart,
|
||||
$idGuest
|
||||
$bookingParams = array(
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'hotel_id' => $idHotel,
|
||||
'id_room_type' => $idProduct,
|
||||
'id_cart' => $idCart,
|
||||
'id_guest' => $idGuest,
|
||||
);
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$bookingParams['occupancy'] = $occupancy;
|
||||
$quantity = count($occupancy);
|
||||
} else {
|
||||
$quantity = $occupancy;
|
||||
}
|
||||
|
||||
if ($hotelRoomData) {
|
||||
if ($hotelRoomData = $objBookingDetail->DataForFrontSearch($bookingParams)) {
|
||||
$totalAvailableRooms = $hotelRoomData['stats']['num_avail'];
|
||||
$quantity = ($quantity > $totalAvailableRooms) ? $totalAvailableRooms : $quantity;
|
||||
}
|
||||
@@ -584,6 +587,13 @@ class ProductControllerCore extends FrontController
|
||||
|
||||
// calculate total price
|
||||
$totalPrice = $totalRoomPrice + $demandsPrice;
|
||||
// send occupancy information searched by the user
|
||||
if ($this->ajax && $occupancy && is_array($occupancy)) {
|
||||
$smartyVars['occupancies'] = $occupancy;
|
||||
$smartyVars['occupancy_adults'] = array_sum(array_column($occupancy, 'adults'));
|
||||
$smartyVars['occupancy_children'] = array_sum(array_column($occupancy, 'children'));
|
||||
$smartyVars['occupancy_child_ages'] = array_sum(array_column($occupancy, 'child_ages'));
|
||||
}
|
||||
|
||||
$smartyVars['hotel_location'] = $hotelLocation;
|
||||
$smartyVars['order_date_restrict'] = $orderDateRestrict;
|
||||
@@ -1074,7 +1084,7 @@ class ProductControllerCore extends FrontController
|
||||
$idProduct = (int) Tools::getValue('id_product');
|
||||
$dateFrom = Tools::getValue('date_from');
|
||||
$dateTo = Tools::getValue('date_to');
|
||||
$quantity = (int) Tools::getValue('quantity');
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
$roomTypeDemands = Tools::getValue('room_type_demands');
|
||||
|
||||
$dateFrom = date('Y-m-d', strtotime($dateFrom));
|
||||
@@ -1084,7 +1094,7 @@ class ProductControllerCore extends FrontController
|
||||
$idProduct,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$quantity,
|
||||
$occupancy,
|
||||
$roomTypeDemands
|
||||
)) {
|
||||
$html = $this->context->smarty->fetch('_partials/booking-form.tpl');
|
||||
@@ -1095,102 +1105,6 @@ class ProductControllerCore extends FrontController
|
||||
$this->ajaxDie(json_encode($response));
|
||||
}
|
||||
|
||||
public function displayAjaxCheckRoomAvailabilityAndRate()
|
||||
{
|
||||
$result = array();
|
||||
if ($idProduct = Tools::getValue('id_product')) {
|
||||
$objHotelRoomType = new HotelRoomType();
|
||||
if ($roomTypeInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($idProduct)) {
|
||||
$dateFrom = Tools::getValue('date_from');
|
||||
$dateTo = Tools::getValue('date_to');
|
||||
$quantity = Tools::getValue('qty');
|
||||
if ($idHotel = $roomTypeInfo['id_hotel']) {
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
if ($hotelRoomData = $objBookingDetail->DataForFrontSearch(
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$idHotel,
|
||||
$idProduct,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
$this->context->cart->id,
|
||||
$this->context->cart->id_guest
|
||||
)) {
|
||||
$totalAvailRooms = $hotelRoomData['stats']['num_avail'];
|
||||
if ($totalAvailRooms >= $quantity) {
|
||||
$totalPrice = 0;
|
||||
$useTax = HotelBookingDetail::useTax();
|
||||
$product = new Product($idProduct);
|
||||
$productPriceWithoutReduction = $product->getPriceWithoutReduct(!$useTax);
|
||||
$numDays = $objBookingDetail->getNumberOfDays($dateFrom, $dateTo);
|
||||
$roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice(
|
||||
$idProduct,
|
||||
$dateFrom,
|
||||
$dateTo
|
||||
);
|
||||
if ($useTax) {
|
||||
$priceProduct = Product::getPriceStatic($idProduct, true);
|
||||
$featurePrice = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($idProduct, $dateFrom, $dateTo, true);
|
||||
$roomTypeDateRangePrice = $roomTypeDateRangePrice['total_price_tax_incl'];
|
||||
} else {
|
||||
$priceProduct = Product::getPriceStatic($idProduct, false);
|
||||
$featurePrice = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($idProduct, $dateFrom, $dateTo, false);
|
||||
$roomTypeDateRangePrice = $roomTypeDateRangePrice['total_price_tax_excl'];
|
||||
}
|
||||
$featurePriceDiff = (float)($productPriceWithoutReduction - $featurePrice);
|
||||
|
||||
//$price_tax_incl = Product::getPriceStatic($idProduct, $price_tax);
|
||||
$totalRoomPrice = $roomTypeDateRangePrice * $quantity;
|
||||
$totalPrice += $totalRoomPrice;
|
||||
$demandsPrice = 0;
|
||||
if ($roomDemand = Tools::getValue('room_demands')) {
|
||||
if ($roomDemand = json_decode($roomDemand, true)) {
|
||||
$objRoomDemandPrice = new HotelRoomTypeDemandPrice();
|
||||
$demandsPrice = $objRoomDemandPrice->getRoomTypeDemandsTotalPrice(
|
||||
$idProduct,
|
||||
$roomDemand,
|
||||
$useTax,
|
||||
$dateFrom,
|
||||
$dateTo
|
||||
);
|
||||
$demandsPrice *= $quantity;
|
||||
$totalPrice += $demandsPrice;
|
||||
}
|
||||
}
|
||||
$result['msg'] = 'success';
|
||||
$result['quantity'] = (int)$quantity;
|
||||
$result['total_price'] = $totalPrice;
|
||||
$result['total_room_price'] = $totalRoomPrice;
|
||||
$result['extra_demand_price'] = $demandsPrice;
|
||||
$result['num_days'] = $numDays;
|
||||
$result['avail_rooms'] = $totalAvailRooms;
|
||||
$result['original_product_price'] = $priceProduct;
|
||||
$result['feature_price'] = $featurePrice;
|
||||
$result['feature_price_diff'] = $featurePriceDiff;
|
||||
} else {
|
||||
$result['msg'] = 'unavailable_quantity';
|
||||
$result['avail_rooms'] = $totalAvailRooms;
|
||||
}
|
||||
} else {
|
||||
$result['msg'] = 'failed1';
|
||||
$result['avail_rooms'] = $totalAvailRooms;
|
||||
}
|
||||
} else {
|
||||
$result['msg'] = 'failed2';
|
||||
$result['avail_rooms'] = $totalAvailRooms;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$result['msg'] = 'failed3';
|
||||
$result['avail_rooms'] = 0;
|
||||
}
|
||||
die(json_encode($result));
|
||||
}
|
||||
|
||||
public function displayAjaxGetHotelImages()
|
||||
{
|
||||
$response = array('status' => false);
|
||||
|
||||
@@ -1165,6 +1165,7 @@ CREATE TABLE `PREFIX_orders` (
|
||||
`valid` int(1) unsigned NOT NULL DEFAULT '0',
|
||||
`is_advance_payment` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`advance_paid_amount` decimal(20,6) NOT NULL DEFAULT '0.00',
|
||||
`with_occupancy` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`date_add` datetime NOT NULL,
|
||||
`date_upd` datetime NOT NULL,
|
||||
PRIMARY KEY (`id_order`),
|
||||
|
||||
@@ -383,6 +383,15 @@ function init()
|
||||
else
|
||||
{
|
||||
$('tr#new_product input, tr#new_product select, tr#new_product button').removeAttr('disabled');
|
||||
$('tr#new_product .booking_guest_occupancy').removeClass('disabled');
|
||||
if (data.room_type_info) {
|
||||
$('tr#new_product .max_adults').val(data.room_type_info.max_adults);
|
||||
$('tr#new_product .max_children').val(data.room_type_info.max_children);
|
||||
$('tr#new_product .max_guests').val(data.room_type_info.max_guests);
|
||||
$('tr#new_product .num_adults').attr('max', data.room_type_info.max_adults);
|
||||
$('tr#new_product .num_children').attr('max', data.room_type_info.max_children);
|
||||
}
|
||||
|
||||
// Keep product variable
|
||||
current_product = data;
|
||||
$('#add_product_product_id').val(data.id_product);
|
||||
@@ -458,10 +467,220 @@ function init()
|
||||
else
|
||||
$('#add_product_product_stock').css('font-weight', 'normal').css('color', 'black').css('font-size', '1em');
|
||||
}
|
||||
// update occupancy input
|
||||
// updateOccupancyInput()
|
||||
// total update
|
||||
addProductRefreshTotal();
|
||||
});
|
||||
|
||||
function setRoomTypeGuestOccupancy(booking_occupancy_wrapper)
|
||||
{
|
||||
var adults = 0;
|
||||
var children = 0;
|
||||
var rooms = $(booking_occupancy_wrapper).find('.occupancy_info_block').length;
|
||||
|
||||
$(booking_occupancy_wrapper).find(".num_adults" ).each(function(key, val) {
|
||||
adults += parseInt($(this).val());
|
||||
});
|
||||
$(booking_occupancy_wrapper).find(".num_children" ).each(function(key, val) {
|
||||
children += parseInt($(this).val());
|
||||
});
|
||||
|
||||
var guestButtonVal = parseInt(adults) + ' ';
|
||||
if (parseInt(adults) > 1) {
|
||||
guestButtonVal += adults_txt;
|
||||
} else {
|
||||
guestButtonVal += adult_txt;
|
||||
}
|
||||
if (parseInt(children) > 0) {
|
||||
if (parseInt(children) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt;
|
||||
}
|
||||
}
|
||||
if (parseInt(rooms) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt;
|
||||
}
|
||||
|
||||
$(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(guestButtonVal);
|
||||
}
|
||||
|
||||
$(document).on('click', '.booking_occupancy_wrapper .remove-room-link', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
booking_occupancy_inner = $(this).closest('.booking_occupancy_inner');
|
||||
$(this).closest('.occupancy_info_block').remove();
|
||||
$(booking_occupancy_inner).find('.room_num_wrapper').each(function(key, val) {
|
||||
$(this).text(room_txt + ' - '+ (key+1) );
|
||||
});
|
||||
setRoomTypeGuestOccupancy($(booking_occupancy_inner).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('change', '.num_occupancy', function(e) {
|
||||
let current_room_occupancy = 0;
|
||||
$(this).closest('.occupancy_info_block').find('.num_occupancy').each(function(){
|
||||
current_room_occupancy += parseInt($(this).val());
|
||||
});
|
||||
let max_guests_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_guests').val();
|
||||
let max_allowed_for_current = (max_guests_in_room - current_room_occupancy) + parseInt($(this).val());
|
||||
if ($(this).val() > $(this).attr('max')) {
|
||||
$(this).val($(this).attr('max'));
|
||||
}
|
||||
if ($(this).val() < $(this).attr('min')) {
|
||||
$(this).val($(this).attr('min'));
|
||||
}
|
||||
if ($(this).val() > max_allowed_for_current) {
|
||||
$(this).val(max_allowed_for_current);
|
||||
}
|
||||
if ($(this).hasClass('num_children')) {
|
||||
var totalChilds = $(this).closest('.occupancy_info_block').find('.guest_child_age').length;
|
||||
if (totalChilds < $(this).val()) {
|
||||
let max_child_in_room;
|
||||
if ($(this).closest(".booking_occupancy_wrapper").find('.max_children').val()) {
|
||||
max_child_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_children').val();
|
||||
} else {
|
||||
max_child_in_room = window.max_child_in_room;
|
||||
}
|
||||
if (totalChilds < max_child_in_room) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').show();
|
||||
while ($(this).closest('.occupancy_info_block').find('.guest_child_age').length < $(this).val()) {
|
||||
|
||||
|
||||
var roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index'));
|
||||
|
||||
var childAgeSelect = '<p class="col-xs-12 col-sm-12 col-md-6 col-lg-6">';
|
||||
childAgeSelect += '<select class="guest_child_age room_occupancies" name="occupancy[' +roomBlockIndex+ '][child_ages][]">';
|
||||
childAgeSelect += '<option value="-1">' + select_age_txt + '</option>';
|
||||
childAgeSelect += '<option value="0">' + under_1_age + '</option>';
|
||||
for (let age = 1; age < max_child_age; age++) {
|
||||
childAgeSelect += '<option value="'+age+'">'+age+'</option>';
|
||||
}
|
||||
childAgeSelect += '</select>';
|
||||
childAgeSelect += '</p>';
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let child = $(this).val();
|
||||
$(this).closest('.occupancy_info_block').find('.guest_child_age').each(function(ind, element) {
|
||||
if (child <= ind) {
|
||||
$(element).parent().remove();
|
||||
}
|
||||
});
|
||||
if (child == 0) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').hide();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper'));
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(document).on('click', '.booking_guest_occupancy:not(.disabled)', function(e) {
|
||||
$(this).parent().toggleClass('open');
|
||||
});
|
||||
|
||||
$(document).on('click', function(e) {
|
||||
if ($('.booking_occupancy_wrapper:visible').length) {
|
||||
var occupancy_wrapper = $('.booking_occupancy_wrapper:visible');
|
||||
$(occupancy_wrapper).find(".occupancy_info_block").addClass('selected');
|
||||
if (!($(e.target).closest(".booking_occupancy_wrapper").length || $(e.target).closest(".booking_guest_occupancy").length || $(e.target).closest(".ajax_add_to_cart_button").length || $(e.target).closest(".exclusive.book_now_submit").length)) {
|
||||
let hasErrors = 0;
|
||||
|
||||
let adults = $(occupancy_wrapper).find(".num_adults").map(function(){return $(this).val();}).get();
|
||||
let children = $(occupancy_wrapper).find(".num_children").map(function(){return $(this).val();}).get();
|
||||
let child_ages = $(occupancy_wrapper).find(".guest_child_age").map(function(){return $(this).val();}).get();
|
||||
|
||||
// start validating above values
|
||||
if (!adults.length || (adults.length != children.length)) {
|
||||
hasErrors = 1;
|
||||
showErrorMessage(invalid_occupancy_txt);
|
||||
} else {
|
||||
$(occupancy_wrapper).find('.occupancy_count').removeClass('error_border');
|
||||
|
||||
// validate values of adults and children
|
||||
adults.forEach(function (item, index) {
|
||||
if (isNaN(item) || parseInt(item) < 1) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
if (isNaN(children[index])) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
});
|
||||
|
||||
// validate values of selected child ages
|
||||
$(occupancy_wrapper).find('.guest_child_age').parent().removeClass('has-error');
|
||||
child_ages.forEach(function (age, index) {
|
||||
age = parseInt(age);
|
||||
if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".guest_child_age").eq(index).parent().addClass('has-error');
|
||||
}
|
||||
});
|
||||
}
|
||||
if (hasErrors == 0) {
|
||||
$(occupancy_wrapper).parent().removeClass('open');
|
||||
$(document).trigger( "QloApps:updateRoomOccupancy", [occupancy_wrapper]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('.booking_occupancy_wrapper .add_new_occupancy_btn').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var booking_occupancy_wrapper = $(this).closest('.booking_occupancy_wrapper');
|
||||
var occupancy_block = '';
|
||||
var roomBlockIndex = parseInt($(booking_occupancy_wrapper).find(".occupancy_info_block").last().attr('occ_block_index'));
|
||||
roomBlockIndex += 1;
|
||||
let max_child_in_room;
|
||||
if ($(this).closest(".booking_occupancy_wrapper").find('.max_children').val()) {
|
||||
max_child_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_children').val();
|
||||
} else {
|
||||
max_child_in_room = window.max_child_in_room;
|
||||
}
|
||||
var countRooms = parseInt($(booking_occupancy_wrapper).find('.occupancy_info_block').length);
|
||||
countRooms += 1
|
||||
occupancy_block += '<div class="occupancy_info_block col-sm-12" occ_block_index="'+roomBlockIndex+'">';
|
||||
occupancy_block += '<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">'+ room_txt + ' - ' + countRooms + '</label><a class="remove-room-link pull-right" href="#">' + remove_txt + '</a></div>';
|
||||
occupancy_block += '<div class="col-sm-12">';
|
||||
occupancy_block += '<div class="row">';
|
||||
occupancy_block += '<div class="form-group col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<label>' + adults_txt + '</label>';
|
||||
occupancy_block += '<input type="number" class="form-control num_occupancy num_adults" name="occupancy['+roomBlockIndex+'][adults]" value="1" min="1">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<label>' + child_txt + '<span class="label-desc-txt"></span></label>';
|
||||
occupancy_block += '<input type="number" class="form-control num_occupancy num_children" name="occupancy['+roomBlockIndex+'][children]" value="0" min="0" max="'+max_child_in_room+'">(' + below_txt + ' ' + max_child_age + ' ' + years_txt + ')';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="row children_age_info_block" style="display:none">';
|
||||
occupancy_block += '<div class="form-group col-sm-12">';
|
||||
occupancy_block += '<label class="">' + all_children_txt + '</label>';
|
||||
occupancy_block += '<div class="">';
|
||||
occupancy_block += '<div class="row children_ages">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<hr class="occupancy-info-separator col-sm-12">';
|
||||
$(booking_occupancy_wrapper).find('.booking_occupancy_inner').append(occupancy_block);
|
||||
|
||||
setRoomTypeGuestOccupancy(booking_occupancy_wrapper);
|
||||
});
|
||||
|
||||
$('input#add_product_product_quantity').on('change', function(){
|
||||
// updateOccupancyInput()
|
||||
addProductRefreshTotal();
|
||||
});
|
||||
|
||||
$('#submitAddProduct').unbind('click').click(function(e) {
|
||||
e.preventDefault();
|
||||
stopAjaxQuery();
|
||||
@@ -635,16 +854,13 @@ function init()
|
||||
if (!element_list.length)
|
||||
{
|
||||
element_list = element.parents('.product-line-row');
|
||||
element_list.find('td .booking_duration_show').hide();
|
||||
element_list.find('td .booking_duration_edit').show();
|
||||
}
|
||||
else
|
||||
{
|
||||
element_list.find('td .booking_duration_show').hide();
|
||||
element_list.find('td .booking_duration_edit').show();
|
||||
}
|
||||
element_list.find('td .room_unit_price_show').hide();
|
||||
element_list.find('td .room_unit_price_edit').show();
|
||||
element_list.find('td .booking_duration_show').hide();
|
||||
element_list.find('td .booking_duration_edit').show();
|
||||
element_list.find('td .booking_occupancy_show').hide();
|
||||
element_list.find('td .booking_occupancy_edit').show();
|
||||
//element_list.find('td .product_price_show').hide();
|
||||
//element_list.find('td .product_price_edit').show();
|
||||
element_list.find('td.cancelCheck').hide();
|
||||
@@ -685,6 +901,8 @@ function init()
|
||||
element_list.find('td .booking_duration_edit').hide();
|
||||
element_list.find('td .room_unit_price_show').show();
|
||||
element_list.find('td .room_unit_price_edit').hide();
|
||||
element_list.find('td .booking_occupancy_show').show();
|
||||
element_list.find('td .booking_occupancy_edit').hide();
|
||||
element_list.find('td.product_invoice').hide();
|
||||
element_list.find('td.cancelCheck').show();
|
||||
element_list.find('td.cancelQuantity').show();
|
||||
@@ -724,10 +942,12 @@ function init()
|
||||
var id_order_detail = $(this).closest('.product-line-row').find('td .edit_product_id_order_detail').val();
|
||||
//some vaues are added to the query by webkul
|
||||
query = 'ajax=1&token='+token+'&action=editProductOnOrder&id_order='+id_order+'&id_room='+id_room+'&id_product='+id_product+'&id_hotel='+id_hotel+'&date_from='+date_from+'&date_to='+date_to+'&order_detail_id='+order_detail_id+'&';
|
||||
if (element_list.length)
|
||||
|
||||
if (element_list.length) {
|
||||
query += element_list.parent().parent().find('input, select, .edit_product_id_order_detail').serialize();
|
||||
else
|
||||
} else {
|
||||
query += element.parent().parent().find('input, select, .edit_product_id_order_detail').serialize();
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
|
||||
48
js/admin/ppreferences.js
Normal file
48
js/admin/ppreferences.js
Normal file
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* 2010-2023 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through LICENSE.txt file inside our module
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to CustomizationPolicy.txt file inside our module for more information.
|
||||
*
|
||||
* @author Webkul IN
|
||||
* @copyright 2010-2023 Webkul IN
|
||||
* @license LICENSE.txt
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
setFrontOccupancyView();
|
||||
$('#PS_FRONT_SEARCH_TYPE').on('change', setFrontOccupancyView);
|
||||
setBackOccupancyView();
|
||||
$('#PS_BACKOFFICE_SEARCH_TYPE').on('change', setBackOccupancyView);
|
||||
|
||||
function setFrontOccupancyView()
|
||||
{
|
||||
if ($('#PS_FRONT_SEARCH_TYPE').val() == SEARCH_TYPE_OWS) {
|
||||
$('#PS_FRONT_OWS_SEARCH_ALGO_TYPE').closest('.form-group').show('fast');
|
||||
$('#PS_FRONT_ROOM_UNIT_SELECTION_TYPE').closest('.form-group').hide('fast');
|
||||
} else {
|
||||
$('#PS_FRONT_OWS_SEARCH_ALGO_TYPE').closest('.form-group').hide('fast');
|
||||
$('#PS_FRONT_ROOM_UNIT_SELECTION_TYPE').closest('.form-group').show('fast');
|
||||
}
|
||||
}
|
||||
|
||||
function setBackOccupancyView()
|
||||
{
|
||||
if ($('#PS_BACKOFFICE_SEARCH_TYPE').val() == SEARCH_TYPE_OWS) {
|
||||
$('#PS_BACKOFFICE_OWS_SEARCH_ALGO_TYPE').closest('.form-group').show('fast');
|
||||
$('#PS_BACKOFFICE_ROOM_BOOKING_TYPE').closest('.form-group').hide('fast');
|
||||
} else {
|
||||
$('#PS_BACKOFFICE_OWS_SEARCH_ALGO_TYPE').closest('.form-group').hide('fast');
|
||||
$('#PS_BACKOFFICE_ROOM_BOOKING_TYPE').closest('.form-group').show('fast');
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
21
js/daterangepicker/LICENSE.txt
Normal file
21
js/daterangepicker/LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Chunlong
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
460
js/daterangepicker/jquery.daterangepicker.css
Normal file
460
js/daterangepicker/jquery.daterangepicker.css
Normal file
@@ -0,0 +1,460 @@
|
||||
.date-picker {
|
||||
width: 170px;
|
||||
height: 25px;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
line-height: 25px;
|
||||
padding-left: 10px;
|
||||
font-size: 12px;
|
||||
font-family: Arial, sans-serif;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
color: #303030;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.date-picker-wrapper {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
border: 1px solid #bfbfbf;
|
||||
background-color: #efefef;
|
||||
padding: 5px 12px;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
color: #aaa;
|
||||
font-family: Arial, sans-serif;
|
||||
-webkit-box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
|
||||
-webkit-box-sizing: initial;
|
||||
box-sizing: initial;
|
||||
}
|
||||
|
||||
.dp-clearfix {
|
||||
clear: both;
|
||||
height: 0;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.inline-wrapper {
|
||||
position: relative;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.single-date {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.no-shortcuts {
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.no-topbar {
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .footer {
|
||||
font-size: 11px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper b {
|
||||
color: #666;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.date-picker-wrapper a {
|
||||
color: #6bb4d6;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-name {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .select-wrapper {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .select-wrapper:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-element {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .select-wrapper select {
|
||||
position: absolute;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
left: 0;
|
||||
top: -1px;
|
||||
font-size: inherit;
|
||||
font-style: inherit;
|
||||
font-weight: inherit;
|
||||
text-transform: inherit;
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)";
|
||||
filter: alpha(opacity=1);
|
||||
opacity: 0.01;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper {
|
||||
border: 1px solid #bfbfbf;
|
||||
border-radius: 3px;
|
||||
background-color: #fff;
|
||||
padding: 5px;
|
||||
cursor: default;
|
||||
position: relative;
|
||||
_overflow: hidden;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table {
|
||||
width: 190px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table.month2 {
|
||||
width: 190px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table th, .date-picker-wrapper .month-wrapper table td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
line-height: 14px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day {
|
||||
padding: 5px 0;
|
||||
line-height: 1;
|
||||
font-size: 12px;
|
||||
margin-bottom: 1px;
|
||||
color: #ccc;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table div.day.lastMonth, .date-picker-wrapper .month-wrapper table div.day.nextMonth {
|
||||
color: #999;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.checked {
|
||||
background-color: #9cdbf7;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .week-name {
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
font-weight: 100;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.has-tooltip {
|
||||
cursor: help !important;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.has-tooltip .tooltip {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time label {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.toMonth.valid {
|
||||
color: #333;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.toMonth.hovering {
|
||||
background-color: #cdecfa;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.nextMonth, .date-picker-wrapper .month-wrapper table .day.lastMonth {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.real-today {
|
||||
background-color: #ffe684;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .month-wrapper table .day.real-today.checked, .date-picker-wrapper .month-wrapper table .day.real-today.hovering {
|
||||
background-color: #70ccd5;
|
||||
}
|
||||
|
||||
.date-picker-wrapper table .caption {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper table .caption > th:first-of-type, .date-picker-wrapper table .caption > th:last-of-type {
|
||||
width: 27px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper table .caption .next, .date-picker-wrapper table .caption .prev {
|
||||
padding: 0 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.date-picker-wrapper table .caption .next:hover, .date-picker-wrapper table .caption .prev:hover {
|
||||
background-color: #ccc;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
width: 15px;
|
||||
height: 100%;
|
||||
background-color: red;
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
float: left;
|
||||
top: -5px;
|
||||
margin: 0 10px -10px;
|
||||
visibility: hidden;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-lines {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-line {
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-line .gap-1 {
|
||||
z-index: 1;
|
||||
height: 0;
|
||||
border-left: 8px solid white;
|
||||
border-top: 8px solid #eee;
|
||||
border-bottom: 8px solid #eee;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-line .gap-2 {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0px;
|
||||
z-index: 2;
|
||||
height: 0;
|
||||
border-left: 8px solid transparent;
|
||||
border-top: 8px solid white;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-line .gap-3 {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 8px;
|
||||
z-index: 2;
|
||||
height: 0;
|
||||
border-left: 8px solid transparent;
|
||||
border-bottom: 8px solid white;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-top-mask {
|
||||
width: 6px;
|
||||
height: 1px;
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: 1px;
|
||||
background-color: #eee;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .gap .gap-bottom-mask {
|
||||
width: 6px;
|
||||
height: 1px;
|
||||
position: absolute;
|
||||
bottom: -1px;
|
||||
left: 7px;
|
||||
background-color: #eee;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .selected-days {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar {
|
||||
line-height: 1.4;
|
||||
position: relative;
|
||||
padding: 10px 40px 10px 0;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar .error-top, .date-picker-wrapper .drp_top-bar .normal-top {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar .default-top {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar.error .default-top {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar.error .error-top {
|
||||
display: block;
|
||||
color: red;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar.normal .default-top {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar.normal .normal-top {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar.normal .normal-top .selection-top {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar .apply-btn {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top: 6px;
|
||||
padding: 3px 5px;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
color: #d9eef7;
|
||||
border: solid 1px #0076a3;
|
||||
background: #0095cd;
|
||||
background: -moz-linear-gradient(top, #00adee, #0078a5);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00adee', endColorstr='#0078a5');
|
||||
color: white;
|
||||
line-height: initial;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .drp_top-bar .apply-btn.disabled {
|
||||
cursor: pointer;
|
||||
color: #606060;
|
||||
border: solid 1px #b7b7b7;
|
||||
background: #fff;
|
||||
background: -moz-linear-gradient(top, #fff, #ededed);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed');
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.single-month .time {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time input[type=range] {
|
||||
vertical-align: middle;
|
||||
width: 129px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time1 {
|
||||
width: 180px;
|
||||
padding: 0 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*time styling*/
|
||||
.time2 {
|
||||
width: 180px;
|
||||
padding: 0 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time1 {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .time2 {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .hour {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.minute {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .first-date-selected, .date-picker-wrapper .last-date-selected {
|
||||
background-color: #49e !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .date-range-length-tip {
|
||||
position: absolute;
|
||||
margin-top: -4px;
|
||||
margin-left: -8px;
|
||||
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
|
||||
display: none;
|
||||
background-color: yellow;
|
||||
padding: 0 6px;
|
||||
border-radius: 2px;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
-webkit-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
|
||||
-moz-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
|
||||
-ms-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
|
||||
-o-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
|
||||
filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
|
||||
}
|
||||
|
||||
.date-picker-wrapper .date-range-length-tip:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
border-left: 4px solid transparent;
|
||||
border-right: 4px solid transparent;
|
||||
border-top: 4px solid yellow;
|
||||
left: 50%;
|
||||
margin-left: -4px;
|
||||
bottom: -4px;
|
||||
}
|
||||
|
||||
.date-picker-wrapper.two-months.no-gap .month1 .next, .date-picker-wrapper.two-months.no-gap .month2 .prev {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .week-number {
|
||||
padding: 5px 0;
|
||||
line-height: 1;
|
||||
font-size: 12px;
|
||||
margin-bottom: 1px;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .week-number.week-number-selected {
|
||||
color: #49e;
|
||||
font-weight: bold;
|
||||
}
|
||||
2638
js/daterangepicker/jquery.daterangepicker.js
Executable file
2638
js/daterangepicker/jquery.daterangepicker.js
Executable file
File diff suppressed because it is too large
Load Diff
1
js/daterangepicker/jquery.daterangepicker.min.css
vendored
Normal file
1
js/daterangepicker/jquery.daterangepicker.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
7
js/daterangepicker/jquery.daterangepicker.min.js
vendored
Executable file
7
js/daterangepicker/jquery.daterangepicker.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
2
js/daterangepicker/moment.min.js
vendored
Normal file
2
js/daterangepicker/moment.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
62
js/daterangepicker/qlodaterangepicker.js
Normal file
62
js/daterangepicker/qlodaterangepicker.js
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* 2010-2022 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright 2010-2022 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var dateRangePickerOrg = $.fn.dateRangePicker;
|
||||
$.fn.dateRangePicker = function(opt) {
|
||||
if(typeof opt === "object") {
|
||||
const custom_opt = {
|
||||
format: 'DD-MM-YYYY',
|
||||
showTopbar: false,
|
||||
autoClose: true,
|
||||
singleMonth: true,
|
||||
language: lang_iso,
|
||||
minDays: 2,
|
||||
startOfWeek: 'monday',
|
||||
hoveringTooltip: false,
|
||||
container: '#page',
|
||||
customArrowPrevSymbol: '<i class="icon icon-angle-left"></i>',
|
||||
customArrowNextSymbol: '<i class="icon icon-angle-right"></i>',
|
||||
getValue: function()
|
||||
{
|
||||
return $(this).find('span').html();
|
||||
},
|
||||
setValue: function(s, s1, s2) {
|
||||
if (s) {
|
||||
$(this).find('span').html(s.replace('to', ' <i class="icon icon-minus"></i> '));
|
||||
} else {
|
||||
$(this).find('span').html(
|
||||
RangePickerCheckin + ' <i class="icon icon-minus"></i> ' + RangePickerCheckout
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
$.each(opt, function(index) {
|
||||
delete custom_opt[index];
|
||||
});
|
||||
|
||||
$.extend(true, opt, custom_opt);
|
||||
|
||||
}
|
||||
|
||||
var args = Array.prototype.slice.call(arguments,0);
|
||||
return dateRangePickerOrg.apply(this, args);
|
||||
}
|
||||
})(jQuery);
|
||||
@@ -184,9 +184,7 @@ function validate_field(that)
|
||||
var selector = '#id_country';
|
||||
if ($(that).attr('name') == 'postcode_invoice')
|
||||
selector += '_invoice';
|
||||
|
||||
var id_country = $(selector + ' option:selected').val();
|
||||
|
||||
if (typeof(countriesNeedZipCode[id_country]) != 'undefined' && typeof(countries[id_country]) != 'undefined')
|
||||
var result = window['validate_'+$(that).attr('data-validate')]($(that).val(), countriesNeedZipCode[id_country], countries[id_country]['iso_code']);
|
||||
}
|
||||
|
||||
@@ -134,26 +134,28 @@ var ajaxCart = {
|
||||
|
||||
var dateFrom = $(this).attr('cat_rm_check_in');
|
||||
var dateTo = $(this).attr('cat_rm_check_out');
|
||||
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('.booking_room_fields'));
|
||||
/* By Webkul
|
||||
* Note : In our case minimalQuantity is taken from Qty. field
|
||||
*/
|
||||
// var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
var minimalQuantity = $("#cat_quantity_wanted_" + idProduct).val();
|
||||
if (!minimalQuantity)
|
||||
minimalQuantity = 1;
|
||||
if ($(this).prop('disabled') != 'disabled')
|
||||
ajaxCart.add(idProduct, idProductAttribute, false, this, minimalQuantity, null, dateFrom, dateTo);
|
||||
// var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
// var minimalQuantity = $("#quantity_wanted_" + idProduct).val();
|
||||
// if (!minimalQuantity)
|
||||
// minimalQuantity = 1;
|
||||
if ($(this).prop('disabled') != 'disabled' && occupancy)
|
||||
ajaxCart.add(idProduct, idProductAttribute, false, this, occupancy, null, dateFrom, dateTo);
|
||||
});
|
||||
//for product page 'add' button...
|
||||
if ($('.cart_block').length) {
|
||||
$(document).off('click', '#add_to_cart button').on('click', '#add_to_cart button', function(e) {
|
||||
$(document).off('click', '#add_to_cart button').on('click', '#add_to_cart button', function(e) {
|
||||
e.preventDefault();
|
||||
var date_from = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
var date_to = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null, date_from, date_to);
|
||||
|
||||
var date_from = $('#room_check_in').val();
|
||||
var date_to = $('#room_check_out').val();
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('.booking_room_fields'));
|
||||
if (occupancy) {
|
||||
ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, occupancy, null, date_from, date_to);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -214,8 +216,8 @@ var ajaxCart = {
|
||||
|
||||
/*by webkul*/
|
||||
if (pagename == 'product') {
|
||||
dateFrom = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
dateTo = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
dateFrom = $('#room_check_in').val();
|
||||
dateTo = $('#room_check_out').val();
|
||||
} else if (pagename == 'category') {
|
||||
dateFrom = $('#check_in_time').val();
|
||||
dateTo = $('#check_out_time').val();
|
||||
@@ -319,7 +321,7 @@ var ajaxCart = {
|
||||
// close fancybox
|
||||
updateFancyBox: function() {},
|
||||
// add a product in the cart via ajax
|
||||
add: function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist, dateFrom, dateTo) {
|
||||
add: function(idProduct, idCombination, addedFromProductPage, callerElement, occupancy, whishlist, dateFrom, dateTo) {
|
||||
|
||||
if (addedFromProductPage && !checkCustomizations()) {
|
||||
if (contentOnly) {
|
||||
@@ -346,8 +348,9 @@ var ajaxCart = {
|
||||
if (addedFromProductPage) {
|
||||
$('#add_to_cart button').prop('disabled', 'disabled').addClass('disabled');
|
||||
$('.filled').removeClass('filled');
|
||||
} else
|
||||
} else {
|
||||
$(callerElement).prop('disabled', 'disabled');
|
||||
}
|
||||
|
||||
if ($('.cart_block_list').hasClass('collapsed'))
|
||||
this.expand();
|
||||
@@ -355,6 +358,7 @@ var ajaxCart = {
|
||||
|
||||
// get the selected extra demands by customer
|
||||
var roomDemands = getRoomsExtraDemands();
|
||||
|
||||
//send the ajax request to the server
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
@@ -365,7 +369,7 @@ var ajaxCart = {
|
||||
async: true,
|
||||
cache: false,
|
||||
dataType: "json",
|
||||
data: 'controller=cart&add=1&dateFrom=' + dateFrom + '&dateTo=' + dateTo + '&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&roomDemands=' + JSON.stringify(roomDemands) + '&token=' + static_token + ((parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination) : '' + '&id_customization=' + ((typeof customizationId !== 'undefined') ? customizationId : 0)),
|
||||
data: 'controller=cart&add=1&dateFrom=' + dateFrom + '&dateTo=' + dateTo + '&ajax=true'+(occupancy_required_for_booking ? '&occupancy=' + JSON.stringify(occupancy) : '&qty=' + occupancy) + '&id_product=' + idProduct + '&roomDemands=' + JSON.stringify(roomDemands) + '&token=' + static_token + ((parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination) : '' + '&id_customization=' + ((typeof customizationId !== 'undefined') ? customizationId : 0)),
|
||||
success: function(jsonData, textStatus, jqXHR) {
|
||||
/*by webkul checking and setting availability of rooms*/
|
||||
/*for product page add to cart quantity management*/
|
||||
@@ -378,18 +382,19 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$(callerElement).closest(".room_cont").find(".rm_left").show();
|
||||
} else {
|
||||
$("cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$(callerElement).closest(".room_cont").find(".rm_left").hide();
|
||||
}
|
||||
|
||||
/*for category page add to cart quantity management*/
|
||||
$(callerElement).closest(".room_cont").find(".remain_rm_qty").text(jsonData.avail_rooms);
|
||||
$(callerElement).closest(".room_cont").find('.max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').hide();
|
||||
$(callerElement).closest(".room_cont").hide();
|
||||
}
|
||||
//$('#cat_quantity_wanted_'+idProduct).val(1);
|
||||
//$('#quantity_wanted_'+idProduct).val(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -406,22 +411,27 @@ var ajaxCart = {
|
||||
if (jsonData.crossSelling)
|
||||
$('.crossseling').html(jsonData.crossSelling);
|
||||
|
||||
if (idCombination)
|
||||
$(jsonData.products).each(function() {
|
||||
if (this.id != undefined && this.id == parseInt(idProduct) && this.idCombination == parseInt(idCombination))
|
||||
if (contentOnly)
|
||||
window.parent.ajaxCart.updateLayer(this);
|
||||
else
|
||||
ajaxCart.updateLayer(this);
|
||||
});
|
||||
else
|
||||
$(jsonData.products).each(function() {
|
||||
if (this.id != undefined && this.id == parseInt(idProduct))
|
||||
if (contentOnly)
|
||||
window.parent.ajaxCart.updateLayer(this);
|
||||
else
|
||||
ajaxCart.updateLayer(this);
|
||||
});
|
||||
// if (idCombination)
|
||||
// $(jsonData.products).each(function() {
|
||||
// if (this.id != undefined && this.id == parseInt(idProduct) && this.idCombination == parseInt(idCombination))
|
||||
// if (contentOnly)
|
||||
// window.parent.ajaxCart.updateLayer(this);
|
||||
// else
|
||||
// ajaxCart.updateLayer(this);
|
||||
// });
|
||||
// else
|
||||
// $(jsonData.products).each(function() {
|
||||
// if (this.id != undefined && this.id == parseInt(idProduct))
|
||||
// if (contentOnly)
|
||||
// window.parent.ajaxCart.updateLayer(this);
|
||||
// else {
|
||||
// ajaxCart.updateLayer(this);
|
||||
// }
|
||||
// });
|
||||
if (jsonData.last_added_product) {
|
||||
ajaxCart.updateLayer(jsonData.last_added_product);
|
||||
|
||||
}
|
||||
if (contentOnly)
|
||||
parent.$.fancybox.close();
|
||||
} else {
|
||||
@@ -434,7 +444,9 @@ var ajaxCart = {
|
||||
else
|
||||
$(callerElement).removeProp('disabled');
|
||||
}
|
||||
|
||||
if (!addedFromProductPage) {
|
||||
resetOccupancyField($(callerElement).closest('.booking_room_fields').find('.booking_occupancy_wrapper'));
|
||||
}
|
||||
emptyCustomizations();
|
||||
|
||||
},
|
||||
@@ -495,12 +507,11 @@ var ajaxCart = {
|
||||
/*by webkul checking and setting availability of rooms*/
|
||||
/*for product page add to cart quantity management*/
|
||||
if (pagename == 'product') {
|
||||
var date_checkIn = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
var date_checkOut = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
var date_checkIn = $('#room_check_in').val();
|
||||
var date_checkOut = $('#room_check_out').val();
|
||||
var product_page_id_product = $('#product_page_product_id').val();
|
||||
if (idProduct == product_page_id_product && dateFrom < date_checkOut && dateTo >= date_checkIn) {
|
||||
$("#max_avail_type_qty").val(jsonData.avail_rooms);
|
||||
|
||||
$(".max_avail_type_qty").val(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
disableRoomTypeDemands(1);
|
||||
}
|
||||
@@ -510,18 +521,19 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .rm_left').show();
|
||||
} else {
|
||||
$("cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$("room_cont").find('[data-id-product="'+idProduct+'"] .rm_left').hide();
|
||||
}
|
||||
|
||||
/*for category page add to cart quantity management*/
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .remain_rm_qty').text(jsonData.avail_rooms);
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').hide();
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"]').hide();
|
||||
}
|
||||
//$('#cat_quantity_wanted_'+idProduct).val(1);
|
||||
//$('#quantity_wanted_'+idProduct).val(1);
|
||||
}
|
||||
|
||||
ajaxCart.updateCart(jsonData);
|
||||
@@ -615,14 +627,14 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
// for category page....
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').show(0, function() {
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find(".remain_rm_qty").text(jsonData.avail_rooms);
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').show(0, function() {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.rm_left').show();
|
||||
} else {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.rm_left').hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -817,7 +829,7 @@ var ajaxCart = {
|
||||
|
||||
content += '<div class="room-capacity cart-info-sec">';
|
||||
content += '<span class="product_info_label">' + capacity_txt + ':</span>';
|
||||
content += '<span class="product_info_data"> ' + cart_booking_data[key].adult + ' ' + adults_txt + ' & ' + cart_booking_data[key].children + ' ' + children_txt + '</span>'
|
||||
content += '<span class="product_info_data"> ' + cart_booking_data[key].adults + ' ' + adults_txt + ' & ' + cart_booking_data[key].children + ' ' + children_txt + '</span>'
|
||||
content += '</div>';
|
||||
|
||||
if (this.hasAttributes)
|
||||
@@ -1010,17 +1022,25 @@ var ajaxCart = {
|
||||
$('#layer_cart_product_price').text(product.price);
|
||||
|
||||
//by webkul has to work on it more..
|
||||
if (pagename == 'product') {
|
||||
$('#layer_cart_product_time_duration').text($('#room_check_in').val() + ' - ' + $('#room_check_out').val());
|
||||
$('#layer_cart_product_quantity').text($('#quantity_wanted').val());
|
||||
$('#quantity_wanted').val(1);
|
||||
}
|
||||
if (pagename == 'category') {
|
||||
$('#layer_cart_product_time_duration').text($('#check_in_time').val() + ' - ' + $('#check_out_time').val());
|
||||
$('#layer_cart_product_quantity').text($('#cat_quantity_wanted_' + product.id).val());
|
||||
$('#cat_quantity_wanted_' + product.id).val(1);
|
||||
$('#layer_cart_product_time_duration').text(
|
||||
product.date_from + ' - ' + product.date_to
|
||||
);
|
||||
|
||||
let rooms = 0;
|
||||
let adults = 0;
|
||||
let children = 0;
|
||||
let room_quantity_text = '';
|
||||
if (occupancy_required_for_booking) {
|
||||
$.each(product.occupancy, function(index, val) {
|
||||
rooms++;
|
||||
adults += parseInt(val.adults);
|
||||
children += parseInt(val.children);
|
||||
});
|
||||
room_quantity_text = getRoomTypeGuestOccupancyFormated(adults, children, rooms);
|
||||
} else {
|
||||
room_quantity_text = product.occupancy;
|
||||
}
|
||||
$('#layer_cart_product_quantity').text(room_quantity_text);
|
||||
|
||||
$('.layer_cart_img').html('<img class="layer_cart_img img-responsive" src="' + product.image + '" alt="' + product.name + '" title="' + product.name + '" />');
|
||||
|
||||
@@ -1189,4 +1209,48 @@ function getRoomsExtraDemands()
|
||||
});
|
||||
|
||||
return roomDemands;
|
||||
}
|
||||
|
||||
function getBookingOccupancyDetails(bookingform)
|
||||
{
|
||||
let occupancy;
|
||||
if (occupancy_required_for_booking) {
|
||||
let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected")
|
||||
if (selected_occupancy.length) {
|
||||
occupancy = [];
|
||||
$(selected_occupancy).each(function(ind, element) {
|
||||
if (parseInt($(element).find('.num_adults').val())) {
|
||||
let child_ages = [];
|
||||
$(element).find('.guest_child_age').each(function(index) {
|
||||
if ($(this).val() > -1) {
|
||||
child_ages.push($(this).val());
|
||||
}
|
||||
});
|
||||
if ($(element).find('.num_children').val()) {
|
||||
if (child_ages.length != $(element).find('.num_children').val()) {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
occupancy.push({
|
||||
'adults': $(element).find('.num_adults').val(),
|
||||
'children': $(element).find('.num_children').val(),
|
||||
'child_ages': child_ages
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
}
|
||||
} else {
|
||||
occupancy = parseInt($(bookingform).find(".quantity_wanted").val());
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
}
|
||||
@@ -195,6 +195,52 @@ class Blockcart extends Module
|
||||
1
|
||||
);
|
||||
|
||||
$addedProduct = false;
|
||||
// get currently added product if exists
|
||||
if (!empty($params['cookie']->currentAddedProduct)) {
|
||||
$addedProduct = json_decode($params['cookie']->currentAddedProduct, true);
|
||||
$objProduct = new Product($addedProduct['id_product'], false, $this->context->language->id);
|
||||
|
||||
$addedProduct['name'] = $objProduct->name;
|
||||
$addedProduct['link'] = $this->context->link->getProductLink(
|
||||
$objProduct->id,
|
||||
$objProduct->link_rewrite,
|
||||
$objProduct->category,
|
||||
null,
|
||||
null,
|
||||
$this->context->cart->id_shop
|
||||
);
|
||||
$image = Product::getCover($objProduct->id);
|
||||
$image['id_product'] = $objProduct->id;
|
||||
// Product::defineProductImage(array(Product::getCover($objProduct->id)['id_image']/), $this->id_lang)
|
||||
$addedProduct['image'] = $this->context->link->getImageLink(
|
||||
$objProduct->link_rewrite,
|
||||
Product::defineProductImage($image, $this->context->language->id),
|
||||
'home_default'
|
||||
);
|
||||
$addedProduct['image_cart'] = $this->context->link->getImageLink(
|
||||
$objProduct->link_rewrite,
|
||||
Product::defineProductImage($image, $this->context->language->id),
|
||||
'cart_default'
|
||||
);
|
||||
$price = $addedProduct['price'] = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice(
|
||||
$objProduct->id,
|
||||
$addedProduct['date_from'],
|
||||
$addedProduct['date_to'],
|
||||
$addedProduct['req_rm']
|
||||
);
|
||||
|
||||
if ($priceDisplayMethod == PS_TAX_EXC) {
|
||||
$addedProduct['price'] = Tools::displayPrice($price['total_price_tax_incl']);
|
||||
} else {
|
||||
$addedProduct['price'] = Tools::displayPrice($price['total_price_tax_excl']);
|
||||
}
|
||||
$addedProduct['date_from'] = Tools::displayDate($addedProduct['date_from']);
|
||||
$addedProduct['date_to'] = Tools::displayDate($addedProduct['date_to']);
|
||||
|
||||
unset($this->context->cookie->currentAddedProduct);
|
||||
}
|
||||
|
||||
$response = array(
|
||||
'products' => $products,
|
||||
'customizedDatas' => Product::getAllCustomizedDatas((int) ($params['cart']->id)),
|
||||
@@ -219,7 +265,7 @@ class Blockcart extends Module
|
||||
'static_token' => Tools::getToken(false),
|
||||
'free_shipping' => Tools::displayPrice($total_free_shipping),
|
||||
'free_shipping_float' => $total_free_shipping,
|
||||
|
||||
'last_added_product' => $addedProduct,
|
||||
'cart_booking_data' => $htlCartData,
|
||||
'total_rooms_in_cart' => $totalRooms,
|
||||
);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
*}
|
||||
<!-- MODULE Block cart -->
|
||||
{if isset($blockcart_top) && $blockcart_top}
|
||||
<div class="clearfix{if $PS_CATALOG_MODE} header_user_catalog{/if} nav_menu_padding pull-right">
|
||||
<div class="header-top-item {if $PS_CATALOG_MODE}header_user_catalog{/if}">
|
||||
{/if}
|
||||
<div class="shopping_cart">
|
||||
<a href="{$link->getPageLink($order_process, true)|escape:'html':'UTF-8'}" title="{l s='View my booking cart' mod='blockcart'}" rel="nofollow">
|
||||
@@ -67,11 +67,6 @@
|
||||
<!-- <span class="quantity-formated"><span class="quantity">{$cart_booking_data[$data_k]['total_num_rooms']}</span> x </span> -->
|
||||
<a class="cart_block_product_name" href="{$link->getProductLink($product, $product.link_rewrite, $product.category, null, null, $product.id_shop, $product.id_product_attribute)|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}">{$product.name|truncate:30:'...':true|escape:'html':'UTF-8'}</a>
|
||||
</div>
|
||||
<!-- extra fields added by webkul to show on the cart -->
|
||||
<div class="room-capacity cart-info-sec">
|
||||
<span class="product_info_label">{l s='Capacity' mod='blockcart'}:</span>
|
||||
<span class="product_info_data"> {$cart_booking_data[$data_k]['adult']} {l s='Adults' mod='blockcart'} & {$cart_booking_data[$data_k]['children']} {l s='Children' mod='blockcart'}</span>
|
||||
</div>
|
||||
|
||||
{if isset($product.attributes_small)}
|
||||
<div class="product-atributes">
|
||||
@@ -118,7 +113,7 @@
|
||||
{foreach from=$cart_booking_data[$data_k]['date_diff'] key=data_k1 item=data_v}
|
||||
<tr class="rooms_remove_container">
|
||||
<td>
|
||||
{$data_v['data_form']|date_format:"%d %b %Y"} - {$data_v['data_to']|date_format:"%d %b %Y"}
|
||||
{$data_v['data_form']|date_format:"%d-%m-%Y"} - {$data_v['data_to']|date_format:"%d-%m-%Y"}
|
||||
</td>
|
||||
<td class="num_rooms_in_date">{$data_v['num_rm']}</td>
|
||||
<td>{convertPrice price=$data_v['amount']}</td>
|
||||
@@ -271,11 +266,11 @@
|
||||
<span id="layer_cart_product_time_duration"></span>
|
||||
</div>
|
||||
<div>
|
||||
<strong class="dark">{l s='Rooms Quantity Added' mod='blockcart'} - </strong>
|
||||
<strong class="dark">{if isset($occupancy_required_for_booking) && $occupancy_required_for_booking}{l s='Room occupancy' mod='blockcart'}{else}{l s='Rooms quantity added' mod='blockcart'}{/if} - </strong>
|
||||
<span id="layer_cart_product_quantity"></span>
|
||||
</div>
|
||||
<div>
|
||||
<strong class="dark">{l s='Total Cart Cost of This Room Type' mod='blockcart'} - </strong>
|
||||
<strong class="dark">{l s='Room type cost' mod='blockcart'} - </strong>
|
||||
<span id="layer_cart_product_price"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -31,20 +31,16 @@ class BlockcartCheckRoomAvailabilityAjaxProcessModuleFrontController extends Mod
|
||||
)) {
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($idProduct)) {
|
||||
if ($idHotel = $roomTypeInfo['id_hotel']) {
|
||||
if ($hotelRoomData = $objBookingDetail->DataForFrontSearch(
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$idHotel,
|
||||
$idProduct,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
$idCart,
|
||||
$idGuest
|
||||
)) {
|
||||
$bookingParams = array(
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'hotel_id' => $idHotel,
|
||||
'id_room_type' => $idProduct,
|
||||
'only_search_data' => 1,
|
||||
'id_cart' => $idCart,
|
||||
'id_guest' => $idGuest,
|
||||
);
|
||||
if ($hotelRoomData = $objBookingDetail->dataForFrontSearch($bookingParams)) {
|
||||
$totalAvailRooms = $hotelRoomData['stats']['num_avail'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ class HotelBookingDemands extends ObjectModel
|
||||
$idCurrency = (int)Configuration::get('PS_CURRENCY_DEFAULT');
|
||||
}
|
||||
$totalDemandsPrice = 0;
|
||||
$sql = 'SELECT hb.`id_room`, hd.* FROM `'._DB_PREFIX_.'htl_booking_demands` hd
|
||||
$sql = 'SELECT hb.`id_room`, hb.`adults`, hb.`children`, hd.* FROM `'._DB_PREFIX_.'htl_booking_demands` hd
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_booking_detail` hb ON (hd.`id_htl_booking` = hb.`id`)
|
||||
WHERE hd.`id_htl_booking` IN
|
||||
(SELECT `id` FROM `'._DB_PREFIX_.'htl_booking_detail`
|
||||
@@ -132,6 +132,8 @@ class HotelBookingDemands extends ObjectModel
|
||||
$demand['extra_demands_tax_label'] = $moduleObj->l('No tax', 'HotelBookingDemands');
|
||||
}
|
||||
$roomDemands[$demand['id_room']]['id_room'] = $demand['id_room'];
|
||||
$roomDemands[$demand['id_room']]['adults'] = $demand['adults'];
|
||||
$roomDemands[$demand['id_room']]['children'] = $demand['children'];
|
||||
$roomDemands[$demand['id_room']]['extra_demands'][] = $demand;
|
||||
}
|
||||
unset($taxTemp);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,9 @@ class HotelCartBookingData extends ObjectModel
|
||||
public $is_back_order;
|
||||
public $date_from;
|
||||
public $date_to;
|
||||
public $adults;
|
||||
public $children;
|
||||
public $child_ages;
|
||||
public $extra_demands;
|
||||
public $date_add;
|
||||
public $date_upd;
|
||||
@@ -59,6 +62,9 @@ class HotelCartBookingData extends ObjectModel
|
||||
'is_back_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
|
||||
'date_from' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
'date_to' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
'adults' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'children' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'child_ages' => array('type' => self::TYPE_STRING),
|
||||
'extra_demands' => array('type' => self::TYPE_STRING),
|
||||
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
@@ -250,6 +256,25 @@ class HotelCartBookingData extends ObjectModel
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [getLastAddedData :: To get booking information of the cart by cart id].
|
||||
*
|
||||
* @param [int] $cart_id [Id of the cart]
|
||||
*
|
||||
* @return [array|false] [If data found Returns the array containing the information of the cart of the passed cart id else returns false]
|
||||
*/
|
||||
public function getLastAddedData($cart_id)
|
||||
{
|
||||
if ($cart_id) {
|
||||
return Db::getInstance()->getRow('
|
||||
SELECT * FROM `'._DB_PREFIX_.'htl_cart_booking_data`
|
||||
WHERE `id_cart`='.$cart_id.' ORDER BY `date_add` DESC
|
||||
');
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* [getCartCurrentDataByCartId :: To get booking information of the cart by Order id].
|
||||
*
|
||||
@@ -407,6 +432,150 @@ class HotelCartBookingData extends ObjectModel
|
||||
return $numRooms;
|
||||
}
|
||||
|
||||
public function addCartBookingData(
|
||||
$id_product,
|
||||
$occupancy,
|
||||
$id_hotel,
|
||||
$date_from,
|
||||
$date_to,
|
||||
$roomDemand,
|
||||
$roomsAvailableList,
|
||||
$id_cart
|
||||
) {
|
||||
$chkQty = 0;
|
||||
$num_days = HotelHelper::getNumberOfDays($date_from, $date_to);
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$roomsRequired = count($occupancy);
|
||||
} else {
|
||||
$objRoomType = new HotelRoomType();
|
||||
$roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($id_product);
|
||||
$roomsRequired = $occupancy;
|
||||
}
|
||||
if (Validate::isLoadedObject($objCart = new Cart($id_cart))) {
|
||||
foreach ($roomsAvailableList as $hotelRoomInfo) {
|
||||
if ($chkQty < $roomsRequired) {
|
||||
|
||||
$obj_htl_cart_booking_data = new HotelCartBookingData();
|
||||
$obj_htl_cart_booking_data->id_cart = $objCart->id;
|
||||
$obj_htl_cart_booking_data->id_guest = $objCart->id_guest;
|
||||
$obj_htl_cart_booking_data->id_customer = $objCart->id_customer;
|
||||
$obj_htl_cart_booking_data->id_currency = $objCart->id_currency;
|
||||
$obj_htl_cart_booking_data->id_product = $id_product;
|
||||
$obj_htl_cart_booking_data->id_room = $hotelRoomInfo['id_room'];
|
||||
$obj_htl_cart_booking_data->id_hotel = $id_hotel;
|
||||
$obj_htl_cart_booking_data->booking_type = 1;
|
||||
$obj_htl_cart_booking_data->quantity = $num_days;
|
||||
$obj_htl_cart_booking_data->extra_demands = $roomDemand;
|
||||
$obj_htl_cart_booking_data->date_from = $date_from;
|
||||
$obj_htl_cart_booking_data->date_to = $date_to;
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$room_occupancy = array_shift($occupancy);
|
||||
$obj_htl_cart_booking_data->adults = $room_occupancy['adults'];
|
||||
$obj_htl_cart_booking_data->children = $room_occupancy['children'];
|
||||
$obj_htl_cart_booking_data->child_ages = $room_occupancy['children'] ? json_encode($room_occupancy['child_ages']) : json_encode(array());
|
||||
} else {
|
||||
$obj_htl_cart_booking_data->adults = $roomTypeInfo['adults'];
|
||||
$obj_htl_cart_booking_data->children = $roomTypeInfo['children'];
|
||||
$obj_htl_cart_booking_data->child_ages = json_encode(array());
|
||||
}
|
||||
$obj_htl_cart_booking_data->save();
|
||||
++$chkQty;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $objCart->updateQty((int)($roomsRequired * $num_days), $id_product);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function updateRoomCartBookingData(
|
||||
$id_product,
|
||||
$occupancy,
|
||||
$operator,
|
||||
$id_hotel = false,
|
||||
$date_from = false,
|
||||
$date_to = false,
|
||||
$roomDemand = array(),
|
||||
$id_cart = false,
|
||||
$id_guest = false
|
||||
) {
|
||||
$context = Context::getContext();
|
||||
if (!$id_cart) {
|
||||
$id_cart = $context->cart->id;
|
||||
}
|
||||
if (!$id_guest) {
|
||||
$id_guest = $context->cart->id_guest;
|
||||
}
|
||||
|
||||
if ($operator == 'up') {
|
||||
if (!$date_from && !$date_to) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$id_hotel) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
if ($roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($id_product)) {
|
||||
if (!$id_hotel = $roomTypeInfo['id_hotel']) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
$objBookingDtl = new HotelBookingDetail();
|
||||
$bookingParams = array(
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $id_product,
|
||||
'only_search_data' => 1,
|
||||
'id_cart' => $id_cart,
|
||||
'id_guest' => $id_guest,
|
||||
);
|
||||
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$roomsRequired = count($occupancy);
|
||||
} else {
|
||||
$roomsRequired = $occupancy;
|
||||
}
|
||||
|
||||
if ($hotelRoomData = $objBookingDtl->dataForFrontSearch($bookingParams)) {
|
||||
if (isset($hotelRoomData['stats']['num_avail'])) {
|
||||
$totalAvailableRooms = $hotelRoomData['stats']['num_avail'];
|
||||
if ($operator == 'up') {
|
||||
if ($totalAvailableRooms >= $roomsRequired) {
|
||||
// add rooms to cart
|
||||
$roomsAvailableList = $hotelRoomData['rm_data'][$id_product]['data']['available'];
|
||||
return $this->addCartBookingData(
|
||||
$id_product,
|
||||
$occupancy,
|
||||
$id_hotel,
|
||||
$date_from,
|
||||
$date_to,
|
||||
$roomDemand,
|
||||
$roomsAvailableList,
|
||||
$id_cart
|
||||
);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return $this->deleteCartBookingData(
|
||||
$id_cart,
|
||||
$id_product,
|
||||
0,
|
||||
$date_from,
|
||||
$date_to
|
||||
);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* [checkExistanceOfRoomInCurrentCart :: To check Whether a room for a date range(which start date is $date_from and End date is $date_to) in current cart is already exists for a customer whose guest id is $id_guest].
|
||||
*
|
||||
@@ -678,6 +847,8 @@ class HotelCartBookingData extends ObjectModel
|
||||
$cart_detail_data[$key]['date_from'] = $value['date_from'];
|
||||
$cart_detail_data[$key]['date_to'] = $value['date_to'];
|
||||
|
||||
$cart_detail_data[$key]['child_ages'] = json_decode($value['child_ages']);
|
||||
|
||||
$unit_price = Product::getPriceStatic($value['id_product'], true);
|
||||
$unit_price_tax_excl = Product::getPriceStatic($value['id_product'], false);
|
||||
$productPriceWithoutReduction = $productObj->getPriceWithoutReduct(false);
|
||||
@@ -942,7 +1113,7 @@ class HotelCartBookingData extends ObjectModel
|
||||
);
|
||||
|
||||
$unitPriceWithoutReduction = $objProduct->getPriceWithoutReduct(!$price_tax);
|
||||
$cartHotelData[$prodKey]['adult'] = $roomDetail['adult'];
|
||||
$cartHotelData[$prodKey]['adults'] = $roomDetail['adults'];
|
||||
$cartHotelData[$prodKey]['children'] = $roomDetail['children'];
|
||||
$cartHotelData[$prodKey]['total_num_rooms'] = 0;
|
||||
$cartHotelData[$prodKey]['id_product'] = $product['id_product'];
|
||||
@@ -1004,7 +1175,6 @@ class HotelCartBookingData extends ObjectModel
|
||||
$cartHotelData[$prodKey]['hotel_info'] = $hotelInfo;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($context->customer->id)) {
|
||||
$cartBookingDetails = $objCartBooking->getOnlyCartBookingData(
|
||||
$context->cart->id,
|
||||
@@ -1018,6 +1188,7 @@ class HotelCartBookingData extends ObjectModel
|
||||
$product['id_product']
|
||||
);
|
||||
}
|
||||
|
||||
if (isset($cartBookingDetails) && $cartBookingDetails) {
|
||||
foreach ($cartBookingDetails as $data_k => $data_v) {
|
||||
$dateJoin = strtotime($data_v['date_from']).strtotime($data_v['date_to']);
|
||||
@@ -1035,8 +1206,12 @@ class HotelCartBookingData extends ObjectModel
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['demand_price'] += $demandPrice;
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_rm'] += 1;
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_days'] = $numDays;
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['adults'] += $data_v['adults'];
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['children'] += $data_v['children'];
|
||||
if (is_array($data_v['child_ages'])) {
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['child_ages'] = array_merge($cartHotelData[$prodKey]['date_diff'][$dateJoin]['child_ages'], json_decode($data_v['child_ages']));
|
||||
}
|
||||
$varQty = (int) $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_rm'];
|
||||
|
||||
$roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice(
|
||||
$product['id_product'],
|
||||
$data_v['date_from'],
|
||||
@@ -1061,6 +1236,10 @@ class HotelCartBookingData extends ObjectModel
|
||||
strtotime($data_v['date_to'])
|
||||
);
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_days'] = $numDays;
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['adults'] = $data_v['adults'];
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['children'] = $data_v['children'];
|
||||
$cartHotelData[$prodKey]['date_diff'][$dateJoin]['child_ages'] = json_decode($data_v['child_ages']);
|
||||
|
||||
$roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice(
|
||||
$product['id_product'],
|
||||
$data_v['date_from'],
|
||||
@@ -1106,7 +1285,6 @@ class HotelCartBookingData extends ObjectModel
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $cartHotelData;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,6 +217,9 @@ class HotelHelper
|
||||
Configuration::updateValue('WK_ADVANCED_PAYMENT_GLOBAL_MIN_AMOUNT', 10);
|
||||
Configuration::updateValue('WK_ADVANCED_PAYMENT_INC_TAX', 1);
|
||||
|
||||
Configuration::updateValue('WK_GLOBAL_CHILD_MAX_AGE', 15);
|
||||
Configuration::updateValue('WK_GLOBAL_MAX_CHILD_IN_ROOM', 3);
|
||||
|
||||
Configuration::updateValue(
|
||||
'MAX_GLOBAL_BOOKING_DATE',
|
||||
date('d-m-Y', strtotime(date('Y-m-d', time()).' + 1 year'))
|
||||
@@ -250,6 +253,14 @@ class HotelHelper
|
||||
Configuration::updateValue('WK_HTL_TAG_LINE', $WK_HTL_TAG_LINE);
|
||||
Configuration::updateValue('WK_HTL_SHORT_DESC', $WK_HTL_SHORT_DESC);
|
||||
|
||||
// Search Fields
|
||||
Configuration::updateValue('PS_FRONT_SEARCH_TYPE', HotelBookingDetail::SEARCH_TYPE_OWS);
|
||||
Configuration::updateValue('PS_FRONT_OWS_SEARCH_ALGO_TYPE', HotelBookingDetail::SEARCH_EXACT_ROOM_TYPE_ALGO);
|
||||
Configuration::updateValue('PS_FRONT_ROOM_UNIT_SELECTION_TYPE', HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY);
|
||||
Configuration::updateValue('PS_BACKOFFICE_SEARCH_TYPE', HotelBookingDetail::SEARCH_TYPE_OWS);
|
||||
Configuration::updateValue('PS_BACKOFFICE_OWS_SEARCH_ALGO_TYPE', HotelBookingDetail::SEARCH_ALL_ROOM_TYPE_ALGO);
|
||||
Configuration::updateValue('PS_BACKOFFICE_ROOM_BOOKING_TYPE', HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -513,8 +524,12 @@ class HotelHelper
|
||||
$htl_rm_type = new HotelRoomType();
|
||||
$htl_rm_type->id_product = $product_id;
|
||||
$htl_rm_type->id_hotel = $id_hotel;
|
||||
$htl_rm_type->adult = 2;
|
||||
$htl_rm_type->adults = 2;
|
||||
$htl_rm_type->children = 2;
|
||||
$htl_rm_type->max_adults = 2;
|
||||
$htl_rm_type->max_children = 2;
|
||||
$htl_rm_type->max_guests = 4;
|
||||
|
||||
$htl_rm_type->save();
|
||||
|
||||
// Add features to the product
|
||||
@@ -717,4 +732,31 @@ class HotelHelper
|
||||
}
|
||||
return $randZipCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Super Admin Of Prestashop
|
||||
* @return int Super Admin Employee ID
|
||||
*/
|
||||
public static function getSupperAdmin()
|
||||
{
|
||||
if ($data = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'employee` ORDER BY `id_employee`')) {
|
||||
foreach ($data as $emp) {
|
||||
$employee = new Employee($emp['id_employee']);
|
||||
if ($employee->isSuperAdmin()) {
|
||||
return $emp['id_employee'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function getNumberOfDays($dateFrom, $dateTo)
|
||||
{
|
||||
$startDate = new DateTime($dateFrom);
|
||||
$endDate = new DateTime($dateTo);
|
||||
$daysDifference = $startDate->diff($endDate)->days;
|
||||
|
||||
return $daysDifference;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ class HotelOrderRestrictDate extends ObjectModel
|
||||
foreach ($cartProducts as $product) {
|
||||
if ($product['active']) {
|
||||
$objCartBookingData = new HotelCartBookingData();
|
||||
$obj_htl_bk_dtl = new HotelBookingDetail();
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$obj_rm_type = new HotelRoomType();
|
||||
|
||||
if ($cart_bk_data = $objCartBookingData->getOnlyCartBookingData(
|
||||
@@ -145,11 +145,18 @@ class HotelOrderRestrictDate extends ObjectModel
|
||||
$cart_data[$date_join]['id_rms'][] = $data['id_room'];
|
||||
}
|
||||
foreach ($cart_data as $cl_key => $cl_val) {
|
||||
$avai_rm = $obj_htl_bk_dtl->DataForFrontSearch($cl_val['date_from'], $cl_val['date_to'], $cl_val['id_hotel'], $product['id_product'], 1);
|
||||
$bookingParams = array(
|
||||
'date_from' => $cl_val['date_from'],
|
||||
'date_to' => $cl_val['date_to'],
|
||||
'hotel_id' => $cl_val['id_hotel'],
|
||||
'id_room_type' => $product['id_product'],
|
||||
'only_search_data' => 1,
|
||||
);
|
||||
$avai_rm = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
$isRmBooked = 0;
|
||||
if (count($avai_rm['rm_data'][0]['data']['available']) < count($cl_val['id_rms'])) {
|
||||
if (count($avai_rm['rm_data'][$product['id_product']]['data']['available']) < count($cl_val['id_rms'])) {
|
||||
foreach ($cl_val['id_rms'] as $cr_key => $cr_val) {
|
||||
if($isRmBooked = $obj_htl_bk_dtl->chechRoomBooked($cr_val, $cl_val['date_from'], $cl_val['date_to'])){
|
||||
if($isRmBooked = $objBookingDetail->chechRoomBooked($cr_val, $cl_val['date_from'], $cl_val['date_to'])){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,8 +27,11 @@ class HotelReservationSystemDb
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_product` int(11) NOT NULL,
|
||||
`id_hotel` int(11) NOT NULL,
|
||||
`adult` smallint(6) NOT NULL,
|
||||
`children` smallint(6) NOT NULL,
|
||||
`adults` smallint(6) NOT NULL DEFAULT '2',
|
||||
`children` smallint(6) NOT NULL DEFAULT '0',
|
||||
`max_adults` smallint(6) NOT NULL DEFAULT '2',
|
||||
`max_children` smallint(6) NOT NULL DEFAULT '0',
|
||||
`max_guests` smallint(6) NOT NULL DEFAULT '2',
|
||||
`min_los` smallint(6) NOT NULL DEFAULT '1',
|
||||
`max_los` smallint(6) NOT NULL DEFAULT '0',
|
||||
`date_add` datetime NOT NULL,
|
||||
@@ -127,6 +130,9 @@ class HotelReservationSystemDb
|
||||
`extra_demands` text NOT NULL,
|
||||
`date_from` datetime NOT NULL,
|
||||
`date_to` datetime NOT NULL,
|
||||
`adults` smallint(6) NOT NULL,
|
||||
`children` smallint(6) NOT NULL,
|
||||
`child_ages` text NOT NULL,
|
||||
`is_refunded` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`date_add` datetime NOT NULL,
|
||||
`date_upd` datetime NOT NULL,
|
||||
@@ -164,8 +170,9 @@ class HotelReservationSystemDb
|
||||
`check_in_time` varchar(32) DEFAULT NULL,
|
||||
`check_out_time` varchar(32) DEFAULT NULL,
|
||||
`room_num` varchar(225) DEFAULT NULL,
|
||||
`adult` smallint(6) NOT NULL DEFAULT '0',
|
||||
`adults` smallint(6) NOT NULL DEFAULT '0',
|
||||
`children` smallint(6) NOT NULL DEFAULT '0',
|
||||
`child_ages` text NOT NULL,
|
||||
`is_refunded` tinyint(1) NOT NULL DEFAULT '0',
|
||||
-- `available_for_order` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`date_add` datetime NOT NULL,
|
||||
|
||||
@@ -23,8 +23,11 @@ class HotelRoomType extends ObjectModel
|
||||
public $id;
|
||||
public $id_product;
|
||||
public $id_hotel;
|
||||
public $adult;
|
||||
public $adults;
|
||||
public $children;
|
||||
public $max_adults;
|
||||
public $max_children;
|
||||
public $max_guests;
|
||||
public $min_los;
|
||||
public $max_los;
|
||||
public $date_add;
|
||||
@@ -36,8 +39,11 @@ class HotelRoomType extends ObjectModel
|
||||
'fields' => array(
|
||||
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'id_hotel' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'adult' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'adults' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'children' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
|
||||
'max_adults' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'default' => 2),
|
||||
'max_children' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
|
||||
'max_guests' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'default' => 2),
|
||||
'min_los' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'default' => 1),
|
||||
'max_los' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'default' => 0),
|
||||
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
|
||||
@@ -99,7 +105,7 @@ class HotelRoomType extends ObjectModel
|
||||
$objHotelRoomType = new HotelRoomType();
|
||||
$objHotelRoomType->id_product = $idProductNew;
|
||||
$objHotelRoomType->id_hotel = $idHotelNew;
|
||||
$objHotelRoomType->adult = $roomType['adult'];
|
||||
$objHotelRoomType->adults = $roomType['adults'];
|
||||
$objHotelRoomType->children = $roomType['children'];
|
||||
if ($objHotelRoomType->save()) {
|
||||
$objHotelRoomType->updateCategories();
|
||||
@@ -220,8 +226,7 @@ class HotelRoomType extends ObjectModel
|
||||
if (!$idLang) {
|
||||
$idLang = Context::getContext()->language->id;
|
||||
}
|
||||
|
||||
$sql = 'SELECT hrt.`id`,hrt.`id_hotel`, hrt.`adult`, hrt.`children`, hbl.`hotel_name`, hrt.`min_los`, hrt.`max_los`
|
||||
$sql = 'SELECT hrt.*, hbl.`hotel_name`
|
||||
FROM `'._DB_PREFIX_.'htl_room_type` AS hrt
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_branch_info_lang` AS hbl
|
||||
ON (hbl.`id` = hrt.`id_hotel` AND hbl.`id_lang` = '.(int)$idLang.')
|
||||
@@ -268,26 +273,40 @@ class HotelRoomType extends ObjectModel
|
||||
return Db::getInstance()->executeS($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param [int] $roomTypesList: string of idRoomTypes seperated by ","
|
||||
*/
|
||||
public function getRoomTypeDetailByRoomTypeIds($roomTypesList)
|
||||
{
|
||||
$sql = 'SELECT COUNT(hri.`id`) AS `numberOfRooms`, hrt.`id_product`, `adults`, `children`, `max_adults`, `max_children`, `max_guests`
|
||||
FROM `'._DB_PREFIX_.'htl_room_type` AS `hrt`
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_information` AS `hri` ON (hri.`id_product` = hrt.`id_product`)
|
||||
WHERE hrt.`id_product` IN ('.$roomTypesList.')
|
||||
GROUP BY hrt.`id_product`';
|
||||
|
||||
return Db::getInstance()->executeS($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* [getIdProductByHotelId :: if (0)
|
||||
* {
|
||||
* returns array containing all rooms types information belongs to the hotel which id is passed as $hotel_id
|
||||
* returns array containing all rooms types information belongs to the hotel which id is passed as $idHotel
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* returns array containing rooms type information which produt_id=$room_type belongs to the hotel which id is passed as $hotel_id
|
||||
* returns array containing rooms type information which produt_id=$idRoomType belongs to the hotel which id is passed as $idHotel
|
||||
* }].
|
||||
*
|
||||
* @param [type] $hotel_id [Id of the hotel ]
|
||||
* @param [int] $room_type [
|
||||
* @param [type] $idHotel [Id of the hotel ]
|
||||
* @param [int] $idRoomType [
|
||||
* Id of the product
|
||||
* if (0)
|
||||
* {
|
||||
* returns array containing all rooms types information belongs to the hotel which id is passed as $hotel_id
|
||||
* returns array containing all rooms types information belongs to the hotel which id is passed as $idHotel
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* returns array containing rooms type information which produt_id=$room_type belongs to the hotel which id is passed as $hotel_id
|
||||
* returns array containing rooms type information which produt_id=$idRoomType belongs to the hotel which id is passed as $idHotel
|
||||
* }
|
||||
* ]
|
||||
* @param [1|0] $onlyActiveProd [1 for only active products data and 0 for all products data]
|
||||
@@ -295,10 +314,10 @@ class HotelRoomType extends ObjectModel
|
||||
*
|
||||
* @return [array|false] [If data found returns array containing information of the room types else returns false ]
|
||||
*/
|
||||
public function getIdProductByHotelId($hotel_id, $room_type = 0, $onlyActiveProd = 0, $onlyActiveHotel = 0)
|
||||
public function getIdProductByHotelId($idHotel, $idRoomType = 0, $onlyActiveProd = 0, $onlyActiveHotel = 0)
|
||||
{
|
||||
$sql = 'SELECT DISTINCT hrt.`id_product`, hrt.`adult`, hrt.`children`, hrt.`id` FROM `'._DB_PREFIX_.
|
||||
'htl_room_type` AS hrt ';
|
||||
$sql = 'SELECT DISTINCT hrt.`id_product`, hrt.`adults`, hrt.`children`, hrt.`id`
|
||||
FROM `'._DB_PREFIX_.'htl_room_type` AS hrt ';
|
||||
|
||||
if ($onlyActiveHotel) {
|
||||
$sql .= 'INNER JOIN `'._DB_PREFIX_.'htl_branch_info` AS hti ON (hti.id = hrt.id_hotel AND hti.active = 1)';
|
||||
@@ -306,18 +325,15 @@ class HotelRoomType extends ObjectModel
|
||||
if ($onlyActiveProd) {
|
||||
$sql .= 'INNER JOIN `'._DB_PREFIX_.'product` AS pp ON (hrt.id_product = pp.id_product AND pp.active = 1)';
|
||||
}
|
||||
$sql .= 'WHERE hrt.`id_hotel`='.$hotel_id;
|
||||
$sql .= 'WHERE hrt.`id_hotel`='. (int)$idHotel;
|
||||
|
||||
if ($room_type) {
|
||||
$sql .= ' AND hrt.`id_product` ='.$room_type;
|
||||
if ($idRoomType) {
|
||||
$sql .= ' AND hrt.`id_product` = '. (int)$idRoomType;
|
||||
}
|
||||
$rm_type = Db::getInstance()->executeS($sql);
|
||||
if ($rm_type) {
|
||||
return $rm_type;
|
||||
}
|
||||
return false;
|
||||
return Db::getInstance()->executeS($sql);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* [getMaxAdults :: To get Maximum number of adults can be in a room type for a hotel].
|
||||
*
|
||||
@@ -327,7 +343,7 @@ class HotelRoomType extends ObjectModel
|
||||
*/
|
||||
public static function getMaxAdults($id_hotel)
|
||||
{
|
||||
$sql = 'SELECT MAX(adult) AS max_adult FROM '._DB_PREFIX_.'htl_room_type WHERE id_hotel='.$id_hotel;
|
||||
$sql = 'SELECT MAX(adults) AS max_adult FROM '._DB_PREFIX_.'htl_room_type WHERE id_hotel='.$id_hotel;
|
||||
|
||||
$max_adult = Db::getInstance()->getValue($sql);
|
||||
|
||||
|
||||
@@ -269,18 +269,14 @@ class HotelRoomTypeFeaturePricing extends ObjectModel
|
||||
$currentDate = date('Y-m-d', $date);
|
||||
$nextDayDate = date('Y-m-d', strtotime('+1 day', strtotime($currentDate)));
|
||||
if ($id_product) {
|
||||
$roomTypeAvailabilityInfo = $objBookingDetail->DataForFrontSearch(
|
||||
$currentDate,
|
||||
$nextDayDate,
|
||||
$id_hotel,
|
||||
$id_product,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0
|
||||
$bookingParams = array(
|
||||
'date_from' => $currentDate,
|
||||
'date_to' => $nextDayDate,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $id_product,
|
||||
'only_search_data' => 1,
|
||||
);
|
||||
$roomTypeAvailabilityInfo = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
if (isset($roomTypeAvailabilityInfo['stats']['num_avail'])) {
|
||||
$totalAvailableRooms = $roomTypeAvailabilityInfo['stats']['num_avail'];
|
||||
} else {
|
||||
@@ -302,18 +298,14 @@ class HotelRoomTypeFeaturePricing extends ObjectModel
|
||||
$currentDate,
|
||||
$nextDayDate
|
||||
);
|
||||
$roomTypeAvailabilityInfo = $objBookingDetail->DataForFrontSearch(
|
||||
$currentDate,
|
||||
$nextDayDate,
|
||||
$id_hotel,
|
||||
$product['id_product'],
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0
|
||||
$bookingParams = array(
|
||||
'date_from' => $currentDate,
|
||||
'date_to' => $nextDayDate,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $product['id_product'],
|
||||
'only_search_data' => 1,
|
||||
);
|
||||
$roomTypeAvailabilityInfo = $objBookingDetail->dataForFrontSearch($bookingParams);
|
||||
if (isset($roomTypeAvailabilityInfo['stats']['num_avail'])) {
|
||||
$totalAvailableRooms = $roomTypeAvailabilityInfo['stats']['num_avail'];
|
||||
} else {
|
||||
@@ -454,18 +446,14 @@ class HotelRoomTypeFeaturePricing extends ObjectModel
|
||||
$roomTypeInfo = $hotelRoomType->getRoomTypeInfoByIdProduct($id_product);
|
||||
$id_hotel = $roomTypeInfo['id_hotel'];
|
||||
if ($id_hotel) {
|
||||
$roomTypeAvailabilityInfo = $hotelBookingDetail->DataForFrontSearch(
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
$id_hotel,
|
||||
$id_product,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
0,
|
||||
0
|
||||
$bookingParams = array(
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'hotel_id' => $id_hotel,
|
||||
'id_room_type' => $id_product,
|
||||
'only_search_data' => 1,
|
||||
);
|
||||
$roomTypeAvailabilityInfo = $hotelBookingDetail->dataForFrontSearch($bookingParams);
|
||||
$bookedRoomsInfo = $hotelRoomInformation->getRoomTypeBookedRoomsForDateRange(
|
||||
$id_hotel,
|
||||
$id_product,
|
||||
|
||||
@@ -216,6 +216,7 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
$longitude = Tools::getValue('loclongitude');
|
||||
$map_formated_address = Tools::getValue('locformatedAddr');
|
||||
$map_input_text = Tools::getValue('googleInputField');
|
||||
|
||||
// check if field is atleast in default language. Not available in default prestashop
|
||||
$defaultLangId = Configuration::get('PS_LANG_DEFAULT');
|
||||
$objDefaultLanguage = Language::getLanguage((int) $defaultLangId);
|
||||
|
||||
@@ -365,6 +365,8 @@ class AdminHotelFeaturePricesSettingsController extends ModuleAdminController
|
||||
$this->errors[] = $this->l('Invalid value of impact value.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!count($this->errors)) {
|
||||
if ($idFeaturePrice) {
|
||||
$objFeaturePricing = new HotelRoomTypeFeaturePricing($idFeaturePrice);
|
||||
|
||||
@@ -83,6 +83,31 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController
|
||||
'title' => $this->l('Save'),
|
||||
),
|
||||
),
|
||||
'occupancypanel' => array(
|
||||
'icon' => 'icon-users',
|
||||
'title' => $this->l('Occupancy Setting'),
|
||||
'fields' => array(
|
||||
// max age of child
|
||||
'WK_GLOBAL_CHILD_MAX_AGE' => array(
|
||||
'title' => $this->l('Consider guest as child below age'),
|
||||
'type' => 'text',
|
||||
'required' => true,
|
||||
'validation' => 'isUnsignedInt',
|
||||
'hint' => $this->l('Enter the age of the guest, which that guest will be considered as child.'),
|
||||
),
|
||||
'WK_GLOBAL_MAX_CHILD_IN_ROOM' => array(
|
||||
'title' => $this->l('Maximum children allowed in a room'),
|
||||
'type' => 'text',
|
||||
'required' => true,
|
||||
'validation' => 'isUnsignedInt',
|
||||
'hint' => $this->l('Enter number of the child allowed in a room.'),
|
||||
'desc' => $this->l('Set as 0 if you do not want to limit children in a room.')
|
||||
),
|
||||
),
|
||||
'submit' => array(
|
||||
'title' => $this->l('Save'),
|
||||
),
|
||||
),
|
||||
'generalsetting' => array(
|
||||
'title' => $this->l('Configuration'),
|
||||
'fields' => array(
|
||||
@@ -260,6 +285,13 @@ class AdminHotelGeneralSettingsController extends ModuleAdminController
|
||||
$objDefaultLanguage = Language::getLanguage((int) $defaultLangId);
|
||||
$languages = Language::getLanguages(false);
|
||||
|
||||
// Validation for the occupancy settings
|
||||
// max age of infant after which guest will considered as child // below 18
|
||||
$globalChildMaxAge = Tools::getValue('WK_GLOBAL_CHILD_MAX_AGE');
|
||||
$globalMaxChildInRoom = Tools::getValue('WK_GLOBAL_MAX_CHILD_IN_ROOM');
|
||||
|
||||
// End occupancy fields validation
|
||||
|
||||
if (!trim(Tools::getValue('WK_HTL_CHAIN_NAME_'.$defaultLangId))) {
|
||||
$this->errors[] = $this->l('Hotel chain name is required at least in ').$objDefaultLanguage['name'];
|
||||
} else {
|
||||
|
||||
@@ -114,12 +114,19 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$id_room_type = 0;
|
||||
}
|
||||
|
||||
if (Tools::getValue('occupancy')) {
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
} else {
|
||||
$occupancy = array();
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('search_hotel_list')) {
|
||||
$urlData = array (
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'id_hotel' => $id_hotel,
|
||||
'id_room_type' => $id_room_type
|
||||
'id_room_type' => $id_room_type,
|
||||
'occupancy' => $occupancy
|
||||
);
|
||||
Tools::redirectAdmin($this->context->link->getAdminLink('AdminHotelRoomsBooking').'&'.http_build_query($urlData));
|
||||
}
|
||||
@@ -197,6 +204,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$this->id_room_type = $id_room_type;
|
||||
$this->date_from = $date_from;
|
||||
$this->date_to = $date_to;
|
||||
$this->occupancy = $occupancy;
|
||||
|
||||
parent::postprocess();
|
||||
}
|
||||
@@ -234,6 +242,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
'date_from' => $this->date_from,
|
||||
'date_to' => $this->date_to,
|
||||
'id_hotel' => $this->id_hotel,
|
||||
'occupancy' => $this->occupancy,
|
||||
'id_room_type' => $this->id_room_type,
|
||||
));
|
||||
}
|
||||
@@ -255,7 +264,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
{
|
||||
$objHotelBookingDetail = new HotelBookingDetail();
|
||||
|
||||
$adult = 0;
|
||||
$adults = 0;
|
||||
$children = 0;
|
||||
$num_rooms = 1;
|
||||
$booking_data = $this->getAllBookingDataInfo(
|
||||
@@ -263,8 +272,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$this->date_to,
|
||||
$this->id_hotel,
|
||||
$this->id_room_type,
|
||||
$adult,
|
||||
$children,
|
||||
$this->occupancy,
|
||||
$num_rooms,
|
||||
$this->context->cart->id,
|
||||
$this->context->cookie->id_guest
|
||||
@@ -273,14 +281,35 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$allotmentTypes = HotelBookingDetail::getAllAllotmentTypes();
|
||||
|
||||
$this->context->smarty->assign(array(
|
||||
'adult' => $adult,
|
||||
'adults' => $adults,
|
||||
'children' => $children,
|
||||
'num_rooms' => $num_rooms,
|
||||
'booking_data' => $booking_data,
|
||||
'allotment_types' => $allotmentTypes,
|
||||
'occupancy' => $this->occupancy,
|
||||
'date_from' => $this->date_from,
|
||||
'date_to' => $this->date_to,
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
));
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
$this->context->smarty->assign('occupancy_required_for_booking', $occupancyRequiredForBooking);
|
||||
|
||||
if (Configuration::get('PS_BACKOFFICE_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS ) {
|
||||
$this->context->smarty->assign(array(
|
||||
'occupancy_adults' => array_sum(array_column($this->occupancy, 'adults')),
|
||||
'occupancy_children' => array_sum(array_column($this->occupancy, 'children')),
|
||||
'occupancy_child_ages' => array_sum(array_column($this->occupancy, 'child_ages')),
|
||||
'is_occupancy_wise_search' => true,
|
||||
));
|
||||
} else {
|
||||
$this->context->smarty->assign('is_occupancy_wise_search', false);
|
||||
}
|
||||
}
|
||||
|
||||
public function initCartData()
|
||||
@@ -341,8 +370,8 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$searchDateFrom = Tools::getValue('search_date_from');
|
||||
$searchDateTo = Tools::getValue('search_date_to');
|
||||
|
||||
// No use of adult, child, num_rooms
|
||||
$adult = 0;
|
||||
// No use of adults, child, num_rooms
|
||||
$adults = 0;
|
||||
$children = 0;
|
||||
$num_rooms = 1;
|
||||
|
||||
@@ -351,7 +380,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$bookingParams['date_to'] = $searchDateTo;
|
||||
$bookingParams['hotel_id'] = $searchIdHotel;
|
||||
$bookingParams['room_type'] = $searchIdRoomType;
|
||||
$bookingParams['adult'] = $adult;
|
||||
$bookingParams['adults'] = $adults;
|
||||
$bookingParams['children'] = $children;
|
||||
$bookingParams['num_rooms'] = $num_rooms;
|
||||
$bookingParams['for_calendar'] = 1;
|
||||
@@ -378,8 +407,8 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
public function ajaxProcessGetCalenderData()
|
||||
{
|
||||
$events = array();
|
||||
// No use of adult, child, num_rooms
|
||||
$adult = 0;
|
||||
// No use of adults, child, num_rooms
|
||||
$adults = 0;
|
||||
$children = 0;
|
||||
$num_rooms = 1;
|
||||
|
||||
@@ -393,7 +422,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$bookingParams = array();
|
||||
$bookingParams['hotel_id'] = $searchIdHotel;
|
||||
$bookingParams['room_type'] = $searchIdRoomType;
|
||||
$bookingParams['adult'] = $adult;
|
||||
$bookingParams['adults'] = $adults;
|
||||
$bookingParams['children'] = $children;
|
||||
$bookingParams['num_rooms'] = $num_rooms;
|
||||
$bookingParams['for_calendar'] = 1;
|
||||
@@ -474,6 +503,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$id_product = Tools::getValue('id_prod');
|
||||
$date_from = Tools::getValue('date_from');
|
||||
$date_to = Tools::getValue('date_to');
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
|
||||
$date_from = date("Y-m-d", strtotime($date_from));
|
||||
$date_to = date("Y-m-d", strtotime($date_to));
|
||||
@@ -523,6 +553,9 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
);
|
||||
if ($opt) {
|
||||
// add room in cart
|
||||
$objRoomType = new HotelRoomType();
|
||||
$roomTypeInfo = $objRoomType->getRoomTypeInfoByIdProduct($id_product);
|
||||
|
||||
$obj_cart_book_data = new HotelCartBookingData();
|
||||
$obj_cart_book_data->id_cart = $id_cart;
|
||||
$obj_cart_book_data->id_guest = $id_guest;
|
||||
@@ -535,6 +568,16 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$obj_cart_book_data->comment = $comment;
|
||||
$obj_cart_book_data->date_from = $date_from;
|
||||
$obj_cart_book_data->date_to = $date_to;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$room_occupancy = array_shift($occupancy);
|
||||
$obj_cart_book_data->adults = $room_occupancy['adults'];
|
||||
$obj_cart_book_data->children = $room_occupancy['children'];
|
||||
$obj_cart_book_data->child_ages = $room_occupancy['children'] ? json_encode($room_occupancy['child_ages']) : json_encode(array());
|
||||
} else {
|
||||
$obj_cart_book_data->adults = $roomTypeInfo['adults'];
|
||||
$obj_cart_book_data->children = $roomTypeInfo['children'];
|
||||
$obj_cart_book_data->child_ages = json_encode(array());
|
||||
}
|
||||
if ($obj_cart_book_data->save()) {
|
||||
$response['success'] = true;
|
||||
$response['data']['id_cart_book_data'] = $obj_cart_book_data->id;
|
||||
@@ -569,9 +612,8 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$date_from,
|
||||
$date_to,
|
||||
$hotel_id,
|
||||
$room_type,
|
||||
$adult,
|
||||
$children,
|
||||
$id_room_type,
|
||||
$occupancy,
|
||||
$num_rooms,
|
||||
$id_cart,
|
||||
$id_guest
|
||||
@@ -583,11 +625,9 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$bookingParams['date_from'] = $date_from;
|
||||
$bookingParams['date_to'] = $date_to;
|
||||
$bookingParams['hotel_id'] = $hotel_id;
|
||||
$bookingParams['room_type'] = $room_type;
|
||||
$bookingParams['adult'] = $adult;
|
||||
$bookingParams['children'] = $children;
|
||||
$bookingParams['id_room_type'] = $id_room_type;
|
||||
$bookingParams['occupancy'] = $occupancy;
|
||||
$bookingParams['num_rooms'] = $num_rooms;
|
||||
$bookingParams['for_calendar'] = 0;
|
||||
$bookingParams['search_available'] = 1;
|
||||
$bookingParams['search_partial'] = 1;
|
||||
$bookingParams['search_booked'] = 1;
|
||||
@@ -597,8 +637,11 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$bookingParams['search_cart_rms'] = 1;
|
||||
|
||||
$booking_data = $obj_booking_dtl->getBookingData($bookingParams);
|
||||
|
||||
if ($booking_data) {
|
||||
$objHotelRoomType = new HotelRoomType();
|
||||
foreach ($booking_data['rm_data'] as $key_bk_data => $value_bk_data) {
|
||||
$booking_data['rm_data'][$key_bk_data]['room_type_info'] = $objHotelRoomType->getRoomTypeInfoByIdProduct($value_bk_data['id_product']);
|
||||
if (isset($value_bk_data['data']['booked']) && $value_bk_data['data']['booked']) {
|
||||
foreach ($value_bk_data['data']['booked'] as $booked_k1 => $booked_v1) {
|
||||
if (isset($booked_v1['detail']) && $booked_v1['detail']) {
|
||||
@@ -629,6 +672,10 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
{
|
||||
parent::setMedia();
|
||||
$currency = new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT'));
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
$jsVars = array(
|
||||
'currency_prefix' => $currency->prefix,
|
||||
'currency_suffix' => $currency->suffix,
|
||||
@@ -637,6 +684,9 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
'currency_blank' => $currency->blank,
|
||||
'ALLOTMENT_AUTO' => HotelBookingDetail::ALLOTMENT_AUTO,
|
||||
'ALLOTMENT_MANUAL' => HotelBookingDetail::ALLOTMENT_MANUAL,
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
'occupancy_required_for_booking' => $occupancyRequiredForBooking,
|
||||
'rooms_booking_url' => $this->context->link->getAdminLink('AdminHotelRoomsBooking'),
|
||||
'opt_select_all' => $this->l('All Types'),
|
||||
'slt_another_htl' => $this->l('Select Another Hotel'),
|
||||
@@ -651,9 +701,27 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
'no_rm_avail_txt' => $this->l('No rooms available.'),
|
||||
'slct_rm_err' => $this->l('Please select a room first.'),
|
||||
'product_added_cart_txt' => $this->l('Product added in cart'),
|
||||
'info_icon_path' => _MODULE_DIR_.$this->module->name.'/views/img/Slices/info-icon.svg'
|
||||
'info_icon_path' => _MODULE_DIR_.$this->module->name.'/views/img/Slices/info-icon.svg',
|
||||
'select_age_txt' => 'Select age',
|
||||
'under_1_age' => 'Under 1',
|
||||
'room_txt' => 'Room',
|
||||
'rooms_txt' => 'Rooms',
|
||||
'remove_txt' => 'Remove',
|
||||
'adult_txt' => 'Adults',
|
||||
'adults_txt' => 'Adults',
|
||||
'child_txt' => 'Child',
|
||||
'children_txt' => 'Children',
|
||||
'below_txt' => 'Below',
|
||||
'years_txt' => 'years',
|
||||
'all_children_txt' => 'All Children',
|
||||
'invalid_occupancy_txt' => 'Invalid occupancy(adults/children) found.',
|
||||
// 'check_calender_var' => $check_calender_var,
|
||||
);
|
||||
if (Configuration::get('PS_BACKOFFICE_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS ) {
|
||||
$jsVars['is_occupancy_wise_search'] = true;
|
||||
} else {
|
||||
$jsVars['is_occupancy_wise_search'] = false;
|
||||
}
|
||||
MediaCore::addJsDef($jsVars);
|
||||
|
||||
// add fullcalender plugin
|
||||
|
||||
@@ -783,6 +783,41 @@ $(document).ready(function() {
|
||||
initGoogleMaps();
|
||||
});
|
||||
|
||||
function setRoomTypeGuestOccupancy(booking_occupancy_wrapper)
|
||||
{
|
||||
var adults = 0;
|
||||
var children = 0;
|
||||
var rooms = $(booking_occupancy_wrapper).find('.occupancy_info_block').length;
|
||||
|
||||
$(booking_occupancy_wrapper).find(".num_adults" ).each(function(key, val) {
|
||||
adults += parseInt($(this).val());
|
||||
});
|
||||
$(booking_occupancy_wrapper).find(".num_children" ).each(function(key, val) {
|
||||
children += parseInt($(this).val());
|
||||
});
|
||||
|
||||
var guestButtonVal = parseInt(adults) + ' ';
|
||||
if (parseInt(adults) > 1) {
|
||||
guestButtonVal += adults_txt;
|
||||
} else {
|
||||
guestButtonVal += adult_txt;
|
||||
}
|
||||
if (parseInt(children) > 0) {
|
||||
if (parseInt(children) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt;
|
||||
}
|
||||
}
|
||||
if (parseInt(rooms) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt;
|
||||
}
|
||||
$(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(guestButtonVal);
|
||||
}
|
||||
|
||||
|
||||
function showFeaturePriceRuleLangField(lang_iso_code, id_lang)
|
||||
{
|
||||
$('#feature_price_rule_lang_btn').html(lang_iso_code + ' <span class="caret"></span>');
|
||||
|
||||
@@ -265,8 +265,53 @@ $(document).ready(function() {
|
||||
}
|
||||
});
|
||||
|
||||
function getBookingOccupancyDetails(bookingform)
|
||||
{
|
||||
let occupancy;
|
||||
if (parseInt(occupancy_required_for_booking)) {
|
||||
let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected")
|
||||
if (selected_occupancy.length) {
|
||||
occupancy = [];
|
||||
$(selected_occupancy).each(function(ind, element) {
|
||||
if (parseInt($(element).find('.num_adults').val())) {
|
||||
let child_ages = [];
|
||||
$(element).find('.guest_child_age').each(function(index) {
|
||||
if ($(this).val() > -1) {
|
||||
child_ages.push($(this).val());
|
||||
}
|
||||
});
|
||||
if ($(element).find('.num_children').val()) {
|
||||
if (child_ages.length != $(element).find('.num_children').val()) {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
occupancy.push({
|
||||
'adults': $(element).find('.num_adults').val(),
|
||||
'children': $(element).find('.num_children').val(),
|
||||
'child_ages': child_ages
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open');
|
||||
occupancy = false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
}
|
||||
|
||||
// booking form
|
||||
$('body').on('click', '.avai_add_cart', function() {
|
||||
$('body').on('click', '.avai_add_cart', function(e) {
|
||||
e.preventDefault();
|
||||
$current_btn = $(this);
|
||||
$current_btn.attr('disabled', 'disabled');
|
||||
var search_id_room_type = $("#search_id_room_type").val();
|
||||
@@ -282,47 +327,56 @@ $(document).ready(function() {
|
||||
var booking_type = $("input[name='bk_type_" + id_room + "']:checked").val();
|
||||
var comment = $("#comment_" + id_room).val();
|
||||
var btn = $(this);
|
||||
$(this).closest('tr').find('.booking_occupancy_wrapper').parent().removeClass('open');
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('tr').find('.booking_occupancy'));
|
||||
|
||||
$.ajax({
|
||||
url: rooms_booking_url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
ajax: true,
|
||||
action: 'addDataToCart',
|
||||
id_prod: id_prod,
|
||||
id_room: id_room,
|
||||
id_hotel: id_hotel,
|
||||
date_from: date_from,
|
||||
date_to: date_to,
|
||||
booking_type: booking_type,
|
||||
comment: comment,
|
||||
search_id_hotel: search_id_hotel,
|
||||
search_id_room_type: search_id_room_type,
|
||||
search_date_from: search_date_from,
|
||||
search_date_to: search_date_to,
|
||||
opt: 1,
|
||||
},
|
||||
success: function(result) {
|
||||
if (result) {
|
||||
if (result.success) {
|
||||
$(".cart_booking_btn").removeAttr('disabled');
|
||||
$current_btn.removeAttr('disabled');
|
||||
if (occupancy) {
|
||||
$.ajax({
|
||||
url: rooms_booking_url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
ajax: true,
|
||||
action: 'addDataToCart',
|
||||
id_prod: id_prod,
|
||||
id_room: id_room,
|
||||
id_hotel: id_hotel,
|
||||
date_from: date_from,
|
||||
date_to: date_to,
|
||||
occupancy: occupancy,
|
||||
booking_type: booking_type,
|
||||
comment: comment,
|
||||
search_id_hotel: search_id_hotel,
|
||||
search_id_room_type: search_id_room_type,
|
||||
search_date_from: search_date_from,
|
||||
search_date_to: search_date_to,
|
||||
opt: 1,
|
||||
},
|
||||
success: function(result) {
|
||||
if (result) {
|
||||
if (result.success) {
|
||||
$(".cart_booking_btn").removeAttr('disabled');
|
||||
$current_btn.removeAttr('disabled');
|
||||
}
|
||||
|
||||
btn.removeClass('btn-primary').removeClass('avai_add_cart').addClass('btn-danger').addClass('avai_delete_cart_data').html(remove);
|
||||
|
||||
btn.attr('data-id-cart', result.data.id_cart);
|
||||
btn.attr('data-id-cart-book-data', result.data.id_cart_book_data);
|
||||
refreshCartData();
|
||||
refreshStatsData();
|
||||
calendar.refetchEvents();
|
||||
}
|
||||
|
||||
btn.removeClass('btn-primary').removeClass('avai_add_cart').addClass('btn-danger').addClass('avai_delete_cart_data').html(remove);
|
||||
|
||||
btn.attr('data-id-cart', result.data.id_cart);
|
||||
btn.attr('data-id-cart-book-data', result.data.id_cart_book_data);
|
||||
refreshCartData();
|
||||
refreshStatsData();
|
||||
calendar.refetchEvents();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
$current_btn.attr('disabled', false);
|
||||
setRoomTypeGuestOccupancy($(this).closest('tr').find('.booking_occupancy_wrapper'));
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click', '.par_add_cart', function() {
|
||||
$('body').on('click', '.par_add_cart', function(e) {
|
||||
e.preventDefault();
|
||||
$current_btn = $(this);
|
||||
$current_btn.attr('disabled', 'disabled');
|
||||
var search_id_room_type = $("#search_id_room_type").val();
|
||||
@@ -340,44 +394,52 @@ $(document).ready(function() {
|
||||
var booking_type = $("input[name='bk_type_" + id_room + "_" + sub_key + "']:checked").val();
|
||||
var comment = $("#comment_" + id_room + "_" + sub_key).val();
|
||||
var btn = $(this);
|
||||
$(this).closest('tr').find('.booking_occupancy_wrapper').parent().removeClass('open');
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('tr').find('.booking_occupancy'));
|
||||
|
||||
$.ajax({
|
||||
url: rooms_booking_url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
ajax: true,
|
||||
action: 'addDataToCart',
|
||||
id_prod: id_prod,
|
||||
id_room: id_room,
|
||||
id_hotel: id_hotel,
|
||||
date_from: date_from,
|
||||
date_to: date_to,
|
||||
booking_type: booking_type,
|
||||
comment: comment,
|
||||
search_id_hotel: search_id_hotel,
|
||||
search_id_room_type: search_id_room_type,
|
||||
search_date_from: search_date_from,
|
||||
search_date_to: search_date_to,
|
||||
opt: 1,
|
||||
},
|
||||
success: function(result) {
|
||||
if (result) {
|
||||
if (result.success) {
|
||||
$(".cart_booking_btn").removeAttr('disabled');
|
||||
$current_btn.removeAttr('disabled');
|
||||
if (occupancy) {
|
||||
$.ajax({
|
||||
url: rooms_booking_url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
ajax: true,
|
||||
action: 'addDataToCart',
|
||||
id_prod: id_prod,
|
||||
id_room: id_room,
|
||||
id_hotel: id_hotel,
|
||||
date_from: date_from,
|
||||
date_to: date_to,
|
||||
occupancy: occupancy,
|
||||
booking_type: booking_type,
|
||||
comment: comment,
|
||||
search_id_hotel: search_id_hotel,
|
||||
search_id_room_type: search_id_room_type,
|
||||
search_date_from: search_date_from,
|
||||
search_date_to: search_date_to,
|
||||
opt: 1,
|
||||
},
|
||||
success: function(result) {
|
||||
if (result) {
|
||||
if (result.success) {
|
||||
$(".cart_booking_btn").removeAttr('disabled');
|
||||
$current_btn.removeAttr('disabled');
|
||||
}
|
||||
|
||||
btn.removeClass('btn-primary').removeClass('par_add_cart').addClass('btn-danger').addClass('part_delete_cart_data').html(remove);
|
||||
|
||||
btn.attr('data-id-cart', result.data.id_cart);
|
||||
btn.attr('data-id-cart-book-data', result.data.id_cart_book_data);
|
||||
refreshCartData();
|
||||
refreshStatsData();
|
||||
calendar.refetchEvents();
|
||||
}
|
||||
|
||||
btn.removeClass('btn-primary').removeClass('par_add_cart').addClass('btn-danger').addClass('part_delete_cart_data').html(remove);
|
||||
|
||||
btn.attr('data-id-cart', result.data.id_cart);
|
||||
btn.attr('data-id-cart-book-data', result.data.id_cart_book_data);
|
||||
refreshCartData();
|
||||
refreshStatsData();
|
||||
calendar.refetchEvents();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
$current_btn.attr('disabled', false);
|
||||
setRoomTypeGuestOccupancy($(this).closest('tr').find('.booking_occupancy_wrapper'));
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click', '.ajax_cart_delete_data', function() {
|
||||
@@ -503,6 +565,167 @@ $(document).ready(function() {
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_occupancy_wrapper .remove-room-link', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
booking_occupancy_inner = $(this).closest('.booking_occupancy_inner');
|
||||
$(this).closest('.occupancy_info_block').remove();
|
||||
$(booking_occupancy_inner).find('.room_num_wrapper').each(function(key, val) {
|
||||
$(this).text(room_txt + ' - '+ (key+1) );
|
||||
});
|
||||
setRoomTypeGuestOccupancy($(booking_occupancy_inner).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('change', '.num_occupancy', function(e) {
|
||||
|
||||
let current_room_occupancy = 0;
|
||||
$(this).closest('.occupancy_info_block').find('.num_occupancy').each(function(){
|
||||
current_room_occupancy += parseInt($(this).val());
|
||||
});
|
||||
let max_guests_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_guests').val();
|
||||
let max_allowed_for_current = (max_guests_in_room - current_room_occupancy) + parseInt($(this).val());
|
||||
if ($(this).val() > $(this).attr('max')) {
|
||||
$(this).val($(this).attr('max'));
|
||||
}
|
||||
if ($(this).val() > max_allowed_for_current) {
|
||||
$(this).val(max_allowed_for_current);
|
||||
}
|
||||
|
||||
if ($(this).hasClass('num_children')) {
|
||||
let totalChilds = $(this).closest('.occupancy_info_block').find('.guest_child_age').length;
|
||||
if (totalChilds < $(this).val()) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').show();
|
||||
while ($(this).closest('.occupancy_info_block').find('.guest_child_age').length < $(this).val()) {
|
||||
var roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index'));
|
||||
var childAgeSelect = '<div class="form-group col-xs-12 col-sm-12 col-md-6 col-lg-6">';
|
||||
childAgeSelect += '<select class="guest_child_age room_occupancies" name="occupancy[' +roomBlockIndex+ '][child_ages][]">';
|
||||
childAgeSelect += '<option value="-1">' + select_age_txt + '</option>';
|
||||
childAgeSelect += '<option value="0">' + under_1_age + '</option>';
|
||||
for (let age = 1; age < max_child_age; age++) {
|
||||
childAgeSelect += '<option value="'+age+'">'+age+'</option>';
|
||||
}
|
||||
childAgeSelect += '</select>';
|
||||
childAgeSelect += '</div>';
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect);
|
||||
}
|
||||
} else {
|
||||
let child = $(this).val();
|
||||
$(this).closest('.occupancy_info_block').find('.guest_child_age').each(function(ind, element) {
|
||||
if (child <= ind) {
|
||||
$(element).parent().remove();
|
||||
}
|
||||
});
|
||||
if (child == 0) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').hide();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper'));
|
||||
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_guest_occupancy', function(e) {
|
||||
$(this).parent().toggleClass('open');
|
||||
});
|
||||
|
||||
$(document).on('click', function(e) {
|
||||
if ($('.booking_occupancy_wrapper:visible').length) {
|
||||
var occupancy_wrapper = $('.booking_occupancy_wrapper:visible');
|
||||
$(occupancy_wrapper).find(".occupancy_info_block").addClass('selected');
|
||||
setRoomTypeGuestOccupancy(occupancy_wrapper);
|
||||
|
||||
if (!($(e.target).closest(".booking_occupancy_wrapper").length || $(e.target).closest(".booking_guest_occupancy").length || $(e.target).closest(".avai_add_cart").length || $(e.target).closest(".par_add_cart").length)) {
|
||||
let hasErrors = 0;
|
||||
|
||||
let adults = $(occupancy_wrapper).find(".num_adults").map(function(){return $(this).val();}).get();
|
||||
let children = $(occupancy_wrapper).find(".num_children").map(function(){return $(this).val();}).get();
|
||||
let child_ages = $(occupancy_wrapper).find(".guest_child_age").map(function(){return $(this).val();}).get();
|
||||
|
||||
// start validating above values
|
||||
if (!adults.length || (adults.length != children.length)) {
|
||||
hasErrors = 1;
|
||||
showErrorMessage(invalid_occupancy_txt);
|
||||
} else {
|
||||
$(occupancy_wrapper).find('.occupancy_count').removeClass('error_border');
|
||||
|
||||
// validate values of adults and children
|
||||
adults.forEach(function (item, index) {
|
||||
if (isNaN(item) || parseInt(item) < 1) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
if (isNaN(children[index])) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
});
|
||||
|
||||
// validate values of selected child ages
|
||||
$(occupancy_wrapper).find('.guest_child_age').parent().removeClass('has-error');
|
||||
child_ages.forEach(function (age, index) {
|
||||
age = parseInt(age);
|
||||
if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".guest_child_age").eq(index).parent().addClass('has-error');
|
||||
}
|
||||
});
|
||||
}
|
||||
if (hasErrors == 0) {
|
||||
$(occupancy_wrapper).parent().removeClass('open');
|
||||
// $(occupancy_wrapper).siblings(".booking_guest_occupancy").parent().removeClass('has-error');
|
||||
|
||||
$(document).trigger( "QloApps:updateRoomOccupancy", [occupancy_wrapper]);
|
||||
} else {
|
||||
// $(occupancy_wrapper).siblings(".booking_guest_occupancy").parent().addClass('has-error');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('.booking_occupancy_wrapper .add_new_occupancy_btn').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var booking_occupancy_wrapper = $(this).closest('.booking_occupancy_wrapper');
|
||||
var occupancy_block = '';
|
||||
var roomBlockIndex = parseInt($(booking_occupancy_wrapper).find(".occupancy_info_block").last().attr('occ_block_index'));
|
||||
roomBlockIndex += 1;
|
||||
|
||||
|
||||
var countRooms = parseInt($(booking_occupancy_wrapper).find('.occupancy_info_block').length);
|
||||
countRooms += 1
|
||||
occupancy_block += '<div class="occupancy_info_block col-sm-12" occ_block_index="'+roomBlockIndex+'">';
|
||||
occupancy_block += '<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">'+ room_txt + ' - ' + countRooms + '</label><a class="remove-room-link pull-right" href="#">' + remove_txt + '</a></div>';
|
||||
occupancy_block += '<div class="col-sm-12">';
|
||||
occupancy_block += '<div class="row">';
|
||||
occupancy_block += '<div class="form-group col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<label>' + adults_txt + '</label>';
|
||||
occupancy_block += '<input type="number" class="form-control num_occupancy num_adults" name="occupancy['+roomBlockIndex+'][adults]" value="1" min="1">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<label>' + child_txt + '<span class="label-desc-txt"></span></label>';
|
||||
occupancy_block += '<input type="number" class="form-control num_occupancy num_children" name="occupancy['+roomBlockIndex+'][children]" value="0" min="0" max="'+max_child_in_room+'">(' + below_txt + ' ' + max_child_age + ' ' + years_txt + ')';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="row children_age_info_block" style="display:none">';
|
||||
occupancy_block += '<div class="form-group col-sm-12">';
|
||||
occupancy_block += '<label class="">' + all_children_txt + '</label>';
|
||||
occupancy_block += '<div class="">';
|
||||
occupancy_block += '<div class="row children_ages">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<hr class="occupancy-info-separator col-sm-12">';
|
||||
|
||||
$(booking_occupancy_wrapper).find('.booking_occupancy_inner').append(occupancy_block);
|
||||
|
||||
setRoomTypeGuestOccupancy(booking_occupancy_wrapper);
|
||||
});
|
||||
|
||||
function refreshCartData()
|
||||
{
|
||||
$.ajax({
|
||||
|
||||
@@ -2,12 +2,19 @@
|
||||
<div class="panel">
|
||||
<ul class="nav nav-tabs">
|
||||
{foreach from=$booking_data['rm_data'] key=book_k item=book_v}
|
||||
<li {if $book_k == 0}class="active"{/if} ><a href="#room_type_{$book_k}" data-toggle="tab">{$book_v['name']}</a></li>
|
||||
<li {if $book_v@first}class="active"{/if} ><a href="#room_type_{$book_k}" data-toggle="tab">{$book_v['name']}</a></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
<div class="tab-content panel">
|
||||
{foreach from=$booking_data['rm_data'] key=book_k item=book_v}
|
||||
<div id="room_type_{$book_k}" class="tab-pane {if $book_k == 0}active{/if}">
|
||||
<div id="room_type_{$book_k}" class="tab-pane {if $book_v@first}active{/if}">
|
||||
{* room type occupancy Details *}
|
||||
<div>
|
||||
<div class="form-group">
|
||||
<b>{l s='Room Occupancy'}:</b>
|
||||
<span>{l s='Maximum adults'} : {$book_v['room_type_info']['max_adults']}</span> <span>{l s='Maximum children'} : {$book_v['room_type_info']['max_children']}</span> <span>{l s='Maximum guests'} : {$book_v['room_type_info']['max_guests']}</span>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active"><a href="#avail_room_data_{$book_k|escape:'htmlall':'UTF-8'}" data-toggle="tab">{l s='Available Rooms' mod='hotelreservationsystem'}</a></li>
|
||||
<li><a href="#part_room_data_{$book_k|escape:'htmlall':'UTF-8'}" data-toggle="tab">{l s='Partially Available' mod='hotelreservationsystem'}</a></li>
|
||||
@@ -24,6 +31,9 @@
|
||||
<th><span class="title_box">{l s='Duration' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Message' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Allotment Type' mod='hotelreservationsystem'}</span></th>
|
||||
{if $occupancy_required_for_booking}
|
||||
<th class="fixed-width-xxl"><span class="title_box">{l s='Guests' mod='hotelreservationsystem'}</span></th>
|
||||
{/if}
|
||||
<th><span class="title_box">{l s='Action' mod='hotelreservationsystem'}</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -42,6 +52,51 @@
|
||||
{/foreach}
|
||||
<input type="text" id="comment_{$avai_v['id_room']|escape:'htmlall':'UTF-8'}" class="form-control avai_comment" placeholder="{l s='Allotment message' mod='hotelreservationsystem'}">
|
||||
</td>
|
||||
{if $occupancy_required_for_booking}
|
||||
<td class="booking_occupancy">
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-default btn-left btn-block booking_guest_occupancy input-occupancy" type="button">
|
||||
<span>{l s='Select occupancy'}</span>
|
||||
</button>
|
||||
<div class="dropdown-menu booking_occupancy_wrapper well well-sm">
|
||||
<input type="hidden" class="max_adults" value="{if isset($book_v)}{$book_v['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_children" value="{if isset($book_v)}{$book_v['max_children']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_guests" value="{if isset($book_v)}{$book_v['max_guests']|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="booking_occupancy_inner row">
|
||||
<div class="occupancy_info_block col-sm-12" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">{l s='Room - 1'}</label></div>
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="1" min="1" max="{if isset($book_v)}{$book_v['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
</div>
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="0" min="0" max="{if isset($book_v)}{$book_v['max_children']|escape:'html':'UTF-8'}{else}{$max_child_in_room}{/if}">
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" style="display:none">
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="">{l s='All Children'}</label>
|
||||
<div class="">
|
||||
<div class="row children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{* <hr class="occupancy-info-separator"> *}
|
||||
</div>
|
||||
</div>
|
||||
{* <div class="add_occupancy_block">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room'}</span></a>
|
||||
</div> *}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
{/if}
|
||||
<td>
|
||||
<button type="button" data-id-cart="" data-id-cart-book-data="" data-id-product="{$avai_v['id_product']|escape:'htmlall':'UTF-8'}" data-id-room="{$avai_v['id_room']|escape:'htmlall':'UTF-8'}" data-id-hotel="{$avai_v['id_hotel']}" data-date-from="{$date_from|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" data-date-to ="{$date_to|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" class="btn btn-primary avai_add_cart">{l s='Add To Cart' mod='hotelreservationsystem'}</button>
|
||||
</td>
|
||||
@@ -56,33 +111,81 @@
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><span class="title_box">{l s='Room No.' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Duration' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Room No.' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Allotment Type' mod='hotelreservationsystem'}</span></th>
|
||||
{if $occupancy_required_for_booking}
|
||||
<th class="fixed-width-xxl"><span class="title_box">{l s='Guests' mod='hotelreservationsystem'}</span></th>
|
||||
{/if}
|
||||
<th><span class="title_box">{l s='Action' mod='hotelreservationsystem'}</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach from=$book_v['data']['partially_available'] key=part_k item=part_v}
|
||||
{foreach from=$part_v['avai_dates'] key=sub_part_k item=sub_part_v}
|
||||
{foreach from=$part_v['rooms'] key=sub_part_k item=sub_part_v}
|
||||
<tr>
|
||||
{if $sub_part_v@first}
|
||||
<td rowspan="{$part_v['avai_dates']|count}">{$part_v['room_num']|escape:'htmlall':'UTF-8'}</td>
|
||||
<td rowspan="{$part_v['rooms']|count}">
|
||||
<p>{dateFormat date=date('Y-m-d', strtotime($part_v['date_from']))} - {dateFormat date=date('Y-m-d', strtotime($part_v['date_to']))}</p>
|
||||
</td>
|
||||
{/if}
|
||||
<td>
|
||||
<p>{dateFormat date=date('Y-m-d', strtotime($sub_part_v['date_from']))} - {dateFormat date=date('Y-m-d', strtotime($sub_part_v['date_to']))}</p>
|
||||
</td>
|
||||
<td >{$sub_part_v['room_num']|escape:'htmlall':'UTF-8'}</td>
|
||||
<td>
|
||||
{foreach $allotment_types as $allotment_type}
|
||||
<label class="control-label">
|
||||
<input type="radio" value="{$allotment_type.id_allotment|intval}" class="par_bk_type" name="bk_type_{$part_v['id_room']|escape:'htmlall':'UTF-8'}_{$sub_part_k|escape:'htmlall':'UTF-8'}" data-id-room="{$part_v['id_room']|escape:'htmlall':'UTF-8'}" data-sub-key="{$sub_part_k|escape:'htmlall':'UTF-8'}" {if $allotment_type@first}checked="checked"{/if}>
|
||||
<input type="radio" value="{$allotment_type.id_allotment|intval}" class="par_bk_type" name="bk_type_{$sub_part_v['id_room']|escape:'htmlall':'UTF-8'}_{$sub_part_k|escape:'htmlall':'UTF-8'}" data-id-room="{$sub_part_v['id_room']|escape:'htmlall':'UTF-8'}" data-sub-key="{$sub_part_k|escape:'htmlall':'UTF-8'}" {if $allotment_type@first}checked="checked"{/if}>
|
||||
<span>{$allotment_type.name|escape:'htmlall':'UTF-8'}</span>
|
||||
</label>
|
||||
{/foreach}
|
||||
<input type="text" id="comment_{$part_v['id_room']|escape:'htmlall':'UTF-8'}_{$sub_part_k|escape:'htmlall':'UTF-8'}" class="form-control par_comment" placeholder="{l s='Allotment message' mod='hotelreservationsystem'}">
|
||||
<input type="text" id="comment_{$sub_part_v['id_room']|escape:'htmlall':'UTF-8'}_{$sub_part_k|escape:'htmlall':'UTF-8'}" class="form-control par_comment" placeholder="{l s='Allotment message' mod='hotelreservationsystem'}">
|
||||
</td>
|
||||
{if $occupancy_required_for_booking}
|
||||
<td class="booking_occupancy">
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-default btn-left btn-block booking_guest_occupancy input-occupancy" type="button">
|
||||
<span>{l s='Select occupancy'}</span>
|
||||
</button>
|
||||
<div class="dropdown-menu booking_occupancy_wrapper well well-sm">
|
||||
<input type="hidden" class="max_adults" value="{if isset($book_v)}{$book_v['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_children" value="{if isset($book_v)}{$book_v['max_children']|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_guests" value="{if isset($book_v)}{$book_v['max_guests']|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="booking_occupancy_inner row">
|
||||
<div class="occupancy_info_block col-sm-12" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">{l s='Room - 1'}</label></div>
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="1" min="1" max="{if isset($book_v)}{$book_v['max_adults']|escape:'html':'UTF-8'}{/if}">
|
||||
</div>
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="0" min="0" max="{if isset($book_v)}{$book_v['max_children']|escape:'html':'UTF-8'}{else}{$max_child_in_room}{/if}">
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" style="display:none">
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="">{l s='All Children'}</label>
|
||||
<div class="">
|
||||
<div class="row children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{* <hr class="occupancy-info-separator"> *}
|
||||
</div>
|
||||
</div>
|
||||
{* <div class="add_occupancy_block">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room'}</span></a>
|
||||
</div> *}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
{/if}
|
||||
<td>
|
||||
<button type="button" data-id-cart="" data-id-cart-book-data="" data-id-product="{$part_v['id_product']|escape:'htmlall':'UTF-8'}" data-id-room="{$part_v['id_room']|escape:'htmlall':'UTF-8'}" data-id-hotel="{$part_v['id_hotel']|escape:'htmlall':'UTF-8'}" data-date-from="{$sub_part_v['date_from']|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" data-date-to ="{$sub_part_v['date_to']|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" data-sub-key="{$sub_part_k|escape:'htmlall':'UTF-8'}" class="btn btn-primary par_add_cart">{l s='Add To Cart' mod='hotelreservationsystem'}</button>
|
||||
<button type="button" data-id-cart="" data-id-cart-book-data="" data-id-product="{$sub_part_v['id_product']|escape:'htmlall':'UTF-8'}" data-id-room="{$sub_part_v['id_room']|escape:'htmlall':'UTF-8'}" data-id-hotel="{$sub_part_v['id_hotel']|escape:'htmlall':'UTF-8'}" data-date-from="{$part_v['date_from']|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" data-date-to ="{$part_v['date_to']|escape:'htmlall':'UTF-8'|date_format:'%Y-%m-%d'}" data-sub-key="{$sub_part_k|escape:'htmlall':'UTF-8'}" class="btn btn-primary par_add_cart">{l s='Add To Cart' mod='hotelreservationsystem'}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
|
||||
@@ -44,6 +44,101 @@
|
||||
<input type="hidden" name="search_id_hotel" id="search_id_hotel" {if isset($id_hotel)}value="{$id_hotel|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
</div>
|
||||
</div>
|
||||
{if $is_occupancy_wise_search}
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="occupancy" class="control-label col-sm-4 required">
|
||||
<span title="" data-toggle="tooltip" class="label-tooltip">{l s='Occupancy' mod='hotelreservationsystem'}</span>
|
||||
</label>
|
||||
<div class="col-sm-8">
|
||||
<div class="dropdown">
|
||||
<button class="booking_guest_occupancy btn btn-default btn-left btn-block input-occupancy" type="button">
|
||||
<span class="">{if (isset($occupancy_adults) && $occupancy_adults)}{$occupancy_adults} {if $occupancy_adults > 1}{l s='Adults'}{else}{l s='Adult'}{/if}, {if isset($occupancy_children) && $occupancy_children}{$occupancy_children} {if $occupancy_children > 1} {l s='Children'}{else}{l s='Child'}{/if}, {/if}{$occupancy|count} {if $occupancy|count > 1}{l s='Rooms'}{else}{l s='Room'}{/if}{else}{l s='1 Adult, 1 Room'}{/if}</span>
|
||||
</button>
|
||||
<input type="hidden" class="max_avail_type_qty" value="{if isset($total_available_rooms)} {$total_available_rooms|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="dropdown-menu booking_occupancy_wrapper well well-sm">
|
||||
<div class="booking_occupancy_inner row">
|
||||
{if isset($occupancy) && $occupancy}
|
||||
{assign var=countRoom value=1}
|
||||
<hr class="occupancy-info-separator col-sm-12">
|
||||
{foreach from=$occupancy key=key item=$room_occupancy name=occupancyInfo}
|
||||
<div class="occupancy_info_block" occ_block_index="{$key|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">{l s='Room'} - {$countRoom|escape:'htmlall':'UTF-8'} </label>{if !$smarty.foreach.occupancyInfo.first}<a class="remove-room-link pull-right" href="#">{l s='Remove'}</a>{/if}</div>
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][adults]" value="{$room_occupancy['adults']|escape:'htmlall':'UTF-8'}" min="1">
|
||||
</div>
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][children]" value="{$room_occupancy['children']|escape:'htmlall':'UTF-8'}" min="0" {if $max_child_in_room}max="{$max_child_in_room}"{/if}>
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" {if !$room_occupancy['children']}style="display:none"{/if}>
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="">{l s='All Children'}</label>
|
||||
<div class="">
|
||||
<div class="row children_ages">
|
||||
{if isset($room_occupancy['child_ages']) && $room_occupancy['child_ages']}
|
||||
{foreach $room_occupancy['child_ages'] as $childAge}
|
||||
<div class="form-group col-xs-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<select class="guest_child_age room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][child_ages][]">
|
||||
<option value="-1" {if $childAge == -1}selected{/if}>{l s='Select age'}</option>
|
||||
<option value="0" {if $childAge == 0}selected{/if}>{l s='Under 1'}</option>
|
||||
{for $age=1 to ($max_child_age-1)}
|
||||
<option value="{$age|escape:'htmlall':'UTF-8'}" {if $childAge == $age}selected{/if}>{$age|escape:'htmlall':'UTF-8'}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator col-sm-12">
|
||||
{assign var=countRoom value=$countRoom+1}
|
||||
{/foreach}
|
||||
{else}
|
||||
<div class="occupancy_info_block col-sm-12" occ_block_index="0">
|
||||
<div class="occupancy_info_head col-sm-12"><label class="room_num_wrapper">{l s='Room - 1'}</label></div>
|
||||
<div class="col-sm-12">
|
||||
<div class="row">
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Adults'}</label>
|
||||
<input type="number" class="form-control num_occupancy num_adults" name="occupancy[0][adults]" value="1" min="1">
|
||||
</div>
|
||||
<div class="form-group col-xs-6 occupancy_count_block">
|
||||
<label>{l s='Child'} <span class="label-desc-txt"></span></label>
|
||||
<input type="number" class="form-control num_occupancy num_children" name="occupancy[0][children]" value="0" min="0" {if $max_child_in_room}max="{$max_child_in_room}"{/if}>
|
||||
({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})
|
||||
</div>
|
||||
</div>
|
||||
<div class="row children_age_info_block" style="display:none">
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="">{l s='All Children'}</label>
|
||||
<div class="">
|
||||
<div class="row children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator col-sm-12">
|
||||
{/if}
|
||||
</div>
|
||||
<div class="add_occupancy_block col-sm-12">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room'}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="id_room_type" class="control-label col-sm-4">
|
||||
<span title="" data-toggle="tooltip" class="label-tooltip">{l s='Room Type' mod='hotelreservationsystem'}</span>
|
||||
|
||||
@@ -280,6 +280,17 @@ class StatsCheckUp extends Module
|
||||
);
|
||||
|
||||
foreach ($result as $row) {
|
||||
$row['stock'] = 0;
|
||||
if ($roomTypeInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($row['id_product'])) {
|
||||
$bookingParams['hotel_id'] = $roomTypeInfo['id_hotel'];
|
||||
$bookingParams['id_room_type'] = $row['id_product'];
|
||||
if ($booking_data = $objBookingDtl->getBookingData($bookingParams)) {
|
||||
if (isset($booking_data['stats']['num_avail'])) {
|
||||
$row['stock'] = $booking_data['stats']['num_avail'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$totals['products']++;
|
||||
$scores = array(
|
||||
'active' => ($row['active'] ? 2 : 0),
|
||||
|
||||
@@ -302,8 +302,20 @@ class StatsProduct extends ModuleGraph
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
// get room types info
|
||||
foreach ($this->getProducts() as $product) {
|
||||
$bookingParams = array();
|
||||
$bookingParams['date_from'] = $dateFrom;
|
||||
$bookingParams['date_to'] = $dateTo;
|
||||
foreach ($this->getProducts($this->context->language->id) as $product) {
|
||||
$availRooms = 0;
|
||||
if ($roomTypeInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($product['id_product'])) {
|
||||
$bookingParams['hotel_id'] = $roomTypeInfo['id_hotel'];
|
||||
$bookingParams['id_room_type'] = $product['id_product'];
|
||||
if ($booking_data = $objBookingDtl->getBookingData($bookingParams)) {
|
||||
if (isset($booking_data['stats']['num_avail'])) {
|
||||
$availRooms = $booking_data['stats']['num_avail'];
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->html .= '
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
@@ -75,8 +75,6 @@ class wkhotelfilterblock extends Module
|
||||
$max_adult = HotelRoomType::getMaxAdults($id_hotel);
|
||||
$max_child = HotelRoomType::getMaxChild($id_hotel);
|
||||
|
||||
$category = new Category($htl_id_category);
|
||||
|
||||
if (!($date_from = Tools::getValue('date_from'))) {
|
||||
$date_from = date('Y-m-d');
|
||||
$date_to = date('Y-m-d', strtotime($date_from) + 86400);
|
||||
@@ -94,10 +92,27 @@ class wkhotelfilterblock extends Module
|
||||
$prod_price[] = Product::getPriceStatic($value['id_product'], HotelBookingDetail::useTax());
|
||||
}
|
||||
}
|
||||
|
||||
// Create URL of category
|
||||
$occupancy = Tools::getValue('occupancy');
|
||||
$urlData = array (
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
'occupancy' => $occupancy,
|
||||
);
|
||||
|
||||
if (Configuration::get('PS_REWRITING_SETTINGS')) {
|
||||
$cat_link = $this->context->link->getCategoryLink($category, is_array($category->link_rewrite) ? $category->link_rewrite[$id_lang] : $this->link_rewrite, $id_lang).'?date_from='.$date_from.'&date_to='.$date_to;
|
||||
$categoryUrl = $this->context->link->getCategoryLink(
|
||||
new Category($htl_id_category, $this->context->language->id),
|
||||
null,
|
||||
$this->context->language->id
|
||||
).'?'.http_build_query($urlData);
|
||||
} else {
|
||||
$cat_link = $this->context->link->getCategoryLink($category, is_array($category->link_rewrite) ? $category->link_rewrite[$id_lang] : $this->link_rewrite, $id_lang).'&date_from='.$date_from.'&date_to='.$date_to;
|
||||
$categoryUrl = $this->context->link->getCategoryLink(
|
||||
new Category($htl_id_category, $this->context->language->id),
|
||||
null,
|
||||
$this->context->language->id
|
||||
).'&'.http_build_query($urlData);
|
||||
}
|
||||
$currency = $this->context->currency;
|
||||
|
||||
@@ -112,7 +127,7 @@ class wkhotelfilterblock extends Module
|
||||
'all_feat' => $all_feat,
|
||||
'max_adult' => $max_adult,
|
||||
'max_child' => $max_child,
|
||||
'cat_link' => $cat_link,
|
||||
'cat_link' => $categoryUrl,
|
||||
'currency' => $currency,
|
||||
'date_from' => $date_from,
|
||||
'date_to' => $date_to,
|
||||
|
||||
@@ -54,6 +54,44 @@ class WkRoomSearchHelper
|
||||
}
|
||||
}
|
||||
|
||||
// Lets validate guest occupancy fields
|
||||
// Get guest occupancy variable
|
||||
$guestOccupancy = Tools::getValue('occupancy');
|
||||
if (!count($guestOccupancy)) {
|
||||
$errors[] = $objModule->l('Invalid occupancy', 'WkRoomSearchHelper');
|
||||
} else {
|
||||
$adultTypeErr = 0;
|
||||
$childTypeErr = 0;
|
||||
$childAgeErr = 0;
|
||||
foreach ($guestOccupancy as $occupancy) {
|
||||
if (!isset($occupancy['adults']) || !Validate::isUnsignedInt($occupancy['adults'])) {
|
||||
$adultTypeErr = 1;
|
||||
}
|
||||
if (!isset($occupancy['children']) || !Validate::isUnsignedInt($occupancy['children'])) {
|
||||
$childTypeErr = 1;
|
||||
} elseif ($occupancy['children']) {
|
||||
if (!isset($occupancy['child_ages']) || ($occupancy['children'] != count($occupancy['child_ages']))) {
|
||||
$childAgeErr = 1;
|
||||
} else {
|
||||
foreach ($occupancy['child_ages'] as $childAge) {
|
||||
if (!Validate::isUnsignedInt($childAge)) {
|
||||
$childAgeErr = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($adultTypeErr) {
|
||||
$errors[] = $objModule->l('Invalid adults', 'WkRoomSearchHelper');
|
||||
}
|
||||
if ($childTypeErr) {
|
||||
$errors[] = $objModule->l('Invalid children', 'WkRoomSearchHelper');
|
||||
}
|
||||
if ($childAgeErr) {
|
||||
$errors[] = $objModule->l('Invalid children ages', 'WkRoomSearchHelper');
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
@@ -71,6 +109,10 @@ class WkRoomSearchHelper
|
||||
$hotelsInfo = $objHotelInfo->hotelBranchesInfo(0, 1);
|
||||
|
||||
$locationEnabled = Configuration::get('WK_HOTEL_LOCATION_ENABLE');
|
||||
$occupancyEnabled = false;
|
||||
if (Configuration::get('PS_FRONT_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) {
|
||||
$occupancyEnabled = true;
|
||||
}
|
||||
// if room type page
|
||||
if ($idProduct = Tools::getValue('id_product')) {
|
||||
$objHtlRoomType = new HotelRoomType();
|
||||
@@ -102,8 +144,8 @@ class WkRoomSearchHelper
|
||||
$searchedData['num_days'] = $objBookingDetail->getNumberOfDays($dateFrom, $dateTo);
|
||||
|
||||
$searchedData['parent_data'] = $htlCategoryInfo;
|
||||
$searchedData['date_from'] = date('d-m-Y', strtotime($dateFrom));
|
||||
$searchedData['date_to'] = date('d-m-Y', strtotime($dateTo));
|
||||
$searchedData['date_from'] = $dateFrom;
|
||||
$searchedData['date_to'] = $dateTo;
|
||||
$searchedData['htl_dtl'] = $objHotelInfo->hotelBranchesInfo(0, 1, 1, $idHotel);
|
||||
|
||||
$searchedData['location'] = $searchedData['htl_dtl']['city'];
|
||||
@@ -123,6 +165,20 @@ class WkRoomSearchHelper
|
||||
}
|
||||
}
|
||||
|
||||
if ($occupancyEnabled) {
|
||||
// send occupancy information searched by the user
|
||||
if ($searchedData['occupancies'] = Tools::getvalue('occupancy')) {
|
||||
$searchedData['occupancy_adults'] = array_sum(
|
||||
array_column($searchedData['occupancies'], 'adults')
|
||||
);
|
||||
$searchedData['occupancy_children'] = array_sum(
|
||||
array_column($searchedData['occupancies'], 'children')
|
||||
);
|
||||
$searchedData['occupancy_child_ages'] = array_sum(
|
||||
array_column($searchedData['occupancies'], 'child_ages')
|
||||
);
|
||||
}
|
||||
}
|
||||
$smartyVars['search_data'] = $searchedData;
|
||||
}
|
||||
|
||||
@@ -143,11 +199,79 @@ class WkRoomSearchHelper
|
||||
$smartyVars['total_active_hotels'] = $totalActiveHotels;
|
||||
$smartyVars['hotels_info'] = $hotelsInfo;
|
||||
$smartyVars['show_hotel_name'] = Configuration::get('WK_HOTEL_NAME_ENABLE');
|
||||
$smartyVars['max_child_age'] = Configuration::get('WK_GLOBAL_CHILD_MAX_AGE');
|
||||
|
||||
$maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($idHotel);
|
||||
$smartyVars['max_order_date'] = date('Y-m-d', strtotime($maxOrderDate));
|
||||
$smartyVars['preparation_time'] = (int) HotelOrderRestrictDate::getPreparationTime($idHotel);
|
||||
|
||||
|
||||
// set base width for each elements
|
||||
$search_column_widths = array(
|
||||
'location' => 4,
|
||||
'hotel' => 5,
|
||||
'date' => 5,
|
||||
'occupancy' => 5,
|
||||
'search' => 3
|
||||
);
|
||||
|
||||
if (!$locationEnabled) {
|
||||
unset($search_column_widths['location']);
|
||||
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['search'] += 1;
|
||||
if ($occupancyEnabled) {
|
||||
$search_column_widths['search'] += 1;
|
||||
$search_column_widths['occupancy'] += 1;
|
||||
} elseif ($smartyVars['show_hotel_name'] || count($hotelsInfo) > 1) {
|
||||
$search_column_widths['hotel'] += 1;
|
||||
} else {
|
||||
$search_column_widths['search'] += 1;
|
||||
$search_column_widths['date'] += 1;
|
||||
}
|
||||
}
|
||||
if (!$smartyVars['show_hotel_name'] && count($hotelsInfo) <= 1) {
|
||||
unset($search_column_widths['hotel']);
|
||||
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['search'] += 1;
|
||||
if ($occupancyEnabled) {
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['occupancy'] += 2;
|
||||
} else {
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['date'] += 2;
|
||||
}
|
||||
}
|
||||
if (!$occupancyEnabled) {
|
||||
unset($search_column_widths['occupancy']);
|
||||
|
||||
if ($smartyVars['show_hotel_name'] || count($hotelsInfo) > 1) {
|
||||
if ($locationEnabled) {
|
||||
$search_column_widths['hotel'] += 1;
|
||||
$search_column_widths['location'] += 1;
|
||||
$search_column_widths['search'] += 2;
|
||||
$search_column_widths['date'] += 1;
|
||||
} else {
|
||||
$search_column_widths['hotel'] += 2;
|
||||
$search_column_widths['search'] += 2;
|
||||
$search_column_widths['date'] += 2;
|
||||
|
||||
}
|
||||
} else {
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['date'] += 4;
|
||||
}
|
||||
}
|
||||
$smartyVars['column_widths'] = $search_column_widths;
|
||||
if (count($search_column_widths) == 2) {
|
||||
$smartyVars['multiple_dates_input'] = true;
|
||||
Media::addJSDef(array(
|
||||
'multiple_dates_input' => true
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
Context::getContext()->smarty->assign($smartyVars);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,74 +32,29 @@
|
||||
float: left;
|
||||
margin-top: 0px;
|
||||
border-top: 3px solid #FFF;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form .header-rmsearch-input {
|
||||
box-shadow: 0 2px 1px 0 rgba(0,0,0,0.18);
|
||||
height: 43px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #search_room_submit {
|
||||
padding: 15px 20px;
|
||||
text-align: unset;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #search_room_submit .icon-arrow-right {
|
||||
font-size: 16px;}
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 35px};
|
||||
|
||||
|
||||
#search_hotel_block_form .input-date {
|
||||
padding-right: 35px;}
|
||||
/*.header-rmsearch-wrapper .location_search_results_ul {
|
||||
top: 1px;}
|
||||
.header-rmsearch-wrapper .hotel_dropdown_ul {
|
||||
top: 41px;}*/
|
||||
.header-rmsearch-wrapper .location_search_results_ul li, .header-rmsearch-wrapper .hotel_dropdown_ul li {
|
||||
padding: 10px 15px;}
|
||||
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 35px;
|
||||
padding-right: 35px;}
|
||||
#search_hotel_block_form #hotel_location {
|
||||
padding-right: 15px;}
|
||||
.occupancy_info_block .occupancy_count {
|
||||
padding: 18px;
|
||||
}
|
||||
#search_hotel_block_form .form-group {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
@media (min-width: 480px) and (max-width: 767px) {
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 35px;
|
||||
padding-right: 35px;
|
||||
background-position: 2% 50%;}
|
||||
#search_hotel_block_form #id_hotel_button {
|
||||
background: url("../../views/img/icon-hotel.svg") no-repeat 2% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 98% 50%;
|
||||
background-color: #FFF;}
|
||||
#search_hotel_block_form #guest_occupancy {
|
||||
background: url("../../views/img/icon-users.svg") no-repeat 2% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 98% 50%;
|
||||
background-color: #FFF;}
|
||||
#search_hotel_block_form .input-date {
|
||||
background-position: 98% 50%;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.occupancy_info_block .occupancy_count_block {
|
||||
width: 100%;}
|
||||
.occupancy_info_block .occupancy_count {
|
||||
width: 80%;}
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 30px;
|
||||
padding-right: 20px;}
|
||||
}
|
||||
@media (min-width: 768px) and (max-width: 768px) {
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #daterange_value.grid {
|
||||
display: grid;
|
||||
column-gap: 5px;
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
#search_hotel_block_form .header-rmsearch-input {
|
||||
height: unset;
|
||||
min-height: 45px;
|
||||
}
|
||||
/* #search_hotel_block_form #search_room_submit {
|
||||
height: 45px;
|
||||
} */
|
||||
#search_hotel_block_form {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
#search_hotel_block_form > div {
|
||||
grid-column-end: unset!important;
|
||||
grid-column: unset!important;}
|
||||
@media (min-width: 768px) and (max-width: 991px) {
|
||||
.header-rmsearch-wrapper {
|
||||
padding: 10px 5px;}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
font-size: 12px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #search_room_submit .icon-arrow-right {
|
||||
font-size: 12px;}
|
||||
#search_hotel_block_form .header-rmsearch-input {
|
||||
font-size: 13px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #search_room_submit {
|
||||
padding: 15px 10px;}
|
||||
.children_ages div {
|
||||
width: 100%;}
|
||||
.occupancy_info_block .occupancy_count {
|
||||
width: 75%;}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,39 +17,102 @@
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
#search_hotel_block_form.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(22, 1fr);
|
||||
column-gap: 5px;
|
||||
}
|
||||
#search_hotel_block_form.grid > div {
|
||||
display: grid;
|
||||
}
|
||||
#search_hotel_block_form .area-3 {
|
||||
grid-column-end: span 3;
|
||||
}
|
||||
#search_hotel_block_form .area-4 {
|
||||
grid-column-end: span 4;
|
||||
}
|
||||
#search_hotel_block_form .area-5 {
|
||||
grid-column-end: span 5;
|
||||
}
|
||||
#search_hotel_block_form .area-6 {
|
||||
grid-column-end: span 6;
|
||||
}
|
||||
#search_hotel_block_form .area-7 {
|
||||
grid-column-end: span 7;
|
||||
}
|
||||
#search_hotel_block_form .area-8 {
|
||||
grid-column-end: span 8;
|
||||
}
|
||||
#search_hotel_block_form .area-9 {
|
||||
grid-column-end: span 9;
|
||||
}
|
||||
#search_hotel_block_form .area-10 {
|
||||
grid-column-end: span 10;
|
||||
}
|
||||
#search_hotel_block_form .area-11 {
|
||||
grid-column-end: span 11;
|
||||
}
|
||||
#search_hotel_block_form .area-14 {
|
||||
grid-column-end: span 14;
|
||||
}
|
||||
#search_hotel_block_form .area-16 {
|
||||
grid-column-end: span 16;
|
||||
}
|
||||
#daterange_value.grid {
|
||||
display: grid;
|
||||
column-gap: 5px;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
/* #search_hotel_block_form {
|
||||
display: grid;
|
||||
grid-template-columns: 0.8fr repeat(3, 1fr) 0.6fr;
|
||||
column-gap: 5px;
|
||||
}
|
||||
@media (min-width: 768px) and (max-width: 991px) {
|
||||
#search_hotel_block_form {
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
grid-template-rows: repeat(2, 1fr);
|
||||
}
|
||||
#search_hotel_block_form > div {
|
||||
grid-column-end: span 4;
|
||||
}
|
||||
#search_hotel_block_form > div:nth-child(1) {
|
||||
grid-column: 1 / span 5;
|
||||
}
|
||||
#search_hotel_block_form > div:nth-child(2) {
|
||||
grid-column: 6 / span 5;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
#search_hotel_block_form {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
} */
|
||||
#search_hotel_block_form .header-rmsearch-input {
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
padding: 7px 5px 7px 12px;
|
||||
border: 1px solid #555555;
|
||||
background-color: #FFF;}
|
||||
background-color: #FFF;
|
||||
min-height: 55px;}
|
||||
#search_hotel_block_form .header-rmsearch-input:active, #search_hotel_block_form .header-rmsearch-input:focus {
|
||||
border: 2px solid #1292FF;}
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 45px;
|
||||
padding-right: 35px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 4% 50%;}
|
||||
#search_hotel_block_form #hotel_location {
|
||||
background-image: url("../../views/img/icon-hotel.svg");}
|
||||
#search_hotel_block_form #id_hotel_button {
|
||||
background: url("../../views/img/icon-hotel.svg") no-repeat 4% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 96% 50%;
|
||||
background: url("../../views/img/icon-hotel.svg") no-repeat 10px 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat calc(100% - 10px) 50%;
|
||||
background-color: #FFF;}
|
||||
#search_hotel_block_form #guest_occupancy {
|
||||
background: url("../../views/img/icon-users.svg") no-repeat 4% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 96% 50%;
|
||||
background-color: #FFF;}
|
||||
|
||||
height: unset;
|
||||
text-align: unset;
|
||||
}
|
||||
#search_hotel_block_form .input-date {
|
||||
cursor: text;
|
||||
background-image: url("../../views/img/icon-calendar.svg");
|
||||
background-repeat: no-repeat;
|
||||
padding-right: 40px;
|
||||
background-position: 96% 50%;}
|
||||
#search_hotel_block_form #hotel_location {
|
||||
padding-right: 15px;}
|
||||
display: grid;
|
||||
cursor: text;}
|
||||
#search_hotel_block_form .input-date span {
|
||||
align-self: center;}
|
||||
#search_hotel_block_form .input-date span i {
|
||||
transform: scale(0.8, 0.6);}
|
||||
.header-rmsearch-input::-webkit-input-placeholder {
|
||||
color: #333;}
|
||||
.header-rmsearch-input:-moz-placeholder {
|
||||
@@ -135,12 +198,110 @@
|
||||
color: #333333;
|
||||
line-height: 22px;
|
||||
text-align: center;}
|
||||
#search_hotel_block_form .form-group {
|
||||
margin-bottom: 20px;}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
background-color: #1292FF;
|
||||
width: 100%;
|
||||
font-size: 13px;
|
||||
text-transform: uppercase;
|
||||
border: none;
|
||||
border-radius: 4px;}
|
||||
border-radius: 4px;}
|
||||
|
||||
|
||||
/* occupancy */
|
||||
#search_occupancy_wrapper {
|
||||
border: none;
|
||||
max-height: 400px;
|
||||
min-width: 250px;
|
||||
overflow: auto;
|
||||
box-shadow: 0 8px 25px -4px rgba(0,0,0,0.39);
|
||||
left: 0px;
|
||||
padding: 20px;}
|
||||
#search_occupancy_wrapper .occupancy-info-separator {
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
margin-right: -20px;
|
||||
margin-left: -20px;}
|
||||
#search_occupancy_wrapper .children_age_info_block {
|
||||
display: none;}
|
||||
#search_occupancy_wrapper .children_age_info_block label {
|
||||
font-size: 12px;
|
||||
color: #777777;}
|
||||
#search_occupancy_wrapper label {
|
||||
font-size: 14px;
|
||||
color: #333333;
|
||||
font-weight: 400;}
|
||||
#search_occupancy_wrapper .add_new_occupancy_btn {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
color: #0000FF;
|
||||
line-height: 24px;}
|
||||
#search_occupancy_wrapper .add_new_occupancy_btn:active, #search_occupancy_wrapper .add_new_occupancy_btn:focus, #search_occupancy_wrapper .add_new_occupancy_btn:hover {
|
||||
text-decoration: none;
|
||||
color: #0000FF;}
|
||||
#search_occupancy_wrapper .occupancy_info_head {
|
||||
font-size: 14px;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;}
|
||||
#search_occupancy_wrapper .occupancy_info_head .remove-room-link {
|
||||
font-size: 12px;
|
||||
color: #FF4343;
|
||||
text-align: right;}
|
||||
#search_occupancy_wrapper .occupancy_info_block {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr); }
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count_block{
|
||||
display: grid;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count_block > div{
|
||||
align-self: end;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .children_age_info_block {
|
||||
grid-column: 1 / 3}
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count {
|
||||
padding: 14px;
|
||||
border: 1px solid #E1E3E7;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
text-align: center;
|
||||
border-radius: 4px;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count > span {
|
||||
min-width: 21px;
|
||||
text-align: center;
|
||||
display: block;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .qty_direction {
|
||||
margin-left: 3px;
|
||||
width: 22px;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .qty_direction a {
|
||||
padding: 1px 5px;
|
||||
border: 0px;
|
||||
border: 1px solid #E1E3E7;
|
||||
color: #333;
|
||||
border-radius: 4px;
|
||||
font-weight: 400;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .qty_direction .occupancy_quantity_down {
|
||||
margin-top: 3px;}
|
||||
|
||||
#search_occupancy_wrapper .children_ages {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
column-gap: 5px;
|
||||
justify-content: space-between;
|
||||
}
|
||||
#search_occupancy_wrapper .children_ages select {
|
||||
background-color: #fff;
|
||||
height: 37px;
|
||||
border-radius: 4px;
|
||||
padding: 3px 5px;
|
||||
font-size: 12px;
|
||||
color: #333;
|
||||
border: 1px solid #E1E3E7;
|
||||
width: 100%;}
|
||||
|
||||
|
||||
@media (max-width: 411px) {
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count_block {
|
||||
width: 100%;}
|
||||
#search_occupancy_wrapper .occupancy_info_block .occupancy_count {
|
||||
width: 80%;}
|
||||
}
|
||||
@@ -35,8 +35,7 @@
|
||||
width: 100%;}
|
||||
.header-rmsearch-primary {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
text-align: center;}
|
||||
vertical-align: middle;}
|
||||
.header-rmsearch-inner-wrapper {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 15px;}
|
||||
@@ -63,27 +62,6 @@
|
||||
float: left;
|
||||
margin-top: 5px;
|
||||
width: 125px;}
|
||||
|
||||
#search_hotel_block_form .header-rmsearch-input {
|
||||
height: 55px;}
|
||||
.header-rmsearch-show-xs {
|
||||
background-color: #ffffff;
|
||||
top: 0;}
|
||||
#search_hotel_block_form .header-rmsearch-input {
|
||||
height: 55px;}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
padding: 5px;
|
||||
box-shadow: 0 0 20px 0 rgba(18,146,255,0.42);}
|
||||
@media (min-width: 768px) {
|
||||
#search_hotel_block_form .input-date {
|
||||
background-position: 92% 50%;}
|
||||
#search_hotel_block_form .check_in_field_block {
|
||||
padding-right:5px;}
|
||||
#search_hotel_block_form .check_out_field_block {
|
||||
padding-left:5px;}}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 1199px) {
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button {
|
||||
padding-left: 40px;
|
||||
padding-right: 30px;}
|
||||
}
|
||||
/* .fancybox-inner #search_hotel_block_form {
|
||||
grid-template-columns: 1fr;
|
||||
} */
|
||||
@@ -23,26 +23,18 @@
|
||||
background: #1A4060;
|
||||
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.16);
|
||||
padding: 20px 0px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form {
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;}
|
||||
.header-rmsearch-wrapper .filter_header {
|
||||
font-size: 12px;
|
||||
color: #FFFFFF;
|
||||
line-height: 25px;}
|
||||
.header-rmsearch-wrapper .filter_header p {
|
||||
margin-bottom: 2px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form .header-rmsearch-input {
|
||||
box-shadow: 0 2px 1px 0 rgba(0,0,0,0.18);
|
||||
height: 49px;}
|
||||
.header-rmsearch-wrapper #search_hotel_block_form #search_room_submit {
|
||||
padding: 15px 20px;}
|
||||
.header-rmsearch-wrapper .container {
|
||||
position: relative;}
|
||||
.header-rmsearch-wrapper .close_room_serach_wrapper {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;}
|
||||
.header-rmsearch-wrapper .filter_header {
|
||||
font-size: 12px;
|
||||
color: #FFFFFF;
|
||||
line-height: 25px;}
|
||||
.header-rmsearch-wrapper .filter_header p {
|
||||
margin-bottom: 2px;}
|
||||
.header-rmsearch-wrapper .container {
|
||||
position: relative;}
|
||||
.header-rmsearch-wrapper .close_room_serach_wrapper {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;}
|
||||
|
||||
/* hotel searched information wrapper css */
|
||||
.header-rmsearch-details-wrapper {
|
||||
@@ -72,52 +64,9 @@
|
||||
background-color: #FAFAFA;}
|
||||
.faded-txt {
|
||||
color: #777777;}
|
||||
|
||||
/* .header-rmsearch-wrapper .location_search_results_ul {
|
||||
top: 1px;}
|
||||
.header-rmsearch-wrapper .hotel_dropdown_ul {
|
||||
top: 46px;}*/
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 40px;
|
||||
padding-right: 30px;}
|
||||
.header-rmsearch-wrapper .location_search_results_ul li, .header-rmsearch-wrapper .hotel_dropdown_ul li {
|
||||
padding: 13px 15px;}
|
||||
#search_hotel_block_form .input-date {
|
||||
background-position: 95% 50%;}
|
||||
@media (min-width: 768px) and (max-width: 991px) {
|
||||
.search_room_submit_block {
|
||||
float: right;}
|
||||
}
|
||||
|
||||
@media (max-width: 991px) {
|
||||
.header-rmsearch-wrapper .close_room_serach_wrapper {
|
||||
top: -8px;
|
||||
right: 15px;}
|
||||
.close_room_serach_wrapper img {
|
||||
width: 18px;}}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
#search_hotel_block_form #hotel_location {
|
||||
background-position: 3% 50%;}}
|
||||
@media (max-width: 767px) {
|
||||
#search_hotel_block_form .input-date {
|
||||
background-position: 96% 50%;}
|
||||
|
||||
.header-rmsearch-details-wrapper .modify_roomtype_search_btn {
|
||||
width: 100%;}
|
||||
}
|
||||
@media (min-width: 480px) and (max-width: 767px) {
|
||||
#search_hotel_block_form #hotel_location, #search_hotel_block_form #id_hotel_button, #search_hotel_block_form #guest_occupancy {
|
||||
padding-left: 35px;
|
||||
padding-right: 35px;
|
||||
background-position: 2% 50%;}
|
||||
#search_hotel_block_form #id_hotel_button {
|
||||
background: url("../../views/img/icon-hotel.svg") no-repeat 2% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 98% 50%;
|
||||
background-color: #FFF;}
|
||||
#search_hotel_block_form #guest_occupancy {
|
||||
background: url("../../views/img/icon-users.svg") no-repeat 2% 50%, url("../../views/img/icon-dropdown-arrow.svg") no-repeat 98% 50%;
|
||||
background-color: #FFF;}
|
||||
#search_hotel_block_form .input-date {
|
||||
background-position: 98% 50%;}
|
||||
}
|
||||
|
||||
width: 18px;}}
|
||||
@@ -20,14 +20,14 @@
|
||||
$(document).ready(function() {
|
||||
// for screen size changes for room search
|
||||
var window_width = $(window).width();
|
||||
if (window_width >= 767) {
|
||||
if (window_width > 767) {
|
||||
$('.fancy_search_header_xs').hide();
|
||||
}
|
||||
|
||||
if ($("body").length) {
|
||||
$(window).resize(function() {
|
||||
var window_width = $(window).width();
|
||||
if (window_width >= 767) {
|
||||
if (window_width > 767) {
|
||||
$.fancybox.close();
|
||||
$('.fancy_search_header_xs').hide();
|
||||
} else {
|
||||
@@ -54,90 +54,83 @@ $(document).ready(function() {
|
||||
var ajax_check_var = '';
|
||||
$('.location_search_results_ul').hide();
|
||||
|
||||
$("#check_out_time").datepicker({
|
||||
dateFormat: 'dd-mm-yy',
|
||||
dayNamesMin: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
||||
//for calender Css
|
||||
beforeShowDay: function (date) {
|
||||
// get check-in date
|
||||
return highlightSelectedDateRange(date, $("#check_in_time").val(), $("#check_out_time").val());
|
||||
},
|
||||
beforeShow: function (input, instance) {
|
||||
// So that on translating page date is translated to NaN-NaN-NaN
|
||||
$('.ui-datepicker').addClass('notranslate');
|
||||
|
||||
var date_to = $('#check_in_time').val();
|
||||
if (typeof date_to != 'undefined' && date_to != '') {
|
||||
var date_format = date_to.split("-");
|
||||
var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format[2], date_format[1] - 1, date_format[0])));
|
||||
selectedDate.setDate(selectedDate.getDate()+1);
|
||||
$("#check_out_time").datepicker("option", "minDate", selectedDate);
|
||||
} else {
|
||||
$('#preparation_time').val()
|
||||
var date_format = new Date();
|
||||
var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date()));
|
||||
selectedDate.setDate(selectedDate.getDate()+1 + parseInt($('#preparation_time').val()));
|
||||
$("#check_out_time").datepicker("option", "minDate", selectedDate);
|
||||
}
|
||||
function createDateRangePicker(max_order_date, preparation_time, dateFrom, dateTo)
|
||||
{
|
||||
let start_date = new Date();
|
||||
if (preparation_time) {
|
||||
start_date.setDate(start_date.getDate() + parseInt(preparation_time));
|
||||
start_date.setHours(0, 0, 0, 0);
|
||||
}
|
||||
});
|
||||
|
||||
$("#check_in_time").datepicker({
|
||||
dateFormat: 'dd-mm-yy',
|
||||
minDate: 0,
|
||||
dayNamesMin: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
||||
beforeShow: function (input, instance) {
|
||||
// So that on translating page date is translated to NaN-NaN-NaN
|
||||
$('.ui-datepicker').addClass('notranslate');
|
||||
},
|
||||
//for calender Css
|
||||
beforeShowDay: function (date) {
|
||||
// highlight dates of the selected date range
|
||||
return highlightSelectedDateRange(date, $("#check_in_time").val(), $("#check_out_time").val());
|
||||
},
|
||||
onClose: function() {
|
||||
// get checkout date before making any changes for the operations
|
||||
var checkOut = $("#check_out_time").val();
|
||||
var date = $("#check_in_time").val();
|
||||
var dateFormat = date.split("-");
|
||||
var selectedDate = new Date(
|
||||
$.datepicker.formatDate('yy-mm-dd', new Date(dateFormat[2], dateFormat[1] - 1, dateFormat[0]))
|
||||
if (max_order_date) {
|
||||
max_order_date = $.datepicker.parseDate('yy-mm-dd', max_order_date );
|
||||
} else {
|
||||
max_order_date = false;
|
||||
}
|
||||
|
||||
if (typeof $('#daterange_value').data('dateRangePicker') != 'undefined') {
|
||||
if (max_order_date) {
|
||||
if ($.datepicker.parseDate('yy-mm-dd', $('#check_out_time').val()) < max_order_date) {
|
||||
dateFrom = dateFrom ? dateFrom :$('#check_in_time').val();
|
||||
dateTo = dateTo ? dateTo : $('#check_out_time').val();
|
||||
} else {
|
||||
dateFrom = false;
|
||||
dateTo = false;
|
||||
}
|
||||
}
|
||||
$('#daterange_value').data('dateRangePicker').clear();
|
||||
$('#daterange_value').data('dateRangePicker').destroy();
|
||||
$("#daterange_value").off("datepicker-change");
|
||||
}
|
||||
|
||||
if (max_order_date) {
|
||||
max_order_date = $.datepicker.formatDate('dd-mm-yy', max_order_date);
|
||||
}
|
||||
|
||||
if (typeof(multiple_dates_input) != 'undefined' && multiple_dates_input) {
|
||||
$('#daterange_value').dateRangePicker({
|
||||
startDate: $.datepicker.formatDate('dd-mm-yy', new Date()),
|
||||
separator : ' to ',
|
||||
setValue: function(s,s1,s2)
|
||||
{
|
||||
if (s1) {
|
||||
$('#daterange_value_from').find('span').html(s1);
|
||||
} else {
|
||||
$(daterange_value_from).find('span').html(
|
||||
RangePickerCheckin
|
||||
);
|
||||
}
|
||||
if (s2) {
|
||||
$('#daterange_value_to').find('span').html(s2);
|
||||
} else {
|
||||
$('#daterange_value_to').find('span').html(
|
||||
RangePickerCheckin
|
||||
);
|
||||
}
|
||||
},
|
||||
endDate: max_order_date,
|
||||
}).on('datepicker-change', function(event,obj){
|
||||
$('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1));
|
||||
$('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2));
|
||||
});
|
||||
} else {
|
||||
$('#daterange_value').dateRangePicker({
|
||||
startDate: $.datepicker.formatDate('dd-mm-yy', new Date()),
|
||||
startDate: start_date,
|
||||
endDate: max_order_date,
|
||||
}).on('datepicker-change', function(event,obj){
|
||||
$('#check_in_time').val($.datepicker.formatDate('yy-mm-dd', obj.date1));
|
||||
$('#check_out_time').val($.datepicker.formatDate('yy-mm-dd', obj.date2));
|
||||
});
|
||||
}
|
||||
|
||||
if (dateFrom && dateTo) {
|
||||
$('#daterange_value').data('dateRangePicker').setDateRange(
|
||||
$.datepicker.formatDate('dd-mm-yy', $.datepicker.parseDate('yy-mm-dd', dateFrom)),
|
||||
$.datepicker.formatDate('dd-mm-yy', $.datepicker.parseDate('yy-mm-dd', dateTo))
|
||||
);
|
||||
selectedDate.setDate(selectedDate.getDate() + 1);
|
||||
$("#check_out_time").datepicker("option", "minDate", selectedDate);
|
||||
|
||||
/* open datepicker of chechout date only if
|
||||
checkout date is empty or checkin selected is equal or more than check out date */
|
||||
if (checkOut == '') {
|
||||
$("#check_out_time").datepicker( "show" );
|
||||
} else {
|
||||
// Lets make the date in the required format
|
||||
selectedDate.setDate(selectedDate.getDate() - 1);
|
||||
var currentDate = selectedDate.getDate();
|
||||
var currentMonth = selectedDate.getMonth() + 1;
|
||||
if (currentMonth < 10) {
|
||||
currentMonth = '0' + currentMonth;
|
||||
}
|
||||
if (currentDate < 10) {
|
||||
currentDate = '0' + currentDate;
|
||||
}
|
||||
|
||||
dmy = selectedDate.getFullYear() + "-" + currentMonth + "-" + currentDate;
|
||||
checkOut = checkOut.split("-");
|
||||
checkOut = (checkOut[2]) + '-' + (checkOut[1]) + '-' + (checkOut[0]);
|
||||
|
||||
if (checkOut <= dmy) {
|
||||
$("#check_out_time").datepicker('show');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof max_order_date != 'undefined' && typeof booking_date_to != 'undefined') {
|
||||
max_order_date_cal = new Date(max_order_date);
|
||||
$("#check_out_time").datepicker("option", "maxDate", new Date(max_order_date));
|
||||
max_order_date_cal.setDate(max_order_date_cal.getDate() - 1);
|
||||
$("#check_in_time").datepicker("option", "maxDate", max_order_date_cal);
|
||||
}
|
||||
|
||||
function abortRunningAjax() {
|
||||
@@ -265,32 +258,10 @@ $(document).ready(function() {
|
||||
});
|
||||
|
||||
$(document).on('click', '.hotel_dropdown_ul li', function() {
|
||||
var max_order_date = $(this).attr('data-max_order_date');
|
||||
var max_date_from = new Date(max_order_date);
|
||||
max_date_from.setDate(max_date_from.getDate() - 1);
|
||||
var max_date_to = new Date(max_order_date);
|
||||
if($("#check_in_time").datepicker("getDate") > max_date_from) {
|
||||
$("#check_in_time").val('');
|
||||
}
|
||||
if($("#check_out_time").datepicker("getDate") > max_date_to) {
|
||||
$("#check_out_time").val('');
|
||||
}
|
||||
$("#check_in_time").datepicker("option", "maxDate", max_date_from);
|
||||
$("#check_out_time").datepicker("option", "maxDate", max_date_to);
|
||||
$("#max_order_date").val(max_order_date);
|
||||
let max_order_date = $(this).attr('data-max_order_date');
|
||||
let preparation_time = $(this).attr('data-preparation_time')
|
||||
let preparation_time_date = new Date();
|
||||
preparation_time_date.setDate(preparation_time_date.getDate() + parseInt(preparation_time));
|
||||
preparation_time_date.setHours(0, 0, 0, 0);
|
||||
if($("#check_in_time").datepicker("getDate") < preparation_time_date) {
|
||||
$("#check_in_time").val('');
|
||||
}
|
||||
preparation_time_date.setDate(preparation_time_date.getDate() + 1);
|
||||
if($("#check_out_time").datepicker("getDate") < preparation_time_date) {
|
||||
$("#check_out_time").val('');
|
||||
}
|
||||
$("#check_in_time").datepicker("option", "minDate", parseInt(preparation_time));
|
||||
$("#check_out_time").datepicker("option", "minDate", parseInt(preparation_time) + 1);
|
||||
createDateRangePicker(max_order_date, preparation_time, $('#check_in_time').val(), $('#check_out_time').val());
|
||||
$("#max_order_date").val(max_order_date);
|
||||
$('#preparation_time').val(preparation_time);
|
||||
$('#id_hotel').val($(this).attr('data-id-hotel'));
|
||||
$('#hotel_cat_id').val($(this).attr('data-hotel-cat-id'));
|
||||
@@ -299,37 +270,14 @@ $(document).ready(function() {
|
||||
|
||||
// If only one hotel then set max order date on date pickers
|
||||
var max_order_date = $('#max_order_date').val();
|
||||
if (max_order_date != '') {
|
||||
var max_date_from = new Date(max_order_date);
|
||||
max_date_from.setDate(max_date_from.getDate() - 1);
|
||||
var max_date_to = new Date(max_order_date);
|
||||
if($("#check_in_time").datepicker("getDate") > max_date_from) {
|
||||
$("#check_in_time").val('');
|
||||
}
|
||||
if($("#check_out_time").datepicker("getDate") > max_date_to) {
|
||||
$("#check_out_time").val('');
|
||||
}
|
||||
$("#check_in_time").datepicker("option", "maxDate", max_date_from);
|
||||
$("#check_out_time").datepicker("option", "maxDate", max_date_to);
|
||||
}
|
||||
|
||||
var preparation_time = $('#preparation_time').val();
|
||||
if (preparation_time != '') {
|
||||
$("#check_in_time").datepicker("option", "minDate", parseInt(preparation_time));
|
||||
$("#check_out_time").datepicker("option", "minDate", parseInt(preparation_time) + 1);
|
||||
}
|
||||
createDateRangePicker(max_order_date, preparation_time, $('#check_in_time').val(), $('#check_out_time').val());
|
||||
|
||||
// validations on the submit of the search fields
|
||||
$('#search_room_submit').on('click', function(e) {
|
||||
var check_in_time = $("#check_in_time").val();
|
||||
var check_out_time = $("#check_out_time").val();
|
||||
|
||||
var date_format_check_in = check_in_time.split("-");
|
||||
var new_chk_in = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format_check_in[2], date_format_check_in[1] - 1, date_format_check_in[0])));
|
||||
var date_format_check_out = check_out_time.split("-");
|
||||
var new_chk_out = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format_check_out[2], date_format_check_out[1] - 1, date_format_check_out[0])));
|
||||
var max_order_date = $("#max_order_date").val();
|
||||
var max_order_date_format = $.datepicker.formatDate('yy-mm-dd', new Date(max_order_date));
|
||||
var error = false;
|
||||
|
||||
var locationCatId = $('#hotel_location').attr('city_cat_id');
|
||||
@@ -345,35 +293,283 @@ $(document).ready(function() {
|
||||
$('#select_htl_error_p').text(hotel_name_cond);
|
||||
error = true;
|
||||
}
|
||||
var date_selector
|
||||
if (typeof(multiple_dates_input) != 'undefined' && multiple_dates_input) {
|
||||
date_selector = '#daterange_value_from, #daterange_value_to';
|
||||
} else {
|
||||
date_selector = '#daterange_value';
|
||||
}
|
||||
if (check_in_time == '') {
|
||||
$("#check_in_time").addClass("error_border");
|
||||
$('#check_in_time_error_p').text(check_in_time_cond);
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(check_in_time_cond);
|
||||
error = true;
|
||||
} else if (new_chk_in < $.datepicker.formatDate('yy-mm-dd', new Date())) {
|
||||
$("#check_in_time").addClass("error_border");
|
||||
$('#check_in_time_error_p').text(less_checkin_date);
|
||||
} else if (check_in_time < $.datepicker.formatDate('yy-mm-dd', new Date())) {
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(less_checkin_date);
|
||||
error = true;
|
||||
}
|
||||
if (check_out_time == '') {
|
||||
$("#check_out_time").addClass("error_border");
|
||||
$('#check_out_time_error_p').text(check_out_time_cond);
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(check_out_time_cond);
|
||||
error = true;
|
||||
} else if (new_chk_out < new_chk_in) {
|
||||
$("#check_out_time").addClass("error_border");
|
||||
$('#check_out_time_error_p').text(more_checkout_date);
|
||||
} else if (check_out_time < check_in_time) {
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(more_checkout_date);
|
||||
error = true;
|
||||
} else if (max_order_date_format < new_chk_in) {
|
||||
$("#check_in_time").addClass("error_border");
|
||||
$('#check_in_time_error_p').text(max_order_date_err + ' ' + max_order_date);
|
||||
} else if (max_order_date < check_in_time) {
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(max_order_date_err + ' ' + max_order_date);
|
||||
error = true;
|
||||
} else if (max_order_date_format < new_chk_out) {
|
||||
$("#check_out_time").addClass("error_border");
|
||||
$('#check_out_time_error_p').text(max_order_date_err + ' ' + max_order_date);
|
||||
} else if (max_order_date < check_out_time) {
|
||||
$(date_selector).addClass("error_border");
|
||||
$('#daterange_value_error_p').text(max_order_date_err + ' ' + max_order_date);
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
});
|
||||
// Occupancy field dropdown
|
||||
// add occupancy info block
|
||||
$('#search_occupancy_wrapper .add_new_occupancy_btn').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var occupancy_block = '';
|
||||
|
||||
var roomBlockIndex = parseInt($("#search_occupancy_wrapper .occupancy_info_block").last().attr('occ_block_index'));
|
||||
roomBlockIndex += 1;
|
||||
|
||||
var countRooms = parseInt($('#search_occupancy_wrapper .occupancy_info_block').length);
|
||||
countRooms += 1
|
||||
|
||||
occupancy_block += '<div class="occupancy-room-block">';
|
||||
occupancy_block += '<div class="occupancy_info_head"><span class="room_num_wrapper">'+ room_txt + ' - ' + countRooms + '</span><a class="remove-room-link pull-right" href="#">' + remove_txt + '</a></div>';
|
||||
occupancy_block += '<div class="occupancy_info_block" occ_block_index="'+roomBlockIndex+'">';
|
||||
occupancy_block += '<div class="form-group occupancy_count_block">';
|
||||
occupancy_block += '<label>' + adults_txt + '</label>';
|
||||
occupancy_block += '<div>';
|
||||
occupancy_block += '<input type="hidden" class="num_occupancy num_adults room_occupancies" name="occupancy['+roomBlockIndex+'][adults]" value="1">';
|
||||
occupancy_block += '<div class="occupancy_count pull-left">';
|
||||
occupancy_block += '<span>1</span>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="qty_direction pull-left">';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">';
|
||||
occupancy_block += '<span><i class="icon-plus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">';
|
||||
occupancy_block += '<span><i class="icon-minus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group occupancy_count_block">';
|
||||
occupancy_block += '<label>' + child_txt + '<span class="label-desc-txt"> (' + below_txt + ' ' + max_child_age + ' ' + years_txt + ')</span></label>';
|
||||
occupancy_block += '<div>';
|
||||
occupancy_block += '<input type="hidden" class="num_occupancy num_children room_occupancies" name="occupancy['+roomBlockIndex+'][children]" value="0">';
|
||||
occupancy_block += '<div class="occupancy_count pull-left">';
|
||||
occupancy_block += '<span>0</span>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="qty_direction pull-left">';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">';
|
||||
occupancy_block += '<span><i class="icon-plus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">';
|
||||
occupancy_block += '<span><i class="icon-minus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group children_age_info_block">';
|
||||
occupancy_block += '<label>' + all_children_txt + '</label>';
|
||||
occupancy_block += '<div class="children_ages">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<hr class="occupancy-info-separator">';
|
||||
occupancy_block += '</div>';
|
||||
$('#occupancy_inner_wrapper').append(occupancy_block);
|
||||
|
||||
// scroll to the latest added room
|
||||
$("#search_occupancy_wrapper").animate({ scrollTop: $("#search_occupancy_wrapper").prop('scrollHeight') }, "slow");
|
||||
|
||||
setGuestOccupancy();
|
||||
});
|
||||
|
||||
// remove occupancy info block
|
||||
$(document).on('click', '#search_occupancy_wrapper .remove-room-link', function(e) {
|
||||
e.preventDefault();
|
||||
$(this).closest('#search_occupancy_wrapper .occupancy-room-block').remove();
|
||||
|
||||
$( "#search_occupancy_wrapper .room_num_wrapper" ).each(function(key, val) {
|
||||
$(this).text(room_txt + ' - '+ (key+1) );
|
||||
});
|
||||
|
||||
setGuestOccupancy();
|
||||
});
|
||||
|
||||
// increase the quantity of adults and child
|
||||
$(document).on('click', '#search_occupancy_wrapper .occupancy_quantity_up', function(e) {
|
||||
e.preventDefault();
|
||||
// set input field value
|
||||
var element = $(this).closest('.occupancy_count_block').find('.num_occupancy');
|
||||
var elementVal = parseInt(element.val()) + 1;
|
||||
|
||||
var childElement = $(this).closest('.occupancy_count_block').find('.num_children').length;
|
||||
if (childElement) {
|
||||
var totalChilds = $(this).closest('.occupancy_info_block').find('.guest_child_age').length;
|
||||
|
||||
if (max_child_in_room == 0 || totalChilds < max_child_in_room) {
|
||||
element.val(elementVal);
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').show();
|
||||
|
||||
var roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index'));
|
||||
|
||||
var childAgeSelect = '<div>';
|
||||
childAgeSelect += '<select class="guest_child_age room_occupancies" name="occupancy[' +roomBlockIndex+ '][child_ages][]">';
|
||||
childAgeSelect += '<option value="-1">' + select_age_txt + '</option>';
|
||||
childAgeSelect += '<option value="0">' + under_1_age + '</option>';
|
||||
for (let age = 1; age < max_child_age; age++) {
|
||||
childAgeSelect += '<option value="'+age+'">'+age+'</option>';
|
||||
}
|
||||
childAgeSelect += '</select>';
|
||||
childAgeSelect += '</div>';
|
||||
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect);
|
||||
|
||||
// set input field value
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal);
|
||||
}
|
||||
} else {
|
||||
element.val(elementVal);
|
||||
|
||||
// set input field value
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal);
|
||||
}
|
||||
|
||||
setGuestOccupancy();
|
||||
});
|
||||
|
||||
$(document).on('click', '#search_occupancy_wrapper .occupancy_quantity_down', function(e) {
|
||||
e.preventDefault();
|
||||
// set input field value
|
||||
var element = $(this).closest('.occupancy_count_block').find('.num_occupancy');
|
||||
var elementVal = parseInt(element.val()) - 1;
|
||||
var childElement = $(this).closest('.occupancy_count_block').find('.num_children').length;
|
||||
|
||||
if (childElement) {
|
||||
if (elementVal < 0) {
|
||||
elementVal = 0;
|
||||
} else {
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages select').last().closest('div').remove();
|
||||
if (elementVal <= 0) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').hide();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (elementVal == 0) {
|
||||
elementVal = 1;
|
||||
}
|
||||
}
|
||||
|
||||
element.val(elementVal);
|
||||
// set input field value
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal);
|
||||
|
||||
setGuestOccupancy();
|
||||
});
|
||||
|
||||
// toggle occupancy block
|
||||
$('#guest_occupancy').on('click', function(e) {
|
||||
e.stopPropagation();
|
||||
$("#search_occupancy_wrapper").toggle();
|
||||
});
|
||||
|
||||
// close the occupancy block when clink anywhere in the body outside occupancy block
|
||||
$('body').on('click', function(e) {
|
||||
// @TODO better approach to be found
|
||||
if ($('#search_occupancy_wrapper').length) {
|
||||
if ($('#search_occupancy_wrapper').css('display') !== 'none') {
|
||||
if (!($(e.target).closest("#search_occupancy_wrapper").length)) {
|
||||
// Before closing the occupancy block validate the vaules inside
|
||||
let hasErrors = 0;
|
||||
|
||||
let adults = $("#search_occupancy_wrapper").find(".num_adults").map(function(){return $(this).val();}).get();
|
||||
let children = $("#search_occupancy_wrapper").find(".num_children").map(function(){return $(this).val();}).get();
|
||||
let child_ages = $("#search_occupancy_wrapper").find(".guest_child_age").map(function(){return $(this).val();}).get();
|
||||
|
||||
// start validating above values
|
||||
if (!adults.length || (adults.length != children.length)) {
|
||||
hasErrors = 1;
|
||||
showErrorMessage(invalid_occupancy_txt);
|
||||
} else {
|
||||
$("#search_occupancy_wrapper").find('.occupancy_count').removeClass('error_border');
|
||||
|
||||
// validate values of adults and children
|
||||
adults.forEach(function (item, index) {
|
||||
if (isNaN(item) || parseInt(item) < 1) {
|
||||
hasErrors = 1;
|
||||
$("#search_occupancy_wrapper .num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
if (isNaN(children[index])) {
|
||||
hasErrors = 1;
|
||||
$("#search_occupancy_wrapper .num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
});
|
||||
|
||||
// validate values of selected child ages
|
||||
$("#search_occupancy_wrapper").find('.guest_child_age').removeClass('error_border');
|
||||
child_ages.forEach(function (age, index) {
|
||||
age = parseInt(age);
|
||||
if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) {
|
||||
hasErrors = 1;
|
||||
$("#search_occupancy_wrapper .guest_child_age").eq(index).addClass('error_border');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (hasErrors == 0) {
|
||||
$("#search_occupancy_wrapper").hide();
|
||||
$("#search_hotel_block_form #guest_occupancy").removeClass('error_border');
|
||||
} else {
|
||||
$("#search_hotel_block_form #guest_occupancy").addClass('error_border');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
// function to set occupancy infor in guest occupancy field(search form)
|
||||
function setGuestOccupancy()
|
||||
{
|
||||
var adults = 0;
|
||||
var children = 0;
|
||||
var rooms = $('#search_occupancy_wrapper .occupancy_info_block').length;
|
||||
$( "#search_occupancy_wrapper .num_adults" ).each(function(key, val) {
|
||||
adults += parseInt($(this).val());
|
||||
});
|
||||
$( "#search_occupancy_wrapper .num_children" ).each(function(key, val) {
|
||||
children += parseInt($(this).val());
|
||||
});
|
||||
var guestButtonVal = parseInt(adults) + ' ';
|
||||
if (parseInt(adults) > 1) {
|
||||
guestButtonVal += adults_txt;
|
||||
} else {
|
||||
guestButtonVal += adult_txt;
|
||||
}
|
||||
if (parseInt(children) > 0) {
|
||||
if (parseInt(children) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt;
|
||||
}
|
||||
}
|
||||
if (parseInt(rooms) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt;
|
||||
}
|
||||
$('#guest_occupancy > span').text(guestButtonVal);
|
||||
}
|
||||
@@ -19,63 +19,10 @@
|
||||
|
||||
{if isset($hotels_info) && count($hotels_info)}
|
||||
<div class="header-rmsearch-wrapper">
|
||||
<div class="filter_header">
|
||||
<div class="filter_header clearfix">
|
||||
<p>{l s='Search Rooms' mod='wkroomsearchblock'}</p>
|
||||
<hr class="header-bottom-hr">
|
||||
</div>
|
||||
<form method="POST" id="search_hotel_block_form">
|
||||
{if isset($location_enabled) && $location_enabled}
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control header-rmsearch-input" id="hotel_location" name="hotel_location" autocomplete="off" placeholder="{l s='Hotel location' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['location']|escape:'htmlall':'UTF-8'}" city_cat_id="{$search_data['parent_data']['id_category']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<div class="dropdown">
|
||||
<ul class="location_search_results_ul dropdown-menu"></ul>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="form-group {if count($hotels_info) <= 1 && !$show_hotel_name} hidden {/if}">
|
||||
{if !$show_hotel_name}
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($hotels_info[0]['max_order_date'])}{$hotels_info[0]['max_order_date']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($hotels_info[0]['preparation_time'])}{$hotels_info[0]['preparation_time']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" value="{$hotels_info[0]['id_category']}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" value="{$hotels_info[0]['id']|escape:'htmlall':'UTF-8'}">
|
||||
<input type="text" id="htl_name" class="form-control header-rmsearch-input" value="{$hotels_info[0]['hotel_name']}" readonly>
|
||||
{else}
|
||||
{if isset($hotels_info) && count($hotels_info)}
|
||||
<div class="dropdown">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" {if isset($search_data)}value="{$search_data['htl_dtl']['id_category']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($preparation_time)}{$preparation_time|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" {if isset($search_data)}value="{$search_data['htl_dtl']['id']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($max_order_date)}{$max_order_date|escape:'htmlall':'UTF-8'}{/if}">
|
||||
|
||||
<button class="form-control header-rmsearch-input {if isset($error) && $error == 1}error_border{/if}" type="button" data-toggle="dropdown" id="id_hotel_button">
|
||||
{if isset($search_data)}
|
||||
<span id="hotel_cat_name" class="pull-left">{$search_data['htl_dtl']['hotel_name']|escape:'htmlall':'UTF-8'}</span>
|
||||
{else}
|
||||
<span id="hotel_cat_name" class="pull-left">{l s='Select Hotel' mod='wkroomsearchblock'}</span>
|
||||
{/if}
|
||||
</button>
|
||||
<ul class="dropdown-menu hotel_dropdown_ul">
|
||||
{if isset($hotels_info) && $hotels_info}
|
||||
{foreach $hotels_info as $name_val}
|
||||
<li tabindex="-1" class="search_result_li" data-id-hotel="{$name_val['id']|escape:'htmlall':'UTF-8'}" data-hotel-cat-id="{$name_val['id_category']|escape:'htmlall':'UTF-8'}" data-max_order_date="{$name_val['max_order_date']}" data-preparation_time="{$name_val['preparation_time']|escape:'htmlall':'UTF-8'}">{$name_val['hotel_name']|escape:'htmlall':'UTF-8'}</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="form-group check_in_field_block">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_in_time" name="check_in_time" autocomplete="off" placeholder="{l s='Check-In' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['date_from']|escape:'htmlall':'UTF-8'}"{/if} readonly>
|
||||
</div>
|
||||
<div class="form-group check_out_field_block">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_out_time" name="check_out_time" autocomplete="off" placeholder="{l s='Check-Out' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['date_to']|escape:'htmlall':'UTF-8'}"{/if} readonly>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn btn-lg btn-primary" name="search_room_submit" id="search_room_submit">
|
||||
<span>{l s='Search Rooms' mod='wkroomsearchblock'}</span> <i class="icon-arrow-right pull-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
{include file="./searchForm.tpl"}
|
||||
</div>
|
||||
{/if}
|
||||
@@ -27,106 +27,8 @@
|
||||
<hr>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row header-rmsearch-inner-wrapper">
|
||||
<form method="POST" id="search_hotel_block_form">
|
||||
{if isset($location_enabled) && $location_enabled}
|
||||
<div class="form-group
|
||||
{if count($hotels_info) <= 1 && !$show_hotel_name}
|
||||
col-sm-3
|
||||
{else}
|
||||
col-sm-6 col-lg-3
|
||||
{/if}">
|
||||
<input type="text" class="form-control header-rmsearch-input" id="hotel_location" name="hotel_location" autocomplete="off" placeholder="{l s='Hotel Location' mod='wkroomsearchblock'}">
|
||||
<div class="dropdown">
|
||||
<ul class="location_search_results_ul"></ul>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="form-group {if count($hotels_info) <= 1 && !$show_hotel_name} hidden {/if}
|
||||
{if isset($location_enabled) && $location_enabled}
|
||||
col-sm-6 col-lg-3
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}">
|
||||
<input type="hidden" name="is_hotel_rooms_search" value="1">
|
||||
{if !$show_hotel_name}
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($hotels_info[0]['max_order_date'])}{$hotels_info[0]['max_order_date']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($hotels_info[0]['preparation_time'])}{$hotels_info[0]['preparation_time']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" value="{$hotels_info[0]['id_category']}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" value="{$hotels_info[0]['id']|escape:'htmlall':'UTF-8'}">
|
||||
<input type="text" id="htl_name" class="form-control header-rmsearch-input" value="{$hotels_info[0]['hotel_name']}" readonly>
|
||||
{else}
|
||||
{if isset($hotels_info) && count($hotels_info)}
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($max_order_date)}{$max_order_date|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($preparation_time)}{$preparation_time|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<div class="dropdown">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel">
|
||||
<button class="form-control header-rmsearch-input {if isset($error) && $error == 1}error_border{/if}" type="button" data-toggle="dropdown" id="id_hotel_button">
|
||||
<span id="hotel_cat_name" class="pull-left">{l s='Select Hotel' mod='wkroomsearchblock'}</span>
|
||||
</button>
|
||||
<ul class="dropdown-menu hotel_dropdown_ul">
|
||||
{if isset($hotels_info) && $hotels_info}
|
||||
{foreach $hotels_info as $name_val}
|
||||
<li class="search_result_li" data-id-hotel="{$name_val['id']|escape:'htmlall':'UTF-8'}" data-hotel-cat-id="{$name_val['id_category']|escape:'htmlall':'UTF-8'}" data-max_order_date="{$name_val['max_order_date']|escape:'htmlall':'UTF-8'}" data-preparation_time="{$name_val['preparation_time']|escape:'htmlall':'UTF-8'}">{$name_val['hotel_name']|escape:'htmlall':'UTF-8'}</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="form-group
|
||||
{if count($hotels_info) <= 1}
|
||||
{if isset($location_enabled) && $location_enabled && $show_hotel_name}
|
||||
col-sm-4 col-lg-2
|
||||
{elseif isset($location_enabled) && !$location_enabled && !$show_hotel_name}
|
||||
col-sm-4
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}
|
||||
{elseif isset($location_enabled) && $location_enabled}
|
||||
col-sm-4 col-lg-2
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_in_time" name="check_in_time" autocomplete="off" placeholder="{l s='Check In Date' mod='wkroomsearchblock'}" readonly>
|
||||
</div>
|
||||
<div class="form-group
|
||||
{if count($hotels_info) <= 1}
|
||||
{if isset($location_enabled) && $location_enabled && $show_hotel_name}
|
||||
col-sm-4 col-lg-2
|
||||
{elseif isset($location_enabled) && !$location_enabled && !$show_hotel_name}
|
||||
col-sm-4
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}
|
||||
{elseif isset($location_enabled) && $location_enabled}
|
||||
col-sm-4 col-lg-2
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_out_time" name="check_out_time" autocomplete="off" placeholder="{l s='Check Out Date' mod='wkroomsearchblock'}" readonly>
|
||||
</div>
|
||||
<div class="form-group
|
||||
{if count($hotels_info) <= 1}
|
||||
{if isset($location_enabled) && $location_enabled && $show_hotel_name}
|
||||
col-sm-4 col-lg-2
|
||||
{elseif isset($location_enabled) && !$location_enabled && !$show_hotel_name}
|
||||
col-sm-4
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}
|
||||
{elseif isset($location_enabled) && $location_enabled}
|
||||
col-sm-4 col-lg-2
|
||||
{else}
|
||||
col-sm-3
|
||||
{/if}">
|
||||
<button type="submit" class="btn btn-default button button-medium exclusive" name="search_room_submit" id="search_room_submit">
|
||||
<span>{l s='Search Now' mod='wkroomsearchblock'}</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="header-rmsearch-inner-wrapper">
|
||||
{include file="./searchForm.tpl"}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -46,71 +46,11 @@
|
||||
{* search form wrapper block*}
|
||||
<div class="header-rmsearch-wrapper">
|
||||
<div class="container">
|
||||
<div class="filter_header row">
|
||||
<div class="col-sm-12">
|
||||
<p>{l s='Searched results for' mod='wkroomsearchblock'}</p>
|
||||
</div>
|
||||
<div class="filter_header">
|
||||
<p>{l s='Searched results for' mod='wkroomsearchblock'}</p>
|
||||
</div>
|
||||
{* search form *}
|
||||
<form method="POST" id="search_hotel_block_form">
|
||||
<div class="row">
|
||||
{if isset($location_enabled) && $location_enabled}
|
||||
<div class="form-group col-md-5 col-sm-6 wk-padding-5">
|
||||
<input type="text" class="form-control header-rmsearch-input" id="hotel_location" name="hotel_location" autocomplete="off" placeholder="{l s='Hotel location' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['location']|escape:'htmlall':'UTF-8'}" city_cat_id="{$search_data['parent_data']['id_category']}"{/if}>
|
||||
<div class="dropdown">
|
||||
<ul class="location_search_results_ul dropdown-menu"></ul>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="form-group wk-padding-5 {if isset($location_enabled) && $location_enabled}col-md-5{/if} col-sm-6 {if count($hotels_info) <= 1 && !$show_hotel_name} hidden {/if}">
|
||||
{if !$show_hotel_name}
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($hotels_info[0]['max_order_date'])}{$hotels_info[0]['max_order_date']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($hotels_info[0]['preparation_time'])}{$hotels_info[0]['preparation_time']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" value="{$hotels_info[0]['id_category']}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" value="{$hotels_info[0]['id']|escape:'htmlall':'UTF-8'}">
|
||||
<input type="text" id="htl_name" class="form-control header-rmsearch-input" value="{$hotels_info[0]['hotel_name']}" readonly>
|
||||
{else}
|
||||
{if isset($hotels_info) && count($hotels_info)}
|
||||
<div class="dropdown">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" {if isset($search_data)}value="{$search_data['htl_dtl']['id_category']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($preparation_time)}{$preparation_time|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" {if isset($search_data)}value="{$search_data['htl_dtl']['id']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($max_order_date)}{$max_order_date|escape:'htmlall':'UTF-8'}{/if}">
|
||||
|
||||
<button class="form-control header-rmsearch-input {if isset($error) && $error == 1}error_border{/if}" type="button" data-toggle="dropdown" id="id_hotel_button">
|
||||
{if isset($search_data)}
|
||||
<span id="hotel_cat_name" class="pull-left">{$search_data['htl_dtl']['hotel_name']|escape:'htmlall':'UTF-8'}</span>
|
||||
{else}
|
||||
<span id="hotel_cat_name" class="pull-left">{l s='Select Hotel' mod='wkroomsearchblock'}</span>
|
||||
{/if}
|
||||
</button>
|
||||
<ul class="dropdown-menu hotel_dropdown_ul">
|
||||
{if isset($hotels_info) && $hotels_info}
|
||||
{foreach $hotels_info as $name_val}
|
||||
<li tabindex="-1" class="search_result_li" data-id-hotel="{$name_val['id']|escape:'htmlall':'UTF-8'}" data-hotel-cat-id="{$name_val['id_category']|escape:'htmlall':'UTF-8'}" data-max_order_date="{$name_val['max_order_date']}" data-preparation_time="{$name_val['preparation_time']|escape:'htmlall':'UTF-8'}">{$name_val['hotel_name']|escape:'htmlall':'UTF-8'}</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-4 wk-padding-5 check_in_field_block">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_in_time" name="check_in_time" autocomplete="off" placeholder="{l s='Check-In' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['date_from']|escape:'htmlall':'UTF-8'}"{/if} readonly>
|
||||
</div>
|
||||
<div class="form-group col-sm-4 check_out_field_block wk-padding-5">
|
||||
<input type="text" class="form-control header-rmsearch-input input-date" id="check_out_time" name="check_out_time" autocomplete="off" placeholder="{l s='Check-Out' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['date_to']|escape:'htmlall':'UTF-8'}"{/if} readonly>
|
||||
</div>
|
||||
<div class="form-group col-sm-4 wk-padding-5 search_room_submit_block">
|
||||
<button type="submit" class="btn btn btn-lg btn-primary pull-right" name="search_room_submit" id="search_room_submit">
|
||||
<span>{l s='Search Rooms' mod='wkroomsearchblock'}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{include file="./searchForm.tpl"}
|
||||
<a href="#" class="close_room_serach_wrapper"><img src="{$module_dir}views/img/icon-close.svg"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
202
modules/wkroomsearchblock/views/templates/hook/searchForm.tpl
Normal file
202
modules/wkroomsearchblock/views/templates/hook/searchForm.tpl
Normal file
@@ -0,0 +1,202 @@
|
||||
<form method="POST" id="search_hotel_block_form" class="grid">
|
||||
{if isset($location_enabled) && $location_enabled}
|
||||
<div class="form-group area-{$column_widths['location']}">
|
||||
<input type="text" class="form-control header-rmsearch-input input-location" id="hotel_location" name="hotel_location" autocomplete="off" placeholder="{l s='Hotel location' mod='wkroomsearchblock'}" {if isset($search_data)}value="{$search_data['location']|escape:'htmlall':'UTF-8'}" city_cat_id="{$search_data['parent_data']['id_category']}"{/if}>
|
||||
<div class="dropdown">
|
||||
<ul class="location_search_results_ul dropdown-menu"></ul>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{if count($hotels_info) <= 1 && !$show_hotel_name}
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($hotels_info[0]['max_order_date'])}{$hotels_info[0]['max_order_date']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($hotels_info[0]['preparation_time'])}{$hotels_info[0]['preparation_time']|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" value="{$hotels_info[0]['id_category']}">
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" value="{$hotels_info[0]['id']|escape:'htmlall':'UTF-8'}">
|
||||
<input type="hidden" id="htl_name" class="form-control header-rmsearch-input" value="{$hotels_info[0]['hotel_name']}" readonly>
|
||||
{else}
|
||||
<div class="form-group area-{$column_widths['hotel']}">
|
||||
{if isset($hotels_info) && count($hotels_info)}
|
||||
<div class="dropdown">
|
||||
<input type="hidden" id="hotel_cat_id" name="hotel_cat_id" {if isset($search_data)}value="{$search_data['htl_dtl']['id_category']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="id_hotel" name="id_hotel" {if isset($search_data)}value="{$search_data['htl_dtl']['id']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="max_order_date" name="max_order_date" value="{if isset($max_order_date)}{$max_order_date|escape:'htmlall':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="preparation_time" name="preparation_time" value="{if isset($preparation_time)}{$preparation_time|escape:'htmlall':'UTF-8'}{/if}">
|
||||
|
||||
<button class="form-control header-rmsearch-input input-hotel {if isset($error) && $error == 1}error_border{/if}" type="button" data-toggle="dropdown" id="id_hotel_button">
|
||||
{if isset($search_data)}
|
||||
<span id="hotel_cat_name" class="pull-left">{$search_data['htl_dtl']['hotel_name']|escape:'htmlall':'UTF-8'}</span>
|
||||
{else}
|
||||
<span id="hotel_cat_name" class="pull-left">{l s='Select Hotel' mod='wkroomsearchblock'}</span>
|
||||
{/if}
|
||||
</button>
|
||||
<ul class="dropdown-menu hotel_dropdown_ul">
|
||||
{if isset($hotels_info) && $hotels_info}
|
||||
{foreach $hotels_info as $name_val}
|
||||
<li tabindex="-1" class="search_result_li" data-id-hotel="{$name_val['id']|escape:'htmlall':'UTF-8'}" data-hotel-cat-id="{$name_val['id_category']|escape:'htmlall':'UTF-8'}" data-max_order_date="{$name_val['max_order_date']}" data-preparation_time="{$name_val['preparation_time']|escape:'htmlall':'UTF-8'}">{$name_val['hotel_name']|escape:'htmlall':'UTF-8'}</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{if isset($multiple_dates_input) && $multiple_dates_input}
|
||||
<div class="grid area-{$column_widths['date']}" id="daterange_value">
|
||||
<div class="form-group">
|
||||
<input type="hidden" id="check_in_time" name="check_in_time" {if isset($search_data)}value="{$search_data['date_from']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<div class="form-control header-rmsearch-input input-date" autocomplete="off" id="daterange_value_from" placeholder="{l s='Check-in' mod='wkroomsearchblock'}"><span>{l s='Check-in' mod='wkroomsearchblock'}</span></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="hidden" id="check_out_time" name="check_out_time" {if isset($search_data)}value="{$search_data['date_to']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<div class="form-control header-rmsearch-input input-date" autocomplete="off" id="daterange_value_to" placeholder="{l s='Check-out' mod='wkroomsearchblock'}"><span>{l s='Check-out' mod='wkroomsearchblock'}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<div class="form-group area-{$column_widths['date']}">
|
||||
<input type="hidden" id="check_in_time" name="check_in_time" {if isset($search_data)}value="{$search_data['date_from']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<input type="hidden" id="check_out_time" name="check_out_time" {if isset($search_data)}value="{$search_data['date_to']|escape:'htmlall':'UTF-8'}"{/if}>
|
||||
<div class="form-control header-rmsearch-input input-date" id="daterange_value" autocomplete="off" placeholder="{l s='Check-in - Check-out' mod='wkroomsearchblock'}"><span>{l s='Check-in' mod='wkroomsearchblock'} <i class="icon icon-minus"></i> {l s='Check-out' mod='wkroomsearchblock'}</span></div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if isset($is_occupancy_wise_search) && $is_occupancy_wise_search}
|
||||
<div class="form-group area-{$column_widths['occupancy']}">
|
||||
<div class="dropdown">
|
||||
<button class="form-control input-occupancy header-rmsearch-input {if isset($error) && $error == 1}error_border{/if}" type="button" data-toggle="dropdown" id="guest_occupancy">
|
||||
<span class="pull-left">{if (isset($search_data['occupancy_adults']) && $search_data['occupancy_adults'])}{$search_data['occupancy_adults']} {if $search_data['occupancy_adults'] > 1}{l s='Adults' mod='wkroomsearchblock'}{else}{l s='Adult' mod='wkroomsearchblock'}{/if}, {if isset($search_data['occupancy_children']) && $search_data['occupancy_children']}{$search_data['occupancy_children']} {if $search_data['occupancy_children'] > 1}
|
||||
{l s='Children' mod='wkroomsearchblock'}{else}{l s='Child' mod='wkroomsearchblock'}{/if}, {/if}{$search_data['occupancies']|count} {if $search_data['occupancies']|count > 1}{l s='Rooms' mod='wkroomsearchblock'}{else}{l s='Room'}{/if}{else}{l s='1 Adult, 1 Room' mod='wkroomsearchblock'}{/if}</span>
|
||||
</button>
|
||||
<div id="search_occupancy_wrapper" class="dropdown-menu">
|
||||
<div id="occupancy_inner_wrapper">
|
||||
{if isset($search_data['occupancies']) && $search_data['occupancies']}
|
||||
{assign var=countRoom value=1}
|
||||
{foreach from=$search_data['occupancies'] key=key item=$occupancy name=occupancyInfo}
|
||||
<div class="occupancy-room-block">
|
||||
<div class="occupancy_info_head"><span class="room_num_wrapper">{l s='Room' mod='wkroomsearchblock'} - {$countRoom|escape:'htmlall':'UTF-8'} </span>{if !$smarty.foreach.occupancyInfo.first}<a class="remove-room-link pull-right" href="#">{l s='Remove' mod='wkroomsearchblock'}</a>{/if}</div>
|
||||
<div class="occupancy_info_block" occ_block_index="{$key|escape:'htmlall':'UTF-8'}">
|
||||
<div class="form-group occupancy_count_block">
|
||||
<label>{l s='Adults' mod='wkroomsearchblock'}</label>
|
||||
<div>
|
||||
<input type="hidden" class="num_occupancy num_adults room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][adults]" value="{$occupancy['adults']|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>{$occupancy['adults']|escape:'htmlall':'UTF-8'}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span><i class="icon-minus"></i></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group occupancy_count_block">
|
||||
<label>{l s='Child' mod='wkroomsearchblock'}<span class="label-desc-txt"> ({l s='Below' mod='wkroomsearchblock'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years' mod='wkroomsearchblock'})</span></label>
|
||||
<div>
|
||||
<input type="hidden" class="num_occupancy num_children room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][children]" value="{$occupancy['children']|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>{$occupancy['children']|escape:'htmlall':'UTF-8'}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span><i class="icon-minus"></i></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group children_age_info_block" {if isset($occupancy['child_ages']) && $occupancy['child_ages']}style="display:block;"{/if}>
|
||||
<label>{l s='All Children' mod='wkroomsearchblock'}</label>
|
||||
<div class="children_ages">
|
||||
{if isset($occupancy['child_ages']) && $occupancy['child_ages']}
|
||||
{foreach $occupancy['child_ages'] as $childAge}
|
||||
<div>
|
||||
<select class="guest_child_age room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][child_ages][]">
|
||||
<option value="-1" {if $childAge == -1}selected{/if}>{l s='Select 1' mod='wkroomsearchblock'}</option>
|
||||
<option value="0" {if $childAge == 0}selected{/if}>{l s='Under 1' mod='wkroomsearchblock'}</option>
|
||||
{for $age=1 to ($max_child_age-1)}
|
||||
<option value="{$age|escape:'htmlall':'UTF-8'}" {if $childAge == $age}selected{/if}>{$age|escape:'htmlall':'UTF-8'}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator">
|
||||
</div>
|
||||
{assign var=countRoom value=$countRoom+1}
|
||||
{/foreach}
|
||||
{else}
|
||||
<div class="occupancy-room-block">
|
||||
<div class="occupancy_info_head"><span class="room_num_wrapper">{l s='Room - 1' mod='wkroomsearchblock'}</span></div>
|
||||
<div class="occupancy_info_block" occ_block_index="0">
|
||||
<div class="form-group occupancy_count_block">
|
||||
<label>{l s='Adults' mod='wkroomsearchblock'}</label>
|
||||
<div>
|
||||
<input type="hidden" class="num_occupancy num_adults room_occupancies" name="occupancy[0][adults]" value="1">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>1</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group occupancy_count_block">
|
||||
<label>{l s='Child' mod='wkroomsearchblock'} <span class="label-desc-txt">({l s='Below' mod='wkroomsearchblock'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years' mod='wkroomsearchblock'})</span></label>
|
||||
<div>
|
||||
<input type="hidden" class="num_occupancy num_children room_occupancies" name="occupancy[0][children]" value="0">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>0</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group children_age_info_block">
|
||||
<label>{l s='All Children' mod='wkroomsearchblock'}</label>
|
||||
<div class="children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator">
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div id="add_new_occupancy">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room' mod='wkroomsearchblock'}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="form-group search_room_submit_block area-{$column_widths['search']}">
|
||||
<button type="submit" class="btn btn btn-lg btn-primary pull-right" name="search_room_submit" id="search_room_submit">
|
||||
<span>{l s='Search Rooms' mod='wkroomsearchblock'}</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -51,9 +51,9 @@ class WkRoomSearchBlock extends Module
|
||||
|| 'index' == $controller
|
||||
|| 'product' == $controller
|
||||
) {
|
||||
|
||||
$this->context->controller->addCSS($this->_path.'/views/css/wk-global-search.css');
|
||||
$this->context->controller->addJS($this->_path.'/views/js/wk-room-search-block.js');
|
||||
$this->context->controller->addCSS(_THEME_CSS_DIR_.'datepicker.css');
|
||||
|
||||
Media::addJsDef(
|
||||
array (
|
||||
@@ -68,6 +68,19 @@ class WkRoomSearchBlock extends Module
|
||||
'less_checkin_date' => $this->l('Check In date can not be before current date.'),
|
||||
'more_checkout_date' => $this->l('Check Out date must be greater than Check In date.'),
|
||||
'select_htl_txt' => $this->l('Select Hotel'),
|
||||
'select_age_txt' => $this->l('Select age'),
|
||||
'under_1_age' => $this->l('Under 1'),
|
||||
'room_txt' => $this->l('Room'),
|
||||
'rooms_txt' => $this->l('Rooms'),
|
||||
'remove_txt' => $this->l('Remove'),
|
||||
'adult_txt' => $this->l('Adult'),
|
||||
'adults_txt' => $this->l('Adults'),
|
||||
'child_txt' => $this->l('Child'),
|
||||
'children_txt' => $this->l('Children'),
|
||||
'below_txt' => $this->l('Below'),
|
||||
'years_txt' => $this->l('years'),
|
||||
'all_children_txt' => $this->l('All Children'),
|
||||
'invalid_occupancy_txt' => $this->l('Invalid occupancy(adults/children) found.'),
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -126,18 +139,36 @@ class WkRoomSearchBlock extends Module
|
||||
|
||||
public function roomSearchProcess()
|
||||
{
|
||||
$urlData = array();
|
||||
$hotelCategoryId = Tools::getValue('hotel_cat_id');
|
||||
$checkIn = Tools::getValue('check_in_time');
|
||||
$checkOut = Tools::getValue('check_out_time');
|
||||
|
||||
// change dates format to acceptable format
|
||||
$checkIn = date('Y-m-d', strtotime($checkIn));
|
||||
$checkOut = date('Y-m-d', strtotime($checkOut));
|
||||
if ($checkIn = Tools::getValue('check_in_time')) {
|
||||
if (!Validate::isDateFormat($checkIn)) {
|
||||
$checkIn = date('Y-m-d');
|
||||
} else {
|
||||
$checkIn = date('Y-m-d', strtotime($checkIn));
|
||||
}
|
||||
$urlData['date_from'] = $checkIn;
|
||||
}
|
||||
|
||||
if ($checkOut = Tools::getValue('check_out_time')) {
|
||||
if (!Validate::isDateFormat($checkOut)) {
|
||||
$checkOut = date('Y-m-d', strtotime('+1 day', strtotime($checkIn)));
|
||||
} else {
|
||||
$checkOut = date('Y-m-d', strtotime($checkOut));
|
||||
}
|
||||
$urlData['date_to'] = $checkOut;
|
||||
}
|
||||
|
||||
$currentDate = date('Y-m-d');
|
||||
$maxOrderDate = Tools::getValue('max_order_date');
|
||||
$maxOrderDate = date('Y-m-d', strtotime($maxOrderDate));
|
||||
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if ($occupancy = Tools::getValue('occupancy')) {
|
||||
$urlData['occupancy'] = $occupancy;
|
||||
}
|
||||
}
|
||||
|
||||
$objSearchHelper = new WkRoomSearchHelper();
|
||||
$this->context->controller->errors = array_merge(
|
||||
$this->context->controller->errors,
|
||||
@@ -145,10 +176,6 @@ class WkRoomSearchBlock extends Module
|
||||
);
|
||||
// id there is no validation error the proceed to redirect on search result page
|
||||
if (!count($this->context->controller->errors)) {
|
||||
$urlData = array (
|
||||
'date_from' => $checkIn,
|
||||
'date_to' => $checkOut,
|
||||
);
|
||||
if (Configuration::get('PS_REWRITING_SETTINGS')) {
|
||||
$redirectLink = $this->context->link->getCategoryLink(
|
||||
new Category($hotelCategoryId, $this->context->language->id),
|
||||
|
||||
@@ -30,14 +30,13 @@
|
||||
{/if}
|
||||
<th class="product header small">{l s='Room Description' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Hotel' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Room Capcity' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Tax Rate(s)' pdf='true'}</th>
|
||||
{* {if isset($layout.before_discount)}
|
||||
<th class="product header small">{l s='Base price' pdf='true'} <br /> {l s='(Tax excl.)' pdf='true'}</th>
|
||||
{/if} *}
|
||||
|
||||
<th class="product header small" width="{$layout.unit_price_tax_excl.width}%">{l s='Unit Price' pdf='true'} <br /> {l s='(Tax excl.)' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Rooms Qty' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Rooms' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Check-in Date' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Check-out Date' pdf='true'}</th>
|
||||
<th class="product header small">{l s='Total' pdf='true'} <br /> {l s='(Tax excl.)' pdf='true'}</th>
|
||||
@@ -64,11 +63,11 @@
|
||||
{$data_v['hotel_name']}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
{* <td>
|
||||
<p class="text-left">
|
||||
{$data_v['adult']} {l s='Adults'}, {$data_v['children']} {l s='Children'}
|
||||
{$data_v['adults']} {l s='Adults'}, {$data_v['children']} {l s='Children'}
|
||||
</p>
|
||||
</td>
|
||||
</td> *}
|
||||
<td class="product center">
|
||||
{$data_v['order_detail_tax_label']}
|
||||
</td>
|
||||
@@ -79,7 +78,7 @@
|
||||
</td>
|
||||
<td class="product center">
|
||||
<p class="text-left">
|
||||
{$rm_v['num_rm']}
|
||||
{if $rm_v['adults'] <= 9}0{$rm_v['adults']}{else}{$rm_v['adults']}{/if} {if $rm_v['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v['children']}, {if $rm_v['children'] <= 9}0{$rm_v['children']}{else} {$rm_v['children']}{/if} {if $rm_v['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}<br>{if $rm_v['num_rm'] <= 9}0{/if}{$rm_v['num_rm']} {if $rm_v['num_rm'] > 1}{l s='Rooms'}{else}{l s='Room'}{/if}
|
||||
</p>
|
||||
</td>
|
||||
<td class="product center">
|
||||
|
||||
@@ -19,52 +19,34 @@
|
||||
|
||||
<div class="booking-form card">
|
||||
<div class="booking_room_fields">
|
||||
<form action="" method="post">
|
||||
<form id="booking-form" action="" method="post">
|
||||
<div class="form-group htl_location_block">
|
||||
<label for="" class="control-label">{l s='Hotel Location'}</label>
|
||||
<p>{$hotel_location|escape:'html':'UTF-8'}</p>
|
||||
</div>
|
||||
{if $product->show_price && !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-6">
|
||||
<label for="" class="control-label">{l s='Check-in Date'}</label>
|
||||
<input type="text" class="form-control input-date" name="room_check_in" id="room_check_in" value="{if isset($date_from)}{$date_from|date_format:"%d-%m-%Y"}{/if}" autocomplete="off" readonly />
|
||||
</div>
|
||||
<div class="form-group col-sm-6">
|
||||
<label for="" class="control-label">{l s='Check-out Date'}</label>
|
||||
<input type="text" class="form-control input-date" name="room_check_out" id="room_check_out" value="{if isset($date_to)}{$date_to|escape:'html':'UTF-8'|date_format:"%d-%m-%Y"}{/if}" autocomplete="off" readonly />
|
||||
<div class="form-group col-sm-12">
|
||||
<div class="form-control input-date" id="room_date_range" autocomplete="off" placeholder="{l s='Check-in - Check-out'}"><span>{l s='Check-in'} <i class="icon icon-minus"></i> {l s='Check-out'}</span></div>
|
||||
<input type="hidden" class="input-date" name="room_check_in" id="room_check_in" value="{if isset($date_from)}{$date_from}{/if}" />
|
||||
<input type="hidden" class="input-date" name="room_check_out" id="room_check_out" value="{if isset($date_to)}{$date_to}{/if}" />
|
||||
</div>
|
||||
</div>
|
||||
{if $total_available_rooms > 0}
|
||||
<div class="unvail_rooms_cond_display row">
|
||||
<div class="form-group col-sm-6" id="quantity_wanted_p"{if (!$allow_oosp && $product->quantity <= 0) || !$product->available_for_order || $PS_CATALOG_MODE} style="display: none;"{/if}>
|
||||
<label for="quantity_wanted">{l s='No. of Rooms'}</label>
|
||||
<div class="qty_sec_cont">
|
||||
<div class="qty_input_cont row margin-lr-0">
|
||||
<input autocomplete="off" type="text" min="1" name="qty" id="quantity_wanted" class="text" value="{$quantity|intval}">
|
||||
|
||||
<input type="hidden" id="num_days" value="{if isset($num_days)}{$num_days|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" id="max_avail_type_qty" value="{if isset($total_available_rooms)}{$total_available_rooms|escape:'html':'UTF-8'}{/if}">
|
||||
</div>
|
||||
<div class="qty_direction">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default product_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default product_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<span class="clearfix"></span>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12"{if !$product->available_for_order || $PS_CATALOG_MODE} style="display: none;"{/if}>
|
||||
{if isset($occupancy_required_for_booking) && $occupancy_required_for_booking}
|
||||
<label class="control-label">{l s='Guests'}</label>
|
||||
{include file="./occupancy_field.tpl"}
|
||||
{else}
|
||||
<label class="control-label">{l s='No. of Rooms'}</label>
|
||||
{include file="./quantity_field.tpl"}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{if isset($has_room_type_demands) && $has_room_type_demands}
|
||||
<hr class="separator-hr-mg-10 unvail_rooms_cond_display">
|
||||
<div class="row price_desc_block unvail_rooms_cond_display">
|
||||
<hr class="separator-hr-mg-10">
|
||||
<div class="row price_desc_block">
|
||||
<div class="col-sm-6">
|
||||
<label class="control-label">{l s='Room Price'}</label>
|
||||
<p>
|
||||
@@ -79,32 +61,36 @@
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="separator-hr-mg-10 form-group unvail_rooms_cond_display">
|
||||
<hr class="separator-hr-mg-10 form-group">
|
||||
{/if}
|
||||
<div class="row unvail_rooms_cond_display">
|
||||
<div class="total_price_block col-xs-7 form-group">
|
||||
<label class="control-label">{l s='Subtotal'}</label>
|
||||
<p>{convertPrice price=$total_price|floatval}</p>
|
||||
</div>
|
||||
{if $total_available_rooms <= $warning_count}
|
||||
<div class="col-xs-5 form-group pull-right num_quantity_alert">
|
||||
<span>{$total_available_rooms|escape:'html':'UTF-8'}</span>
|
||||
{if $total_available_rooms > 1} {l s='rooms left!'} {else} {l s='room left!'} {/if}
|
||||
<div id="booking_action_block">
|
||||
<div class="row">
|
||||
<div class="total_price_block col-xs-7 form-group">
|
||||
<label class="control-label">{l s='Subtotal'}</label>
|
||||
<p>{convertPrice price=$total_price|floatval}</p>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="unvail_rooms_cond_display">
|
||||
{if (!$allow_oosp && $product->quantity <= 0) || !$product->available_for_order || (isset($restricted_country_mode) && $restricted_country_mode) || $PS_CATALOG_MODE || $order_date_restrict}
|
||||
{else}
|
||||
<p id="add_to_cart" class="buttons_bottom_block no-print">
|
||||
<button type="submit" name="Submit" class="exclusive book_now_submit">
|
||||
<span>
|
||||
{if isset($content_only) && $content_only && (isset($product->customization_required) && $product->customization_required)}{l s='Customize'}{else}{l s='Book Now'}{/if}
|
||||
{if $total_available_rooms <= $warning_count}
|
||||
<div class="col-xs-5 form-group text-right num_quantity_alert">
|
||||
<span class="num_searched_avail_rooms">
|
||||
{$total_available_rooms|escape:'html':'UTF-8'}
|
||||
</span>
|
||||
</button>
|
||||
</p>
|
||||
{/if}
|
||||
{if $total_available_rooms > 1} {l s='rooms left!'} {else} {l s='room left!'} {/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div>
|
||||
{if (!$allow_oosp && $product->quantity <= 0) || !$product->available_for_order || (isset($restricted_country_mode) && $restricted_country_mode) || $PS_CATALOG_MODE || $order_date_restrict}
|
||||
{else}
|
||||
<p id="add_to_cart" class="buttons_bottom_block no-print">
|
||||
<button type="submit" name="Submit" class="exclusive book_now_submit">
|
||||
<span>
|
||||
{if isset($content_only) && $content_only && (isset($product->customization_required) && $product->customization_required)}{l s='Customize'}{else}{l s='Book Now'}{/if}
|
||||
</span>
|
||||
<span id="booking_action_loader"></span>
|
||||
</button>
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<div class="sold_out_alert">
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
<div class="row accordion-section">
|
||||
<div class="col-sm-12 demand_header">
|
||||
<a class="accordion-section-title {if $roomCount == 1}active{/if}" href="#accordion_{$key|escape:'html':'UTF-8'}">
|
||||
{l s='Room'} {$roomCount|escape:'html':'UTF-8'}
|
||||
{l s='Room'} {$roomCount|escape:'html':'UTF-8'}
|
||||
<span>({if {$roomDemand['adults']} <= 9}0{$roomDemand['adults']}{else}{$roomDemand['adults']}{/if} {if $roomDemand['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}, {if {$roomDemand['children']} <= 9}0{$roomDemand['children']}{else}{$roomDemand['children']}{/if} {if $roomDemand['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if})</span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="accordion_{$key|escape:'html':'UTF-8'}" class="accordion-section-content {if $roomCount == 1}open{/if}" {if $roomCount == 1}style="display: block;"{/if}>
|
||||
|
||||
174
themes/hotel-reservation-theme/_partials/occupancy_field.tpl
Normal file
174
themes/hotel-reservation-theme/_partials/occupancy_field.tpl
Normal file
@@ -0,0 +1,174 @@
|
||||
{**
|
||||
* 2010-2023 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through LICENSE.txt file inside our module
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to CustomizationPolicy.txt file inside our module for more information.
|
||||
*
|
||||
* @author Webkul IN
|
||||
* @copyright 2010-2023 Webkul IN
|
||||
* @license LICENSE.txt
|
||||
*}
|
||||
|
||||
<div class="form-group dropdown">
|
||||
<button class="form-control booking_guest_occupancy input-occupancy{if isset($error) && $error == 1} error_border{/if}" type="button">
|
||||
<span class="">
|
||||
{if isset($occupancies) && $occupancies}
|
||||
{if (isset($occupancy_adults) && $occupancy_adults)}{$occupancy_adults} {if $occupancy_adults > 1}{l s='Adults'}{else}{l s='Adult'}{/if}, {if isset($occupancy_children) && $occupancy_children}{$occupancy_children} {if $occupancy_children > 1} {l s='Children'}{else}{l s='Child'}{/if}, {/if}{$occupancies|count} {if $occupancies|count > 1}{l s='Rooms'}{else}{l s='Room'}{/if}{else}{l s='1 Adult, 1 Room'}{/if}
|
||||
{else}
|
||||
{l s='Select Occupancy'}
|
||||
{/if}
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<div class="dropdown-menu booking_occupancy_wrapper">
|
||||
<input type="hidden" class="max_avail_type_qty" value="{if isset($total_available_rooms)}{$total_available_rooms|escape:'html':'UTF-8'}{/if}">
|
||||
<input type="hidden" class="max_adults" value="{$room_type_info['max_adults']|escape:'html':'UTF-8'}">
|
||||
<input type="hidden" class="max_children" value="{$room_type_info['max_children']|escape:'html':'UTF-8'}">
|
||||
<input type="hidden" class="max_guests" value="{$room_type_info['max_guests']|escape:'html':'UTF-8'}">
|
||||
<input type="hidden" class="base_adult" value="{$room_type_info['adults']|escape:'html':'UTF-8'}">
|
||||
<input type="hidden" class="base_children" value="{$room_type_info['children']|escape:'html':'UTF-8'}">
|
||||
<div class="booking_occupancy_inner">
|
||||
{if isset($occupancies) && $occupancies}
|
||||
{assign var=countRoom value=1}
|
||||
{foreach from=$occupancies key=key item=$occupancy name=occupancyInfo}
|
||||
<div class="occupancy_info_block selected" occ_block_index="{$key|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_info_head"><span class="room_num_wrapper">{l s='Room'} - {$countRoom|escape:'htmlall':'UTF-8'} </span>{if !$smarty.foreach.occupancyInfo.first}<a class="remove-room-link pull-right" href="#">{l s='Remove'}</a>{/if}</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-5 col-xs-6 occupancy_count_block">
|
||||
<div class="row">
|
||||
<label class="col-sm-12">{l s='Adults'}</label>
|
||||
<div class="col-sm-12">
|
||||
<input type="hidden" class="num_occupancy num_adults room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][adults]" value="{$occupancy['adults']|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>{$occupancy['adults']|escape:'htmlall':'UTF-8'}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span><i class="icon-minus"></i></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-sm-7 col-xs-6 occupancy_count_block">
|
||||
<div class="row">
|
||||
<label class="col-sm-12">{l s='Child'}<span class="label-desc-txt"> ({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})</span></label>
|
||||
<div class="col-sm-12">
|
||||
<input type="hidden" class="num_occupancy num_children room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][children]" max="{}" value="{$occupancy['children']|escape:'htmlall':'UTF-8'}">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>{$occupancy['children']|escape:'htmlall':'UTF-8'}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span><i class="icon-minus"></i></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row children_age_info_block" {if isset($occupancy['child_ages']) && $occupancy['child_ages']}style="display:block;"{/if}>
|
||||
<label class="col-sm-12">{l s='All Children'}</label>
|
||||
<div class="col-sm-12">
|
||||
<div class="row children_ages">
|
||||
{if isset($occupancy['child_ages']) && $occupancy['child_ages']}
|
||||
{foreach $occupancy['child_ages'] as $childAge}
|
||||
<div class="col-xs-4 col-sm-12 col-md-6 col-lg-4">
|
||||
<select class="guest_child_age room_occupancies" name="occupancy[{$key|escape:'htmlall':'UTF-8'}][child_ages][]">
|
||||
<option value="-1" {if $childAge == -1}selected{/if}>{l s='Select 1'}</option>
|
||||
<option value="0" {if $childAge == 0}selected{/if}>{l s='Under 1'}</option>
|
||||
{for $age=1 to ($max_child_age-1)}
|
||||
<option value="{$age|escape:'htmlall':'UTF-8'}" {if $childAge == $age}selected{/if}>{$age|escape:'htmlall':'UTF-8'}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator">
|
||||
</div>
|
||||
{assign var=countRoom value=$countRoom+1}
|
||||
{/foreach}
|
||||
{else}
|
||||
<div class="occupancy_info_block" occ_block_index="0">
|
||||
<div class="occupancy_info_head"><span class="room_num_wrapper">{l s='Room - 1'}</span></div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-5 col-xs-6 occupancy_count_block">
|
||||
<div class="row">
|
||||
<label class="col-sm-12">{l s='Adults'}</label>
|
||||
<div class="col-sm-12">
|
||||
<input type="hidden" class="num_occupancy num_adults" name="num_adults[]" value="{$room_type_info['adults']}">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>{$room_type_info['adults']}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-sm-7 col-xs-6 occupancy_count_block">
|
||||
<div class="row">
|
||||
<label class="col-sm-12">{l s='Child'} <span class="label-desc-txt">({l s='Below'} {$max_child_age|escape:'htmlall':'UTF-8'} {l s='years'})</span></label>
|
||||
<div class="col-sm-12">
|
||||
<input type="hidden" class="num_occupancy num_children" name="num_children[]" value="0">
|
||||
<div class="occupancy_count pull-left">
|
||||
<span>0</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row children_age_info_block">
|
||||
<label class="col-sm-12">{l s='All Children'}</label>
|
||||
<div class="col-sm-12">
|
||||
<div class="row children_ages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="occupancy-info-separator">
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="add_occupancy_block">
|
||||
<a class="add_new_occupancy_btn" href="#"><i class="icon-plus"></i> <span>{l s='Add Room'}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -4,7 +4,8 @@
|
||||
<div class="card">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 demand_header">
|
||||
{l s='Room'} {$roomCount|escape:'html':'UTF-8'}
|
||||
{l s='Room'} {$roomCount|escape:'html':'UTF-8'}
|
||||
<span>({if {$roomDemand['adults']} <= 9}0{$roomDemand['adults']}{else}{$roomDemand['adults']}{/if} {if $roomDemand['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}, {if {$roomDemand['children']} <= 9}0{$roomDemand['children']}{else}{$roomDemand['children']}{/if} {if $roomDemand['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if})</span>
|
||||
</div>
|
||||
<div>
|
||||
<div class="col-sm-12 demand_detail">
|
||||
|
||||
34
themes/hotel-reservation-theme/_partials/quantity_field.tpl
Normal file
34
themes/hotel-reservation-theme/_partials/quantity_field.tpl
Normal file
@@ -0,0 +1,34 @@
|
||||
{**
|
||||
* 2010-2023 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through LICENSE.txt file inside our module
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to CustomizationPolicy.txt file inside our module for more information.
|
||||
*
|
||||
* @author Webkul IN
|
||||
* @copyright 2010-2023 Webkul IN
|
||||
* @license LICENSE.txt
|
||||
*}
|
||||
|
||||
<div class="rm_qty_cont clearfix">
|
||||
<input type="hidden" class="text-center form-control quantity_wanted" min="1" name="qty" value="{if isset($quantity) && $quantity}{$quantity|escape:'html':'UTF-8'}{else}1{/if}">
|
||||
<input type="hidden" class="max_avail_type_qty" value="{if isset($total_available_rooms)} {$total_available_rooms|escape:'html':'UTF-8'}{/if}">
|
||||
<div class="qty_count pull-left">
|
||||
<span>{if isset($quantity) && $quantity}{$quantity|escape:'html':'UTF-8'}{else}1{/if}</span>
|
||||
</div>
|
||||
<div class="qty_direction pull-left">
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default rm_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty" class="btn btn-default rm_quantity_down">
|
||||
<span><i class="icon-minus"></i></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,100 +1,79 @@
|
||||
{if isset($booking_data['rm_data']) && $booking_data['rm_data']}
|
||||
{foreach from=$booking_data['rm_data'] key=room_k item=room_v}
|
||||
<div class="col-sm-12 room_cont">
|
||||
<div class="col-sm-12 room_cont" data-id-product="{$room_v['id_product']|escape:'htmlall':'UTF-8'}">
|
||||
<div class="row">
|
||||
<div class="col-sm-4">
|
||||
<a href="{$room_v['product_link']}">
|
||||
<img src="{$room_v['image']}" class="img-responsive">
|
||||
<a href="{$room_v['product_link']|escape:'htmlall':'UTF-8'}">
|
||||
<img src="{$room_v['image']|escape:'htmlall':'UTF-8'}" class="img-responsive room-type-image">
|
||||
{hook h='displayRoomTypeListImageAfter' product=$room_v}
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-sm-8">
|
||||
<p class="rm_heading">{$room_v['name']}</p>
|
||||
<div class="rm_desc">{$room_v['description']} <a href="{$room_v['product_link']}">{l s='View More'}....</a></div>
|
||||
|
||||
<p><span class="capa_txt">{l s='Max Capacity:'}</span><span class="capa_data"> {$room_v['adult']} {l s='Adults'}, {$room_v['children']} {l s='child'}</span></p>
|
||||
{if isset($room_v['num_review'])}
|
||||
<div class="rm_review_cont pull-left">
|
||||
{for $foo=1 to 5}
|
||||
{if $foo <= $room_v['ratting']}
|
||||
<div class="rm_ratting_yes" style="background-image:url({$ratting_img});"></div>
|
||||
{else}
|
||||
<div class="rm_ratting_no" style="background-image:url({$ratting_img});"></div>
|
||||
{/if}
|
||||
{/for}
|
||||
<span class="rm_review">{$room_v['num_review']} {l s='Reviews'}</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
<span class="rm_left pull-right" {if $room_v['room_left']>$warning_num} style="display:none"{/if}>{l s='Hurry!'} <span class="cat_remain_rm_qty_{$room_v['id_product']}">{$room_v['room_left']}</span> {l s='rooms left'}</span>
|
||||
{/if}
|
||||
|
||||
{if !empty($room_v['feature'])}
|
||||
<div class="rm_amenities_cont">
|
||||
{foreach from=$room_v['feature'] key=feat_k item=feat_v}
|
||||
<img title="{$feat_v.name}" src="{$link->getMediaLink("`$feat_img_dir`{$feat_v.value}")}" class="rm_amen"> {* by webkul change meddia link*}
|
||||
{* <img src="{$feat_img_dir}{$feat_v['value']}" class="rm_amen"> *}
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
<div class="row margin-lr-0 pull-left rm_price_cont">
|
||||
{if $room_v['feature_price_diff'] >= 0}
|
||||
<span class="pull-left rm_price_val {if $room_v['feature_price_diff']>0}room_type_old_price{/if}">
|
||||
{displayPrice price = $room_v['price_without_reduction']|round:2|floatVal}
|
||||
</span>
|
||||
<div class="col-sm-8 room_info_cont">
|
||||
<div class="row">
|
||||
<p class="rm_heading col-sm-12 col-md-7">{$room_v['name']|escape:'htmlall':'UTF-8'}</p>
|
||||
{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
<p class="rm_left col-sm-12 col-md-5" {if $room_v['room_left']>$warning_num} style="display:none"{/if}>
|
||||
{l s='Hurry!'} <span class="remain_rm_qty">{$room_v['room_left']|escape:'htmlall':'UTF-8'}</span> {l s='rooms left'}
|
||||
</p>
|
||||
{/if}
|
||||
{if $room_v['feature_price_diff']}
|
||||
<span class="pull-left rm_price_val">
|
||||
{displayPrice price = $room_v['feature_price']|round:2|floatVal}
|
||||
</span>
|
||||
{/if}
|
||||
<span class="pull-left rm_price_txt">/{l s='Per Night'}</span>
|
||||
</div>
|
||||
<div class="rm_desc">{$room_v['description']|truncate:190:"":true} <a href="{$room_v['product_link']|escape:'htmlall':'UTF-8'}">{l s='View More'}....</a></div>
|
||||
<div class="room_features_cont">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-5 col-lg-6">
|
||||
{if !empty($room_v['feature'])}
|
||||
<p class="rm_amenities_cont">
|
||||
{foreach from=$room_v['feature'] key=feat_k item=feat_v}
|
||||
<img title="{$feat_v.name|escape:'htmlall':'UTF-8'}" src="{$link->getMediaLink("`$feat_img_dir`{$feat_v.value}")|escape:'htmlall':'UTF-8'}" class="rm_amen">
|
||||
{/foreach}
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="col-sm-12 hidden-md hidden-lg">
|
||||
<p class="capa_txt"><span>{l s='Max Capacity:'}</span><span class="capa_data"> {$room_v['max_adults']|escape:'htmlall':'UTF-8'} {l s='Adults'}, {$room_v['max_children']|escape:'htmlall':'UTF-8'} {l s='child'}</span></p>
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-7 col-lg-6">
|
||||
{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
|
||||
{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
<a cat_rm_check_in="{$booking_date_from}" cat_rm_check_out="{$booking_date_to}" href="" rm_product_id="{$room_v['id_product']}" cat_rm_book_nm_days="{$num_days}" data-id-product-attribute="0" data-id-product="{$room_v['id_product']|intval}" class="btn btn-default button button-medium ajax_add_to_cart_button pull-right"><span>{l s='Book Now'}</span></a>
|
||||
|
||||
<!-- ################################################ -->
|
||||
|
||||
<div class="rm_qty_cont pull-right clearfix" id="cat_rm_quantity_wanted_{$room_v['id_product']}">
|
||||
<span class="qty_txt">{l s='Qty.'}:</span>
|
||||
<div class="qty_sec_cont row">
|
||||
<div class="qty_input_cont row margin-lr-0">
|
||||
<input autocomplete="off" type="text" min="1" name="qty_{$room_v['id_product']}" id="cat_quantity_wanted_{$room_v['id_product']}" class="text-center form-control cat_quantity_wanted" value="1" id_room_product="{$room_v['id_product']}">
|
||||
</div>
|
||||
<div class="qty_direction">
|
||||
<a href="#" data-room_id_product="{$room_v['id_product']}" data-field-qty="qty_{$room_v['id_product']}" class="btn btn-default cat_rm_quantity_up">
|
||||
<span>
|
||||
<i class="icon-plus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="#" data-field-qty="qty_{$room_v['id_product']}" class="btn btn-default cat_rm_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<p class="rm_price_cont">
|
||||
{if $room_v['feature_price_diff'] >= 0}
|
||||
<span class="rm_price_val {if $room_v['feature_price_diff']>0}room_type_old_price{/if}">
|
||||
{displayPrice price = $room_v['price_without_reduction']|round:2|floatVal}
|
||||
</span>
|
||||
{/if}
|
||||
{if $room_v['feature_price_diff']}
|
||||
<span class="rm_price_val">
|
||||
{displayPrice price = $room_v['feature_price']|round:2|floatVal}
|
||||
</span>
|
||||
{/if}
|
||||
<span class="rm_price_txt">/{l s='Per Night'}</span>
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="col-md-4 col-lg-3 visible-md visible-lg">
|
||||
<div class="capa_txt"><span>{l s='Max Capacity:'}</span><br><span class="capa_data"> {$room_v['max_adults']|escape:'htmlall':'UTF-8'} {l s='Adults'}, {$room_v['max_children']|escape:'htmlall':'UTF-8'} {l s='child'}</span></div>
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-8 col-lg-9">
|
||||
<div class="booking_room_fields">
|
||||
{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}
|
||||
{if isset($occupancy_required_for_booking) && $occupancy_required_for_booking}
|
||||
<div class="booking_guest_occupancy_conatiner">
|
||||
{include file="./occupancy_field.tpl" room_type_info=$room_v total_available_rooms=$room_v['room_left']}
|
||||
</div>
|
||||
{else}
|
||||
<div>
|
||||
<label>{l s='Qty:'}</label>
|
||||
{include file="./quantity_field.tpl" total_available_rooms=$room_v['room_left']}
|
||||
</div>
|
||||
{/if}
|
||||
<div>
|
||||
<a cat_rm_check_in="{$booking_date_from|escape:'htmlall':'UTF-8'}" cat_rm_check_out="{$booking_date_to|escape:'htmlall':'UTF-8'}" href="" rm_product_id="{$room_v['id_product']}" cat_rm_book_nm_days="{$num_days|escape:'htmlall':'UTF-8'}" data-id-product-attribute="0" data-id-product="{$room_v['id_product']|intval}" class="btn btn-default button button-medium ajax_add_to_cart_button"><span>{l s='Book Now'}</span></a>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
<!-- <div id="cat_rm_quantity_wanted_{$room_v['id_product']}">
|
||||
<a href="#" data-field-qty="qty_{$room_v['id_product']}" class="btn btn-default button-minus cat_rm_quantity_down">
|
||||
<span>
|
||||
<i class="icon-minus"></i>
|
||||
</span>
|
||||
</a>
|
||||
<input autocomplete="off" type="text" min="1" name="qty_{$room_v['id_product']}" id="cat_quantity_wanted_{$room_v['id_product']}" class="text" value="1" />
|
||||
|
||||
<a href="#" data-room_id_product="{$room_v['id_product']}" data-field-qty="qty_{$room_v['id_product']}" class="btn btn-default button-plus cat_rm_quantity_up">
|
||||
<span><i class="icon-plus"></i></span>
|
||||
</a>
|
||||
</div> -->
|
||||
|
||||
|
||||
<!-- ################################################ -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.margin-lr-0
|
||||
{
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,8 +63,9 @@
|
||||
padding-top: 30px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.room_cont .btn.btn-default.button.button-medium {
|
||||
transform: translate(0px, 6px);
|
||||
|
||||
.room-type-image {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.rm_heading
|
||||
@@ -72,7 +73,7 @@
|
||||
color: #333333;
|
||||
font-size: 32px;
|
||||
font-weight: 400;
|
||||
line-height: 25px;
|
||||
line-height: 35px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
@@ -80,9 +81,9 @@
|
||||
{
|
||||
line-height: 22px;
|
||||
color: #555555;
|
||||
font-size: 16px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.rm_desc p
|
||||
@@ -94,22 +95,24 @@
|
||||
{
|
||||
text-decoration: none;
|
||||
color: #379BF0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.capa_txt
|
||||
{
|
||||
color: #333333;
|
||||
font-size: 16px;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
font-weight: 400;
|
||||
}
|
||||
p.capa_txt {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.capa_data
|
||||
{
|
||||
color: #555555;
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
margin-left: 10px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.rm_review_cont
|
||||
@@ -143,12 +146,7 @@
|
||||
|
||||
.rm_amenities_cont
|
||||
{
|
||||
background-color: white;
|
||||
border-bottom: 1px solid #cccccc;
|
||||
border-top: 1px solid #cccccc;
|
||||
margin-bottom: 15px;
|
||||
padding: 10px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.rm_left
|
||||
@@ -156,7 +154,6 @@
|
||||
color: #e85757;
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
.rm_amen
|
||||
@@ -174,7 +171,7 @@
|
||||
color: #333333;
|
||||
font-size: 32px;
|
||||
font-weight: 400;
|
||||
line-height: 25px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.rm_price_txt
|
||||
@@ -187,9 +184,19 @@
|
||||
|
||||
.rm_price_cont
|
||||
{
|
||||
clear: both;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
@media (min-width: 992px) {
|
||||
.rm_left {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.rm_price_cont
|
||||
{
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
.rm_qty_cont
|
||||
{
|
||||
width: 120px;
|
||||
@@ -229,12 +236,52 @@
|
||||
float: left;
|
||||
}
|
||||
|
||||
.qty_direction a
|
||||
/* .qty_direction a
|
||||
{
|
||||
margin-bottom: 2.8px;
|
||||
margin-top: 3px;
|
||||
margin-left: 2px;
|
||||
padding: 1px 4px;
|
||||
} */
|
||||
|
||||
.booking_guest_occupancy.form-control {
|
||||
background-color: transparent!important;
|
||||
border: 1px solid #999999;
|
||||
box-shadow: 0 1px 0 0 rgba(0,0,0,0.13);
|
||||
height: 46px;
|
||||
border-radius: 4px;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
.booking_guest_occupancy_conatiner {
|
||||
display: flex;
|
||||
}
|
||||
@media (min-width: 992px) {
|
||||
.room_features_cont > div {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: flex-end;
|
||||
gap: 10px 0;
|
||||
}
|
||||
.booking_room_fields {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: end;
|
||||
justify-content: end;
|
||||
gap: 15px 10px;
|
||||
}
|
||||
|
||||
.booking_guest_occupancy_conatiner {
|
||||
display: inline-block;
|
||||
}
|
||||
.booking_guest_occupancy_conatiner .form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
.booking_guest_occupancy_conatiner .form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.display-inline
|
||||
@@ -276,5 +323,5 @@
|
||||
.room_type_old_price {
|
||||
text-decoration: line-through;
|
||||
color:#e85757;
|
||||
font-size:18px;
|
||||
font-size:18px;
|
||||
}
|
||||
85
themes/hotel-reservation-theme/css/daterangepicker.css
Normal file
85
themes/hotel-reservation-theme/css/daterangepicker.css
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* 2010-2022 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright 2010-2022 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
.date-picker-wrapper {
|
||||
font-family: Verdana,Arial,sans-serif;
|
||||
z-index: 111111;
|
||||
border-radius: 5px;
|
||||
background-color: #fff;
|
||||
color: #777;
|
||||
box-shadow: 0 4px 10px 0 rgb(0 0 0 / 26%);
|
||||
}
|
||||
.date-picker-wrapper.no-shortcuts {
|
||||
margin-top: -4px;
|
||||
padding: 10px;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper{
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
border-radius: 0px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.date-picker-wrapper .footer, .date-picker-wrapper .dp-clearfix, .date-picker-wrapper .time {
|
||||
display: none;
|
||||
}
|
||||
.date-picker-wrapper .month-name {
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
color: #333;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper table .week-name {
|
||||
height: 40px;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper table .day.real-today {
|
||||
background-color: unset;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper table tr td .day {
|
||||
padding: 10px 11px;
|
||||
line-height: 18px;
|
||||
font-size: 14px;
|
||||
margin: 0;
|
||||
width: 38px;
|
||||
}
|
||||
.date-picker-wrapper table .caption .next, .date-picker-wrapper table .caption .prev {
|
||||
font-size: 16px;
|
||||
color: #000;
|
||||
padding: 5px 10px;
|
||||
background-color: #f0f0f0;
|
||||
display: inline-block;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.date-picker-wrapper table .caption .next i, .date-picker-wrapper table .caption .prev i {
|
||||
width: 6px;
|
||||
}
|
||||
.date-picker-wrapper table .caption .next:hover, .date-picker-wrapper table .caption .prev:hover {
|
||||
color: #000;
|
||||
background: #dadada;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper table .day.checked {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
.date-picker-wrapper .month-wrapper table .day.toMonth.hovering {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
.date-picker-wrapper .first-date-selected, .date-picker-wrapper .last-date-selected {
|
||||
background-color: #1292ff !important;
|
||||
}
|
||||
@@ -6518,6 +6518,30 @@ table.table_block td {
|
||||
margin-bottom: 0;
|
||||
width: auto; }
|
||||
|
||||
/* input backgrounds */
|
||||
.input-occupancy, .form-control .input-occupancy {
|
||||
background: url("../img/icon/icon-users.svg") no-repeat 8px 50%, url("../img/icon/icon-dropdown-arrow.svg") no-repeat calc(100% - 8px) 50%;
|
||||
padding-left: 35px;
|
||||
padding-right: 20px;
|
||||
background-color: #FFF;
|
||||
}
|
||||
.input-date, .form-control .input-date {
|
||||
background: url("../img/icon/icon-calendar.svg") no-repeat 10px 50%, url("../img/icon/icon-dropdown-arrow.svg") no-repeat calc(100% - 8px) 50%;
|
||||
padding-left: 35px;
|
||||
padding-right: 20px;
|
||||
background-color: #FFF;}
|
||||
.input-date span i, .form-control .input-date span i {
|
||||
transform: scale(0.8, 0.6);}
|
||||
|
||||
.input-hotel, .form-control .input-hotel, .input-location, .form-control .input-location {
|
||||
background: url("../img/icon/icon-hotel.svg") no-repeat 10px 50%;
|
||||
padding-left: 35px;
|
||||
background-color: #FFF;
|
||||
}
|
||||
.input-occupancy, .form-control .input-occupancy {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.page-product-box {
|
||||
padding-bottom: 10px; }
|
||||
|
||||
@@ -7223,6 +7247,9 @@ div.star a:hover {
|
||||
padding: 5px 0;
|
||||
color: #333; }
|
||||
|
||||
#page {
|
||||
position: relative; }
|
||||
|
||||
.header-container {
|
||||
background: #fff; }
|
||||
|
||||
|
||||
112
themes/hotel-reservation-theme/css/occupancy.css
Normal file
112
themes/hotel-reservation-theme/css/occupancy.css
Normal file
@@ -0,0 +1,112 @@
|
||||
/**
|
||||
* 2010-2023 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright 2010-2023 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
.booking_occupancy_wrapper {
|
||||
border: none;
|
||||
max-height: 380px;
|
||||
overflow: auto;
|
||||
box-shadow: 0 8px 25px -4px rgba(0,0,0,0.39);
|
||||
left: 0px;
|
||||
padding: 20px;
|
||||
min-width: 280px}
|
||||
.booking_occupancy_wrapper .occupancy-info-separator {
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
margin-right: -20px;
|
||||
margin-left: -20px;}
|
||||
.booking_occupancy_wrapper .children_age_info_block {
|
||||
display: none;}
|
||||
.booking_occupancy_wrapper .children_age_info_block label {
|
||||
font-size: 12px;
|
||||
color: #777777;}
|
||||
.booking_occupancy_wrapper .label-desc-txt {
|
||||
font-size: 12px;
|
||||
color: #777777;}
|
||||
.booking_occupancy_wrapper label {
|
||||
font-size: 14px;
|
||||
color: #333333;
|
||||
font-weight: 400;}
|
||||
.booking_occupancy_wrapper .add_new_occupancy_btn {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
color: #0000FF;
|
||||
line-height: 24px;}
|
||||
.booking_occupancy_wrapper .add_new_occupancy_btn:active, .booking_occupancy_wrapper .add_new_occupancy_btn:focus, .booking_occupancy_wrapper .add_new_occupancy_btn:hover {
|
||||
text-decoration: none;
|
||||
color: #0000FF;}
|
||||
.booking_occupancy_wrapper .occupancy_info_head {
|
||||
font-size: 14px;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;}
|
||||
.booking_occupancy_wrapper .occupancy_info_head .remove-room-link {
|
||||
font-size: 12px;
|
||||
color: #FF4343;
|
||||
text-align: right;}
|
||||
.booking_occupancy_wrapper .occupancy_info_block .occupancy_count, .qty_count {
|
||||
padding: 14px;
|
||||
border: 1px solid #E1E3E7;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
text-align: center;
|
||||
border-radius: 4px;}
|
||||
.rm_qty_cont .qty_count, .rm_qty_cont .qty_direction a {
|
||||
border: 1px solid #999999;
|
||||
box-shadow: 0 1px 0 0 rgb(0 0 0 / 13%);}
|
||||
.booking_occupancy_wrapper .occupancy_info_block .occupancy_count > span, .qty_count > span {
|
||||
min-width: 21px;
|
||||
text-align: center;
|
||||
display: block;}
|
||||
.qty_direction {
|
||||
margin-left: 3px;
|
||||
width: 22px;}
|
||||
.qty_direction a {
|
||||
padding: 1px 5px;
|
||||
border: 0px;
|
||||
border: 1px solid #E1E3E7;
|
||||
color: #333;
|
||||
border-radius: 4px;
|
||||
font-weight: 400;}
|
||||
.qty_direction .occupancy_quantity_down, .qty_direction .rm_quantity_down {
|
||||
margin-top: 3px;}
|
||||
|
||||
.booking_occupancy_wrapper .children_ages .col-xs-4 {
|
||||
padding-left: 5px;
|
||||
margin-bottom: 5px;
|
||||
padding-right: 5px;}
|
||||
.booking_occupancy_wrapper .children_ages select {
|
||||
background-color: #fff;
|
||||
height: 37px;
|
||||
border-radius: 4px;
|
||||
padding: 3px 5px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 12px;
|
||||
color: #333;
|
||||
border: 1px solid #E1E3E7;
|
||||
width: 100%;}
|
||||
|
||||
|
||||
@media (max-width: 450) {
|
||||
.booking_occupancy_wrapper .occupancy_info_block .occupancy_count_block {
|
||||
width: 100%;}
|
||||
.booking_occupancy_wrapper .occupancy_info_block .occupancy_count {
|
||||
width: 80%;}
|
||||
}
|
||||
@@ -1103,8 +1103,14 @@ Quick View Styles
|
||||
width: 100%;
|
||||
text-transform: uppercase;
|
||||
padding: 15px;}
|
||||
.booking_room_fields .hasDatepicker {
|
||||
.booking_room_fields #room_date_range {
|
||||
display: grid;
|
||||
cursor: text;}
|
||||
.booking_room_fields #room_date_range span {
|
||||
align-self: center;}
|
||||
.booking_room_fields #room_date_range span i {
|
||||
color: #777;}
|
||||
|
||||
.booking_room_fields .htl_location_block p {
|
||||
line-height: 25px;
|
||||
font-size: 18px;
|
||||
@@ -1262,27 +1268,7 @@ Quick View Styles
|
||||
text-transform: uppercase;
|
||||
text-align: center;}
|
||||
|
||||
|
||||
#quantity_wanted_p .rm_qty_cont {
|
||||
width: 100%;
|
||||
margin-right: 15px;}
|
||||
#quantity_wanted_p .qty_sec_cont {
|
||||
width: 100%;
|
||||
margin: 0px;
|
||||
float: left;}
|
||||
#quantity_wanted_p .qty_input_cont {
|
||||
float: left;
|
||||
width: 126px;}
|
||||
#quantity_wanted_p .qty_input_cont input {
|
||||
border-radius: 4px 0px 0px 4px;}
|
||||
#quantity_wanted_p .qty_direction {
|
||||
width: 22px;
|
||||
float: left;}
|
||||
#quantity_wanted_p .qty_direction a {
|
||||
padding: 2px 5px;
|
||||
border-left: 0px;
|
||||
border-color: #999;}
|
||||
.product_wrapper .circle-small {
|
||||
.product_wrapper .circle-small {
|
||||
opacity: 0.5;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
@@ -1290,18 +1276,15 @@ Quick View Styles
|
||||
background: #FFFFFF;}
|
||||
.room_info_content span.col-sm-4 {
|
||||
margin-bottom: 5px;}
|
||||
.product_wrapper .input-date {
|
||||
background: transparent url(../img/icon/icon-calendar.svg) no-repeat scroll 92% 50%!important;
|
||||
background-size: 16px!important;}
|
||||
.product_wrapper input {
|
||||
|
||||
.product_wrapper .form-control {
|
||||
background-color: transparent!important;
|
||||
border: 1px solid #999999;
|
||||
box-shadow: 0 1px 0 0 rgba(0,0,0,0.13);
|
||||
height: 48px;
|
||||
border-radius: 4px;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
padding: 0px 15px;}
|
||||
font-size: 14px;}
|
||||
.product_wrapper textarea {
|
||||
background-color: transparent!important;
|
||||
border: 1px solid #999999;
|
||||
@@ -1322,6 +1305,7 @@ Quick View Styles
|
||||
opacity: 0.5;
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;}
|
||||
|
||||
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
|
||||
background-color: transparent;
|
||||
}
|
||||
@@ -1330,15 +1314,38 @@ Quick View Styles
|
||||
float: left!important;}
|
||||
.booking_room_fields .form-group {
|
||||
width: 100%;}}
|
||||
@media (min-width: 320px) and (max-width: 767px) {
|
||||
.product_wrapper .input-date {
|
||||
background-position: 97% 50%!important;}}
|
||||
@media (max-width: 450px) {
|
||||
.num_avail_rooms_alert {
|
||||
float: left!important;}
|
||||
.booking_room_fields .form-group {
|
||||
width: 100%;}}
|
||||
|
||||
/* booking form loading */
|
||||
#booking_action_block {
|
||||
position: relative;
|
||||
}
|
||||
@keyframes blink {
|
||||
33%{background-size:calc(100%/3) 0% ,calc(100%/3) 100%,calc(100%/3) 100%}
|
||||
50%{background-size:calc(100%/3) 100%,calc(100%/3) 0% ,calc(100%/3) 100%}
|
||||
66%{background-size:calc(100%/3) 100%,calc(100%/3) 100%,calc(100%/3) 0% }
|
||||
}
|
||||
#booking_action_loader {
|
||||
margin: auto;
|
||||
height: 16px;
|
||||
width: 50px;
|
||||
--_circle: no-repeat radial-gradient(circle closest-side,rgb(255, 255, 255) 80%,#0000);
|
||||
background:
|
||||
var(--_circle) 0% 50%,
|
||||
var(--_circle) 50% 50%,
|
||||
var(--_circle) 100% 50%;
|
||||
background-size: calc(100%/3) 100%;
|
||||
animation: blink 1.5s infinite linear;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#booking_action_loader.active {
|
||||
display: block;
|
||||
}
|
||||
/* room type extra demands container */
|
||||
.room_demands_container_overlay {
|
||||
display: none;
|
||||
|
||||
@@ -43,13 +43,36 @@
|
||||
{if isset($cookie->id_lang)}
|
||||
{addJsDef id_lang=$cookie->id_lang|intval}
|
||||
{/if}
|
||||
{addJsDef lang_iso=$lang_iso}
|
||||
{addJsDefL name=FancyboxI18nClose}{l s='Close'}{/addJsDefL}
|
||||
{addJsDefL name=FancyboxI18nNext}{l s='Next'}{/addJsDefL}
|
||||
{addJsDefL name=FancyboxI18nPrev}{l s='Previous'}{/addJsDefL}
|
||||
{addJsDefL name=RangePickerCheckin}{l s='Check-in'}{/addJsDefL}
|
||||
{addJsDefL name=RangePickerCheckout}{l s='Check-out'}{/addJsDefL}
|
||||
{addJsDef usingSecureMode=Tools::usingSecureMode()|boolval}
|
||||
{addJsDef ajaxsearch=Configuration::get('PS_SEARCH_AJAX')|boolval}
|
||||
{addJsDef instantsearch=Configuration::get('PS_INSTANT_SEARCH')|boolval}
|
||||
{addJsDef quickView=$quick_view|boolval}
|
||||
{addJsDef displayList=Configuration::get('PS_GRID_PRODUCT')|boolval}
|
||||
{addJsDef highDPI=Configuration::get('PS_HIGHT_DPI')|boolval}
|
||||
{* occupancy text *}
|
||||
{addJsDef is_occupancy_wise_search=$is_occupancy_wise_search|boolval}
|
||||
{addJsDef occupancy_required_for_booking=$occupancy_required_for_booking|boolval}
|
||||
{addJsDef max_child_age=$max_child_age}
|
||||
{addJsDef max_child_in_room=$max_child_in_room}
|
||||
|
||||
{addJsDefL name='select_occupancy_txt'}{l s='Select Occupancy' js=1}{/addJsDefL}
|
||||
{addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL}
|
||||
{addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL}
|
||||
{addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL}
|
||||
{addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL}
|
||||
{addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL}
|
||||
{addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL}
|
||||
{addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL}
|
||||
{addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL}
|
||||
{addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL}
|
||||
{addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL}
|
||||
{addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL}
|
||||
{/strip}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="6px" height="12px" viewBox="0 0 6 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown-arrow</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Occupancy-Wise-Search-1" transform="translate(-676.000000, -525.000000)" fill="#000000" fill-rule="nonzero">
|
||||
<g id="hero">
|
||||
<g id="search" transform="translate(319.000000, 170.000000)">
|
||||
<g id="all-actionables-[20v]" transform="translate(30.000000, 108.000000)">
|
||||
<g id="guests-occupancy" transform="translate(0.000000, 225.000000)">
|
||||
<path d="M330,22 L333,26.7142857 L327,26.7142857 L330,22 Z M330,33.7142857 L327,29 L333,29 L330,33.7142857 Z" id="icon-dropdown-arrow"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
25
themes/hotel-reservation-theme/img/icon/icon-hotel.svg
Normal file
25
themes/hotel-reservation-theme/img/icon/icon-hotel.svg
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="17px" height="18px" viewBox="0 0 17 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-hotel</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Occupancy-Wise-Search-1" transform="translate(-367.000000, -370.000000)" fill-rule="nonzero" stroke="#000000" stroke-width="1.5">
|
||||
<g id="hero">
|
||||
<g id="search" transform="translate(319.000000, 170.000000)">
|
||||
<g id="all-actionables-[20v]" transform="translate(30.000000, 108.000000)">
|
||||
<g id="select-hotel" transform="translate(0.000000, 75.000000)">
|
||||
<g id="icon-hotel" transform="translate(18.000000, 17.000000)">
|
||||
<rect id="Rectangle-Copy" x="4.75" y="4.75" width="11.5" height="12.5" rx="2"></rect>
|
||||
<rect id="Rectangle" fill="#F0F0F0" x="0.75" y="0.75" width="11.5" height="16.5" rx="2"></rect>
|
||||
<rect id="Rectangle-4" x="4.75" y="3.75" width="3.5" height="3.5" rx="1"></rect>
|
||||
<rect id="Rectangle-4-Copy" x="4.75" y="9.75" width="3.5" height="3.5" rx="1"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
25
themes/hotel-reservation-theme/img/icon/icon-users.svg
Normal file
25
themes/hotel-reservation-theme/img/icon/icon-users.svg
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="17px" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-users</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
|
||||
<g id="Occupancy-Wise-Search-1" transform="translate(-364.000000, -521.000000)" stroke="#000000" stroke-width="1.5">
|
||||
<g id="hero">
|
||||
<g id="search" transform="translate(319.000000, 170.000000)">
|
||||
<g id="all-actionables-[20v]" transform="translate(30.000000, 108.000000)">
|
||||
<g id="guests-occupancy" transform="translate(0.000000, 225.000000)">
|
||||
<g id="icon-users" transform="translate(16.000000, 19.000000)">
|
||||
<path d="M13.0909091,14.7272727 L13.0909091,13.0909091 C13.0909091,11.2834317 11.6256592,9.81818182 9.81818182,9.81818182 L3.27272727,9.81818182 C1.46524991,9.81818182 1.81672859e-16,11.2834317 0,13.0909091 L0,14.7272727" id="Shape"></path>
|
||||
<circle id="Oval" cx="6.54545455" cy="3.27272727" r="3.27272727"></circle>
|
||||
<path d="M18,14.7272727 L18,13.0909091 C17.9988875,11.59946 16.9895445,10.2974074 15.5454545,9.92454545" id="Shape"></path>
|
||||
<path d="M12.2727273,0.106363636 C13.7208394,0.477138917 14.7336899,1.78199276 14.7336899,3.27681818 C14.7336899,4.77164361 13.7208394,6.07649745 12.2727273,6.44727273" id="Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -817,7 +817,7 @@ Enjoy!
|
||||
$span.width(origElemWidth -spanPad);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
} else {
|
||||
// Force the select to fill the size of the div
|
||||
$div.addClass('fixedWidth');
|
||||
|
||||
@@ -58,87 +58,6 @@ function resizeCatimg()
|
||||
image.src = div.css('background-image').replace(/url\("?|"?\)$/ig, '');
|
||||
}
|
||||
|
||||
|
||||
// The button to increment the product value
|
||||
$(document).on('click', '.cat_rm_quantity_up', function(e){
|
||||
e.preventDefault();
|
||||
fieldName = $(this).data('field-qty');
|
||||
var currentVal = parseInt($('input[name='+fieldName+']').val());
|
||||
|
||||
/*if (!allowBuyWhenOutOfStock && quantityAvailable > 0)
|
||||
quantityAvailableT = quantityAvailable;
|
||||
else*/
|
||||
quantityAvailableT = $(this).closest('.room_cont').find(".cat_remain_rm_qty_"+$(this).data('room_id_product')).text();
|
||||
if (!isNaN(currentVal) && currentVal < quantityAvailableT)
|
||||
{
|
||||
$('input[name='+fieldName+']').val(currentVal + 1).trigger('keyup');
|
||||
}
|
||||
else
|
||||
$('input[name='+fieldName+']').val(quantityAvailableT);
|
||||
});
|
||||
|
||||
// The button to decrement the product value
|
||||
$(document).on('click', '.cat_rm_quantity_down', function(e){
|
||||
e.preventDefault();
|
||||
fieldName = $(this).data('field-qty');
|
||||
var currentVal = parseInt($('input[name='+fieldName+']').val());
|
||||
if (!isNaN(currentVal) && currentVal > 1)
|
||||
$('input[name='+fieldName+']').val(currentVal - 1).trigger('keyup');
|
||||
else
|
||||
$('input[name='+fieldName+']').val(1);
|
||||
});
|
||||
|
||||
|
||||
$(document).on('focusout', '.cat_quantity_wanted', function(e)
|
||||
{
|
||||
var qty_wntd = $(this).val();
|
||||
if (qty_wntd == '' || !$.isNumeric(qty_wntd))
|
||||
{
|
||||
$(this).val(1);
|
||||
qty_wntd = $(this).val();
|
||||
}
|
||||
$(this).val(parseInt(qty_wntd));
|
||||
if(parseInt(qty_wntd) < 1 || parseInt(qty_wntd) > parseInt($('.cat_remain_rm_qty_'+$(this).attr('id_room_product')).text()))
|
||||
{
|
||||
$(this).val($('.cat_remain_rm_qty_'+$(this).attr('id_room_product')).text());
|
||||
}
|
||||
else if (qty_wntd <= parseInt($('.cat_remain_rm_qty_'+$(this).attr('id_room_product')).text()) && qty_wntd >= 1)
|
||||
{
|
||||
$cornt_obj = $(this);
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
headers: { "cache-control": "no-cache" },
|
||||
url: product_controller_url,
|
||||
dataType:'JSON',
|
||||
cache: false,
|
||||
data: {
|
||||
date_from:$('#check_in_time').val(),
|
||||
date_to:$('#check_out_time').val(),
|
||||
product_quantity_down:1,
|
||||
qty:qty_wntd,
|
||||
id_product:$(this).attr('id_room_product')
|
||||
},
|
||||
success: function(result)
|
||||
{
|
||||
if (result.msg == 'success') {
|
||||
total_price = result.total_price;
|
||||
total_price = parseFloat(total_price);
|
||||
|
||||
price = formatCurrency(total_price, currency_format, currency_sign, currency_blank);
|
||||
|
||||
$('.total_price_block p').text(price);
|
||||
$cornt_obj.closest(".rm_qty_cont").siblings(".rm_book_btn").attr('cat_rm_book_nm_days', result.num_days);
|
||||
$('.cat_remain_rm_qty_'+$cornt_obj.attr('id_room_product')).text(result.avail_rooms);
|
||||
} else if (result.msg == 'unavailable_quantity') {
|
||||
$cornt_obj.val(result.avail_rooms);
|
||||
} else {
|
||||
alert(some_error_cond);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/*Set maxDate for Order resrict date*/
|
||||
/*$(document).ready(function(){
|
||||
if (max_order_date) {
|
||||
|
||||
@@ -111,6 +111,7 @@ $(document).ready(function(){
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
function highdpiInit()
|
||||
{
|
||||
if (typeof highDPI === 'undefined')
|
||||
@@ -477,4 +478,4 @@ function highlightSelectedDateRange(date, checkIn, checkOut)
|
||||
}
|
||||
|
||||
return [true, ''];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,26 +134,28 @@ var ajaxCart = {
|
||||
|
||||
var dateFrom = $(this).attr('cat_rm_check_in');
|
||||
var dateTo = $(this).attr('cat_rm_check_out');
|
||||
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('.booking_room_fields'));
|
||||
/* By Webkul
|
||||
* Note : In our case minimalQuantity is taken from Qty. field
|
||||
*/
|
||||
// var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
var minimalQuantity = $("#cat_quantity_wanted_" + idProduct).val();
|
||||
if (!minimalQuantity)
|
||||
minimalQuantity = 1;
|
||||
if ($(this).prop('disabled') != 'disabled')
|
||||
ajaxCart.add(idProduct, idProductAttribute, false, this, minimalQuantity, null, dateFrom, dateTo);
|
||||
// var minimalQuantity = parseInt($(this).data('minimal_quantity'));
|
||||
// var minimalQuantity = $("#quantity_wanted_" + idProduct).val();
|
||||
// if (!minimalQuantity)
|
||||
// minimalQuantity = 1;
|
||||
if ($(this).prop('disabled') != 'disabled' && occupancy)
|
||||
ajaxCart.add(idProduct, idProductAttribute, false, this, occupancy, null, dateFrom, dateTo);
|
||||
});
|
||||
//for product page 'add' button...
|
||||
if ($('.cart_block').length) {
|
||||
$(document).off('click', '#add_to_cart button').on('click', '#add_to_cart button', function(e) {
|
||||
$(document).off('click', '#add_to_cart button').on('click', '#add_to_cart button', function(e) {
|
||||
e.preventDefault();
|
||||
var date_from = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
var date_to = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null, date_from, date_to);
|
||||
|
||||
var date_from = $('#room_check_in').val();
|
||||
var date_to = $('#room_check_out').val();
|
||||
var occupancy = getBookingOccupancyDetails($(this).closest('.booking_room_fields'));
|
||||
if (occupancy) {
|
||||
ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, occupancy, null, date_from, date_to);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -214,8 +216,8 @@ var ajaxCart = {
|
||||
|
||||
/*by webkul*/
|
||||
if (pagename == 'product') {
|
||||
dateFrom = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
dateTo = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
dateFrom = $('#room_check_in').val();
|
||||
dateTo = $('#room_check_out').val();
|
||||
} else if (pagename == 'category') {
|
||||
dateFrom = $('#check_in_time').val();
|
||||
dateTo = $('#check_out_time').val();
|
||||
@@ -319,7 +321,7 @@ var ajaxCart = {
|
||||
// close fancybox
|
||||
updateFancyBox: function() {},
|
||||
// add a product in the cart via ajax
|
||||
add: function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist, dateFrom, dateTo) {
|
||||
add: function(idProduct, idCombination, addedFromProductPage, callerElement, occupancy, whishlist, dateFrom, dateTo) {
|
||||
|
||||
if (addedFromProductPage && !checkCustomizations()) {
|
||||
if (contentOnly) {
|
||||
@@ -346,8 +348,9 @@ var ajaxCart = {
|
||||
if (addedFromProductPage) {
|
||||
$('#add_to_cart button').prop('disabled', 'disabled').addClass('disabled');
|
||||
$('.filled').removeClass('filled');
|
||||
} else
|
||||
} else {
|
||||
$(callerElement).prop('disabled', 'disabled');
|
||||
}
|
||||
|
||||
if ($('.cart_block_list').hasClass('collapsed'))
|
||||
this.expand();
|
||||
@@ -355,6 +358,7 @@ var ajaxCart = {
|
||||
|
||||
// get the selected extra demands by customer
|
||||
var roomDemands = getRoomsExtraDemands();
|
||||
|
||||
//send the ajax request to the server
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
@@ -365,7 +369,7 @@ var ajaxCart = {
|
||||
async: true,
|
||||
cache: false,
|
||||
dataType: "json",
|
||||
data: 'controller=cart&add=1&dateFrom=' + dateFrom + '&dateTo=' + dateTo + '&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&roomDemands=' + JSON.stringify(roomDemands) + '&token=' + static_token + ((parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination) : '' + '&id_customization=' + ((typeof customizationId !== 'undefined') ? customizationId : 0)),
|
||||
data: 'controller=cart&add=1&dateFrom=' + dateFrom + '&dateTo=' + dateTo + '&ajax=true'+(occupancy_required_for_booking ? '&occupancy=' + JSON.stringify(occupancy) : '&qty=' + occupancy) + '&id_product=' + idProduct + '&roomDemands=' + JSON.stringify(roomDemands) + '&token=' + static_token + ((parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination) : '' + '&id_customization=' + ((typeof customizationId !== 'undefined') ? customizationId : 0)),
|
||||
success: function(jsonData, textStatus, jqXHR) {
|
||||
/*by webkul checking and setting availability of rooms*/
|
||||
/*for product page add to cart quantity management*/
|
||||
@@ -378,18 +382,19 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$(callerElement).closest(".room_cont").find(".rm_left").show();
|
||||
} else {
|
||||
$("cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$(callerElement).closest(".room_cont").find(".rm_left").hide();
|
||||
}
|
||||
|
||||
/*for category page add to cart quantity management*/
|
||||
$(callerElement).closest(".room_cont").find(".remain_rm_qty").text(jsonData.avail_rooms);
|
||||
$(callerElement).closest(".room_cont").find('.max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').hide();
|
||||
$(callerElement).closest(".room_cont").hide();
|
||||
}
|
||||
//$('#cat_quantity_wanted_'+idProduct).val(1);
|
||||
//$('#quantity_wanted_'+idProduct).val(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -406,22 +411,27 @@ var ajaxCart = {
|
||||
if (jsonData.crossSelling)
|
||||
$('.crossseling').html(jsonData.crossSelling);
|
||||
|
||||
if (idCombination)
|
||||
$(jsonData.products).each(function() {
|
||||
if (this.id != undefined && this.id == parseInt(idProduct) && this.idCombination == parseInt(idCombination))
|
||||
if (contentOnly)
|
||||
window.parent.ajaxCart.updateLayer(this);
|
||||
else
|
||||
ajaxCart.updateLayer(this);
|
||||
});
|
||||
else
|
||||
$(jsonData.products).each(function() {
|
||||
if (this.id != undefined && this.id == parseInt(idProduct))
|
||||
if (contentOnly)
|
||||
window.parent.ajaxCart.updateLayer(this);
|
||||
else
|
||||
ajaxCart.updateLayer(this);
|
||||
});
|
||||
// if (idCombination)
|
||||
// $(jsonData.products).each(function() {
|
||||
// if (this.id != undefined && this.id == parseInt(idProduct) && this.idCombination == parseInt(idCombination))
|
||||
// if (contentOnly)
|
||||
// window.parent.ajaxCart.updateLayer(this);
|
||||
// else
|
||||
// ajaxCart.updateLayer(this);
|
||||
// });
|
||||
// else
|
||||
// $(jsonData.products).each(function() {
|
||||
// if (this.id != undefined && this.id == parseInt(idProduct))
|
||||
// if (contentOnly)
|
||||
// window.parent.ajaxCart.updateLayer(this);
|
||||
// else {
|
||||
// ajaxCart.updateLayer(this);
|
||||
// }
|
||||
// });
|
||||
if (jsonData.last_added_product) {
|
||||
ajaxCart.updateLayer(jsonData.last_added_product);
|
||||
|
||||
}
|
||||
if (contentOnly)
|
||||
parent.$.fancybox.close();
|
||||
} else {
|
||||
@@ -434,7 +444,9 @@ var ajaxCart = {
|
||||
else
|
||||
$(callerElement).removeProp('disabled');
|
||||
}
|
||||
|
||||
if (!addedFromProductPage) {
|
||||
resetOccupancyField($(callerElement).closest('.booking_room_fields').find('.booking_occupancy_wrapper'));
|
||||
}
|
||||
emptyCustomizations();
|
||||
|
||||
},
|
||||
@@ -495,12 +507,11 @@ var ajaxCart = {
|
||||
/*by webkul checking and setting availability of rooms*/
|
||||
/*for product page add to cart quantity management*/
|
||||
if (pagename == 'product') {
|
||||
var date_checkIn = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_in').val()));
|
||||
var date_checkOut = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate(ajaxCart.dateFormat, $('#room_check_out').val()));
|
||||
var date_checkIn = $('#room_check_in').val();
|
||||
var date_checkOut = $('#room_check_out').val();
|
||||
var product_page_id_product = $('#product_page_product_id').val();
|
||||
if (idProduct == product_page_id_product && dateFrom < date_checkOut && dateTo >= date_checkIn) {
|
||||
$("#max_avail_type_qty").val(jsonData.avail_rooms);
|
||||
|
||||
$(".max_avail_type_qty").val(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
disableRoomTypeDemands(1);
|
||||
}
|
||||
@@ -510,18 +521,19 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .rm_left').show();
|
||||
} else {
|
||||
$("cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$("room_cont").find('[data-id-product="'+idProduct+'"] .rm_left').hide();
|
||||
}
|
||||
|
||||
/*for category page add to cart quantity management*/
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .remain_rm_qty').text(jsonData.avail_rooms);
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"] .max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
if (jsonData.avail_rooms == 0) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').hide();
|
||||
$(".room_cont").find('[data-id-product="'+idProduct+'"]').hide();
|
||||
}
|
||||
//$('#cat_quantity_wanted_'+idProduct).val(1);
|
||||
//$('#quantity_wanted_'+idProduct).val(1);
|
||||
}
|
||||
|
||||
ajaxCart.updateCart(jsonData);
|
||||
@@ -615,14 +627,14 @@ var ajaxCart = {
|
||||
|
||||
if (pagename == 'category') {
|
||||
// for category page....
|
||||
$(".cat_remain_rm_qty_" + idProduct).text(jsonData.avail_rooms);
|
||||
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.room_cont').show(0, function() {
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find(".remain_rm_qty").text(jsonData.avail_rooms);
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.max_avail_type_qty').val(jsonData.avail_rooms);
|
||||
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').show(0, function() {
|
||||
if (jsonData.avail_rooms <= room_warning_num) {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').show();
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.rm_left').show();
|
||||
} else {
|
||||
$(".cat_remain_rm_qty_" + idProduct).closest('.rm_left').hide();
|
||||
$('.room_cont[data-id-product="'+idProduct+'"]').find('.rm_left').hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -817,7 +829,7 @@ var ajaxCart = {
|
||||
|
||||
content += '<div class="room-capacity cart-info-sec">';
|
||||
content += '<span class="product_info_label">' + capacity_txt + ':</span>';
|
||||
content += '<span class="product_info_data"> ' + cart_booking_data[key].adult + ' ' + adults_txt + ' & ' + cart_booking_data[key].children + ' ' + children_txt + '</span>'
|
||||
content += '<span class="product_info_data"> ' + cart_booking_data[key].adults + ' ' + adults_txt + ' & ' + cart_booking_data[key].children + ' ' + children_txt + '</span>'
|
||||
content += '</div>';
|
||||
|
||||
if (this.hasAttributes)
|
||||
@@ -1010,17 +1022,25 @@ var ajaxCart = {
|
||||
$('#layer_cart_product_price').text(product.price);
|
||||
|
||||
//by webkul has to work on it more..
|
||||
if (pagename == 'product') {
|
||||
$('#layer_cart_product_time_duration').text($('#room_check_in').val() + ' - ' + $('#room_check_out').val());
|
||||
$('#layer_cart_product_quantity').text($('#quantity_wanted').val());
|
||||
$('#quantity_wanted').val(1);
|
||||
}
|
||||
if (pagename == 'category') {
|
||||
$('#layer_cart_product_time_duration').text($('#check_in_time').val() + ' - ' + $('#check_out_time').val());
|
||||
$('#layer_cart_product_quantity').text($('#cat_quantity_wanted_' + product.id).val());
|
||||
$('#cat_quantity_wanted_' + product.id).val(1);
|
||||
$('#layer_cart_product_time_duration').text(
|
||||
product.date_from + ' - ' + product.date_to
|
||||
);
|
||||
|
||||
let rooms = 0;
|
||||
let adults = 0;
|
||||
let children = 0;
|
||||
let room_quantity_text = '';
|
||||
if (occupancy_required_for_booking) {
|
||||
$.each(product.occupancy, function(index, val) {
|
||||
rooms++;
|
||||
adults += parseInt(val.adults);
|
||||
children += parseInt(val.children);
|
||||
});
|
||||
room_quantity_text = getRoomTypeGuestOccupancyFormated(adults, children, rooms);
|
||||
} else {
|
||||
room_quantity_text = product.occupancy;
|
||||
}
|
||||
$('#layer_cart_product_quantity').text(room_quantity_text);
|
||||
|
||||
$('.layer_cart_img').html('<img class="layer_cart_img img-responsive" src="' + product.image + '" alt="' + product.name + '" title="' + product.name + '" />');
|
||||
|
||||
@@ -1189,4 +1209,48 @@ function getRoomsExtraDemands()
|
||||
});
|
||||
|
||||
return roomDemands;
|
||||
}
|
||||
|
||||
function getBookingOccupancyDetails(bookingform)
|
||||
{
|
||||
let occupancy;
|
||||
if (occupancy_required_for_booking) {
|
||||
let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected")
|
||||
if (selected_occupancy.length) {
|
||||
occupancy = [];
|
||||
$(selected_occupancy).each(function(ind, element) {
|
||||
if (parseInt($(element).find('.num_adults').val())) {
|
||||
let child_ages = [];
|
||||
$(element).find('.guest_child_age').each(function(index) {
|
||||
if ($(this).val() > -1) {
|
||||
child_ages.push($(this).val());
|
||||
}
|
||||
});
|
||||
if ($(element).find('.num_children').val()) {
|
||||
if (child_ages.length != $(element).find('.num_children').val()) {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
occupancy.push({
|
||||
'adults': $(element).find('.num_adults').val(),
|
||||
'children': $(element).find('.num_children').val(),
|
||||
'child_ages': child_ages
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
}
|
||||
} else {
|
||||
occupancy = parseInt($(bookingform).find(".quantity_wanted").val());
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
}
|
||||
340
themes/hotel-reservation-theme/js/occupancy.js
Normal file
340
themes/hotel-reservation-theme/js/occupancy.js
Normal file
@@ -0,0 +1,340 @@
|
||||
/**
|
||||
* 2010-2023 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright 2010-2023 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
$(document).on('click', '.booking_occupancy_wrapper .remove-room-link', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
booking_occupancy_inner = $(this).closest('.booking_occupancy_inner');
|
||||
$(this).closest('.occupancy_info_block').remove();
|
||||
$(booking_occupancy_inner).find('.room_num_wrapper').each(function(key, val) {
|
||||
$(this).text(room_txt + ' - '+ (key+1) );
|
||||
});
|
||||
setRoomTypeGuestOccupancy($(booking_occupancy_inner).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_occupancy_wrapper .occupancy_quantity_up', function(e) {
|
||||
e.preventDefault();
|
||||
// set input field value
|
||||
let max_guests_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_guests').val();
|
||||
let element = $(this).closest('.occupancy_count_block').find('.num_occupancy');
|
||||
let elementVal = parseInt(element.val());
|
||||
|
||||
let current_room_occupancy = 0;
|
||||
$(this).closest('.occupancy_info_block').find('.num_occupancy').each(function(){
|
||||
current_room_occupancy += parseInt($(this).val());
|
||||
});
|
||||
let max_allowed_for_current = (max_guests_in_room - current_room_occupancy) + elementVal;
|
||||
|
||||
let childElement = $(this).closest('.occupancy_count_block').find('.num_children').length;
|
||||
if (childElement) {
|
||||
let max_child_in_room;
|
||||
if ($(this).closest(".booking_occupancy_wrapper").find('.max_children').val()) {
|
||||
max_child_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_children').val();
|
||||
} else {
|
||||
max_child_in_room = window.max_child_in_room;
|
||||
}
|
||||
if (elementVal < max_child_in_room && elementVal < max_allowed_for_current) {
|
||||
element.val(elementVal + 1);
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').show();
|
||||
|
||||
let roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index'));
|
||||
|
||||
let childAgeSelect = '<div class="col-xs-6 col-sm-12 col-md-6">';
|
||||
childAgeSelect += '<select class="guest_child_age room_occupancies" name="occupancy[' +roomBlockIndex+ '][child_ages][]">';
|
||||
childAgeSelect += '<option value="-1">' + select_age_txt + '</option>';
|
||||
childAgeSelect += '<option value="0">' + under_1_age + '</option>';
|
||||
for (let age = 1; age < max_child_age; age++) {
|
||||
childAgeSelect += '<option value="'+age+'">'+age+'</option>';
|
||||
}
|
||||
childAgeSelect += '</select>';
|
||||
childAgeSelect += '</div>';
|
||||
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect);
|
||||
|
||||
// set input field value
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal + 1);
|
||||
}
|
||||
} else {
|
||||
let max_adults_in_room;
|
||||
if ($(this).closest(".booking_occupancy_wrapper").find('.max_adults').val()) {
|
||||
max_adults_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_adults').val();
|
||||
}
|
||||
if (elementVal < max_adults_in_room && elementVal < max_allowed_for_current) {
|
||||
element.val(elementVal + 1);
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal + 1);
|
||||
}
|
||||
}
|
||||
setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_occupancy_wrapper .occupancy_quantity_down', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// set input field value
|
||||
var element = $(this).closest('.occupancy_count_block').find('.num_occupancy');
|
||||
var elementVal = parseInt(element.val()) - 1;
|
||||
var childElement = $(this).closest('.occupancy_count_block').find('.num_children').length;
|
||||
|
||||
if (childElement) {
|
||||
if (elementVal < 0) {
|
||||
elementVal = 0;
|
||||
} else {
|
||||
$(this).closest('.occupancy_info_block').find('.children_ages select').last().closest('div').remove();
|
||||
if (elementVal <= 0) {
|
||||
$(this).closest('.occupancy_info_block').find('.children_age_info_block').hide();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (elementVal == 0) {
|
||||
elementVal = 1;
|
||||
}
|
||||
}
|
||||
|
||||
element.val(elementVal);
|
||||
// set input field value
|
||||
$(this).closest('.occupancy_count_block').find('.occupancy_count > span').text(elementVal);
|
||||
|
||||
setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper'));
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_guest_occupancy', function(e) {
|
||||
$('.booking_guest_occupancy_conatiner .dropdown').removeClass('open');
|
||||
$(this).parent().toggleClass('open');
|
||||
});
|
||||
|
||||
$(document).on('click', function(e) {
|
||||
if ($('.booking_occupancy_wrapper:visible').length) {
|
||||
var occupancy_wrapper = $('.booking_occupancy_wrapper:visible');
|
||||
$(occupancy_wrapper).find(".occupancy_info_block").addClass('selected');
|
||||
setRoomTypeGuestOccupancy(occupancy_wrapper);
|
||||
if (!($(e.target).closest(".booking_occupancy_wrapper").length || $(e.target).closest(".booking_guest_occupancy").length || $(e.target).closest(".ajax_add_to_cart_button").length || $(e.target).closest(".exclusive.book_now_submit").length)) {
|
||||
let hasErrors = 0;
|
||||
|
||||
let adults = $(occupancy_wrapper).find(".num_adults").map(function(){return $(this).val();}).get();
|
||||
let children = $(occupancy_wrapper).find(".num_children").map(function(){return $(this).val();}).get();
|
||||
let child_ages = $(occupancy_wrapper).find(".guest_child_age").map(function(){return $(this).val();}).get();
|
||||
|
||||
// start validating above values
|
||||
if (!adults.length || (adults.length != children.length)) {
|
||||
hasErrors = 1;
|
||||
showErrorMessage(invalid_occupancy_txt);
|
||||
} else {
|
||||
$(occupancy_wrapper).find('.occupancy_count').removeClass('error_border');
|
||||
|
||||
// validate values of adults and children
|
||||
adults.forEach(function (item, index) {
|
||||
if (isNaN(item) || parseInt(item) < 1) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
if (isNaN(children[index])) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border');
|
||||
}
|
||||
});
|
||||
|
||||
// validate values of selected child ages
|
||||
$(occupancy_wrapper).find('.guest_child_age').removeClass('error_border');
|
||||
child_ages.forEach(function (age, index) {
|
||||
age = parseInt(age);
|
||||
if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) {
|
||||
hasErrors = 1;
|
||||
$(occupancy_wrapper).find(".guest_child_age").eq(index).addClass('error_border');
|
||||
}
|
||||
});
|
||||
}
|
||||
if (hasErrors == 0) {
|
||||
$(occupancy_wrapper).parent().removeClass('open');
|
||||
$(occupancy_wrapper).siblings(".booking_guest_occupancy").removeClass('error_border');
|
||||
|
||||
$(document).trigger( "QloApps:updateRoomOccupancy", [occupancy_wrapper]);
|
||||
} else {
|
||||
$(occupancy_wrapper).siblings(".booking_guest_occupancy").addClass('error_border');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on('click', '.booking_occupancy_wrapper .add_new_occupancy_btn', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var booking_occupancy_wrapper = $(this).closest('.booking_occupancy_wrapper');
|
||||
var occupancy_block = '';
|
||||
var roomBlockIndex = parseInt($(booking_occupancy_wrapper).find(".occupancy_info_block").last().attr('occ_block_index'));
|
||||
roomBlockIndex += 1;
|
||||
|
||||
|
||||
var countRooms = parseInt($(booking_occupancy_wrapper).find('.occupancy_info_block').length);
|
||||
countRooms += 1
|
||||
if ($(booking_occupancy_wrapper).find('.max_avail_type_qty').val() > 0
|
||||
&& countRooms <= $(booking_occupancy_wrapper).find('.max_avail_type_qty').val()
|
||||
) {
|
||||
occupancy_block += '<div class="occupancy_info_block" occ_block_index="'+roomBlockIndex+'">';
|
||||
occupancy_block += '<div class="occupancy_info_head"><span class="room_num_wrapper">'+ room_txt + ' - ' + countRooms + '</span><a class="remove-room-link pull-right" href="#">' + remove_txt + '</a></div>';
|
||||
occupancy_block += '<div class="row">';
|
||||
occupancy_block += '<div class="form-group col-sm-5 col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<div class="row">';
|
||||
occupancy_block += '<label class="col-sm-12">' + adults_txt + '</label>';
|
||||
occupancy_block += '<div class="col-sm-12">';
|
||||
occupancy_block += '<input type="hidden" class="num_occupancy num_adults" name="occupancy['+roomBlockIndex+'][adults]" value="1">';
|
||||
occupancy_block += '<div class="occupancy_count pull-left">';
|
||||
occupancy_block += '<span>1</span>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="qty_direction pull-left">';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">';
|
||||
occupancy_block += '<span><i class="icon-plus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">';
|
||||
occupancy_block += '<span><i class="icon-minus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group col-sm-7 col-xs-6 occupancy_count_block">';
|
||||
occupancy_block += '<div class="row">';
|
||||
occupancy_block += '<label class="col-sm-12">' + child_txt + '<span class="label-desc-txt">(' + below_txt + ' ' + max_child_age + ' ' + years_txt + ')</span></label>';
|
||||
occupancy_block += '<div class="col-sm-12">';
|
||||
occupancy_block += '<input type="hidden" class="num_occupancy num_children room_occupancies" name="occupancy['+roomBlockIndex+'][children]" value="0">';
|
||||
occupancy_block += '<div class="occupancy_count pull-left">';
|
||||
occupancy_block += '<span>0</span>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="qty_direction pull-left">';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_up">';
|
||||
occupancy_block += '<span><i class="icon-plus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '<a href="#" data-field-qty="qty" class="btn btn-default occupancy_quantity_down">';
|
||||
occupancy_block += '<span><i class="icon-minus"></i></span>';
|
||||
occupancy_block += '</a>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<div class="form-group row children_age_info_block">';
|
||||
occupancy_block += '<label class="col-sm-12">' + all_children_txt + '</label>';
|
||||
occupancy_block += '<div class="col-sm-12">';
|
||||
occupancy_block += '<div class="row children_ages">';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '</div>';
|
||||
occupancy_block += '<hr class="occupancy-info-separator">';
|
||||
occupancy_block += '</div>';
|
||||
|
||||
$(booking_occupancy_wrapper).find('.booking_occupancy_inner').append(occupancy_block);
|
||||
|
||||
// scroll to the latest added room
|
||||
// var objDiv = document.getElementById("booking_occupancy_wrapper");
|
||||
// objDiv.scrollTop = objDiv.scrollHeight;
|
||||
$(booking_occupancy_wrapper).animate({ scrollTop: $(booking_occupancy_wrapper).prop('scrollHeight') }, "slow");
|
||||
|
||||
}
|
||||
|
||||
setRoomTypeGuestOccupancy(booking_occupancy_wrapper);
|
||||
});
|
||||
|
||||
// The button to increment the product value
|
||||
$(document).on('click', '.rm_quantity_up', function(e){
|
||||
e.preventDefault();
|
||||
|
||||
var element = $(this).closest('.rm_qty_cont').find('.quantity_wanted');
|
||||
var elementVal = parseInt(element.val()) + 1;
|
||||
let quantityAvailableT = $(this).closest('.rm_qty_cont').find(".max_avail_type_qty").val();
|
||||
if (isNaN(elementVal) || elementVal > quantityAvailableT) {
|
||||
elementVal = quantityAvailableT;
|
||||
}
|
||||
element.val(elementVal);
|
||||
$(this).closest('.rm_qty_cont').find('.qty_count > span').text(elementVal);
|
||||
$(document).trigger( "QloApps:updateRoomQuantity", [element]);
|
||||
});
|
||||
|
||||
// The button to decrement the product value
|
||||
$(document).on('click', '.rm_quantity_down', function(e){
|
||||
e.preventDefault();
|
||||
var element = $(this).closest('.rm_qty_cont').find('.quantity_wanted');
|
||||
var elementVal = parseInt(element.val()) - 1;
|
||||
if (isNaN(elementVal) || elementVal < 1) {
|
||||
elementVal = 1;
|
||||
}
|
||||
|
||||
element.val(elementVal);
|
||||
$(this).closest('.rm_qty_cont').find('.qty_count > span').text(elementVal);
|
||||
$(document).trigger( "QloApps:updateRoomQuantity", [element]);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
function setRoomTypeGuestOccupancy(booking_occupancy_wrapper)
|
||||
{
|
||||
var adults = 0;
|
||||
var children = 0;
|
||||
var rooms = $(booking_occupancy_wrapper).find('.occupancy_info_block').length;
|
||||
|
||||
$(booking_occupancy_wrapper).find(".num_adults" ).each(function(key, val) {
|
||||
adults += parseInt($(this).val());
|
||||
});
|
||||
$(booking_occupancy_wrapper).find(".num_children" ).each(function(key, val) {
|
||||
children += parseInt($(this).val());
|
||||
});
|
||||
guestButtonVal = getRoomTypeGuestOccupancyFormated(adults, children, rooms);
|
||||
$(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(guestButtonVal);
|
||||
}
|
||||
|
||||
function getRoomTypeGuestOccupancyFormated(adults, children, rooms)
|
||||
{
|
||||
var guestButtonVal = parseInt(adults) + ' ';
|
||||
if (parseInt(adults) > 1) {
|
||||
guestButtonVal += adults_txt;
|
||||
} else {
|
||||
guestButtonVal += adult_txt;
|
||||
}
|
||||
if (parseInt(children) > 0) {
|
||||
if (parseInt(children) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt;
|
||||
}
|
||||
}
|
||||
if (parseInt(rooms) > 1) {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt;
|
||||
} else {
|
||||
guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt;
|
||||
}
|
||||
|
||||
return guestButtonVal;
|
||||
}
|
||||
|
||||
|
||||
function resetOccupancyField(booking_occupancy_wrapper)
|
||||
{
|
||||
$(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(select_occupancy_txt);
|
||||
$(booking_occupancy_wrapper).find('.booking_occupancy_inner > div').each(function(index, element){
|
||||
let num_adults = $(booking_occupancy_wrapper).find('.base_adult').val();
|
||||
if (index == 0) {
|
||||
$(this).removeClass('selected');
|
||||
$(this).find('.num_adults').val(num_adults).siblings('.occupancy_count').find('span').text(num_adults);
|
||||
$(this).find('.num_children').val(0).siblings('.occupancy_count').find('span').text(0);
|
||||
$(this).find('.children_ages > div').remove();
|
||||
} else {
|
||||
$(element).remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -297,34 +297,6 @@ if (typeof(contentOnly) != 'undefined' && contentOnly) {
|
||||
});
|
||||
}
|
||||
|
||||
// The button to increase the number of rooms value
|
||||
$(document).on('click', '.product_quantity_up', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
let numRoomsWanted = parseInt($('#quantity_wanted').val());
|
||||
let numRoomsMaxAvailable = parseInt($('#max_avail_type_qty').val());
|
||||
|
||||
if (numRoomsWanted <= numRoomsMaxAvailable) {
|
||||
if (numRoomsWanted < numRoomsMaxAvailable) {
|
||||
$('#quantity_wanted').val(numRoomsWanted + 1);
|
||||
}
|
||||
BookingForm.refresh();
|
||||
} else if ((numRoomsWanted < 1 || numRoomsWanted > numRoomsMaxAvailable) && numRoomsMaxAvailable > 0) {
|
||||
$('#quantity_wanted').val(numRoomsMaxAvailable);
|
||||
}
|
||||
});
|
||||
|
||||
// The button to decrease the number of rooms value
|
||||
$(document).on('click', '.product_quantity_down', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
let numRoomsWanted = parseInt($('#quantity_wanted').val());
|
||||
if (numRoomsWanted > 1) {
|
||||
$('#quantity_wanted').val(numRoomsWanted - 1);
|
||||
BookingForm.refresh();
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof minimalQuantity != 'undefined' && minimalQuantity) {
|
||||
checkMinimalQuantity();
|
||||
$(document).on('keyup', 'input[name=qty]', function(e) {
|
||||
@@ -1056,15 +1028,23 @@ function checkUrl() {
|
||||
/*java script code by webkul on produt page.*/
|
||||
/*#####################################################################*/
|
||||
$(document).ready(function() {
|
||||
if (!$('#max_avail_type_qty').length || $('#max_avail_type_qty').val() < 1) {
|
||||
if (!$('.max_avail_type_qty').length || $('.max_avail_type_qty').val() < 1) {
|
||||
disableRoomTypeDemands(1);
|
||||
} else {
|
||||
disableRoomTypeDemands(0);
|
||||
}
|
||||
|
||||
BookingForm.initDatepicker();
|
||||
BookingForm.init();
|
||||
|
||||
$(document).on('focusout', '#quantity_wanted', function(e) {
|
||||
// $(document).on('focusout', '#quantity_wanted', function(e) {
|
||||
// BookingForm.refresh();
|
||||
// });
|
||||
|
||||
$(document).on('QloApps:updateRoomOccupancy', function(e) {
|
||||
BookingForm.refresh();
|
||||
});
|
||||
|
||||
$(document).on('QloApps:updateRoomQuantity', function(e) {
|
||||
BookingForm.refresh();
|
||||
});
|
||||
|
||||
@@ -1081,6 +1061,7 @@ $(document).ready(function() {
|
||||
BookingForm.refresh();
|
||||
});
|
||||
|
||||
|
||||
// Accordian for extra demand
|
||||
function close_accordion_section() {
|
||||
$('.accordion .accordion-section-title').removeClass('active');
|
||||
@@ -1138,110 +1119,72 @@ var BookingForm = {
|
||||
currentRequest: null,
|
||||
init: function() {
|
||||
this.currentRequest = null;
|
||||
BookingForm.initDatepicker();
|
||||
BookingForm.initDatepicker(max_order_date, preparation_time, $('#room_check_in').val(), $('#room_check_out').val());
|
||||
},
|
||||
initDatepicker: function() {
|
||||
// date from
|
||||
$("#room_check_in").datepicker({
|
||||
showOtherMonths: true,
|
||||
dateFormat: 'dd-mm-yy',
|
||||
minDate: preparation_time,
|
||||
beforeShow: function (input, instance) {
|
||||
// So that on translating page date is translated to NaN-NaN-NaN
|
||||
$('.ui-datepicker').addClass('notranslate');
|
||||
},
|
||||
beforeShowDay: function (date) {
|
||||
// highlight dates of the selected date range
|
||||
return highlightSelectedDateRange(date, $("#room_check_in").val(), $("#room_check_out").val());
|
||||
},
|
||||
onClose: function() {
|
||||
var selectedDate = $("#room_check_in").val();
|
||||
initDatepicker: function(max_order_date, preparation_time, dateFrom, dateTo) {
|
||||
let start_date = new Date();
|
||||
if (preparation_time) {
|
||||
start_date.setDate(start_date.getDate() + parseInt(preparation_time));
|
||||
start_date.setHours(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
var date_from_format = selectedDate.split("-");
|
||||
var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_from_format[2], date_from_format[1] - 1, date_from_format[0])));
|
||||
var date_in = $.datepicker.formatDate('yy-mm-dd', selectedDate);
|
||||
|
||||
var date_to_format = $('#room_check_out').val().split("-");
|
||||
var selectedDateTo = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_to_format[2], date_to_format[1] - 1, date_to_format[0])));
|
||||
|
||||
var date_out = $.datepicker.formatDate('yy-mm-dd', selectedDateTo);
|
||||
|
||||
if (date_in >= date_out) {
|
||||
selectedDate.setDate(selectedDate.getDate() + 1);
|
||||
$("#room_check_out").datepicker("option", "minDate", selectedDate);
|
||||
$("#room_check_out").val($.datepicker.formatDate('dd-mm-yy', selectedDate));
|
||||
$('#room_check_out').datepicker('show');
|
||||
}
|
||||
BookingForm.refresh();
|
||||
}
|
||||
});
|
||||
|
||||
// date to
|
||||
$("#room_check_out").datepicker({
|
||||
showOtherMonths: true,
|
||||
dateFormat: 'dd-mm-yy',
|
||||
minDate: preparation_time + 1,
|
||||
beforeShow: function (input, instance) {
|
||||
// So that on translating page date is translated to NaN-NaN-NaN
|
||||
$('.ui-datepicker').addClass('notranslate');
|
||||
|
||||
var date_to = $('#room_check_in').val();
|
||||
if (typeof date_to != 'undefined' && date_to != '') {
|
||||
var date_format = date_to.split("-");
|
||||
var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format[2], date_format[1] - 1, date_format[0])));
|
||||
selectedDate.setDate(selectedDate.getDate()+1);
|
||||
$("#room_check_out").datepicker("option", "minDate", selectedDate);
|
||||
} else {
|
||||
var date_format = new Date();
|
||||
var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date()));
|
||||
selectedDate.setDate(selectedDate.getDate()+1);
|
||||
$("#room_check_out").datepicker("option", "minDate", selectedDate);
|
||||
}
|
||||
},
|
||||
beforeShowDay: function (date) {
|
||||
// highlight dates of the selected date range
|
||||
return highlightSelectedDateRange(date, $("#room_check_in").val(), $("#room_check_out").val());
|
||||
},
|
||||
onSelect: function(dateText, instance) {
|
||||
var date_from_format = $('#room_check_in').val().split("-");
|
||||
var selectedDateFrom = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_from_format[2], date_from_format[1] - 1, date_from_format[0])));
|
||||
var date_in = $.datepicker.formatDate('yy-mm-dd', selectedDateFrom);
|
||||
var date_to_format = $('#room_check_out').val().split("-");
|
||||
var selectedDateTo = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_to_format[2], date_to_format[1] - 1, date_to_format[0])));
|
||||
var date_out = $.datepicker.formatDate('yy-mm-dd', selectedDateTo);
|
||||
|
||||
if (date_out > date_in) {
|
||||
BookingForm.refresh();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// set max order date
|
||||
if (max_order_date) {
|
||||
var maxDateFrom = new Date(max_order_date);
|
||||
maxDateFrom.setDate(maxDateFrom.getDate() - 1);
|
||||
var maxDateTo = new Date(max_order_date);
|
||||
if($('#room_check_in').datepicker('getDate') > maxDateFrom) {
|
||||
$('#room_check_in').val('');
|
||||
max_order_date = $.datepicker.parseDate('yy-mm-dd', max_order_date );
|
||||
} else {
|
||||
max_order_date = false;
|
||||
}
|
||||
if (typeof $('#room_date_range').data('dateRangePicker') != 'undefined') {
|
||||
if (max_order_date) {
|
||||
if ($.datepicker.parseDate('yy-mm-dd', $('#room_check_out').val()) < max_order_date) {
|
||||
dateFrom = $('#room_check_in').val();
|
||||
dateTo = $('#room_check_out').val();
|
||||
}
|
||||
}
|
||||
if($('#room_check_out').datepicker('getDate') > maxDateTo) {
|
||||
$('#room_check_out').val('');
|
||||
$('#room_date_range').data('dateRangePicker').clear();
|
||||
$('#room_date_range').data('dateRangePicker').destroy();
|
||||
$("#room_date_range").off("datepicker-change");
|
||||
}
|
||||
|
||||
if (max_order_date) {
|
||||
max_order_date = $.datepicker.formatDate('dd-mm-yy', max_order_date);
|
||||
}
|
||||
$('#room_date_range').dateRangePicker({
|
||||
startDate: $.datepicker.formatDate('dd-mm-yy', new Date()),
|
||||
endDate: max_order_date,
|
||||
startDate: start_date,
|
||||
}).on('datepicker-change', function(event,obj){
|
||||
$('#room_check_in').val($.datepicker.formatDate('yy-mm-dd', obj.date1));
|
||||
$('#room_check_out').val($.datepicker.formatDate('yy-mm-dd', obj.date2));
|
||||
BookingForm.refresh();
|
||||
});
|
||||
|
||||
$('body button').on('click', '', function() {
|
||||
if (!$(this).closest('.date-picker-wrapper').length) {
|
||||
$('#room_date_range').data('dateRangePicker').close();
|
||||
}
|
||||
$('#room_check_in').datepicker('option', 'maxDate', maxDateFrom);
|
||||
$('#room_check_out').datepicker('option', 'maxDate', maxDateTo);
|
||||
});
|
||||
if (dateFrom && dateTo) {
|
||||
$('#room_date_range').data('dateRangePicker').setDateRange(
|
||||
$.datepicker.formatDate('dd-mm-yy', $.datepicker.parseDate('yy-mm-dd', dateFrom)),
|
||||
$.datepicker.formatDate('dd-mm-yy', $.datepicker.parseDate('yy-mm-dd', dateTo))
|
||||
);
|
||||
}
|
||||
},
|
||||
getFormData: function () {
|
||||
var quantity = parseInt($('#quantity_wanted').val());
|
||||
quantity = (isNaN(quantity) || quantity < 1) ? 1 : quantity;
|
||||
// var quantity = parseInt($('#quantity_wanted').val());
|
||||
// quantity = (isNaN(quantity) || quantity < 1) ? 1 : quantity;
|
||||
|
||||
var data = {
|
||||
id_product: parseInt($('#product_page_product_id').val()),
|
||||
date_from: $('#room_check_in').val(),
|
||||
date_to: $('#room_check_out').val(),
|
||||
quantity: quantity,
|
||||
// quantity: quantity,
|
||||
room_type_demands: JSON.stringify(getRoomsExtraDemands()),
|
||||
};
|
||||
if (occupancy = getBookingOccupancy()) {
|
||||
data.occupancy = occupancy;
|
||||
}
|
||||
|
||||
return data;
|
||||
},
|
||||
refresh: function() {
|
||||
@@ -1259,12 +1202,18 @@ var BookingForm = {
|
||||
if(BookingForm.currentRequest != null) {
|
||||
BookingForm.currentRequest.abort();
|
||||
}
|
||||
$('.book_now_submit').prop('disabled', true).find('span:not(#booking_action_loader)').hide();
|
||||
$('#booking_action_block').find('#booking_action_loader').addClass('active');
|
||||
},
|
||||
success: function(response) {
|
||||
if (response.status == true) {
|
||||
$('.booking-form').replaceWith(response.html_booking_form);
|
||||
BookingForm.init();
|
||||
}
|
||||
},
|
||||
complete: function() {
|
||||
$('.book_now_submit').prop('disabled', false).find('span:not(#booking_action_loader)').show();
|
||||
$('#booking_action_block').find('#booking_action_loader').removeClass('active');
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -1310,3 +1259,49 @@ $(document).on('click', '.room_info_hotel_images_wrap .btn-show-more-images', fu
|
||||
const page = parseInt($(this).attr('data-next-page'));
|
||||
loadHotelImagesByPage(page);
|
||||
});
|
||||
|
||||
// get guest occupancies of the booking
|
||||
function getBookingOccupancy()
|
||||
{
|
||||
let bookingform = $("#booking-form");
|
||||
let occupancy;
|
||||
if (occupancy_required_for_booking) {
|
||||
let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected")
|
||||
if (selected_occupancy.length) {
|
||||
occupancy = [];
|
||||
$(selected_occupancy).each(function(ind, element) {
|
||||
if (parseInt($(element).find('.num_adults').val())) {
|
||||
let child_ages = [];
|
||||
$(element).find('.guest_child_age').each(function(index) {
|
||||
if ($(this).val() > -1) {
|
||||
child_ages.push($(this).val());
|
||||
}
|
||||
});
|
||||
if ($(element).find('.num_children').val()) {
|
||||
if (child_ages.length != $(element).find('.num_children').val()) {
|
||||
$(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
occupancy.push({
|
||||
'adults': $(element).find('.num_adults').val(),
|
||||
'children': $(element).find('.num_children').val(),
|
||||
'child_ages': child_ages
|
||||
});
|
||||
} else {
|
||||
// $(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// $(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open')
|
||||
occupancy = false;
|
||||
}
|
||||
} else {
|
||||
occupancy = parseInt($(bookingform).find(".quantity_wanted").val());
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
}
|
||||
@@ -67,11 +67,6 @@
|
||||
<!-- <span class="quantity-formated"><span class="quantity">{$cart_booking_data[$data_k]['total_num_rooms']}</span> x </span> -->
|
||||
<a class="cart_block_product_name" href="{$link->getProductLink($product, $product.link_rewrite, $product.category, null, null, $product.id_shop, $product.id_product_attribute)|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}">{$product.name|truncate:30:'...':true|escape:'html':'UTF-8'}</a>
|
||||
</div>
|
||||
<!-- extra fields added by webkul to show on the cart -->
|
||||
<div class="room-capacity cart-info-sec">
|
||||
<span class="product_info_label">{l s='Capacity' mod='blockcart'}:</span>
|
||||
<span class="product_info_data"> {$cart_booking_data[$data_k]['adult']} {l s='Adults' mod='blockcart'} & {$cart_booking_data[$data_k]['children']} {l s='Children' mod='blockcart'}</span>
|
||||
</div>
|
||||
|
||||
{if isset($product.attributes_small)}
|
||||
<div class="product-atributes">
|
||||
@@ -118,7 +113,7 @@
|
||||
{foreach from=$cart_booking_data[$data_k]['date_diff'] key=data_k1 item=data_v}
|
||||
<tr class="rooms_remove_container">
|
||||
<td>
|
||||
{$data_v['data_form']|date_format:"%d %b %Y"} - {$data_v['data_to']|date_format:"%d %b %Y"}
|
||||
{$data_v['data_form']|date_format:"%d-%m-%Y"} - {$data_v['data_to']|date_format:"%d-%m-%Y"}
|
||||
</td>
|
||||
<td class="num_rooms_in_date">{$data_v['num_rm']}</td>
|
||||
<td>{convertPrice price=$data_v['amount']}</td>
|
||||
@@ -271,11 +266,11 @@
|
||||
<span id="layer_cart_product_time_duration"></span>
|
||||
</div>
|
||||
<div>
|
||||
<strong class="dark">{l s='Rooms Quantity Added' mod='blockcart'} - </strong>
|
||||
<strong class="dark">{if isset($occupancy_required_for_booking) && $occupancy_required_for_booking}{l s='Room occupancy' mod='blockcart'}{else}{l s='Rooms quantity added' mod='blockcart'}{/if} - </strong>
|
||||
<span id="layer_cart_product_quantity"></span>
|
||||
</div>
|
||||
<div>
|
||||
<strong class="dark">{l s='Total Cart Cost of This Room Type' mod='blockcart'} - </strong>
|
||||
<strong class="dark">{l s='Room type cost' mod='blockcart'} - </strong>
|
||||
<span id="layer_cart_product_price"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<p>
|
||||
{$rm_v['num_rm']}
|
||||
{if $rm_v['adults'] <= 9}0{$rm_v['adults']}{else}{$rm_v['adults']}{/if} {if $rm_v['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v['children']}, {if $rm_v['children'] <= 9}0{$rm_v['children']}{else} {$rm_v['children']}{/if} {if $rm_v['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}<br>{if $rm_v['num_rm'] <= 9}0{/if}{$rm_v['num_rm']} {if $rm_v['num_rm'] > 1}{l s='Rooms'}{else}{l s='Room'}{/if}
|
||||
</p>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
{if !$hasCompletelyRefunded}
|
||||
<a refund_fields_on="0" id="order_refund_request" class="btn btn-default pull-right" href="#" title="{l s='Proceed to refund'}"><span>{l s='Cancel Bookings'}</span></a>
|
||||
{/if}
|
||||
|
||||
|
||||
{if isset($id_cms_refund_policy) && $id_cms_refund_policy}<a target="_blank" class="btn btn-default pull-right refund_policy_link" href="{$link->getCMSLink($id_cms_refund_policy)|escape:'html':'UTF-8'}">{l s='Refund Policies'}</a>{/if}
|
||||
{/if}
|
||||
{hook h='displayBookingAction' id_order=$order->id}
|
||||
@@ -158,7 +158,6 @@
|
||||
<th class="cart_product">{l s='Room Image'}</th>
|
||||
<th class="cart_description">{l s='Room Description'}</th>
|
||||
<th>{l s='Hotel Name'}</th>
|
||||
<th>{l s='Room Capacity'}</th>
|
||||
<th class="cart_unit">{l s='Unit Price'}</th>
|
||||
<th>{l s='Rooms'}</th>
|
||||
<th>{l s='Check-in Date'}</th>
|
||||
@@ -364,11 +363,6 @@
|
||||
{/if}
|
||||
</td>
|
||||
<td>{$data_v['hotel_name']|escape:'html':'UTF-8'}</td>
|
||||
<td>
|
||||
<p class="text-left">
|
||||
{$data_v['adult']|escape:'html':'UTF-8'} {l s='Adults'}, {$data_v['children']|escape:'html':'UTF-8'} {l s='Children'}
|
||||
</p>
|
||||
</td>
|
||||
<td class="cart_unit">
|
||||
<p class="text-center">
|
||||
{if $group_use_tax}
|
||||
@@ -392,7 +386,11 @@
|
||||
{/if}
|
||||
</p>
|
||||
</td>
|
||||
<td class="text-center">{$rm_v['num_rm']|escape:'html':'UTF-8'}</td>
|
||||
<td class="text-center">
|
||||
<p>
|
||||
{if $rm_v['adults'] <= 9}0{$rm_v['adults']}{else}{$rm_v['adults']}{/if} {if $rm_v['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v['children']}, {if $rm_v['children'] <= 9}0{$rm_v['children']}{else} {$rm_v['children']}{/if} {if $rm_v['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}<br>{if $rm_v['num_rm'] <= 9}0{/if}{$rm_v['num_rm']} {if $rm_v['num_rm'] > 1}{l s='Rooms'}{else}{l s='Room'}{/if}
|
||||
</p>
|
||||
</td>
|
||||
<td class="text-center">{$rm_v['data_form']|date_format:"%d-%m-%Y"}</td>
|
||||
<td class="text-center">{$rm_v['data_to']|date_format:"%d-%m-%Y"}</td>
|
||||
<td class="cart_total text-left">
|
||||
|
||||
@@ -187,13 +187,13 @@
|
||||
{$product->description}
|
||||
</div>
|
||||
</div>
|
||||
{if isset($product->capacity['adult']) && isset($product->capacity['children']) }
|
||||
{if isset($product->capacity['adults']) && isset($product->capacity['children']) }
|
||||
<div class="info_margin_div">
|
||||
<div class="room_info_heading">
|
||||
<span>{l s='Max Capacity'}</span>
|
||||
</div>
|
||||
<div class="room_info_content">
|
||||
<p> {$product->capacity['adult']} {l s='Adults'}, {$product->capacity['children']} {l s='child'}</p>
|
||||
<p> {$product->capacity['adults']} {l s='Adults'}, {$product->capacity['children']} {l s='child'}</p>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -133,16 +133,10 @@
|
||||
<p class="room_duration_block_head">{l s='CHECK OUT'}</p>
|
||||
<p class="room_duration_block_value">{$rm_v['data_to']|date_format:"%d %b, %a"}</p>
|
||||
</div>
|
||||
<div class="col-sm-2 col-xs-6">
|
||||
<p class="room_duration_block_head">{l s='ROOMS'}</p>
|
||||
<div class="col-sm-6 col-xs-6">
|
||||
<p class="room_duration_block_head">{l s='OCCUPANCY'}</p>
|
||||
<p class="room_duration_block_value">
|
||||
{if {$rm_v['num_rm']} <= 9}0{$rm_v['num_rm']}{else}{$rm_v['num_rm']}{/if}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-sm-4 col-xs-6">
|
||||
<p class="room_duration_block_head">{l s='NO. OF GUESTS'}</p>
|
||||
<p class="room_duration_block_value">
|
||||
{if {$data_v['adult']} <= 9}0{$data_v['adult']}{else}{$data_v['adult']}{/if} {l s='Adults'}, {if {$data_v['children']} <= 9}0{$data_v['children']}{else}{$data_v['children']}{/if} {l s='Child'}
|
||||
{if {$rm_v['adults']} <= 9}0{$rm_v['adults']}{else}{$rm_v['adults']}{/if} {if $rm_v['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v['children']}, {if $rm_v['children'] <= 9}0{$rm_v['children']}{else}{$rm_v['children']}{/if} {if $rm_v['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}, {if {$rm_v['num_rm']} <= 9}0{/if}{$rm_v['num_rm']}{if $rm_v['num_rm'] > 1} {l s='Rooms'}{else} {l s='Room'}{/if}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user