Merge branch 'webkul:develop' into fix-disable-dates
This commit is contained in:
@@ -74,7 +74,7 @@
|
||||
{else}
|
||||
<h2>{l s='No order was created from this cart.'}</h2>
|
||||
{if $customer->id}
|
||||
<a class="btn btn-default" href="{$link->getAdminLink('AdminOrders')|escape:'html':'UTF-8'}&id_cart={$cart->id|intval}&addorder"><i class="icon-shopping-cart"></i> {l s='Create an order from this cart.'}</a>
|
||||
<a class="btn btn-default" href="{$link->getAdminLink('AdminOrders')|escape:'html':'UTF-8'}&cart_id={$cart->id|intval}&addorder"><i class="icon-shopping-cart"></i> {l s='Create an order from this cart.'}</a>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -129,15 +129,15 @@
|
||||
<h3><i class="icon-link"></i> {l s="Help Center"}</h3>
|
||||
<dl>
|
||||
<dt><a href="https://qloapps.com/qlo-reservation-system/" class="_blank">{l s="Official Documentation"}</a></dt>
|
||||
<dd>{l s="Qloapps User Guide"}</dd>
|
||||
<dd>{l s="QloApps User Guide"}</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><a href="https://forums.qloapps.com/" class="_blank">{l s="Qloapps Forum"}</a></dt>
|
||||
<dd>{l s="Connect with the Qloapps community"}</dd>
|
||||
<dt><a href="https://forums.qloapps.com/" class="_blank">{l s="QloApps Forum"}</a></dt>
|
||||
<dd>{l s="Connect with the QloApps community"}</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><a href="https://qloapps.com/addons/" class="_blank">{l s="Qloapps Addons"}</a></dt>
|
||||
<dd>{l s="Enhance your store Qloapps modules"}</dd>
|
||||
<dt><a href="https://qloapps.com/addons/" class="_blank">{l s="QloApps Addons"}</a></dt>
|
||||
<dd>{l s="Enhance your store QloApps modules"}</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><a href="https://qloapps.com/contact/" class="_blank">{l s="Contact Us!"}</a></dt>
|
||||
@@ -148,4 +148,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -412,6 +412,17 @@
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="max_quantity_container" class="form-group" {if (!$product->available_for_order && $product->isAssociatedToShop()) || $product->auto_add_to_cart || !$product->allow_multiple_quantity}style="display:none;"{/if}>
|
||||
<label class="control-label col-lg-3" for="max_quantity">
|
||||
<span class="label-tooltip" data-toggle="tooltip"
|
||||
title="{l s='Enter max allowed quantity per room, enter 0 for unlimited.'}">
|
||||
{l s='Max quantity allow'}
|
||||
</span>
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" id="max_quantity" name="max_quantity" value="{$product->max_quantity|escape:'html':'UTF-8'}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-6 col-lg-offset-3">
|
||||
<div class="alert alert-info">
|
||||
|
||||
@@ -469,15 +469,6 @@ $(document).ready(function () {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-lg-2" for="sp_from_quantity">{l s='Starting at'}</label>
|
||||
<div class="col-lg-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">{l s='unit'}</span>
|
||||
<input type="text" name="sp_from_quantity" id="sp_from_quantity" value="1" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-lg-2" for="sp_price">{l s='product price'}
|
||||
{if $country_display_tax_label}
|
||||
|
||||
@@ -50,15 +50,6 @@
|
||||
<td><img src="{$data.image_link|escape:'html':'UTF-8'}" title="Room image" /></td>
|
||||
<td>
|
||||
<p>{$data.room_type|escape:'html':'UTF-8'}</p>
|
||||
{if isset($data.selected_demands) && $data.selected_demands}
|
||||
<ul class="extra-demand-list">
|
||||
{foreach $data.selected_demands as $selDemand}
|
||||
<li>
|
||||
{$selDemand.name|escape:'html':'UTF-8'}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/if}
|
||||
</td>
|
||||
<td>{dateFormat date=$data.date_from} - {dateFormat date=$data.date_to}</td>
|
||||
{if $occupancy_required_for_booking}
|
||||
@@ -85,7 +76,7 @@
|
||||
</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>
|
||||
<label>{l s='Children'} <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>
|
||||
@@ -153,7 +144,7 @@
|
||||
{if (isset($data.extra_demands) && $data.extra_demands) || isset($data.additional_service) && $data.additional_service}
|
||||
<br />
|
||||
<a href="#" id_room={$data.id_room|escape:'html':'UTF-8'} date_from="{$data.date_from|escape:'html':'UTF-8'}" date_to="{$data.date_to|escape:'html':'UTF-8'}" id_product="{$data.id_product|escape:'html':'UTF-8'}" id_cart="{$data.id_cart|escape:'html':'UTF-8'}" class="open_rooms_extra_demands btn btn-success" title="{l s='Click here to add or remove the extra services of this room type.'}">
|
||||
<i class="icon-plus"></i> {l s='Services'}
|
||||
<i class="icon-pencil"></i> {l s='Services'}
|
||||
</a>
|
||||
{/if}
|
||||
</td>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
{foreach $roomDemand['extra_demands'] as $demand}
|
||||
<tr>
|
||||
<td>{$demand['name']}</td>
|
||||
<td>{displayPrice price=$demand['total_price_tax_incl'] currency=$orderCurrency}</td>
|
||||
<td>{displayPrice price=$demand['total_price_tax_excl'] currency=$orderCurrency}</td>
|
||||
<td><a class="btn btn-danger pull-right del-order-room-demand" href="#" id_booking_demand="{$demand['id_booking_demand']}"><i class="icon-trash"></i></a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
@@ -96,7 +96,7 @@
|
||||
<div class="col-sm-12 room_demand_block">
|
||||
<p>
|
||||
<span>{$demand['name']}</span>
|
||||
<span class="pull-right">{displayPrice price=$demand['total_price_tax_incl'] currency=$orderCurrency}</span>
|
||||
<span class="pull-right">{displayPrice price=$demand['total_price_tax_excl'] currency=$orderCurrency}</span>
|
||||
</p>
|
||||
</div>
|
||||
{/foreach}
|
||||
|
||||
@@ -18,113 +18,113 @@
|
||||
*}
|
||||
|
||||
{if (isset($additionalServices) && $additionalServices) || (isset($roomTypeServiceProducts) && $roomTypeServiceProducts)}
|
||||
<div id="room_type_service_product_desc" class="tab-pane{if !(isset($extraDemands) && $extraDemands) && !(isset($roomTypeDemands) && $roomTypeDemands)} active{/if}">
|
||||
{if isset($orderEdit) && $orderEdit}
|
||||
<div id="room_type_service_product_desc" class="tab-pane{if !(isset($extraDemands) && $extraDemands) && !(isset($roomTypeDemands) && $roomTypeDemands)} active{/if}">
|
||||
{if isset($orderEdit) && $orderEdit}
|
||||
|
||||
<p class="col-sm-12 facility_nav_btn">
|
||||
<button id="btn_new_room_service" class="btn btn-success"><i class="icon-plus"></i> {l s='Add new service'}</button>
|
||||
<button id="back_to_service_btn" class="btn btn-default"><i class="icon-arrow-left"></i> {l s='Back'}</button>
|
||||
</p>
|
||||
<p class="col-sm-12 facility_nav_btn">
|
||||
<button id="btn_new_room_service" class="btn btn-success"><i class="icon-plus"></i> {l s='Add new service'}</button>
|
||||
<button id="back_to_service_btn" class="btn btn-default"><i class="icon-arrow-left"></i> {l s='Back'}</button>
|
||||
</p>
|
||||
|
||||
{* Already selected room services *}
|
||||
<div class="col-sm-12 room_ordered_services table-responsive">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
{foreach $additionalServices['additional_services'] as $service}
|
||||
<tr class="room_demand_block">
|
||||
<td>
|
||||
<div>{$service['name']|escape:'html':'UTF-8'}</div>
|
||||
{if $service['allow_multiple_quantity']}
|
||||
<div class="qty_container">
|
||||
<input type="number" class="form-control qty" data-id_room_type_service_product_order_detail="{$service['id_room_type_service_product_order_detail']}" data-id_product="{$service['id_product']|escape:'html':'UTF-8'}" value="{$service['quantity']|escape:'html':'UTF-8'}">
|
||||
</div>
|
||||
{/if}
|
||||
</td>
|
||||
<td>
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT}
|
||||
<span class="badge badge-info label">{l s='Convenience fee'}</span>
|
||||
{* Already selected room services *}
|
||||
<div class="col-sm-12 room_ordered_services table-responsive">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
{foreach $additionalServices['additional_services'] as $service}
|
||||
<tr class="room_demand_block">
|
||||
<td>
|
||||
<div>{$service['name']|escape:'html':'UTF-8'}</div>
|
||||
{if $service['allow_multiple_quantity']}
|
||||
<div class="qty_container">
|
||||
<input type="number" class="form-control qty" data-id_room_type_service_product_order_detail="{$service['id_room_type_service_product_order_detail']}" data-id_product="{$service['id_product']|escape:'html':'UTF-8'}" value="{$service['quantity']|escape:'html':'UTF-8'}">
|
||||
</div>
|
||||
{/if}
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_WITH_ROOM}
|
||||
<span class="badge badge-info label">{l s='Auto added'}</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td>{displayPrice price=$service['total_price_tax_excl']|escape:'html':'UTF-8' currency=$orderCurrency}</td>
|
||||
<td><a class="btn btn-danger pull-right del_room_additional_service" data-id_room_type_service_product_order_detail="{$service['id_room_type_service_product_order_detail']}" href="#"><i class="icon-trash"></i></a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{else}
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<i class="icon-warning"></i> {l s='No services added yet.'}
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<form id="add_room_services_form" class="col-sm-12 room_services_container">
|
||||
<div class="room_demand_detail">
|
||||
{if isset($roomTypeServiceProducts) && $roomTypeServiceProducts}
|
||||
{foreach $roomTypeServiceProducts as $product}
|
||||
<div class="row room_demand_block">
|
||||
<div class="col-xs-6">
|
||||
<div class="row">
|
||||
<div class="col-xs-2">
|
||||
<input data-id_booking_detail="{$id_booking_detail}" value="{$product['id_product']|escape:'html':'UTF-8'}" name="selected_service[]" type="checkbox" class="id_room_type_service"/>
|
||||
</div>
|
||||
<div class="col-xs-10">
|
||||
<p>{$product['name']|escape:'html':'UTF-8'}</p>
|
||||
{if $product.allow_multiple_quantity}
|
||||
<div class="qty_container">
|
||||
<input type="number" class="form-control qty" id="qty_{$product['id_product']|escape:'html':'UTF-8'}" name="service_qty[{$product['id_product']|escape:'html':'UTF-8'}]" data-id-product="{$product.id_product|escape:'html':'UTF-8'}" value="1">
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<p>
|
||||
<span class="pull-right">{convertPrice price=$product.price_tax_incl}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{else}
|
||||
<i class="icon-warning"></i> {l s='No services available to select, All services already added.'}
|
||||
{/if}
|
||||
</div>
|
||||
<input type="hidden" name="id_booking_detail" value="{$id_booking_detail}">
|
||||
<button type="submit" id="save_service_service" class="btn btn-success pull-right"><i class="icon-save"></i> {l s='Save'}</button>
|
||||
</form>
|
||||
|
||||
{elseif isset($additionalServices) && $additionalServices}
|
||||
<div class="row room_demand_detail">
|
||||
{foreach $additionalServices['additional_services'] as $service}
|
||||
<div class="col-sm-12 room_demand_block">
|
||||
<div class="row">
|
||||
<div class="col-xs-8">
|
||||
<span class="pull-right">
|
||||
<td>
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT}
|
||||
<span class="badge badge-info label">{l s='Convenience fee'}</span>
|
||||
{/if}
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_WITH_ROOM}
|
||||
<span class="badge badge-info label">{l s='Auto added'}</span>
|
||||
{/if}
|
||||
</span>
|
||||
<div>{$service['name']|escape:'html':'UTF-8'}</div>
|
||||
{if $service['allow_multiple_quantity']}
|
||||
<div class="quantity">{l s='Qty:'} {$service['quantity']|escape:'html':'UTF-8'}</div>
|
||||
{/if}
|
||||
|
||||
</td>
|
||||
<td>{displayPrice price=$service['total_price_tax_excl']|escape:'html':'UTF-8' currency=$orderCurrency}</td>
|
||||
<td><a class="btn btn-danger pull-right del_room_additional_service" data-id_room_type_service_product_order_detail="{$service['id_room_type_service_product_order_detail']}" href="#"><i class="icon-trash"></i></a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{else}
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<i class="icon-warning"></i> {l s='No services added yet.'}
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<form id="add_room_services_form" class="col-sm-12 room_services_container">
|
||||
<div class="room_demand_detail">
|
||||
{if isset($roomTypeServiceProducts) && $roomTypeServiceProducts}
|
||||
{foreach $roomTypeServiceProducts as $product}
|
||||
<div class="row room_demand_block">
|
||||
<div class="col-xs-6">
|
||||
<div class="row">
|
||||
<div class="col-xs-2">
|
||||
<input data-id_booking_detail="{$id_booking_detail}" value="{$product['id_product']|escape:'html':'UTF-8'}" name="selected_service[]" type="checkbox" class="id_room_type_service"/>
|
||||
</div>
|
||||
<div class="col-xs-10">
|
||||
<p>{$product['name']|escape:'html':'UTF-8'}</p>
|
||||
{if $product.allow_multiple_quantity}
|
||||
<div class="qty_container">
|
||||
<input type="number" class="form-control qty" id="qty_{$product['id_product']|escape:'html':'UTF-8'}" name="service_qty[{$product['id_product']|escape:'html':'UTF-8'}]" data-id-product="{$product.id_product|escape:'html':'UTF-8'}" value="1">
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
<span class="pull-right">{displayPrice price=$service['total_price_tax_excl'] currency=$orderCurrency}</span>
|
||||
<div class="col-xs-6">
|
||||
<p>
|
||||
<span class="pull-right">{convertPrice price=$product.price_tax_incl}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
{else}
|
||||
<i class="icon-warning"></i> {l s='No services available to select, All services already added.'}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<input type="hidden" name="id_booking_detail" value="{$id_booking_detail}">
|
||||
<button type="submit" id="save_service_service" class="btn btn-success pull-right"><i class="icon-save"></i> {l s='Save'}</button>
|
||||
</form>
|
||||
|
||||
{elseif isset($additionalServices) && $additionalServices}
|
||||
<div class="row room_demand_detail">
|
||||
{foreach $additionalServices['additional_services'] as $service}
|
||||
<div class="col-sm-12 room_demand_block">
|
||||
<div class="row">
|
||||
<div class="col-xs-8">
|
||||
<span class="pull-right">
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT}
|
||||
<span class="badge badge-info label">{l s='Convenience fee'}</span>
|
||||
{/if}
|
||||
{if $service['product_auto_add'] && $service['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_WITH_ROOM}
|
||||
<span class="badge badge-info label">{l s='Auto added'}</span>
|
||||
{/if}
|
||||
</span>
|
||||
<div>{$service['name']|escape:'html':'UTF-8'}</div>
|
||||
{if $service['allow_multiple_quantity']}
|
||||
<div class="quantity">{l s='Qty:'} {$service['quantity']|escape:'html':'UTF-8'}</div>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
<span class="pull-right">{displayPrice price=$service['total_price_tax_excl'] currency=$orderCurrency}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<i class="icon-user"></i> {l s='Room Type Additional Facilities'}
|
||||
</div>
|
||||
<div class="alert alert-info">
|
||||
{l s='To create new Additiona facilities '} <a target="_blank" href="{$link->getAdminLink('AdminRoomTypeGlobalDemand')}">{l s='click here.'}</a>
|
||||
{l s='To create new Additional facilities'} <a target="_blank" href="{$link->getAdminLink('AdminRoomTypeGlobalDemand')}">{l s='click here.'}</a>
|
||||
</div>
|
||||
{if isset($allDemands) && $allDemands}
|
||||
<div class="panel-group">
|
||||
@@ -112,4 +112,4 @@
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
@@ -54,7 +54,9 @@
|
||||
<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.'}
|
||||
{l s='Below, enter the maximum number of adults and children which can be accommodated in a room of this room type.'}
|
||||
<br>
|
||||
{l s='For maximum room occupancy, the total number of guests which can be accommodated in a room of this room type.'}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
|
||||
@@ -108,39 +108,39 @@ $(function() {
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if isset($products) && $products}
|
||||
{if isset($num_products) && $num_products}
|
||||
<div class="panel">
|
||||
<h3>
|
||||
{if $products|@count == 1}
|
||||
{if $num_products == 1}
|
||||
{l s='1 product'}
|
||||
{else}
|
||||
{l s='%d products' sprintf=$products|@count}
|
||||
{l s='%d products' sprintf=$num_products}
|
||||
{/if}
|
||||
</h3>
|
||||
{$products}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if isset($customers) && $customers}
|
||||
{if isset($num_customers) && $num_customers}
|
||||
<div class="panel">
|
||||
<h3>
|
||||
{if $customers|@count == 1}
|
||||
{if $num_customers == 1}
|
||||
{l s='1 customer'}
|
||||
{else}
|
||||
{l s='%d customers' sprintf=$customers|@count}
|
||||
{l s='%d customers' sprintf=$num_customers}
|
||||
{/if}
|
||||
</h3>
|
||||
{$customers}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if isset($orders) && $orders}
|
||||
{if isset($num_orders) && $num_orders}
|
||||
<div class="panel">
|
||||
<h3>
|
||||
{if $orders|@count == 1}
|
||||
{if $num_orders == 1}
|
||||
{l s='1 order'}
|
||||
{else}
|
||||
{l s='%d orders' sprintf=$orders|@count}
|
||||
{l s='%d orders' sprintf=$num_orders}
|
||||
{/if}
|
||||
</h3>
|
||||
{$orders}
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
{* <div class="form-group">
|
||||
<label for="id_manufacturer" class="control-label col-lg-3">{l s='Manufacturer'}</label>
|
||||
<div class="col-lg-9">
|
||||
<div class="col-lg-8">
|
||||
@@ -68,8 +68,8 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
</div> *}
|
||||
{* <div class="form-group">
|
||||
<label for="id_supplier" class="control-label col-lg-3">{l s='Supplier'}</label>
|
||||
<div class="col-lg-9">
|
||||
<div class="col-lg-8">
|
||||
@@ -85,8 +85,8 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
</div> *}
|
||||
{* <div class="form-group">
|
||||
<label for="id_attribute_group" class="control-label col-lg-3">{l s='Attributes'}</label>
|
||||
<div class="col-lg-9">
|
||||
<div class="col-lg-4">
|
||||
@@ -111,7 +111,7 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> *}
|
||||
<div class="form-group">
|
||||
<label for="id_feature" class="control-label col-lg-3">{l s='Features'}</label>
|
||||
<div class="col-lg-9">
|
||||
|
||||
@@ -1174,7 +1174,7 @@ abstract class AdminTabCore
|
||||
{
|
||||
/* Classical fields */
|
||||
foreach ($_POST as $key => $value) {
|
||||
if (array_key_exists($key, $object) && $key != 'id_'.$table) {
|
||||
if (property_exists($object, $key) && $key != 'id_'.$table) {
|
||||
/* Do not take care of password field if empty */
|
||||
if ($key == 'passwd' && Tools::getValue('id_'.$table) && empty($value)) {
|
||||
continue;
|
||||
|
||||
@@ -568,10 +568,6 @@ class CartCore extends ObjectModel
|
||||
$sql->where('cp.`id_product` = '.(int)$id_product);
|
||||
}
|
||||
$sql->where('p.`id_product` IS NOT NULL');
|
||||
// hide invisible products
|
||||
// if ($front) {
|
||||
// $sql->where('p.`is_invisible` = 0');
|
||||
// }
|
||||
|
||||
// Build ORDER BY
|
||||
$sql->orderBy('cp.`date_add`, cp.`id_product`, cp.`id_product_attribute` ASC');
|
||||
@@ -3523,7 +3519,7 @@ class CartCore extends ObjectModel
|
||||
$module = Module::getInstanceByName($module_name);
|
||||
|
||||
if (Validate::isLoadedObject($module)) {
|
||||
if (array_key_exists('id_carrier', $module)) {
|
||||
if (property_exists($module, 'id_carrier')) {
|
||||
$module->id_carrier = $carrier->id;
|
||||
}
|
||||
if ($carrier->need_range) {
|
||||
|
||||
@@ -585,7 +585,7 @@ class CustomerCore extends ObjectModel
|
||||
WHERE c.`id_customer` = '.(int)$this->id);
|
||||
|
||||
$result['last_visit'] = $result2['last_visit'];
|
||||
$result['age'] = ($result3['age'] != date('Y') ? $result3['age'] : '--');
|
||||
$result['age'] = (isset($result3['age']) && $result3['age'] != date('Y') ? $result3['age'] : '--');
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ class PageCore extends ObjectModel
|
||||
FROM `'._DB_PREFIX_.'page`
|
||||
WHERE `id_page_type` = '.(int)$page_type_id.$where;
|
||||
$result = Db::getInstance()->getRow($sql);
|
||||
if ($result['id_page']) {
|
||||
if (isset($result['id_page']) && $result['id_page']) {
|
||||
return $result['id_page'];
|
||||
}
|
||||
|
||||
|
||||
@@ -362,11 +362,11 @@ abstract class PaymentModuleCore extends Module
|
||||
$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) {
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_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) {
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$order->with_occupancy = 1;
|
||||
}
|
||||
}
|
||||
@@ -379,19 +379,23 @@ abstract class PaymentModuleCore extends Module
|
||||
(float)$this->context->cart->getOrderTotal(true, Cart::ADVANCE_PAYMENT, $order->product_list, $id_carrier),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
$order->amount_paid = (float)Tools::ps_round(
|
||||
(($order->advance_paid_amount * $amount_paid) / $this->context->cart->getOrderTotal(true, Cart::ADVANCE_PAYMENT, null, $id_carrier)),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
if ($totalOrder = $this->context->cart->getOrderTotal(true, Cart::ADVANCE_PAYMENT, null, $id_carrier)) {
|
||||
$order->amount_paid = (float)Tools::ps_round(
|
||||
(($order->advance_paid_amount * $amount_paid) / $totalOrder),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$order->advance_paid_amount = (float)Tools::ps_round(
|
||||
(float)$this->context->cart->getOrderTotal(true, Cart::BOTH, $order->product_list, $id_carrier),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
$order->amount_paid = (float)Tools::ps_round(
|
||||
(($order->advance_paid_amount * $amount_paid) / $this->context->cart->getOrderTotal(true, Cart::BOTH, null, $id_carrier)),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
if ($orderTotal = $this->context->cart->getOrderTotal(true, Cart::BOTH, null, $id_carrier)) {
|
||||
$order->amount_paid = (float)Tools::ps_round(
|
||||
(($order->advance_paid_amount * $amount_paid) / $orderTotal),
|
||||
_PS_PRICE_COMPUTE_PRECISION_
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Creating order
|
||||
|
||||
@@ -77,6 +77,9 @@ class ProductCore extends ObjectModel
|
||||
/** @var bool allow order for multiple quantities */
|
||||
public $allow_multiple_quantity;
|
||||
|
||||
/** @var bool max allowed quantities */
|
||||
public $max_quantity;
|
||||
|
||||
/** @var string available_now */
|
||||
public $available_now;
|
||||
|
||||
@@ -240,7 +243,6 @@ class ProductCore extends ObjectModel
|
||||
public $cache_has_attachments;
|
||||
public $is_virtual;
|
||||
public $booking_product;
|
||||
public $is_invisible;
|
||||
public $id_pack_product_attribute;
|
||||
public $cache_default_attribute;
|
||||
|
||||
@@ -297,7 +299,6 @@ class ProductCore extends ObjectModel
|
||||
'cache_has_attachments' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
|
||||
'is_virtual' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
|
||||
'booking_product' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
|
||||
'is_invisible' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
|
||||
'service_product_type' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
|
||||
|
||||
/* Shop fields */
|
||||
@@ -308,6 +309,7 @@ class ProductCore extends ObjectModel
|
||||
'ecotax' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice'),
|
||||
'minimal_quantity' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
|
||||
'allow_multiple_quantity' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
|
||||
'max_quantity' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
|
||||
'price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'required' => true),
|
||||
'wholesale_price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice'),
|
||||
'unity' => array('type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isString'),
|
||||
@@ -992,7 +994,7 @@ class ProductCore extends ObjectModel
|
||||
public function deleteServiceInfo()
|
||||
{
|
||||
if (!RoomTypeServiceProduct::deleteRoomProductLink($this->id)
|
||||
||RoomTypeServiceProductPrice::deleteRoomProductPrices($this->id)
|
||||
|| !RoomTypeServiceProductPrice::deleteRoomProductPrices($this->id)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
@@ -1339,7 +1341,6 @@ class ProductCore extends ObjectModel
|
||||
.($sub_category? ' AND product_shop.`id_category_default` = '.(int)$sub_category : '')
|
||||
.($front ? ' AND product_shop.`show_at_front` = 1':'')
|
||||
.(!is_null($auto_add_to_cart) ? ' AND product_shop.`auto_add_to_cart` = '.$auto_add_to_cart:'')
|
||||
.($front ? ' AND p.`is_invisible` = 0':'')
|
||||
.($available_for_order != 2 ? ' AND p.`available_for_order` = '.(int)$available_for_order:'')
|
||||
.($active ? ' AND product_shop.`active` = 1' : '');
|
||||
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
||||
@@ -1384,7 +1385,6 @@ class ProductCore extends ObjectModel
|
||||
.($sub_category? ' AND product_shop.`id_category_default` = '.(int)$sub_category : '')
|
||||
.($front ? ' AND product_shop.`show_at_front` = 1':'')
|
||||
.(!is_null($auto_add_to_cart) ? ' AND product_shop.`auto_add_to_cart` = '.$auto_add_to_cart:'')
|
||||
.($front ? ' AND p.`is_invisible` = 0':'')
|
||||
.($available_for_order != 2 ? ' AND p.`available_for_order` = '.(int)$available_for_order:'')
|
||||
.($active ? ' AND product_shop.`active` = 1' : '');
|
||||
|
||||
@@ -1429,7 +1429,6 @@ class ProductCore extends ObjectModel
|
||||
AND p.`service_product_type` = '.(int)self::SERVICE_PRODUCT_WITH_ROOMTYPE. '
|
||||
AND product_shop.`id_shop` = '.(int)$context->shop->id
|
||||
.($front ? ' AND product_shop.`auto_add_to_cart` = 0 AND product_shop.`show_at_front` = 1':'')
|
||||
.($front ? ' AND p.`is_invisible` = 0':'')
|
||||
.($active ? ' AND product_shop.`active` = 1' : '');
|
||||
|
||||
|
||||
|
||||
@@ -145,8 +145,7 @@ class SpecificPriceCore extends ObjectModel
|
||||
FROM `'._DB_PREFIX_.'specific_price`
|
||||
WHERE 1 '.self::filterOutField('id_product', $id_product).
|
||||
($id_product_attribute ? ' AND id_product_attribute = '.(int) $id_product_attribute : '').'
|
||||
AND id_cart = '.(int) $id_cart.'
|
||||
GROUP BY `id_specific_price_rule`'
|
||||
AND id_cart = '.(int) $id_cart
|
||||
);
|
||||
}
|
||||
|
||||
@@ -359,7 +358,7 @@ class SpecificPriceCore extends ObjectModel
|
||||
AND IF(`from_quantity` > 1, `from_quantity`, 0) <= ';
|
||||
|
||||
$query .= (Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION') || !$id_cart || !$real_quantity) ? (int)$quantity : max(1, (int)$real_quantity);
|
||||
$query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC, `to` DESC, `from` DESC';
|
||||
$query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `score` DESC, `to` DESC, `from` DESC';
|
||||
|
||||
SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query);
|
||||
}
|
||||
|
||||
@@ -345,7 +345,7 @@ class ThemeCore extends ObjectModel
|
||||
public function toggleResponsive()
|
||||
{
|
||||
// Object must have a variable called 'responsive'
|
||||
if (!array_key_exists('responsive', $this)) {
|
||||
if (!property_exists($this, 'responsive')) {
|
||||
throw new PrestaShopException('property "responsive" is missing in object '.get_class($this));
|
||||
}
|
||||
|
||||
@@ -361,7 +361,7 @@ class ThemeCore extends ObjectModel
|
||||
|
||||
public function toggleDefaultLeftColumn()
|
||||
{
|
||||
if (!array_key_exists('default_left_column', $this)) {
|
||||
if (!property_exists($this, 'default_left_column')) {
|
||||
throw new PrestaShopException('property "default_left_column" is missing in object '.get_class($this));
|
||||
}
|
||||
|
||||
@@ -374,7 +374,7 @@ class ThemeCore extends ObjectModel
|
||||
|
||||
public function toggleDefaultRightColumn()
|
||||
{
|
||||
if (!array_key_exists('default_right_column', $this)) {
|
||||
if (!property_exists($this,'default_right_column')) {
|
||||
throw new PrestaShopException('property "default_right_column" is missing in object '.get_class($this));
|
||||
}
|
||||
|
||||
|
||||
@@ -3611,7 +3611,7 @@ class AdminControllerCore extends Controller
|
||||
{
|
||||
/* Classical fields */
|
||||
foreach ($_POST as $key => $value) {
|
||||
if (array_key_exists($key, $object) && $key != 'id_'.$table) {
|
||||
if (property_exists($object, $key) && $key != 'id_'.$table) {
|
||||
/* Do not take care of password field if empty */
|
||||
if ($key == 'passwd' && Tools::getValue('id_'.$table) && empty($value)) {
|
||||
continue;
|
||||
|
||||
@@ -441,7 +441,7 @@ class FrontControllerCore extends Controller
|
||||
}
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
$this->context->smarty->assign(array(
|
||||
|
||||
@@ -219,15 +219,28 @@ class OrderReturnCore extends ObjectModel
|
||||
0
|
||||
);
|
||||
$bookingRow['additional_services_tax_excl'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$id_order,
|
||||
$bookingRow['id_order'],
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
$bookingRow['id_product'],
|
||||
$bookingRow['date_from'],
|
||||
$bookingRow['date_to'],
|
||||
$bookingRow['id_room'],
|
||||
1,
|
||||
0
|
||||
0,
|
||||
null
|
||||
);
|
||||
$bookingRow['additional_services_tax_incl'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$bookingRow['id_order'],
|
||||
0,
|
||||
0,
|
||||
$bookingRow['id_product'],
|
||||
$bookingRow['date_from'],
|
||||
$bookingRow['date_to'],
|
||||
$bookingRow['id_room'],
|
||||
1,
|
||||
1,
|
||||
null
|
||||
);
|
||||
|
||||
if ($customerView) {
|
||||
@@ -238,7 +251,9 @@ class OrderReturnCore extends ObjectModel
|
||||
$returnsCustView[$dateJoin]['total_price_tax_incl'] += $bookingRow['total_price_tax_incl'];
|
||||
$returnsCustView[$dateJoin]['total_paid_amount'] += $bookingRow['total_paid_amount'];
|
||||
$returnsCustView[$dateJoin]['extra_demands_price_tax_incl'] += $bookingRow['extra_demands_price_tax_incl'];
|
||||
$returnsCustView[$dateJoin]['extra_demands_price_tax_incl'] += $bookingRow['additional_services_tax_incl'];
|
||||
$returnsCustView[$dateJoin]['extra_demands_price_tax_excl'] += $bookingRow['extra_demands_price_tax_excl'];
|
||||
$returnsCustView[$dateJoin]['extra_demands_price_tax_excl'] += $bookingRow['additional_services_tax_excl'];
|
||||
} else {
|
||||
unset($bookingRow['id_room']);
|
||||
unset($bookingRow['room_num']);
|
||||
|
||||
@@ -486,7 +486,7 @@ class SupplyOrderCore extends ObjectModel
|
||||
$this->id = $data[$this->def['primary']];
|
||||
}
|
||||
foreach ($data as $key => $value) {
|
||||
if (array_key_exists($key, $this)) {
|
||||
if (property_exists($this, $key)) {
|
||||
// formats prices and floats
|
||||
if ($this->def['fields'][$key]['validate'] == 'isFloat' ||
|
||||
$this->def['fields'][$key]['validate'] == 'isPrice') {
|
||||
|
||||
@@ -338,7 +338,7 @@ class SupplyOrderDetailCore extends ObjectModel
|
||||
$this->id = $data[$this->def['primary']];
|
||||
}
|
||||
foreach ($data as $key => $value) {
|
||||
if (array_key_exists($key, $this)) {
|
||||
if (property_exists($this, $key)) {
|
||||
// formats prices and floats
|
||||
if ($this->def['fields'][$key]['validate'] == 'isFloat' ||
|
||||
$this->def['fields'][$key]['validate'] == 'isPrice') {
|
||||
|
||||
@@ -135,6 +135,7 @@ class AdminCartsControllerCore extends AdminController
|
||||
$smartyVars['type'] = 'non_orderd';
|
||||
}
|
||||
}
|
||||
$smartyVars['link'] = $this->context->link;
|
||||
|
||||
$tpl = $this->createTemplate('_orders.tpl');
|
||||
$tpl->assign($smartyVars);
|
||||
|
||||
@@ -81,17 +81,18 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
'title' => $this->l('Position'),
|
||||
'filter_key' => 'sa!position',
|
||||
'position' => 'position',
|
||||
'align' => 'center'
|
||||
),
|
||||
'active' => array(
|
||||
'title' => $this->l('Displayed'),
|
||||
'active' => 'status',
|
||||
'type' => 'bool',
|
||||
'class' => 'fixed-width-xs',
|
||||
'align' => 'center',
|
||||
'ajax' => true,
|
||||
'orderby' => false
|
||||
)
|
||||
'class' => 'fixed-width-sm'
|
||||
),
|
||||
// 'active' => array(
|
||||
// 'title' => $this->l('Displayed'),
|
||||
// 'active' => 'status',
|
||||
// 'type' => 'bool',
|
||||
// 'class' => 'fixed-width-xs',
|
||||
// 'align' => 'center',
|
||||
// 'ajax' => true,
|
||||
// 'orderby' => false
|
||||
// )
|
||||
);
|
||||
|
||||
$this->bulk_actions = array(
|
||||
@@ -369,49 +370,49 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
public function renderKpis()
|
||||
{
|
||||
$time = time();
|
||||
$kpis = array();
|
||||
// public function renderKpis()
|
||||
// {
|
||||
// $time = time();
|
||||
// $kpis = array();
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-disabled-categories';
|
||||
$helper->icon = 'icon-off';
|
||||
$helper->color = 'color1';
|
||||
$helper->title = $this->l('Disabled Categories', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=disabled_categories';
|
||||
$kpis[] = $helper->generate();
|
||||
// $helper = new HelperKpi();
|
||||
// $helper->id = 'box-disabled-categories';
|
||||
// $helper->icon = 'icon-off';
|
||||
// $helper->color = 'color1';
|
||||
// $helper->title = $this->l('Disabled Categories', null, null, false);
|
||||
// $helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=disabled_categories';
|
||||
// $kpis[] = $helper->generate();
|
||||
|
||||
// $helper = new HelperKpi();
|
||||
// $helper->id = 'box-empty-categories';
|
||||
// $helper->icon = 'icon-bookmark-empty';
|
||||
// $helper->color = 'color2';
|
||||
// $helper->href = $this->context->link->getAdminLink('AdminTracking');
|
||||
// $helper->title = $this->l('Empty Categories', null, null, false);
|
||||
// $helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=empty_categories';
|
||||
// $kpis[] = $helper->generate();
|
||||
// // $helper = new HelperKpi();
|
||||
// // $helper->id = 'box-empty-categories';
|
||||
// // $helper->icon = 'icon-bookmark-empty';
|
||||
// // $helper->color = 'color2';
|
||||
// // $helper->href = $this->context->link->getAdminLink('AdminTracking');
|
||||
// // $helper->title = $this->l('Empty Categories', null, null, false);
|
||||
// // $helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=empty_categories';
|
||||
// // $kpis[] = $helper->generate();
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-top-category';
|
||||
$helper->icon = 'icon-money';
|
||||
$helper->color = 'color3';
|
||||
$helper->title = $this->l('Top Category', null, null, false);
|
||||
$helper->subtitle = $this->l('30 days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=top_category';
|
||||
$kpis[] = $helper->generate();
|
||||
// $helper = new HelperKpi();
|
||||
// $helper->id = 'box-top-category';
|
||||
// $helper->icon = 'icon-money';
|
||||
// $helper->color = 'color3';
|
||||
// $helper->title = $this->l('Top Category', null, null, false);
|
||||
// $helper->subtitle = $this->l('30 days', null, null, false);
|
||||
// $helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=top_category';
|
||||
// $kpis[] = $helper->generate();
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-products-per-category';
|
||||
$helper->icon = 'icon-search';
|
||||
$helper->color = 'color4';
|
||||
$helper->title = $this->l('Average number of products per category', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=products_per_category';
|
||||
$kpis[] = $helper->generate();
|
||||
// $helper = new HelperKpi();
|
||||
// $helper->id = 'box-products-per-category';
|
||||
// $helper->icon = 'icon-search';
|
||||
// $helper->color = 'color4';
|
||||
// $helper->title = $this->l('Average number of products per category', null, null, false);
|
||||
// $helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=products_per_category';
|
||||
// $kpis[] = $helper->generate();
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
}
|
||||
// $helper = new HelperKpiRow();
|
||||
// $helper->kpis = $kpis;
|
||||
// return $helper->generate();
|
||||
// }
|
||||
|
||||
public function renderForm()
|
||||
{
|
||||
@@ -421,7 +422,7 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
$obj = $this->loadObject(true);
|
||||
$context = Context::getContext();
|
||||
$id_shop = $context->shop->id;
|
||||
$selected_categories = array((isset($obj->id_parent) && $obj->isParentCategoryAvailable($id_shop))? (int)$obj->id_parent : (int)Tools::getValue('id_parent', Category::getRootCategory()->id));
|
||||
$selected_categories = array((isset($obj->id_parent) && $obj->isParentCategoryAvailable($id_shop))? (int)$obj->id_parent : (int)Tools::getValue('id_parent', Configuration::get('PS_SERVICE_CATEGORY')));
|
||||
$unidentified = new Group(Configuration::get('PS_UNIDENTIFIED_GROUP'));
|
||||
$guest = new Group(Configuration::get('PS_GUEST_GROUP'));
|
||||
$default = new Group(Configuration::get('PS_CUSTOMER_GROUP'));
|
||||
@@ -479,25 +480,25 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
'class' => 'copy2friendlyUrl',
|
||||
'hint' => $this->l('Invalid characters:').' <>;=#{}',
|
||||
),
|
||||
array(
|
||||
'type' => 'switch',
|
||||
'label' => $this->l('Displayed'),
|
||||
'name' => 'active',
|
||||
'required' => false,
|
||||
'is_bool' => true,
|
||||
'values' => array(
|
||||
array(
|
||||
'id' => 'active_on',
|
||||
'value' => 1,
|
||||
'label' => $this->l('Enabled')
|
||||
),
|
||||
array(
|
||||
'id' => 'active_off',
|
||||
'value' => 0,
|
||||
'label' => $this->l('Disabled')
|
||||
)
|
||||
)
|
||||
),
|
||||
// array(
|
||||
// 'type' => 'switch',
|
||||
// 'label' => $this->l('Displayed'),
|
||||
// 'name' => 'active',
|
||||
// 'required' => false,
|
||||
// 'is_bool' => true,
|
||||
// 'values' => array(
|
||||
// array(
|
||||
// 'id' => 'active_on',
|
||||
// 'value' => 1,
|
||||
// 'label' => $this->l('Enabled')
|
||||
// ),
|
||||
// array(
|
||||
// 'id' => 'active_off',
|
||||
// 'value' => 0,
|
||||
// 'label' => $this->l('Disabled')
|
||||
// )
|
||||
// )
|
||||
// ),
|
||||
array(
|
||||
'type' => 'categories',
|
||||
'label' => $this->l('Parent category'),
|
||||
@@ -509,80 +510,80 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
'root_category' => Configuration::get('PS_SERVICE_CATEGORY')
|
||||
)
|
||||
),
|
||||
array(
|
||||
'type' => 'textarea',
|
||||
'label' => $this->l('Description'),
|
||||
'name' => 'description',
|
||||
'autoload_rte' => true,
|
||||
'lang' => true,
|
||||
'hint' => $this->l('Invalid characters:').' <>;=#{}'
|
||||
),
|
||||
array(
|
||||
'type' => 'file',
|
||||
'label' => $this->l('Category Cover Image'),
|
||||
'name' => 'image',
|
||||
'display_image' => true,
|
||||
'image' => $image_url ? $image_url : false,
|
||||
'size' => $image_size,
|
||||
'delete_url' => self::$currentIndex.'&'.$this->identifier.'='.$this->_category->id.'&token='.$this->token.'&deleteImage=1',
|
||||
'hint' => $this->l('This is the main image for your category, displayed in the category page. The category description will overlap this image and appear in its top-left corner.'),
|
||||
'format' => $format['category']
|
||||
),
|
||||
array(
|
||||
'type' => 'file',
|
||||
'label' => $this->l('Category thumbnail'),
|
||||
'name' => 'thumb',
|
||||
'display_image' => true,
|
||||
'image' => $thumb_url ? $thumb_url : false,
|
||||
'size' => $thumb_size,
|
||||
'format' => $format['medium']
|
||||
),
|
||||
array(
|
||||
'type' => 'text',
|
||||
'label' => $this->l('Meta title'),
|
||||
'name' => 'meta_title',
|
||||
'maxchar' => 70,
|
||||
'lang' => true,
|
||||
'rows' => 5,
|
||||
'cols' => 100,
|
||||
'hint' => $this->l('Forbidden characters:').' <>;=#{}'
|
||||
),
|
||||
array(
|
||||
'type' => 'textarea',
|
||||
'label' => $this->l('Meta description'),
|
||||
'name' => 'meta_description',
|
||||
'maxchar' => 160,
|
||||
'lang' => true,
|
||||
'rows' => 5,
|
||||
'cols' => 100,
|
||||
'hint' => $this->l('Forbidden characters:').' <>;=#{}'
|
||||
),
|
||||
array(
|
||||
'type' => 'tags',
|
||||
'label' => $this->l('Meta keywords'),
|
||||
'name' => 'meta_keywords',
|
||||
'lang' => true,
|
||||
'hint' => $this->l('To add "tags," click in the field, write something, and then press "Enter."').' '.$this->l('Forbidden characters:').' <>;=#{}'
|
||||
),
|
||||
array(
|
||||
'type' => 'text',
|
||||
'label' => $this->l('Friendly URL'),
|
||||
'name' => 'link_rewrite',
|
||||
'lang' => true,
|
||||
'required' => true,
|
||||
'hint' => $this->l('Only letters, numbers, underscore (_) and the minus (-) character are allowed.')
|
||||
),
|
||||
array(
|
||||
'type' => 'group',
|
||||
'label' => $this->l('Group access'),
|
||||
'name' => 'groupBox',
|
||||
'values' => Group::getGroups(Context::getContext()->language->id),
|
||||
'info_introduction' => $this->l('You now have three default customer groups.'),
|
||||
'unidentified' => $unidentified_group_information,
|
||||
'guest' => $guest_group_information,
|
||||
'customer' => $default_group_information,
|
||||
'hint' => $this->l('Mark all of the customer groups which you would like to have access to this category.')
|
||||
)
|
||||
// array(
|
||||
// 'type' => 'textarea',
|
||||
// 'label' => $this->l('Description'),
|
||||
// 'name' => 'description',
|
||||
// 'autoload_rte' => true,
|
||||
// 'lang' => true,
|
||||
// 'hint' => $this->l('Invalid characters:').' <>;=#{}'
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'file',
|
||||
// 'label' => $this->l('Category Cover Image'),
|
||||
// 'name' => 'image',
|
||||
// 'display_image' => true,
|
||||
// 'image' => $image_url ? $image_url : false,
|
||||
// 'size' => $image_size,
|
||||
// 'delete_url' => self::$currentIndex.'&'.$this->identifier.'='.$this->_category->id.'&token='.$this->token.'&deleteImage=1',
|
||||
// 'hint' => $this->l('This is the main image for your category, displayed in the category page. The category description will overlap this image and appear in its top-left corner.'),
|
||||
// 'format' => $format['category']
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'file',
|
||||
// 'label' => $this->l('Category thumbnail'),
|
||||
// 'name' => 'thumb',
|
||||
// 'display_image' => true,
|
||||
// 'image' => $thumb_url ? $thumb_url : false,
|
||||
// 'size' => $thumb_size,
|
||||
// 'format' => $format['medium']
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'text',
|
||||
// 'label' => $this->l('Meta title'),
|
||||
// 'name' => 'meta_title',
|
||||
// 'maxchar' => 70,
|
||||
// 'lang' => true,
|
||||
// 'rows' => 5,
|
||||
// 'cols' => 100,
|
||||
// 'hint' => $this->l('Forbidden characters:').' <>;=#{}'
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'textarea',
|
||||
// 'label' => $this->l('Meta description'),
|
||||
// 'name' => 'meta_description',
|
||||
// 'maxchar' => 160,
|
||||
// 'lang' => true,
|
||||
// 'rows' => 5,
|
||||
// 'cols' => 100,
|
||||
// 'hint' => $this->l('Forbidden characters:').' <>;=#{}'
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'tags',
|
||||
// 'label' => $this->l('Meta keywords'),
|
||||
// 'name' => 'meta_keywords',
|
||||
// 'lang' => true,
|
||||
// 'hint' => $this->l('To add "tags," click in the field, write something, and then press "Enter."').' '.$this->l('Forbidden characters:').' <>;=#{}'
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'text',
|
||||
// 'label' => $this->l('Friendly URL'),
|
||||
// 'name' => 'link_rewrite',
|
||||
// 'lang' => true,
|
||||
// 'required' => true,
|
||||
// 'hint' => $this->l('Only letters, numbers, underscore (_) and the minus (-) character are allowed.')
|
||||
// ),
|
||||
// array(
|
||||
// 'type' => 'group',
|
||||
// 'label' => $this->l('Group access'),
|
||||
// 'name' => 'groupBox',
|
||||
// 'values' => Group::getGroups(Context::getContext()->language->id),
|
||||
// 'info_introduction' => $this->l('You now have three default customer groups.'),
|
||||
// 'unidentified' => $unidentified_group_information,
|
||||
// 'guest' => $guest_group_information,
|
||||
// 'customer' => $default_group_information,
|
||||
// 'hint' => $this->l('Mark all of the customer groups which you would like to have access to this category.')
|
||||
// )
|
||||
),
|
||||
'submit' => array(
|
||||
'title' => $this->l('Save'),
|
||||
@@ -736,6 +737,13 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
$this->errors[] = Tools::displayError('The category cannot be a parent of itself.');
|
||||
}
|
||||
}
|
||||
// @todo remove this after adding link_rewrite form option
|
||||
// currently have removed link_rewrite as it is currently not required
|
||||
// so adding link_rewrite in $_POST
|
||||
foreach (Language::getLanguages(true) as $lang) {
|
||||
$_POST['link_rewrite_'.$lang['id_lang']] = Tools::link_rewrite(Tools::getValue('name_'.$lang['id_lang']));
|
||||
}
|
||||
|
||||
$object = parent::processAdd();
|
||||
|
||||
//if we create a you root category you have to associate to a shop before to add sub categories in. So we redirect to AdminCategories listing
|
||||
@@ -745,6 +753,22 @@ class AdminCategoriesControllerCore extends AdminController
|
||||
return $object;
|
||||
}
|
||||
|
||||
public function processUpdate()
|
||||
{
|
||||
// @todo remove this after adding link_rewrite form option
|
||||
// currently have removed link_rewrite as it is currently not required
|
||||
// so adding link_rewrite in $_POST
|
||||
if (!Validate::isLoadedObject($this->object)) {
|
||||
foreach (Language::getLanguages(true) as $lang) {
|
||||
$_POST['link_rewrite_'.$lang['id_lang']] = Tools::link_rewrite(Tools::getValue('name_'.$lang['id_lang']));
|
||||
}
|
||||
} else {
|
||||
foreach (Language::getLanguages(true) as $lang) {
|
||||
$_POST['link_rewrite_'.$lang['id_lang']] = $this->object->link_rewrite[$lang['id_lang']];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function setDeleteMode()
|
||||
{
|
||||
if ($this->delete_mode == 'link' || $this->delete_mode == 'linkanddisable') {
|
||||
|
||||
@@ -175,8 +175,6 @@ class AdminEmployeesControllerCore extends AdminController
|
||||
|
||||
public function initPageHeaderToolbar()
|
||||
{
|
||||
parent::initPageHeaderToolbar();
|
||||
|
||||
if (empty($this->display)) {
|
||||
$this->page_header_toolbar_btn['new_employee'] = array(
|
||||
'href' => self::$currentIndex.'&addemployee&token='.$this->token,
|
||||
@@ -195,6 +193,8 @@ class AdminEmployeesControllerCore extends AdminController
|
||||
$this->toolbar_title);
|
||||
}
|
||||
}
|
||||
|
||||
parent::initPageHeaderToolbar();
|
||||
}
|
||||
|
||||
public function renderList()
|
||||
|
||||
@@ -139,9 +139,9 @@ class AdminGeolocationControllerCore extends AdminController
|
||||
{
|
||||
$this->display = 'options';
|
||||
if (!$this->isGeoLiteCityAvailable()) {
|
||||
$this->displayWarning($this->l('In order to use Geolocation, please download').'
|
||||
<a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">'.$this->l('this file').'</a> '.
|
||||
$this->l('and extract it (using Winrar or Gzip) into the /tools/geoip/ directory.'));
|
||||
$this->displayWarning($this->l('In order to use Geolocation, please download the file').'
|
||||
<a href="https://github.com/mbcc2006/GeoLiteCity-data/blob/master/GeoLiteCity.dat" target="_blank">GeoLiteCity.dat</a> '.
|
||||
$this->l('from GitHub and copy into the /tools/geoip/ directory.'));
|
||||
Configuration::updateValue('PS_GEOLOCATION_ENABLED', 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
parent::__construct();
|
||||
|
||||
$this->imageType = 'jpg';
|
||||
$this->_defaultOrderBy = 'position';
|
||||
$this->_defaultOrderBy = 'id_product';
|
||||
$this->max_file_size = (int)(Configuration::get('PS_LIMIT_UPLOAD_FILE_VALUE') * 1000000);
|
||||
$this->max_image_size = (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE');
|
||||
$this->allow_export = true;
|
||||
@@ -99,7 +99,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
$this->available_tabs_lang = array(
|
||||
'Informations' => $this->l('Information'),
|
||||
'Prices' => $this->l('Prices'),
|
||||
'Seo' => $this->l('SEO'),
|
||||
// 'Seo' => $this->l('SEO'),
|
||||
'Images' => $this->l('Images'),
|
||||
'Associations' => $this->l('Associations'),
|
||||
);
|
||||
@@ -108,7 +108,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
$this->available_tabs = array_merge($this->available_tabs, array(
|
||||
'Informations' => 0,
|
||||
'Prices' => 1,
|
||||
'Seo' => 2,
|
||||
// 'Seo' => 2,
|
||||
'Associations' => 3,
|
||||
'Images' => 4,
|
||||
));
|
||||
@@ -948,7 +948,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
$id_groups = Tools::getValue('spm_id_group');
|
||||
$id_customers = Tools::getValue('spm_id_customer');
|
||||
$prices = Tools::getValue('spm_price');
|
||||
$from_quantities = Tools::getValue('spm_from_quantity');
|
||||
$from_quantities = 1;
|
||||
$reductions = Tools::getValue('spm_reduction');
|
||||
$reduction_types = Tools::getValue('spm_reduction_type');
|
||||
$froms = Tools::getValue('spm_from');
|
||||
@@ -1939,7 +1939,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
if ($this->isTabSubmitted('Prices')) {
|
||||
// $this->processAdvancedPayment();
|
||||
$this->processPriceAddition();
|
||||
// $this->processSpecificPricePriorities();
|
||||
$this->processSpecificPricePriorities();
|
||||
}
|
||||
if ($this->isTabSubmitted('Images')) {
|
||||
$this->processImageLegends();
|
||||
@@ -2016,6 +2016,20 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
$default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
|
||||
$languages = Language::getLanguages(false);
|
||||
|
||||
|
||||
// we have removed seo tab as it is currently not required, but in product object requires link_rewrite
|
||||
// so adding link_rewrite in $_POST
|
||||
if (Configuration::get('PS_FORCE_FRIENDLY_PRODUCT') || !Validate::isLoadedObject($this->object)) {
|
||||
foreach ($languages as $lang) {
|
||||
$_POST['link_rewrite_'.$lang['id_lang']] = Tools::link_rewrite(Tools::getValue('name_'.$lang['id_lang']));
|
||||
}
|
||||
} else {
|
||||
foreach ($languages as $lang) {
|
||||
$_POST['link_rewrite_'.$lang['id_lang']] = $this->object->link_rewrite[$lang['id_lang']];
|
||||
}
|
||||
}
|
||||
// end
|
||||
|
||||
// Check required fields
|
||||
foreach ($rules['required'] as $field) {
|
||||
if (!$this->isProductFieldUpdated($field)) {
|
||||
@@ -2855,13 +2869,12 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
$tree = new HelperTreeCategories('associated-categories-tree', 'Associated categories');
|
||||
$tree->setTemplate('tree_associated_categories.tpl')
|
||||
->setHeaderTemplate('tree_associated_header.tpl')
|
||||
->setRootCategory((int)Configuration::get('PS_PRODUCTS_CATEGORY'))
|
||||
->setRootCategory((int)Configuration::get('PS_SERVICE_CATEGORY'))
|
||||
->setUseCheckBox(true)
|
||||
->setUseSearch(false)
|
||||
->setFullTree(0)
|
||||
->setSelectedCategories($categories)
|
||||
->setUseBulkActions(false);
|
||||
// ->setDisablAllCategories(true);
|
||||
|
||||
$data->assign(array('default_category' => $default_category,
|
||||
'selected_cat_ids' => implode(',', array_keys($selected_cat)),
|
||||
|
||||
@@ -72,7 +72,7 @@ class AdminOrderPreferencesControllerCore extends AdminController
|
||||
),
|
||||
'GLOBAL_PREPARATION_TIME' => array(
|
||||
'title' => $this->l('Preparation time'),
|
||||
'hint' => $this->l('Number of days required to prepare a room for stay.'),
|
||||
'hint' => $this->l('Number of days required to prepare a room for a guest\'s stay. For example, if you set this value to 3 and someone is booking on 2nd of March he can only book rooms for dates from and after 3 days, i.e, 5th of March.'),
|
||||
'desc' => $this->l('Set to 0 to disable this feature.'),
|
||||
'type' => 'text',
|
||||
'class' => 'fixed-width-xl',
|
||||
|
||||
@@ -252,7 +252,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
}
|
||||
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
@@ -2695,10 +2695,6 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$this->context->cart = $cart;
|
||||
$this->context->customer = new Customer($order->id_customer);
|
||||
|
||||
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'][$idProduct]['data']['available'];
|
||||
$chkQty = 0;
|
||||
@@ -2708,7 +2704,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$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_customer = $order->id_customer;
|
||||
$objCartBookingData->id_currency = $order->id_currency;
|
||||
$objCartBookingData->id_product = $room_info['id_product'];
|
||||
$objCartBookingData->id_room = $room_info['id_room'];
|
||||
@@ -2724,8 +2720,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$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->adults = $room_info_by_id_product['adults'];
|
||||
$objCartBookingData->children = $room_info_by_id_product['children'];
|
||||
$objCartBookingData->child_ages = json_encode(array());
|
||||
}
|
||||
$objCartBookingData->save();
|
||||
@@ -3036,7 +3032,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$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->id_customer = $order->id_customer;
|
||||
$objBookingDetail->booking_type = $objCartBookingData->booking_type;
|
||||
$objBookingDetail->id_status = 1;
|
||||
$objBookingDetail->comment = $objCartBookingData->comment;
|
||||
@@ -3247,10 +3243,12 @@ 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'];
|
||||
if ($order->with_occupancy) {
|
||||
$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 == '') {
|
||||
@@ -3308,30 +3306,36 @@ 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))) {
|
||||
|
||||
// validations if order is with occupancy
|
||||
if ($order->with_occupancy) {
|
||||
if (!isset($adults) || !$adults || !Validate::isUnsignedInt($adults)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Please provide all children age.'),
|
||||
'error' => Tools::displayError('Invalid number of adults.'),
|
||||
)));
|
||||
} else {
|
||||
foreach($child_ages as $childAge) {
|
||||
if (!Validate::isUnsignedInt($childAge)) {
|
||||
die(json_encode(array(
|
||||
'result' => false,
|
||||
'error' => Tools::displayError('Invalid children age.'),
|
||||
)));
|
||||
} 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.'),
|
||||
)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5264,6 +5268,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
if ($objProduct->allow_multiple_quantity) {
|
||||
if (!Validate::isUnsignedInt($qty)) {
|
||||
$this->errors[] = Tools::displayError('The quantity code you\'ve entered is invalid.');
|
||||
// } elseif ($objProduct->max_quantity && $qty > $objProduct->max_quantity) {
|
||||
// $this->errors[] = Tools::displayError(sprintf('cannot add more than %d quantity.', $objProduct->max_quantity));
|
||||
}
|
||||
} else {
|
||||
$qty = 1;
|
||||
|
||||
@@ -146,8 +146,8 @@ class AdminPPreferencesControllerCore extends AdminController
|
||||
'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)'))
|
||||
array('id' => HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY, 'name' => $this->l('Room Occupancy')),
|
||||
array('id' => HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_QUANTITY, 'name' => $this->l('Rooms Quantity (No. of rooms)'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
),
|
||||
@@ -181,8 +181,8 @@ class AdminPPreferencesControllerCore extends AdminController
|
||||
'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)'))
|
||||
array('id' => HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY, 'name' => $this->l('Room Occupancy')),
|
||||
array('id' => HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_QUANTITY, 'name' => $this->l('Rooms Quantity (No. of rooms)'))
|
||||
),
|
||||
'identifier' => 'id',
|
||||
),
|
||||
@@ -442,11 +442,11 @@ class AdminPPreferencesControllerCore extends AdminController
|
||||
}
|
||||
|
||||
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;
|
||||
$_POST['PS_FRONT_ROOM_UNIT_SELECTION_TYPE'] = HotelBookingDetail::PS_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;
|
||||
$_POST['PS_BACKOFFICE_ROOM_BOOKING_TYPE'] = HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY;
|
||||
}
|
||||
|
||||
if (Tools::getIsset('PS_CATALOG_MODE')) {
|
||||
|
||||
@@ -2081,7 +2081,6 @@ class AdminProductsControllerCore extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
// shreesh check if product is virtual, then set categories according to hotel
|
||||
// if (Tools::getValue('is_virtual')) {
|
||||
$id_hotel = Tools::getValue('id_hotel');
|
||||
if (!$id_hotel || !Validate::isUnsignedInt($id_hotel)) {
|
||||
|
||||
@@ -82,12 +82,16 @@ class AdminSearchControllerCore extends AdminController
|
||||
Tools::redirectAdmin('index.php?tab=AdminOrders&id_order='.(int)$order->id.'&vieworder'.'&token='.Tools::getAdminTokenLite('AdminOrders'));
|
||||
} else {
|
||||
$row = get_object_vars($order);
|
||||
$row['id_order'] = $row['id'];
|
||||
$customer = $order->getCustomer();
|
||||
$row['customer'] = $customer->firstname.' '.$customer->lastname;
|
||||
$order_state = $order->getCurrentOrderState();
|
||||
$row['osname'] = $order_state->name[$this->context->language->id];
|
||||
$this->_list['orders'] = array($row);
|
||||
$idHotel = HotelBookingDetail::getIdHotelByIdOrder($row['id']);
|
||||
if (in_array($idHotel, HotelBranchInformation::getProfileAccessedHotels($this->context->employee->id_profile, 1, 1))) {
|
||||
$row['id_order'] = $row['id'];
|
||||
$customer = $order->getCustomer();
|
||||
$row['customer'] = $customer->firstname.' '.$customer->lastname;
|
||||
$order_state = $order->getCurrentOrderState();
|
||||
$row['osname'] = $order_state->name[$this->context->language->id];
|
||||
$this->_list['orders'] = array($row);
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
$orders = Order::getByReference($this->query);
|
||||
@@ -99,12 +103,15 @@ class AdminSearchControllerCore extends AdminController
|
||||
foreach ($orders as $order) {
|
||||
/** @var Order $order */
|
||||
$row = get_object_vars($order);
|
||||
$row['id_order'] = $row['id'];
|
||||
$customer = $order->getCustomer();
|
||||
$row['customer'] = $customer->firstname.' '.$customer->lastname;
|
||||
$order_state = $order->getCurrentOrderState();
|
||||
$row['osname'] = $order_state->name[$this->context->language->id];
|
||||
$this->_list['orders'][] = $row;
|
||||
$idHotel = HotelBookingDetail::getIdHotelByIdOrder($row['id']);
|
||||
if (in_array($idHotel, HotelBranchInformation::getProfileAccessedHotels($this->context->employee->id_profile, 1, 1))) {
|
||||
$row['id_order'] = $row['id'];
|
||||
$customer = $order->getCustomer();
|
||||
$row['customer'] = $customer->firstname.' '.$customer->lastname;
|
||||
$order_state = $order->getCurrentOrderState();
|
||||
$row['osname'] = $order_state->name[$this->context->language->id];
|
||||
$this->_list['orders'][] = $row;
|
||||
}
|
||||
}
|
||||
} elseif ($searchType == 3) {
|
||||
$this->errors[] = Tools::displayError('No order was found with this ID:').' '.Tools::htmlentitiesUTF8($this->query);
|
||||
@@ -162,7 +169,15 @@ class AdminSearchControllerCore extends AdminController
|
||||
public function searchCatalog()
|
||||
{
|
||||
$this->context = Context::getContext();
|
||||
$this->_list['products'] = Product::searchByName($this->context->language->id, $this->query);
|
||||
if ($this->_list['products'] = Product::searchByName($this->context->language->id, $this->query)) {
|
||||
$objRoomType = new HotelRoomType();
|
||||
foreach ($this->_list['products'] as $key => $product) {
|
||||
$roomInfo = $objRoomType->getRoomTypeInfoByIdProduct($product['id_product']);
|
||||
if (!in_array($roomInfo['id_hotel'], HotelBranchInformation::getProfileAccessedHotels($this->context->employee->id_profile, 1, 1))) {
|
||||
unset($this->_list['products'][$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->_list['categories'] = Category::searchByName($this->context->language->id, $this->query);
|
||||
}
|
||||
|
||||
@@ -299,9 +314,8 @@ class AdminSearchControllerCore extends AdminController
|
||||
$this->show_toolbar = false;
|
||||
$this->fields_list['products'] = array(
|
||||
'id_product' => array('title' => $this->l('ID'), 'width' => 25),
|
||||
'manufacturer_name' => array('title' => $this->l('Manufacturer'), 'align' => 'center', 'width' => 200),
|
||||
'reference' => array('title' => $this->l('Reference'), 'align' => 'center', 'width' => 150),
|
||||
'name' => array('title' => $this->l('Name'), 'width' => 'auto'),
|
||||
'reference' => array('title' => $this->l('Reference'), 'align' => 'center', 'width' => 150),
|
||||
'price_tax_excl' => array('title' => $this->l('Price (tax excl.)'), 'align' => 'right', 'type' => 'price', 'width' => 60),
|
||||
'price_tax_incl' => array('title' => $this->l('Price (tax incl.)'), 'align' => 'right', 'type' => 'price', 'width' => 60),
|
||||
'active' => array('title' => $this->l('Active'), 'width' => 70, 'active' => 'status', 'align' => 'center', 'type' => 'bool')
|
||||
@@ -350,7 +364,7 @@ class AdminSearchControllerCore extends AdminController
|
||||
}
|
||||
$this->tpl_view_vars['categories'] = $categories;
|
||||
}
|
||||
if (isset($this->_list['products']) && count($this->_list['products'])) {
|
||||
if (isset($this->_list['products']) && $this->_list['products']&& count($this->_list['products'])) {
|
||||
$view = '';
|
||||
$this->initProductList();
|
||||
|
||||
@@ -376,6 +390,7 @@ class AdminSearchControllerCore extends AdminController
|
||||
$view = $helper->generateList($this->_list['products'], $this->fields_list['products']);
|
||||
}
|
||||
|
||||
$this->tpl_view_vars['num_products'] = count($this->_list['products']);
|
||||
$this->tpl_view_vars['products'] = $view;
|
||||
}
|
||||
if (isset($this->_list['customers']) && count($this->_list['customers'])) {
|
||||
@@ -398,6 +413,7 @@ class AdminSearchControllerCore extends AdminController
|
||||
}
|
||||
$view = $helper->generateList($this->_list['customers'], $this->fields_list['customers']);
|
||||
}
|
||||
$this->tpl_view_vars['num_customers'] = count($this->_list['customers']);
|
||||
$this->tpl_view_vars['customers'] = $view;
|
||||
}
|
||||
if (isset($this->_list['orders']) && count($this->_list['orders'])) {
|
||||
@@ -417,6 +433,7 @@ class AdminSearchControllerCore extends AdminController
|
||||
if ($this->_list['orders']) {
|
||||
$view = $helper->generateList($this->_list['orders'], $this->fields_list['orders']);
|
||||
}
|
||||
$this->tpl_view_vars['num_orders'] = count($this->_list['orders']);
|
||||
$this->tpl_view_vars['orders'] = $view;
|
||||
}
|
||||
|
||||
|
||||
@@ -284,7 +284,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
if (!$distinct_products) {
|
||||
return '0%';
|
||||
}
|
||||
return round(100 * $distinct_products / AdminStatsController::getTotalProducts()).'%';
|
||||
return round(100 * $distinct_products / AdminStatsController::getTotalRoomTypes()).'%';
|
||||
}
|
||||
|
||||
public static function getOrders($date_from, $date_to, $granularity = false, $id_hotel = false)
|
||||
@@ -354,7 +354,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
public static function getCustomerMainGender()
|
||||
{
|
||||
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
|
||||
SELECT SUM(IF(g.id_gender IS NOT NULL, 1, 0)) as total, SUM(IF(type = 0, 1, 0)) as male, SUM(IF(type = 1, 1, 0)) as female, SUM(IF(type = 2, 1, 0)) as neutral
|
||||
SELECT SUM(IF(c.id_gender IS NOT NULL, 1, 0)) as total, SUM(IF(type = 0, 1, 0)) as male, SUM(IF(type = 1, 1, 0)) as female, SUM(IF(type = 2, 1, 0)) as neutral
|
||||
FROM `'._DB_PREFIX_.'customer` c
|
||||
LEFT JOIN `'._DB_PREFIX_.'gender` g ON c.id_gender = g.id_gender
|
||||
WHERE c.active = 1 '.Shop::addSqlRestriction());
|
||||
@@ -1176,9 +1176,10 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
|
||||
public static function getArrivalsInfoByDate($date, $idHotel = null)
|
||||
{
|
||||
$sql = 'SELECT hbd.*, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
$sql = 'SELECT hbd.*, o.`with_occupancy`, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
DATEDIFF(hbd.`date_to`, hbd.`date_from`) AS los
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = hbd.`id_order`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = hbd.`id_customer`)
|
||||
WHERE hbd.`is_refunded` = 0 AND hbd.`date_from` = "'.pSQL($date).' 00:00:00"
|
||||
AND hbd.`id_status` != '.(int) HotelBookingDetail::STATUS_CHECKED_IN.'
|
||||
@@ -1191,9 +1192,10 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
|
||||
public static function getDeparturesInfoByDate($date, $idHotel = null)
|
||||
{
|
||||
$sql = 'SELECT hbd.*, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
$sql = 'SELECT hbd.*, o.`with_occupancy`, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
DATEDIFF(hbd.`date_to`, hbd.`date_from`) AS los
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = hbd.`id_order`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = hbd.`id_customer`)
|
||||
WHERE hbd.`is_refunded` = 0 AND hbd.`date_to` = "'.pSQL($date).' 00:00:00"
|
||||
AND hbd.`id_status` = '.(int) HotelBookingDetail::STATUS_CHECKED_IN.
|
||||
@@ -1205,9 +1207,10 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
|
||||
public static function getInHousesInfo($idHotel = null)
|
||||
{
|
||||
$sql = 'SELECT hbd.*, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
$sql = 'SELECT hbd.*, o.`with_occupancy`, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
DATEDIFF(hbd.`date_to`, hbd.`date_from`) AS los
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = hbd.`id_order`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = hbd.`id_customer`)
|
||||
WHERE hbd.`is_refunded` = 0 AND hbd.`id_status` = '.(int) HotelBookingDetail::STATUS_CHECKED_IN.
|
||||
(!is_null($idHotel) ? HotelBranchInformation::addHotelRestriction($idHotel, 'hbd') : '');
|
||||
@@ -1220,7 +1223,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
{
|
||||
$sql = 'SELECT hbd.`id_customer`, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
COUNT(hbd.`id`) AS total_rooms, SUM(hbd.`adults` + hbd.`children`) AS total_guests,
|
||||
hbd.`id_hotel`, hbd.`hotel_name`, hbd.`id_order`, o.`total_paid_tax_excl`, o.`id_currency`, osl.`name` AS `state_name`
|
||||
hbd.`id_hotel`, hbd.`hotel_name`, hbd.`id_order`, o.`with_occupancy`, o.`total_paid_tax_excl`, o.`id_currency`, osl.`name` AS `state_name`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = hbd.`id_order`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl
|
||||
@@ -1237,8 +1240,8 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
public static function getCancellationsInfoByDate($date, $idHotel = null)
|
||||
{
|
||||
$sql = 'SELECT orr.`id_order_return`, orr.`id_customer`, hbd.`room_num`, hbd.`id_product`, hbd.`room_type_name`,
|
||||
CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name,
|
||||
hbd.`id_hotel`, hbd.`hotel_name`, SUM(hbd.`adults` + hbd.`children`) AS total_guests,
|
||||
o.`with_occupancy`, CONCAT(c.`firstname`, " ", c.`lastname`) AS customer_name, hbd.`id_hotel`,
|
||||
hbd.`hotel_name`, SUM(hbd.`adults` + hbd.`children`) AS total_guests,
|
||||
hbd.`date_from`, hbd.`date_to`, orr.`id_order`
|
||||
FROM `'._DB_PREFIX_.'order_return` orr
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_return_detail` ord ON (ord.`id_order_return` = orr.`id_order_return`)
|
||||
@@ -1665,9 +1668,10 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$dateTo = date('Y-m-d', strtotime('+1 day', strtotime($dateTo)));
|
||||
}
|
||||
|
||||
$sql = 'SELECT SUM(total_paid_tax_excl)
|
||||
$sql = 'SELECT SUM(total_paid_tax_excl - refunded_amount)
|
||||
FROM (
|
||||
SELECT o.`id_order`, o.`total_paid_tax_excl` / o.`conversion_rate` AS total_paid_tax_excl,
|
||||
IFNULL(orr.`refunded_amount`, 0) AS refunded_amount,
|
||||
(SELECT hbd.`id_hotel`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
@@ -1677,6 +1681,8 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
ON (hbd.`id_order` = o.`id_order`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_branch_info` hbi
|
||||
ON (hbi.`id` = hbd.`id_hotel`)
|
||||
LEFT JOIN `' ._DB_PREFIX_.'order_return` orr
|
||||
ON (orr.`id_order` = o.`id_order`)
|
||||
WHERE o.`valid` = 1 AND hbi.`active` = 1 AND hbd.`is_refunded` = 0
|
||||
AND o.`invoice_date` BETWEEN "'.pSQL($dateFrom).' 00:00:00" AND "'.pSQL($dateTo).' 23:59:59"
|
||||
AND o.`source` = "'.pSQL(Configuration::get('PS_SHOP_DOMAIN')).'"'.
|
||||
|
||||
@@ -716,8 +716,6 @@ class AdminThemesControllerCore extends AdminController
|
||||
|
||||
public function initPageHeaderToolbar()
|
||||
{
|
||||
parent::initPageHeaderToolbar();
|
||||
|
||||
if (empty($this->display)) {
|
||||
$this->page_header_toolbar_btn['import_theme'] = array(
|
||||
'href' => self::$currentIndex.'&action=importtheme&token='.$this->token,
|
||||
@@ -746,6 +744,8 @@ class AdminThemesControllerCore extends AdminController
|
||||
|
||||
$title = implode(' '.Configuration::get('PS_NAVIGATION_PIPE').' ', $this->toolbar_title);
|
||||
$this->page_header_toolbar_title = $title;
|
||||
|
||||
parent::initPageHeaderToolbar();
|
||||
}
|
||||
|
||||
private function checkParentClass($name)
|
||||
|
||||
@@ -50,6 +50,19 @@ class AddressControllerCore extends FrontController
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize address controller
|
||||
* @see FrontController::init()
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
parent::init();
|
||||
|
||||
if ($this->context->customer->id) {
|
||||
$this->_address = new Address(Customer::getCustomerIdAddress($this->context->customer->id));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start forms process
|
||||
* @see FrontController::postProcess()
|
||||
|
||||
@@ -170,6 +170,8 @@ class AuthControllerCore extends FrontController
|
||||
'informations' => $this->informations,
|
||||
'hasError' => !empty($this->errors),
|
||||
'errors' => $this->errors,
|
||||
'hasAjaxExtraData' => !empty($this->ajaxExtraData),
|
||||
'ajaxExtraData' => $this->ajaxExtraData,
|
||||
'page' => $this->context->smarty->fetch($this->template),
|
||||
'token' => Tools::getToken(false)
|
||||
);
|
||||
@@ -416,309 +418,314 @@ class AuthControllerCore extends FrontController
|
||||
if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) {
|
||||
if (Customer::customerExists($email)) {
|
||||
$this->errors[] = Tools::displayError('An account using this email address has already been registered.', false);
|
||||
} elseif (Customer::customerExists($email, false, false)) {
|
||||
$this->errors[] = Tools::displayError('You are already registered as a guest with this email address.').' <button type="submit" class="btn btn-link alert-link btn-transform" name="submitTransformAccount">'.Tools::displayError('Click here').'</button>'.Tools::displayError('').' to generate a password for your account.';
|
||||
}
|
||||
}
|
||||
// Preparing customer
|
||||
$customer = new Customer();
|
||||
$lastnameAddress = Tools::getValue('lastname');
|
||||
$firstnameAddress = Tools::getValue('firstname');
|
||||
$_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress);
|
||||
$_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress);
|
||||
$addresses_types = array('address');
|
||||
|
||||
if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) {
|
||||
$addresses_types[] = 'address_invoice';
|
||||
}
|
||||
|
||||
$error_phone = false;
|
||||
if (Configuration::get('PS_ONE_PHONE_AT_LEAST')) {
|
||||
if (Tools::isSubmit('submitGuestAccount') || !Tools::getValue('is_new_customer')) {
|
||||
if (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')) {
|
||||
$error_phone = true;
|
||||
}
|
||||
} elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE'))
|
||||
|| (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create'))
|
||||
|| (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create')))
|
||||
&& (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))) {
|
||||
$error_phone = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($error_phone) {
|
||||
$this->errors[] = Tools::displayError('You must register at least one phone number.');
|
||||
}
|
||||
|
||||
// if PS_CUSTOMER_ADDRESS_CREATION is disabled And customer has no addresses then create customer address
|
||||
// with the details of first hotel which rooms he has in cart
|
||||
if (!Configuration::get('PS_CUSTOMER_ADDRESS_CREATION')
|
||||
&& isset($this->context->cart->id)
|
||||
&& $this->context->cart->id
|
||||
) {
|
||||
if (Module::isInstalled('hotelreservationsystem')) {
|
||||
include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
$objHtlCart = new HotelCartBookingData();
|
||||
if ($htlCartInfo = $objHtlCart->getCartCurrentDataByCartId($this->context->cart->id)) {
|
||||
if (isset($htlCartInfo[0]['id_hotel']) && ($idHotel = $htlCartInfo[0]['id_hotel'])) {
|
||||
if ($address_info = HotelBranchInformation::getAddress($idHotel)) {
|
||||
$_POST['lastname'] = Tools::getValue('customer_lastname');
|
||||
$_POST['firstname'] = Tools::getValue('customer_firstname');
|
||||
$_POST['address1'] = $address_info['address1'];
|
||||
$_POST['city'] = $address_info['city'];
|
||||
$_POST['postcode'] = $address_info['postcode'];
|
||||
$_POST['alias'] = 'My address';
|
||||
$_POST['id_country'] = $address_info['id_country'];
|
||||
$_POST['id_state'] = $address_info['id_state'];
|
||||
$_POST['auto_generated'] = true;
|
||||
// if form is shorter then address name will be customer name
|
||||
$lastnameAddress = $_POST['lastname'];
|
||||
$firstnameAddress = $_POST['firstname'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// End
|
||||
$this->errors = array_unique(array_merge($this->errors, $customer->validateController()));
|
||||
|
||||
// Check the requires fields which are settings in the BO
|
||||
$this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();
|
||||
|
||||
if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
|
||||
if (!count($this->errors)) {
|
||||
|
||||
$this->processCustomerNewsletter($customer);
|
||||
|
||||
$customer->firstname = Tools::ucwords($customer->firstname);
|
||||
$customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
|
||||
if (!Validate::isBirthDate($customer->birthday)) {
|
||||
$this->errors[] = Tools::displayError('Invalid date of birth.');
|
||||
}
|
||||
|
||||
// New Guest customer
|
||||
$customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0);
|
||||
$customer->active = 1;
|
||||
|
||||
if (!count($this->errors)) {
|
||||
if ($customer->add()) {
|
||||
if (!$customer->is_guest) {
|
||||
if (!$this->sendConfirmationMail($customer)) {
|
||||
$this->errors[] = Tools::displayError('The email cannot be sent.');
|
||||
}
|
||||
}
|
||||
|
||||
$this->updateContext($customer);
|
||||
|
||||
$this->context->cart->update();
|
||||
Hook::exec('actionCustomerAccountAdd', array(
|
||||
'_POST' => $_POST,
|
||||
'newCustomer' => $customer
|
||||
));
|
||||
if ($this->ajax) {
|
||||
$return = array(
|
||||
'hasError' => !empty($this->errors),
|
||||
'errors' => $this->errors,
|
||||
'isSaved' => true,
|
||||
'id_customer' => (int)$this->context->cookie->id_customer,
|
||||
'id_address_delivery' => $this->context->cart->id_address_delivery,
|
||||
'id_address_invoice' => $this->context->cart->id_address_invoice,
|
||||
'token' => Tools::getToken(false)
|
||||
);
|
||||
$this->ajaxDie(json_encode($return));
|
||||
}
|
||||
|
||||
if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
|
||||
Tools::redirect(html_entity_decode($back));
|
||||
}
|
||||
|
||||
// redirection: if cart is not empty : redirection to the cart
|
||||
if (count($this->context->cart->getProducts(true)) > 0) {
|
||||
$multi = (int)Tools::getValue('multi-shipping');
|
||||
Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : ''));
|
||||
}
|
||||
// else : redirection to the account
|
||||
else {
|
||||
Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your account.');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// if registration type is in one step, we save the address
|
||||
|
||||
$_POST['lastname'] = $lastnameAddress;
|
||||
$_POST['firstname'] = $firstnameAddress;
|
||||
$post_back = $_POST;
|
||||
// Preparing addresses
|
||||
foreach ($addresses_types as $addresses_type) {
|
||||
$$addresses_type = new Address();
|
||||
$$addresses_type->id_customer = 1;
|
||||
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
foreach ($_POST as $key => &$post) {
|
||||
if ($tmp = Tools::getValue($key.'_invoice')) {
|
||||
$post = $tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
$_POST = $post_back;
|
||||
}
|
||||
|
||||
if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) {
|
||||
$this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country');
|
||||
}
|
||||
|
||||
if (!$country->active) {
|
||||
$this->errors[] = Tools::displayError('This country is not active.');
|
||||
}
|
||||
|
||||
$postcode = $$addresses_type->postcode;
|
||||
/* Check zip code format */
|
||||
if ($country->zip_code_format && !$country->checkZipCode($postcode)) {
|
||||
$this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))));
|
||||
} elseif (empty($postcode) && $country->need_zip_code) {
|
||||
$this->errors[] = Tools::displayError('A Zip / Postal code is required.');
|
||||
} elseif ($postcode && !Validate::isPostCode($postcode)) {
|
||||
$this->errors[] = Tools::displayError('The Zip / Postal code is invalid.');
|
||||
}
|
||||
|
||||
if ($country->need_identification_number) {
|
||||
if (!Configuration::get('PS_CUSTOMER_ADDRESS_CREATION')) {
|
||||
$$addresses_type->dni = null;
|
||||
} elseif (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))) {
|
||||
$this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.');
|
||||
}
|
||||
} elseif (!$country->need_identification_number) {
|
||||
$$addresses_type->dni = null;
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
|
||||
if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) {
|
||||
$this->errors[] = Tools::displayError('Country is invalid');
|
||||
}
|
||||
}
|
||||
$contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0;
|
||||
$id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0;
|
||||
if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) {
|
||||
$this->errors[] = Tools::displayError('This country requires you to choose a State.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) && !(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')) {
|
||||
$this->errors[] = Tools::displayError('Invalid date of birth');
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
if (Customer::customerExists(Tools::getValue('email'))) {
|
||||
$this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false);
|
||||
// Preparing customer
|
||||
$customer = new Customer();
|
||||
$lastnameAddress = Tools::getValue('lastname');
|
||||
$firstnameAddress = Tools::getValue('firstname');
|
||||
$_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress);
|
||||
$_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress);
|
||||
$addresses_types = array('address');
|
||||
|
||||
if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) {
|
||||
$addresses_types[] = 'address_invoice';
|
||||
}
|
||||
|
||||
$this->processCustomerNewsletter($customer);
|
||||
$error_phone = false;
|
||||
if (Configuration::get('PS_ONE_PHONE_AT_LEAST')) {
|
||||
if (Tools::isSubmit('submitGuestAccount') || !Tools::getValue('is_new_customer')) {
|
||||
if (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')) {
|
||||
$error_phone = true;
|
||||
}
|
||||
} elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE'))
|
||||
|| (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create'))
|
||||
|| (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create')))
|
||||
&& (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))) {
|
||||
$error_phone = true;
|
||||
}
|
||||
}
|
||||
|
||||
$customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
|
||||
if (!Validate::isBirthDate($customer->birthday)) {
|
||||
if ($error_phone) {
|
||||
$this->errors[] = Tools::displayError('You must register at least one phone number.');
|
||||
}
|
||||
|
||||
// if PS_CUSTOMER_ADDRESS_CREATION is disabled And customer has no addresses then create customer address
|
||||
// with the details of first hotel which rooms he has in cart
|
||||
if (!Configuration::get('PS_CUSTOMER_ADDRESS_CREATION')
|
||||
&& isset($this->context->cart->id)
|
||||
&& $this->context->cart->id
|
||||
) {
|
||||
if (Module::isInstalled('hotelreservationsystem')) {
|
||||
include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
$objHtlCart = new HotelCartBookingData();
|
||||
if ($htlCartInfo = $objHtlCart->getCartCurrentDataByCartId($this->context->cart->id)) {
|
||||
if (isset($htlCartInfo[0]['id_hotel']) && ($idHotel = $htlCartInfo[0]['id_hotel'])) {
|
||||
if ($address_info = HotelBranchInformation::getAddress($idHotel)) {
|
||||
$_POST['lastname'] = Tools::getValue('customer_lastname');
|
||||
$_POST['firstname'] = Tools::getValue('customer_firstname');
|
||||
$_POST['address1'] = $address_info['address1'];
|
||||
$_POST['city'] = $address_info['city'];
|
||||
$_POST['postcode'] = $address_info['postcode'];
|
||||
$_POST['alias'] = 'My address';
|
||||
$_POST['id_country'] = $address_info['id_country'];
|
||||
$_POST['id_state'] = $address_info['id_state'];
|
||||
$_POST['auto_generated'] = true;
|
||||
// if form is shorter then address name will be customer name
|
||||
$lastnameAddress = $_POST['lastname'];
|
||||
$firstnameAddress = $_POST['firstname'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// End
|
||||
$this->errors = array_unique(array_merge($this->errors, $customer->validateController()));
|
||||
|
||||
// Check the requires fields which are settings in the BO
|
||||
$this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();
|
||||
|
||||
if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
|
||||
if (!count($this->errors)) {
|
||||
|
||||
$this->processCustomerNewsletter($customer);
|
||||
|
||||
$customer->firstname = Tools::ucwords($customer->firstname);
|
||||
$customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
|
||||
if (!Validate::isBirthDate($customer->birthday)) {
|
||||
$this->errors[] = Tools::displayError('Invalid date of birth.');
|
||||
}
|
||||
|
||||
// New Guest customer
|
||||
$customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0);
|
||||
$customer->active = 1;
|
||||
|
||||
if (!count($this->errors)) {
|
||||
if ($customer->add()) {
|
||||
if (!$customer->is_guest) {
|
||||
if (!$this->sendConfirmationMail($customer)) {
|
||||
$this->errors[] = Tools::displayError('The email cannot be sent.');
|
||||
}
|
||||
}
|
||||
|
||||
$this->updateContext($customer);
|
||||
|
||||
$this->context->cart->update();
|
||||
Hook::exec('actionCustomerAccountAdd', array(
|
||||
'_POST' => $_POST,
|
||||
'newCustomer' => $customer
|
||||
));
|
||||
if ($this->ajax) {
|
||||
$return = array(
|
||||
'hasError' => !empty($this->errors),
|
||||
'errors' => $this->errors,
|
||||
'isSaved' => true,
|
||||
'id_customer' => (int)$this->context->cookie->id_customer,
|
||||
'id_address_delivery' => $this->context->cart->id_address_delivery,
|
||||
'id_address_invoice' => $this->context->cart->id_address_invoice,
|
||||
'token' => Tools::getToken(false)
|
||||
);
|
||||
$this->ajaxDie(json_encode($return));
|
||||
}
|
||||
|
||||
if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
|
||||
Tools::redirect(html_entity_decode($back));
|
||||
}
|
||||
|
||||
// redirection: if cart is not empty : redirection to the cart
|
||||
if (count($this->context->cart->getProducts(true)) > 0) {
|
||||
$multi = (int)Tools::getValue('multi-shipping');
|
||||
Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : ''));
|
||||
}
|
||||
// else : redirection to the account
|
||||
else {
|
||||
Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your account.');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// if registration type is in one step, we save the address
|
||||
|
||||
$_POST['lastname'] = $lastnameAddress;
|
||||
$_POST['firstname'] = $firstnameAddress;
|
||||
$post_back = $_POST;
|
||||
// Preparing addresses
|
||||
foreach ($addresses_types as $addresses_type) {
|
||||
$$addresses_type = new Address();
|
||||
$$addresses_type->id_customer = 1;
|
||||
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
foreach ($_POST as $key => &$post) {
|
||||
if ($tmp = Tools::getValue($key.'_invoice')) {
|
||||
$post = $tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
$_POST = $post_back;
|
||||
}
|
||||
|
||||
if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) {
|
||||
$this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country');
|
||||
}
|
||||
|
||||
if (!$country->active) {
|
||||
$this->errors[] = Tools::displayError('This country is not active.');
|
||||
}
|
||||
|
||||
$postcode = $$addresses_type->postcode;
|
||||
/* Check zip code format */
|
||||
if ($country->zip_code_format && !$country->checkZipCode($postcode)) {
|
||||
$this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))));
|
||||
} elseif (empty($postcode) && $country->need_zip_code) {
|
||||
$this->errors[] = Tools::displayError('A Zip / Postal code is required.');
|
||||
} elseif ($postcode && !Validate::isPostCode($postcode)) {
|
||||
$this->errors[] = Tools::displayError('The Zip / Postal code is invalid.');
|
||||
}
|
||||
|
||||
if ($country->need_identification_number) {
|
||||
if (!Configuration::get('PS_CUSTOMER_ADDRESS_CREATION')) {
|
||||
$$addresses_type->dni = null;
|
||||
} elseif (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))) {
|
||||
$this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.');
|
||||
}
|
||||
} elseif (!$country->need_identification_number) {
|
||||
$$addresses_type->dni = null;
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
|
||||
if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) {
|
||||
$this->errors[] = Tools::displayError('Country is invalid');
|
||||
}
|
||||
}
|
||||
$contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0;
|
||||
$id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0;
|
||||
if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) {
|
||||
$this->errors[] = Tools::displayError('This country requires you to choose a State.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) && !(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')) {
|
||||
$this->errors[] = Tools::displayError('Invalid date of birth');
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
$customer->active = 1;
|
||||
// New Guest customer
|
||||
if (Tools::isSubmit('is_new_customer')) {
|
||||
$customer->is_guest = !Tools::getValue('is_new_customer', 1);
|
||||
} else {
|
||||
$customer->is_guest = 0;
|
||||
if (Customer::customerExists(Tools::getValue('email'))) {
|
||||
$this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false);
|
||||
}
|
||||
if (!$customer->add()) {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your account.');
|
||||
} else {
|
||||
foreach ($addresses_types as $addresses_type) {
|
||||
$$addresses_type->id_customer = (int)$customer->id;
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
foreach ($_POST as $key => &$post) {
|
||||
if ($tmp = Tools::getValue($key.'_invoice')) {
|
||||
$post = $tmp;
|
||||
|
||||
$this->processCustomerNewsletter($customer);
|
||||
|
||||
$customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
|
||||
if (!Validate::isBirthDate($customer->birthday)) {
|
||||
$this->errors[] = Tools::displayError('Invalid date of birth');
|
||||
}
|
||||
|
||||
if (!count($this->errors)) {
|
||||
$customer->active = 1;
|
||||
// New Guest customer
|
||||
if (Tools::isSubmit('is_new_customer')) {
|
||||
$customer->is_guest = !Tools::getValue('is_new_customer', 1);
|
||||
} else {
|
||||
$customer->is_guest = 0;
|
||||
}
|
||||
if (!$customer->add()) {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your account.');
|
||||
} else {
|
||||
foreach ($addresses_types as $addresses_type) {
|
||||
$$addresses_type->id_customer = (int)$customer->id;
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
foreach ($_POST as $key => &$post) {
|
||||
if ($tmp = Tools::getValue($key.'_invoice')) {
|
||||
$post = $tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
$_POST = $post_back;
|
||||
}
|
||||
if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add()) {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your address.');
|
||||
}
|
||||
}
|
||||
if (!count($this->errors)) {
|
||||
if (!$customer->is_guest) {
|
||||
$this->context->customer = $customer;
|
||||
$customer->cleanGroups();
|
||||
// we add the guest customer in the default customer group
|
||||
$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
|
||||
if (!$this->sendConfirmationMail($customer)) {
|
||||
// webkul - we will not stop process on email delivery fails
|
||||
//$this->errors[] = Tools::displayError('The email cannot be sent.');
|
||||
$this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
|
||||
if ($addresses_type == 'address_invoice') {
|
||||
$_POST = $post_back;
|
||||
}
|
||||
if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add()) {
|
||||
$this->errors[] = Tools::displayError('An error occurred while creating your address.');
|
||||
}
|
||||
} else {
|
||||
$customer->cleanGroups();
|
||||
// we add the guest customer in the guest customer group
|
||||
$customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
|
||||
}
|
||||
$this->updateContext($customer);
|
||||
$this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)$customer->id);
|
||||
$this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id);
|
||||
if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) {
|
||||
$this->context->cart->id_address_invoice = (int)$address_invoice->id;
|
||||
}
|
||||
if (!count($this->errors)) {
|
||||
if (!$customer->is_guest) {
|
||||
$this->context->customer = $customer;
|
||||
$customer->cleanGroups();
|
||||
// we add the guest customer in the default customer group
|
||||
$customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
|
||||
if (!$this->sendConfirmationMail($customer)) {
|
||||
// webkul - we will not stop process on email delivery fails
|
||||
//$this->errors[] = Tools::displayError('The email cannot be sent.');
|
||||
}
|
||||
} else {
|
||||
$customer->cleanGroups();
|
||||
// we add the guest customer in the guest customer group
|
||||
$customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
|
||||
}
|
||||
$this->updateContext($customer);
|
||||
$this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)$customer->id);
|
||||
$this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id);
|
||||
if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) {
|
||||
$this->context->cart->id_address_invoice = (int)$address_invoice->id;
|
||||
}
|
||||
|
||||
if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
|
||||
$delivery_option = array((int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.',');
|
||||
$this->context->cart->setDeliveryOption($delivery_option);
|
||||
}
|
||||
if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
|
||||
$delivery_option = array((int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.',');
|
||||
$this->context->cart->setDeliveryOption($delivery_option);
|
||||
}
|
||||
|
||||
// If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
|
||||
$this->context->cart->update();
|
||||
// If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
|
||||
$this->context->cart->update();
|
||||
|
||||
// Avoid articles without delivery address on the cart
|
||||
$this->context->cart->autosetProductAddress();
|
||||
// Avoid articles without delivery address on the cart
|
||||
$this->context->cart->autosetProductAddress();
|
||||
|
||||
Hook::exec('actionCustomerAccountAdd', array(
|
||||
'_POST' => $_POST,
|
||||
'newCustomer' => $customer
|
||||
));
|
||||
if ($this->ajax) {
|
||||
$return = array(
|
||||
'hasError' => !empty($this->errors),
|
||||
'errors' => $this->errors,
|
||||
'isSaved' => true,
|
||||
'id_customer' => (int)$this->context->cookie->id_customer,
|
||||
'id_address_delivery' => $this->context->cart->id_address_delivery,
|
||||
'id_address_invoice' => $this->context->cart->id_address_invoice,
|
||||
'token' => Tools::getToken(false)
|
||||
);
|
||||
$this->ajaxDie(json_encode($return));
|
||||
}
|
||||
// if registration type is in two steps, we redirect to register address
|
||||
if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
|
||||
Tools::redirect('index.php?controller=address');
|
||||
}
|
||||
Hook::exec('actionCustomerAccountAdd', array(
|
||||
'_POST' => $_POST,
|
||||
'newCustomer' => $customer
|
||||
));
|
||||
if ($this->ajax) {
|
||||
$return = array(
|
||||
'hasError' => !empty($this->errors),
|
||||
'errors' => $this->errors,
|
||||
'isSaved' => true,
|
||||
'id_customer' => (int)$this->context->cookie->id_customer,
|
||||
'id_address_delivery' => $this->context->cart->id_address_delivery,
|
||||
'id_address_invoice' => $this->context->cart->id_address_invoice,
|
||||
'token' => Tools::getToken(false)
|
||||
);
|
||||
$this->ajaxDie(json_encode($return));
|
||||
}
|
||||
// if registration type is in two steps, we redirect to register address
|
||||
if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
|
||||
Tools::redirect('index.php?controller=address');
|
||||
}
|
||||
|
||||
if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
|
||||
Tools::redirect(html_entity_decode($back));
|
||||
}
|
||||
if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
|
||||
Tools::redirect(html_entity_decode($back));
|
||||
}
|
||||
|
||||
// redirection: if cart is not empty : redirection to the cart
|
||||
if (count($this->context->cart->getProducts(true)) > 0) {
|
||||
Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : ''));
|
||||
}
|
||||
// else : redirection to the account
|
||||
else {
|
||||
Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
|
||||
// redirection: if cart is not empty : redirection to the cart
|
||||
if (count($this->context->cart->getProducts(true)) > 0) {
|
||||
Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : ''));
|
||||
}
|
||||
// else : redirection to the account
|
||||
else {
|
||||
Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -772,12 +779,21 @@ class AuthControllerCore extends FrontController
|
||||
*/
|
||||
protected function processTransformAccount()
|
||||
{
|
||||
if (!Validate::isEmail($email = trim(Tools::getValue('email_create'))) || empty($email)) {
|
||||
if (!Validate::isEmail($email = trim(Tools::getValue('email_create', Tools::getValue('email')))) || empty($email)) {
|
||||
$this->errors[] = Tools::displayError('Invalid email address.');
|
||||
} elseif ($id_customer = Customer::customerExists($email, true, false)) {
|
||||
$customer = new Customer($id_customer);
|
||||
if ($customer->transformToCustomer($this->context->language->id)) {
|
||||
$this->confirmations[] = 'TRANSFORM_OK';
|
||||
|
||||
$back = '';
|
||||
if ($back == Tools::secureReferrer(Tools::getValue('back'))) {
|
||||
$back = html_entity_decode($back);
|
||||
} else {
|
||||
$back = Tools::safeOutput($back);
|
||||
}
|
||||
$this->ajaxExtraData['redirect_link'] = $this->context->link->getPageLink('authentication').
|
||||
($back ? '?back='.$back.'&' : '?').'guest_transform_success=1';
|
||||
} else {
|
||||
$this->errors[] = Tools::displayError('Your guest account could not be transformed to a customer account.');
|
||||
}
|
||||
|
||||
@@ -285,11 +285,11 @@ class CartControllerCore extends FrontController
|
||||
|
||||
if ($product->booking_product) {
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
if ($occupancyRequiredForBooking) {
|
||||
if ($occupancyRequiredForBooking && $operator == 'up') {
|
||||
if ($occupancy = json_decode(Tools::getValue('occupancy'), true)) {
|
||||
$this->qty = count($occupancy);
|
||||
} else {
|
||||
@@ -395,16 +395,26 @@ class CartControllerCore extends FrontController
|
||||
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 {
|
||||
// validate normal products if available
|
||||
if ($serviceProducts) {
|
||||
$objRoomTypeServiceProduct = new RoomTypeServiceProduct();
|
||||
foreach ($serviceProducts as $key => $standartProduct) {
|
||||
if (!$objRoomTypeServiceProduct->isRoomTypeLinkedWithProduct($this->id_product, $standartProduct['id_product'])) {
|
||||
unset($serviceProducts[$key]);
|
||||
} else {
|
||||
// validate service products if available
|
||||
if ($serviceProducts) {
|
||||
$objRoomTypeServiceProduct = new RoomTypeServiceProduct();
|
||||
foreach ($serviceProducts as $key => $serviceProduct) {
|
||||
if (!$objRoomTypeServiceProduct->isRoomTypeLinkedWithProduct($this->id_product, $serviceProduct['id_product'])) {
|
||||
unset($serviceProducts[$key]);
|
||||
} else {
|
||||
if (Validate::isLoadedObject($objServiceProduct = new Product($serviceProduct['id_product']))) {
|
||||
if (!$objServiceProduct->allow_multiple_quantity && $serviceProduct['quantity'] > 1) {
|
||||
$serviceProducts[$key]['quantity'] = 1;
|
||||
} else if ($objServiceProduct->max_quantity && $objServiceProduct->max_quantity < $serviceProduct['quantity'] ) {
|
||||
$serviceProducts[$key]['quantity'] = $objServiceProduct->max_quantity;
|
||||
}
|
||||
} else {
|
||||
$response['error'] = Tools::displayError('Service not Found');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -621,6 +631,8 @@ class CartControllerCore extends FrontController
|
||||
if ($objProduct->allow_multiple_quantity) {
|
||||
if (!Validate::isUnsignedInt($qty)) {
|
||||
$this->errors[] = Tools::displayError('The quantity you\'ve entered is invalid.');
|
||||
} elseif ($objProduct->max_quantity && $qty > $objProduct->max_quantity) {
|
||||
$this->errors[] = Tools::displayError(sprintf('cannot add more than %d quantity.', $objProduct->max_quantity));
|
||||
}
|
||||
} else {
|
||||
$qty = 1;
|
||||
|
||||
@@ -49,16 +49,16 @@ class GuestTrackingControllerCore extends FrontController
|
||||
{
|
||||
if (Tools::isSubmit('submitGuestTracking') || Tools::isSubmit('submitTransformGuestToCustomer')) {
|
||||
// These lines are here for retrocompatibility with old theme
|
||||
$id_order = Tools::getValue('id_order');
|
||||
$idOrder = Tools::getValue('id_order');
|
||||
$order_collection = array();
|
||||
if ($id_order) {
|
||||
if (is_numeric($id_order)) {
|
||||
$order = new Order((int)$id_order);
|
||||
if ($idOrder) {
|
||||
if (is_numeric($idOrder)) {
|
||||
$order = new Order((int)$idOrder);
|
||||
if (Validate::isLoadedObject($order)) {
|
||||
$order_collection = Order::getByReference($order->reference);
|
||||
}
|
||||
} else {
|
||||
$order_collection = Order::getByReference($id_order);
|
||||
$order_collection = Order::getByReference($idOrder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ class GuestTrackingControllerCore extends FrontController
|
||||
|
||||
$email = Tools::getValue('email');
|
||||
|
||||
if (empty($order_reference) && empty($id_order)) {
|
||||
if (empty($order_reference) && empty($idOrder)) {
|
||||
$this->errors[] = Tools::displayError('Please provide your order\'s reference number.');
|
||||
} elseif (empty($email)) {
|
||||
$this->errors[] = Tools::displayError('Please provide a valid email address.');
|
||||
@@ -185,6 +185,7 @@ class GuestTrackingControllerCore extends FrontController
|
||||
include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
$objHtlBranchInfo = new HotelBranchInformation();
|
||||
$objBookingDetail = new HotelBookingDetail();
|
||||
$objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail();
|
||||
$objRoomType = new HotelRoomType();
|
||||
|
||||
$nonRequestedRooms = 0;
|
||||
@@ -225,130 +226,253 @@ class GuestTrackingControllerCore extends FrontController
|
||||
if ($orderProducts = $order->getProducts()) {
|
||||
$total_demands_price_te = 0;
|
||||
$total_demands_price_ti = 0;
|
||||
$total_convenience_fee_te = 0;
|
||||
$total_convenience_fee_ti = 0;
|
||||
// ddd($orderProducts);
|
||||
foreach ($orderProducts as $type_key => $type_value) {
|
||||
if (in_array($type_value['product_id'], $processedProducts)) {
|
||||
continue;
|
||||
}
|
||||
$processedProducts[] = $type_value['product_id'];
|
||||
if ($type_value['is_booking_product']) {
|
||||
$processedProducts[] = $type_value['product_id'];
|
||||
|
||||
$product = new Product($type_value['product_id'], false, $this->context->language->id);
|
||||
$cover_image_arr = $product->getCover($type_value['product_id']);
|
||||
$product = new Product($type_value['product_id'], false, $this->context->language->id);
|
||||
$cover_image_arr = $product->getCover($type_value['product_id']);
|
||||
|
||||
if (!empty($cover_image_arr)) {
|
||||
$cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default');
|
||||
} else {
|
||||
$cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default');
|
||||
}
|
||||
|
||||
if (isset($customer->id)) {
|
||||
$obj_cart = new Cart($order->id_cart);
|
||||
$order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id);
|
||||
} else {
|
||||
$order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']);
|
||||
}
|
||||
$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]['adults'] = $rm_dtl['adults'];
|
||||
$cartHotelData[$type_key]['children'] = $rm_dtl['children'];
|
||||
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
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*/
|
||||
$order_details_obj = new OrderDetail($data_v['id_order_detail']);
|
||||
$prod_ord_dtl_name = $order_details_obj->product_name;
|
||||
$cartHotelData[$type_key]['name'] = $prod_ord_dtl_name;
|
||||
|
||||
$cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity;
|
||||
$cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity;
|
||||
|
||||
if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1;
|
||||
|
||||
$num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
$var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'];
|
||||
|
||||
$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]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order'];
|
||||
if ($data_v['is_back_order']) {
|
||||
$anyBackOrder = 1;
|
||||
}
|
||||
if (!empty($cover_image_arr)) {
|
||||
$cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default');
|
||||
} else {
|
||||
$num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']);
|
||||
$cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default');
|
||||
}
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1;
|
||||
$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;
|
||||
if (isset($customer->id)) {
|
||||
$obj_cart = new Cart($order->id_cart);
|
||||
$order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id);
|
||||
} else {
|
||||
$order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']);
|
||||
}
|
||||
$cartHotelData[$type_key]['id_product'] = $type_value['product_id'];
|
||||
$cartHotelData[$type_key]['cover_img'] = $cover_img;
|
||||
|
||||
$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]['amount_tax_incl'] = $data_v['total_price_tax_incl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order'];
|
||||
if ($data_v['is_back_order']) {
|
||||
$anyBackOrder = 1;
|
||||
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
foreach ($order_bk_data as $data_k => $data_v) {
|
||||
$date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']);
|
||||
|
||||
$cartHotelData[$type_key]['adults'] = $data_v['adults'];
|
||||
$cartHotelData[$type_key]['children'] = $data_v['children'];
|
||||
/*Product price when order was created*/
|
||||
$order_details_obj = new OrderDetail($data_v['id_order_detail']);
|
||||
$cartHotelData[$type_key]['name'] = $order_details_obj->product_name;
|
||||
$cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity;
|
||||
$cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity;
|
||||
|
||||
if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1;
|
||||
|
||||
$num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'];
|
||||
$var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'];
|
||||
|
||||
$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'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] += $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] += $data_v['total_price_tax_incl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] += $data_v['total_price_tax_excl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order'];
|
||||
if ($data_v['is_back_order']) {
|
||||
$anyBackOrder = 1;
|
||||
}
|
||||
} else {
|
||||
$num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']);
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1;
|
||||
$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;
|
||||
$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'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['avg_paid_unit_price_tax_incl'] = $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl'];
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order'];
|
||||
if ($data_v['is_back_order']) {
|
||||
$anyBackOrder = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['ids_htl_booking_detail'][] = $data_v['id'];
|
||||
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to']
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] += $extraDemandPriceTI = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
$data_v['id_room'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
0,
|
||||
1,
|
||||
1
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] += $extraDemandPriceTE = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
$data_v['id_room'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
0,
|
||||
1,
|
||||
0
|
||||
);
|
||||
$total_demands_price_ti += $extraDemandPriceTI;
|
||||
$total_demands_price_te += $extraDemandPriceTE;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl;
|
||||
|
||||
$feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']);
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff;
|
||||
|
||||
$cartHotelData[$type_key]['hotel_name'] = $data_v['hotel_name'];
|
||||
// add additional services products in hotel detail.
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to']
|
||||
);
|
||||
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_ti'] += $additionalServicesPriceTI = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
1
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_te'] += $additionalServicesPriceTE = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
0
|
||||
);
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to']
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] = 0;
|
||||
// get auto added price to be displayed with room price
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0;
|
||||
}
|
||||
$extraDemandPriceTI = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
0,
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
1
|
||||
1,
|
||||
1,
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_ti'] += $extraDemandPriceTI;
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] = 0;
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] = 0;
|
||||
}
|
||||
$extraDemandPriceTE = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands_price_te'] += $extraDemandPriceTE;
|
||||
$total_demands_price_ti += $extraDemandPriceTI;
|
||||
$total_demands_price_te += $extraDemandPriceTE;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl;
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl;
|
||||
// calculate averages now
|
||||
foreach ($cartHotelData[$type_key]['date_diff'] as $key => &$value) {
|
||||
$value['avg_paid_unit_price_tax_excl'] = Tools::ps_round($value['avg_paid_unit_price_tax_excl'] / $value['num_rm'], 6);
|
||||
$value['avg_paid_unit_price_tax_incl'] = Tools::ps_round($value['avg_paid_unit_price_tax_incl'] / $value['num_rm'], 6);
|
||||
|
||||
$feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']);
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff;
|
||||
$value['avg_price_diff_tax_excl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_excl'] - $value['product_price_tax_excl'], 6));
|
||||
$value['avg_price_diff_tax_incl'] = abs(Tools::ps_round($value['avg_paid_unit_price_tax_incl'] - $value['product_price_tax_incl'], 6));
|
||||
}
|
||||
} else if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITH_ROOMTYPE) {
|
||||
if ($type_value['product_auto_add'] && $type_value['product_price_addition_type'] == Product::PRICE_ADDITION_TYPE_INDEPENDENT) {
|
||||
$total_convenience_fee_ti += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
);
|
||||
$total_convenience_fee_te += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
$type_value['product_id'],
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// get all products that are independent.
|
||||
if ($type_value['product_service_type'] == Product::SERVICE_PRODUCT_WITHOUT_ROOMTYPE) {
|
||||
$product = new Product($type_value['product_id'], false, $this->context->language->id);
|
||||
$cover_image_arr = $product->getCover($type_value['product_id']);
|
||||
|
||||
//enter hotel name
|
||||
$hotelInfo = $objHtlBranchInfo->hotelBranchesInfo(
|
||||
Configuration::get('PS_LANG_DEFAULT'),
|
||||
2,
|
||||
0,
|
||||
$data_v['id_hotel']
|
||||
);
|
||||
$cartHotelData[$type_key]['hotel_name'] = $hotelInfo['hotel_name'];
|
||||
if (!empty($cover_image_arr)) {
|
||||
$type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default');
|
||||
} else {
|
||||
$type_value['cover_img'] = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code.'-default', 'small_default');
|
||||
}
|
||||
$cartServiceProducts[] = $type_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -359,8 +483,15 @@ class GuestTrackingControllerCore extends FrontController
|
||||
null, $this->context->language->id
|
||||
);
|
||||
|
||||
$customerGuestDetail = false;
|
||||
if ($id_customer_guest_detail = OrderCustomerGuestDetail::isCustomerGuestBooking($order->id)) {
|
||||
$customerGuestDetail = new OrderCustomerGuestDetail($id_customer_guest_detail);
|
||||
}
|
||||
|
||||
$this->context->smarty->assign(
|
||||
array(
|
||||
'total_convenience_fee_ti' => $total_convenience_fee_ti,
|
||||
'total_convenience_fee_te' => $total_convenience_fee_te,
|
||||
'total_demands_price_ti' => $total_demands_price_ti,
|
||||
'total_demands_price_te' => $total_demands_price_te,
|
||||
'any_back_order' => $anyBackOrder,
|
||||
@@ -369,6 +500,7 @@ class GuestTrackingControllerCore extends FrontController
|
||||
'order_has_invoice' => $order->hasInvoice(),
|
||||
'cart_htl_data' => $cartHotelData,
|
||||
'non_requested_rooms' => $nonRequestedRooms,
|
||||
'customerGuestDetail' => $customerGuestDetail,
|
||||
)
|
||||
);
|
||||
//end
|
||||
|
||||
@@ -163,110 +163,117 @@ class OrderDetailControllerCore extends FrontController
|
||||
$this->errors[] = Tools::displayError('Order ID required');
|
||||
} else {
|
||||
$order = new Order($id_order);
|
||||
// Here handle request from the ajax on order details page i.e refund, additional qty etc
|
||||
$method = Tools::getValue('method');
|
||||
// extra demands popup ajax
|
||||
if ($method == 'getRoomTypeBookingDemands') {
|
||||
$response = array('reload' => false);
|
||||
if (($idProduct = Tools::getValue('id_product'))
|
||||
&& ($idOrder = Tools::getValue('id_order'))
|
||||
&& ($dateFrom = Tools::getValue('date_from'))
|
||||
&& ($dateTo = Tools::getValue('date_to'))
|
||||
) {
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
$useTax = 0;
|
||||
$customer = Context::getContext()->customer;
|
||||
if (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC) {
|
||||
$useTax = 1;
|
||||
}
|
||||
if ($extraDemands = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$idProduct,
|
||||
0,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
1,
|
||||
0,
|
||||
$useTax
|
||||
)) {
|
||||
$this->context->smarty->assign(
|
||||
array(
|
||||
if (Validate::isLoadedObject($order) && $order->id_customer == $this->context->customer->id) {
|
||||
// Here handle request from the ajax on order details page i.e refund, additional qty etc
|
||||
$method = Tools::getValue('method');
|
||||
// extra demands popup ajax
|
||||
if ($method == 'getRoomTypeBookingDemands') {
|
||||
$response = array('reload' => false);
|
||||
if (($idProduct = Tools::getValue('id_product'))
|
||||
&& ($idOrder = Tools::getValue('id_order'))
|
||||
&& ($dateFrom = Tools::getValue('date_from'))
|
||||
&& ($dateTo = Tools::getValue('date_to'))
|
||||
) {
|
||||
$objBookingDemand = new HotelBookingDemands();
|
||||
$useTax = 0;
|
||||
$customer = Context::getContext()->customer;
|
||||
if (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC) {
|
||||
$useTax = 1;
|
||||
}
|
||||
if ($extraDemands = $objBookingDemand->getRoomTypeBookingExtraDemands(
|
||||
$idOrder,
|
||||
$idProduct,
|
||||
0,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
1,
|
||||
0,
|
||||
$useTax
|
||||
)) {
|
||||
$this->context->smarty->assign(
|
||||
array(
|
||||
'useTax' => $useTax,
|
||||
'extraDemands' => $extraDemands,
|
||||
)
|
||||
);
|
||||
}
|
||||
$objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail();
|
||||
if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
0,
|
||||
0,
|
||||
$idProduct,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
0,
|
||||
0,
|
||||
$useTax
|
||||
)) {
|
||||
$this->context->smarty->assign(array(
|
||||
'useTax' => $useTax,
|
||||
'extraDemands' => $extraDemands,
|
||||
)
|
||||
);
|
||||
'additionalServices' => $additionalServices,
|
||||
));
|
||||
}
|
||||
$response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl');
|
||||
}
|
||||
$objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail();
|
||||
if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$idOrder,
|
||||
0,
|
||||
0,
|
||||
$idProduct,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
0,
|
||||
0,
|
||||
$useTax
|
||||
)) {
|
||||
$this->context->smarty->assign(array(
|
||||
'useTax' => $useTax,
|
||||
'additionalServices' => $additionalServices,
|
||||
));
|
||||
}
|
||||
$response['extra_demands'] = $this->context->smarty->fetch(_PS_THEME_DIR_.'_partials/order_booking_demands.tpl');
|
||||
}
|
||||
|
||||
die(json_encode($response));
|
||||
} elseif ($method == 'submitRefundRequest') { // room cancellation ajax
|
||||
$hasError = 0;
|
||||
if (!$refundReason = Tools::getValue('cancellation_reason')) {
|
||||
$hasError = 1;
|
||||
} elseif (!Validate::isCleanHtml($refundReason)) {
|
||||
$hasError = 1;
|
||||
}
|
||||
if ($bookingRefunds = Tools::getValue('bookings_to_refund')) {
|
||||
if (!count($bookingRefunds = json_decode($bookingRefunds, true))) {
|
||||
die(json_encode($response));
|
||||
} elseif ($method == 'submitRefundRequest') { // room cancellation ajax
|
||||
$hasError = 0;
|
||||
if (!$refundReason = Tools::getValue('cancellation_reason')) {
|
||||
$hasError = 1;
|
||||
} else {
|
||||
foreach ($bookingRefunds as $idHtlBooking) {
|
||||
if (OrderReturn::getOrdersReturnDetail($order->id, 0, $idHtlBooking)) {
|
||||
$hasError = 1;
|
||||
break;
|
||||
} elseif (!Validate::isCleanHtml($refundReason)) {
|
||||
$hasError = 1;
|
||||
}
|
||||
if ($bookingRefunds = Tools::getValue('bookings_to_refund')) {
|
||||
if (!count($bookingRefunds = json_decode($bookingRefunds, true))) {
|
||||
$hasError = 1;
|
||||
} else {
|
||||
foreach ($bookingRefunds as $idHtlBooking) {
|
||||
$objHotelBookingDetail = new HotelBookingDetail($idHtlBooking);
|
||||
if ($objHotelBookingDetail->id_customer != $order->id_customer
|
||||
|| OrderReturn::getOrdersReturnDetail($order->id, 0, $idHtlBooking)
|
||||
) {
|
||||
$hasError = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$hasError = 1;
|
||||
}
|
||||
} else {
|
||||
$hasError = 1;
|
||||
}
|
||||
if (!$hasError) {
|
||||
$objOrderReturn = new OrderReturn();
|
||||
$objOrderReturn->id_customer = $order->id_customer;
|
||||
$objOrderReturn->id_order = $order->id;
|
||||
$objOrderReturn->state = 0;
|
||||
$objOrderReturn->by_admin = 0;
|
||||
$objOrderReturn->question = $refundReason;
|
||||
$objOrderReturn->save();
|
||||
if ($objOrderReturn->id) {
|
||||
foreach ($bookingRefunds as $idHtlBooking) {
|
||||
$objHtlBooking = new HotelBookingDetail($idHtlBooking);
|
||||
$numDays = $objHtlBooking->getNumberOfDays(
|
||||
$objHtlBooking->date_from,
|
||||
$objHtlBooking->date_to
|
||||
);
|
||||
if (!$hasError) {
|
||||
$objOrderReturn = new OrderReturn();
|
||||
$objOrderReturn->id_customer = $order->id_customer;
|
||||
$objOrderReturn->id_order = $order->id;
|
||||
$objOrderReturn->state = 0;
|
||||
$objOrderReturn->by_admin = 0;
|
||||
$objOrderReturn->question = $refundReason;
|
||||
$objOrderReturn->save();
|
||||
if ($objOrderReturn->id) {
|
||||
foreach ($bookingRefunds as $idHtlBooking) {
|
||||
$objHtlBooking = new HotelBookingDetail($idHtlBooking);
|
||||
$numDays = $objHtlBooking->getNumberOfDays(
|
||||
$objHtlBooking->date_from,
|
||||
$objHtlBooking->date_to
|
||||
);
|
||||
|
||||
$objOrderReturnDetail = new OrderReturnDetail();
|
||||
$objOrderReturnDetail->id_order_return = $objOrderReturn->id;
|
||||
$objOrderReturnDetail->id_order_detail = $objHtlBooking->id_order_detail;
|
||||
$objOrderReturnDetail->product_quantity = $numDays;
|
||||
$objOrderReturnDetail->id_htl_booking = $idHtlBooking;
|
||||
$objOrderReturnDetail->save();
|
||||
$objOrderReturnDetail = new OrderReturnDetail();
|
||||
$objOrderReturnDetail->id_order_return = $objOrderReturn->id;
|
||||
$objOrderReturnDetail->id_order_detail = $objHtlBooking->id_order_detail;
|
||||
$objOrderReturnDetail->product_quantity = $numDays;
|
||||
$objOrderReturnDetail->id_htl_booking = $idHtlBooking;
|
||||
$objOrderReturnDetail->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Emails to customer, admin on refund request state change
|
||||
$objOrderReturn->changeIdOrderReturnState(Configuration::get('PS_ORS_PENDING'));
|
||||
// Emails to customer, admin on refund request state change
|
||||
$objOrderReturn->changeIdOrderReturnState(Configuration::get('PS_ORS_PENDING'));
|
||||
|
||||
die(json_encode(array('status' => 1)));
|
||||
die(json_encode(array('status' => 1)));
|
||||
}
|
||||
die(json_encode(array('status' => 0)));
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array('status' => 0)));
|
||||
}
|
||||
// END ajax request handle
|
||||
@@ -479,40 +486,40 @@ class OrderDetailControllerCore extends FrontController
|
||||
1,
|
||||
0
|
||||
);
|
||||
// get auto added price to be displayed with room price
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$id_order,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$id_order,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
}
|
||||
// get auto added price to be displayed with room price
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_ti'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$id_order,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
if (empty($cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'])) {
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] = 0;
|
||||
}
|
||||
$cartHotelData[$type_key]['date_diff'][$date_join]['additional_services_price_auto_add_te'] += $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$id_order,
|
||||
0,
|
||||
0,
|
||||
$type_value['product_id'],
|
||||
$data_v['date_from'],
|
||||
$data_v['date_to'],
|
||||
$data_v['id_room'],
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
Product::PRICE_ADDITION_TYPE_WITH_ROOM
|
||||
);
|
||||
// calculate averages now
|
||||
foreach ($cartHotelData[$type_key]['date_diff'] as $key => &$value) {
|
||||
$value['avg_paid_unit_price_tax_excl'] = Tools::ps_round($value['avg_paid_unit_price_tax_excl'] / $value['num_rm'], 6);
|
||||
|
||||
@@ -389,6 +389,9 @@ class OrderOpcControllerCore extends ParentOrderController
|
||||
*/
|
||||
public function initContent()
|
||||
{
|
||||
// check all service products are available
|
||||
RoomTypeServiceProductCartDetail::validateServiceProductsInCart();
|
||||
|
||||
parent::initContent();
|
||||
|
||||
// check ORDER RESTRICT condition before payment by the customer
|
||||
@@ -452,7 +455,6 @@ class OrderOpcControllerCore extends ParentOrderController
|
||||
|
||||
$this->context->smarty->assign('checkout_process_steps', $this->checkoutProcess->getSteps());
|
||||
|
||||
// @todo shreesh get this checked with sumit sir
|
||||
// set room type demands
|
||||
// $objGlobalDemand = new HotelRoomTypeGlobalDemand();
|
||||
// $allDemands = $objGlobalDemand->getAllDemands();
|
||||
|
||||
@@ -114,6 +114,10 @@ class ProductControllerCore extends FrontController
|
||||
$this->product = new Product($id_product, true, $this->context->language->id, $this->context->shop->id);
|
||||
}
|
||||
|
||||
if (!$this->product->booking_product) {
|
||||
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
|
||||
}
|
||||
|
||||
if (!Validate::isLoadedObject($this->product)) {
|
||||
header('HTTP/1.1 404 Not Found');
|
||||
header('Status: 404 Not Found');
|
||||
@@ -192,12 +196,6 @@ class ProductControllerCore extends FrontController
|
||||
$this->context->cookie->last_visited_category = (int)$this->category->id_category;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->product->booking_product) {
|
||||
header('HTTP/1.1 403 Forbidden');
|
||||
header('Status: 403 Forbidden');
|
||||
$this->errors[] = Tools::displayError('You do not have access to this Product.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,11 +355,12 @@ class ProductControllerCore extends FrontController
|
||||
// booking preparation time
|
||||
$preparationTime = (int) HotelOrderRestrictDate::getPreparationTime($hotel_id);
|
||||
|
||||
$objHotelImage = new HotelImage();
|
||||
$hotelImageLink = null;
|
||||
if ($coverImage = HotelImage::getCover($hotel_id)) {
|
||||
$hotelImagesBaseDir = _MODULE_DIR_.'hotelreservationsystem/views/img/hotel_img/';
|
||||
$hotelImageLink = $this->context->link->getMediaLink(
|
||||
$hotelImagesBaseDir.$coverImage['hotel_image_id'].'.jpg'
|
||||
$objHotelImage->getImageLink($coverImage['id'], ImageType::getFormatedName('large'))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -591,7 +590,7 @@ class ProductControllerCore extends FrontController
|
||||
'id_cart' => $idCart,
|
||||
'id_guest' => $idGuest,
|
||||
);
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$bookingParams['occupancy'] = $occupancy;
|
||||
$quantity = count($occupancy);
|
||||
} else {
|
||||
@@ -603,6 +602,7 @@ class ProductControllerCore extends FrontController
|
||||
$quantity = 1;
|
||||
}
|
||||
|
||||
$totalAvailableRooms = 0;
|
||||
if ($hotelRoomData = $objBookingDetail->DataForFrontSearch($bookingParams)) {
|
||||
$totalAvailableRooms = $hotelRoomData['stats']['num_avail'];
|
||||
$quantity = ($quantity > $totalAvailableRooms) ? $totalAvailableRooms : $quantity;
|
||||
@@ -689,10 +689,22 @@ class ProductControllerCore extends FrontController
|
||||
$serviceProductsPrice = 0;
|
||||
if ($roomServiceProducts = json_decode($roomServiceProducts, true)) {
|
||||
$objRoomTypeServiceProductPrice = new RoomTypeServiceProductPrice();
|
||||
$objRoomTypeServiceProduct = new RoomTypeServiceProduct();
|
||||
foreach ($roomServiceProducts as &$product) {
|
||||
$objProduct = new ProductCore($product['id_product'], false, $this->context->language->id);
|
||||
$product['name'] = $objProduct->name;
|
||||
$product['allow_multiple_quantity'] = $objProduct->allow_multiple_quantity;
|
||||
if (!$objRoomTypeServiceProduct->isRoomTypeLinkedWithProduct($idProduct, $product['id_product'])) {
|
||||
unset($product);
|
||||
continue;
|
||||
} else {
|
||||
$objServiceProduct = new ProductCore($product['id_product'], false, $this->context->language->id);
|
||||
if (!$objServiceProduct->allow_multiple_quantity && $product['quantity'] > 1) {
|
||||
$product['quantity'] = 1;
|
||||
} else if ($objServiceProduct->max_quantity && $objServiceProduct->max_quantity < $product['quantity'] ) {
|
||||
$product['quantity'] = $objServiceProduct->max_quantity;
|
||||
}
|
||||
|
||||
}
|
||||
$product['name'] = $objServiceProduct->name;
|
||||
$product['allow_multiple_quantity'] = $objServiceProduct->allow_multiple_quantity;
|
||||
$productPrice = $objRoomTypeServiceProductPrice->getProductPrice($product['id_product'], $idProduct, $product['quantity'], $useTax);
|
||||
$product['price'] = $productPrice;
|
||||
$serviceProductsPrice += $productPrice;
|
||||
@@ -1244,7 +1256,8 @@ class ProductControllerCore extends FrontController
|
||||
$hotelImagesBaseDir = _MODULE_DIR_.'hotelreservationsystem/views/img/hotel_img/';
|
||||
foreach ($hotelImages as &$hotelImage) {
|
||||
$hotelImage['link'] = $this->context->link->getMediaLink(
|
||||
$hotelImagesBaseDir.$hotelImage['hotel_image_id'].'.jpg'
|
||||
$objHotelImage->getImageLink($hotelImage['id'],
|
||||
ImageType::getFormatedName('large'))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1318,12 +1331,14 @@ class ProductControllerCore extends FrontController
|
||||
public function displayAjaxCheckServiceProductWithRoomType()
|
||||
{
|
||||
$response = array(
|
||||
'status' => false
|
||||
'success' => false
|
||||
);
|
||||
|
||||
if ($this->isTokenValid()) {
|
||||
$idProduct = Tools::getValue('id_product');
|
||||
$idServiceProduct = Tools::getValue('service_product');
|
||||
$addedServiceProduct = Tools::getValue('added_service_product');
|
||||
$qty = Tools::getValue('qty');
|
||||
if (Validate::isLoadedObject($objProduct = new Product($idProduct))) {
|
||||
if (!Product::isBookingProduct($idProduct)) {
|
||||
$response['error'] = Tools::displayError('Room Type info not Found');
|
||||
@@ -1334,7 +1349,37 @@ class ProductControllerCore extends FrontController
|
||||
if (!$objRoomTypeServiceProduct->isRoomTypeLinkedWithProduct($idProduct, $idServiceProduct)) {
|
||||
$response['error'] = Tools::displayError('Selected product is not available with current room type');
|
||||
} else {
|
||||
$response['status'] = true;
|
||||
if (Validate::isLoadedObject($objServiceProduct = new Product($idServiceProduct))) {
|
||||
$response['success'] = true;
|
||||
if (!$objServiceProduct->allow_multiple_quantity) {
|
||||
if (!empty($addedServiceProduct)) {
|
||||
if (!in_array($idServiceProduct, array_column($addedServiceProduct, 'id_product'))) {
|
||||
$response['add'] = true;
|
||||
$response['msg'] = 'Service is added to cart.';
|
||||
} else {
|
||||
$response['msg'] = 'Service already added.';
|
||||
}
|
||||
} else {
|
||||
$response['add'] = true;
|
||||
$response['msg'] = 'Service is added to cart.';
|
||||
}
|
||||
} else {
|
||||
$totalQty = $qty;
|
||||
if (!empty($addedServiceProduct)) {
|
||||
if (($key = array_search($idServiceProduct, array_column($addedServiceProduct, 'id_product')))!== false) {
|
||||
$totalQty += $addedServiceProduct[$key]['quantity'];
|
||||
}
|
||||
}
|
||||
if ($objServiceProduct->max_quantity && $objServiceProduct->max_quantity < $totalQty ) {
|
||||
$response['msg'] = Tools::displayError(sprintf('Cannot add more than %d quantity.', $objServiceProduct->max_quantity));
|
||||
} else {
|
||||
$response['add'] = true;
|
||||
$response['msg'] = Tools::displayError('Service is added to cart.');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$response['error'] = Tools::displayError('Service not Found');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$response['error'] = Tools::displayError('Room Type not Found');
|
||||
|
||||
@@ -1519,6 +1519,7 @@ CREATE TABLE `PREFIX_product` (
|
||||
`quantity` int(10) NOT NULL DEFAULT '0',
|
||||
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
|
||||
`allow_multiple_quantity` tinyint(1) unsigned NOT NULL DEFAULT '1',
|
||||
`max_quantity` int(10) unsigned NOT NULL DEFAULT '1',
|
||||
`price` decimal(20,6) NOT NULL DEFAULT '0.000000',
|
||||
`wholesale_price` decimal(20,6) NOT NULL DEFAULT '0.000000',
|
||||
`unity` varchar(255) DEFAULT NULL,
|
||||
@@ -1554,7 +1555,6 @@ CREATE TABLE `PREFIX_product` (
|
||||
`cache_has_attachments` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`is_virtual` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`booking_product` tinyint(1) NOT NULL DEFAULT '1',
|
||||
`is_invisible` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`cache_default_attribute` int(10) unsigned DEFAULT NULL,
|
||||
`date_add` datetime NOT NULL,
|
||||
`date_upd` datetime NOT NULL,
|
||||
@@ -1578,6 +1578,7 @@ CREATE TABLE IF NOT EXISTS `PREFIX_product_shop` (
|
||||
`ecotax` decimal(17,6) NOT NULL DEFAULT '0.000000',
|
||||
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
|
||||
`allow_multiple_quantity` tinyint(1) unsigned NOT NULL DEFAULT '1',
|
||||
`max_quantity` int(10) unsigned NOT NULL DEFAULT '1',
|
||||
`price` decimal(20,6) NOT NULL DEFAULT '0.000000',
|
||||
`wholesale_price` decimal(20,6) NOT NULL DEFAULT '0.000000',
|
||||
`unity` varchar(255) DEFAULT NULL,
|
||||
|
||||
@@ -686,6 +686,24 @@
|
||||
<configuration id="ROOM_TYPE_CHECKUP_TOTAL_ROOMS_GT" name="ROOM_TYPE_CHECKUP_TOTAL_ROOMS_GT">
|
||||
<value>3</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_DESCRIPTIONS_SHORT_LT" name="SERVICE_CHECKUP_DESCRIPTIONS_SHORT_LT">
|
||||
<value>50</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_DESCRIPTIONS_SHORT_GT" name="SERVICE_CHECKUP_DESCRIPTIONS_GT">
|
||||
<value>150</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_IMAGES_LT" name="SERVICE_CHECKUP_IMAGES_LT">
|
||||
<value>1</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_IMAGES_GT" name="SERVICE_CHECKUP_IMAGES_GT">
|
||||
<value>2</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_ORDERS_LT" name="SERVICE_CHECKUP_ORDERS_LT">
|
||||
<value>1</value>
|
||||
</configuration>
|
||||
<configuration id="SERVICE_CHECKUP_ORDERS_GT" name="SERVICE_CHECKUP_ORDERS_GT">
|
||||
<value>2</value>
|
||||
</configuration>
|
||||
<configuration id="FOOTER_CMS" name="FOOTER_CMS">
|
||||
<value>0_3|0_4</value>
|
||||
</configuration>
|
||||
|
||||
@@ -1616,7 +1616,7 @@ function loadRecommendation()
|
||||
token: token
|
||||
},
|
||||
success: function(res) {
|
||||
if (res.success && res.content.trim()) {
|
||||
if (res.success && res.content && res.content.trim()) {
|
||||
$('#recommendation-wrapper-skeleton').fadeIn('slow');
|
||||
$('#recommendation-wrapper').html(res.content);
|
||||
let images = $('#recommendation-wrapper img');
|
||||
|
||||
@@ -449,6 +449,14 @@ product_tabs['Informations'] = new function(){
|
||||
}
|
||||
});
|
||||
|
||||
$('input[name=allow_multiple_quantity]').on('change', function(e) {
|
||||
if ($(this).val() == 1) {
|
||||
$('#max_quantity_container').show('fast');
|
||||
} else {
|
||||
$('#max_quantity_container').hide('fast');
|
||||
}
|
||||
});
|
||||
|
||||
$('#related_product_autocomplete_input')
|
||||
.autocomplete('ajax_products_list.php?exclude_packs=0&excludeVirtuals=0&excludeIds='+id_product, {
|
||||
minChars: 1,
|
||||
|
||||
2
js/daterangepicker/moment.min.js
vendored
2
js/daterangepicker/moment.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -9501,7 +9501,6 @@ var FullCalendar = (function (exports) {
|
||||
});
|
||||
return (createElement(ContentHook, { hookProps: hookProps, content: options.dayCellContent, defaultContent: props.defaultContent }, props.children));
|
||||
};
|
||||
console.log(DayCellContent);
|
||||
return DayCellContent;
|
||||
}(BaseComponent));
|
||||
function refineDayCellHookProps(raw) {
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<td class="linkbelow" style="padding:7px 0">
|
||||
<font size="2" face="Open-sans, sans-serif" color="#555454">
|
||||
<span>
|
||||
You can review this credit slip and download your invoice from the <a href="{history_url}" style="color:#337ff1">"My credit slips"</a> section of your account by clicking <a href="{my_account_url}" style="color:#337ff1">"My account"</a> on our shop. </span>
|
||||
You can review this credit slip and download your invoice from the <a href="{credit_slip_url}" style="color:#337ff1">"My credit slips"</a> section of your account by clicking <a href="{my_account_url}" style="color:#337ff1">"My account"</a> on our shop. </span>
|
||||
</font>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -7,7 +7,7 @@ We have generated a credit slip in your name for order with the
|
||||
reference {order_name}.
|
||||
|
||||
You can review this credit slip and download your invoice from the
|
||||
"My credit slips" [/{history_url}] section of your account by clicking
|
||||
"My credit slips" [/{credit_slip_url}] section of your account by clicking
|
||||
"My account" [/{my_account_url}] on our shop.
|
||||
|
||||
{shop_name} [/{shop_url}] powered by Webkul(tm)
|
||||
|
||||
@@ -50,6 +50,9 @@ class BankwirePaymentModuleFrontController extends ModuleFrontController
|
||||
$total = $cart->getOrderTotal(true, Cart::BOTH);
|
||||
}
|
||||
|
||||
// check all service products are available
|
||||
RoomTypeServiceProductCartDetail::validateServiceProductsInCart();
|
||||
|
||||
$restrict_order = false;
|
||||
/*Check Order restrict condition before Payment by the customer*/
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
|
||||
@@ -49,6 +49,9 @@ class BankwireValidationModuleFrontController extends ModuleFrontController
|
||||
if (!$authorized)
|
||||
die($this->module->l('This payment method is not available.', 'validation'));
|
||||
|
||||
// check all service products are available
|
||||
RoomTypeServiceProductCartDetail::validateServiceProductsInCart();
|
||||
|
||||
// Check Order restrict condition before Payment by the customer
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
|
||||
@@ -50,6 +50,9 @@ class ChequePaymentModuleFrontController extends ModuleFrontController
|
||||
$total = $cart->getOrderTotal(true, Cart::BOTH);
|
||||
}
|
||||
|
||||
// check all service products are available
|
||||
RoomTypeServiceProductCartDetail::validateServiceProductsInCart();
|
||||
|
||||
$restrict_order = false;
|
||||
/*Check Order restrict condition before Payment by the customer*/
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
|
||||
@@ -48,6 +48,9 @@ class ChequeValidationModuleFrontController extends ModuleFrontController
|
||||
if (!$authorized)
|
||||
die($this->module->l('This payment method is not available.', 'validation'));
|
||||
|
||||
// check all service products are available
|
||||
RoomTypeServiceProductCartDetail::validateServiceProductsInCart();
|
||||
|
||||
/*Check Order restrict condition before Payment by the customer*/
|
||||
if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) {
|
||||
require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
|
||||
@@ -26,6 +26,7 @@ function line_chart_availability(widget_name, chart_details) {
|
||||
.useInteractiveGuideline(true)
|
||||
.x(function(d) { return (d !== undefined ? d[0] : 0); })
|
||||
.y(function(d) { return (d !== undefined ? parseInt(d[1]) : 0); })
|
||||
.forceY(0)
|
||||
.margin({
|
||||
left: 30,
|
||||
right: 30,
|
||||
|
||||
@@ -170,7 +170,7 @@ class DashGuestCycle extends Module
|
||||
}
|
||||
|
||||
$tr[] = array(
|
||||
'value' => $arrivalInfo['adult'] + $arrivalInfo['children'],
|
||||
'value' => $arrivalInfo['with_occupancy'] ? ($arrivalInfo['adults'] + $arrivalInfo['children']) : '--',
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
@@ -230,7 +230,7 @@ class DashGuestCycle extends Module
|
||||
}
|
||||
|
||||
$tr[] = array(
|
||||
'value' => $departureInfo['adult'] + $departureInfo['children'],
|
||||
'value' => $departureInfo['with_occupancy'] ? ($departureInfo['adults'] + $departureInfo['children']) : '--',
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
@@ -291,7 +291,7 @@ class DashGuestCycle extends Module
|
||||
}
|
||||
|
||||
$tr[] = array(
|
||||
'value' => $inHouseInfo['adult'] + $inHouseInfo['children'],
|
||||
'value' => $inHouseInfo['with_occupancy'] ? ($inHouseInfo['adults'] + $inHouseInfo['children']) : '--',
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
@@ -357,7 +357,7 @@ class DashGuestCycle extends Module
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
'value' => $newBookingInfo['total_guests'],
|
||||
'value' => $newBookingInfo['with_occupancy'] ? $newBookingInfo['total_guests'] : '--',
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
@@ -425,7 +425,7 @@ class DashGuestCycle extends Module
|
||||
}
|
||||
|
||||
$tr[] = array(
|
||||
'value' => $cancellationInfo['total_guests'],
|
||||
'value' => $cancellationInfo['with_occupancy'] ? $cancellationInfo['total_guests'] : '--',
|
||||
'class' => 'text-center',
|
||||
);
|
||||
$tr[] = array(
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-6 col-lg-3">
|
||||
<div class="stat-box label-tooltip" data-toggle="tooltip" data-original-title="{l s='Total Revenue Per Available Room (TrevPAR) measures the total revenue being generated per available room including additional facilities.' mod='dashperformance'}" data-placement="top" style="background-color: #B6FFB6;">
|
||||
<div class="stat-box label-tooltip" data-toggle="tooltip" data-original-title="{l s='Total Revenue Per Available Room (TrevPAR) measures the total revenue being generated per available room including additional facilities and service products.' mod='dashperformance'}" data-placement="top" style="background-color: #B6FFB6;">
|
||||
<div class="title-wrapper">
|
||||
<p>{l s='Total Revenue Per Available Room' mod='dashperformance'}</p>
|
||||
</div>
|
||||
|
||||
@@ -561,7 +561,7 @@ class DashProducts extends Module
|
||||
LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range`
|
||||
LEFT JOIN `'._DB_PREFIX_.'page` p ON pv.`id_page` = p.`id_page`
|
||||
LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type`
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON hrt.`id_product` = p.`id_object`
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON hrt.`id_product` = p.`id_object`
|
||||
WHERE pt.`name` = \'product\'
|
||||
'.Shop::addSqlRestriction(false, 'pv').'
|
||||
AND dr.`time_start` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
|
||||
|
||||
@@ -82,8 +82,8 @@ class HotelBookingDetail extends ObjectModel
|
||||
const SEARCH_TYPE_NORMAL = 2;
|
||||
|
||||
//
|
||||
const PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY = 1;
|
||||
const PS_FRONT_ROOM_UNIT_SELECTION_TYPE_QUANTITY = 2;
|
||||
const PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY = 1;
|
||||
const PS_ROOM_UNIT_SELECTION_TYPE_QUANTITY = 2;
|
||||
|
||||
public static $definition = array(
|
||||
'table' => 'htl_booking_detail',
|
||||
|
||||
@@ -450,7 +450,12 @@ class HotelCartBookingData extends ObjectModel
|
||||
$chkQty = 0;
|
||||
$num_days = HotelHelper::getNumberOfDays($date_from, $date_to);
|
||||
$objRoomTypeServiceProductCartDetail = new RoomTypeServiceProductCartDetail();
|
||||
if (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (defined('_PS_ADMIN_DIR_')) {
|
||||
$PS_ROOM_UNIT_SELECTION_TYPE = Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE');
|
||||
} else {
|
||||
$PS_ROOM_UNIT_SELECTION_TYPE = Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE');
|
||||
}
|
||||
if ($PS_ROOM_UNIT_SELECTION_TYPE == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$roomsRequired = count($occupancy);
|
||||
} else {
|
||||
$objRoomType = new HotelRoomType();
|
||||
@@ -475,7 +480,7 @@ class HotelCartBookingData extends ObjectModel
|
||||
$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) {
|
||||
if ($PS_ROOM_UNIT_SELECTION_TYPE == HotelBookingDetail::PS_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'];
|
||||
@@ -573,8 +578,12 @@ class HotelCartBookingData extends ObjectModel
|
||||
'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) {
|
||||
if (defined('_PS_ADMIN_DIR_')) {
|
||||
$PS_ROOM_UNIT_SELECTION_TYPE = Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE');
|
||||
} else {
|
||||
$PS_ROOM_UNIT_SELECTION_TYPE = Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE');
|
||||
}
|
||||
if ($PS_ROOM_UNIT_SELECTION_TYPE == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$roomsRequired = count($occupancy);
|
||||
} else {
|
||||
$roomsRequired = $occupancy;
|
||||
|
||||
@@ -256,10 +256,10 @@ class HotelHelper
|
||||
// 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_FRONT_ROOM_UNIT_SELECTION_TYPE', HotelBookingDetail::PS_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);
|
||||
Configuration::updateValue('PS_BACKOFFICE_ROOM_BOOKING_TYPE', HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ class HotelImage extends ObjectModel
|
||||
|
||||
$this->source_index = _PS_HOTEL_IMG_DIR_.'index.php';
|
||||
|
||||
$this->image_dir = _PS_HOTEL_IMG_.$this->getImgFolder();
|
||||
$this->image_dir = _PS_HOTEL_IMG_DIR_.$this->getImgFolder();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -61,6 +61,33 @@ class HotelImage extends ObjectModel
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the hotel image from disk and remove the containing folder if empty
|
||||
* Handles both legacy and new image filesystems
|
||||
*/
|
||||
public function deleteImage($force_delete = false)
|
||||
{
|
||||
parent::deleteImage();
|
||||
// Can we delete the image folder?
|
||||
if (is_dir($this->image_dir)) {
|
||||
$delete_folder = true;
|
||||
foreach (scandir($this->image_dir) as $file) {
|
||||
if (($file != '.' && $file != '..' && $file != 'index.php')) {
|
||||
$delete_folder = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($delete_folder) && $delete_folder) {
|
||||
// delete index image before deleting folder
|
||||
unlink($this->image_dir.'index.php');
|
||||
@rmdir($this->image_dir);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* [getImagesByHotelId :: To get paginated hotel images data]
|
||||
* @param [int] $id_hotel [id_hotel to get images of]
|
||||
@@ -232,9 +259,9 @@ class HotelImage extends ObjectModel
|
||||
}
|
||||
}
|
||||
$addedImage = array(
|
||||
'id_image' => $objHtlImage->id,
|
||||
'id' => $objHtlImage->id,
|
||||
'cover' => $objHtlImage->cover,
|
||||
'image_url' => Context::getContext()->link->getMediaLink($objHtlImage->getImageLink($objHtlImage->id)),
|
||||
'image_link' => Context::getContext()->link->getMediaLink($objHtlImage->getImageLink($objHtlImage->id)),
|
||||
);
|
||||
return $addedImage;
|
||||
}
|
||||
|
||||
@@ -132,6 +132,7 @@ class HotelOrderRefundRules extends ObjectModel
|
||||
|
||||
$objHtlRefundRules = new HotelBranchRefundRules();
|
||||
$objHotelBookingDemands = new HotelBookingDemands();
|
||||
$objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail();
|
||||
|
||||
if ($bookingsToRefund = OrderReturn::getOrdersReturnDetail($idOrder, $idOrderReturn, $idHtlBooking)) {
|
||||
foreach ($bookingsToRefund as $booking) {
|
||||
@@ -152,6 +153,19 @@ class HotelOrderRefundRules extends ObjectModel
|
||||
1
|
||||
);
|
||||
|
||||
$totalServicesPrice = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts(
|
||||
$objHtlBooking->id_order,
|
||||
0,
|
||||
0,
|
||||
$objHtlBooking->id_product,
|
||||
$objHtlBooking->date_from,
|
||||
$objHtlBooking->date_to,
|
||||
$objHtlBooking->id_room,
|
||||
1,
|
||||
1,
|
||||
null
|
||||
);
|
||||
|
||||
if ($refundRules = $objHtlRefundRules->getHotelRefundRules($objHtlBooking->id_hotel, 0, 1)) {
|
||||
$orderCurrency = $objOrder->id_currency;
|
||||
$defaultCurrency = Configuration::get('PS_CURRENCY_DEFAULT');
|
||||
@@ -169,7 +183,7 @@ class HotelOrderRefundRules extends ObjectModel
|
||||
$ruleApplied = false;
|
||||
foreach ($refundRules as $refRule) {
|
||||
if ($daysBeforeCancel >= $refRule['days']) {
|
||||
$paidAmount = $objHtlBooking->total_paid_amount + $totalDemandsPrice;
|
||||
$paidAmount = $objHtlBooking->total_paid_amount + $totalDemandsPrice + $totalServicesPrice;
|
||||
if ($objOrder->is_advance_payment) {
|
||||
$refundValue = $refRule['deduction_value_adv_pay'];
|
||||
} else {
|
||||
|
||||
@@ -103,41 +103,6 @@ class HotelOrderRestrictDate extends ObjectModel
|
||||
)) {
|
||||
$cart_data = array();
|
||||
foreach ($cart_bk_data as $data) {
|
||||
$objCartBookingData = new HotelCartBookingData($data['id']);
|
||||
if ($maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($objCartBookingData->id_hotel)) {
|
||||
if (strtotime('-1 day', strtotime($maxOrderDate)) < strtotime($objCartBookingData->date_from)
|
||||
|| strtotime($maxOrderDate) < strtotime($objCartBookingData->date_to)
|
||||
) {
|
||||
$objBranchInfo = new HotelBranchInformation(
|
||||
$objCartBookingData->id_hotel,
|
||||
$context->language->id
|
||||
);
|
||||
$controller->errors[] = sprintf(
|
||||
'You can not book rooms for hotel \'%s\' after date %s. Please remove these rooms to proceed.',
|
||||
$objBranchInfo->hotel_name,
|
||||
Tools::displayDate($maxOrderDate)
|
||||
);
|
||||
$error = true;
|
||||
}
|
||||
}
|
||||
$preparationTime = HotelOrderRestrictDate::getPreparationTime($objCartBookingData->id_hotel);
|
||||
if ($preparationTime !== false) {
|
||||
$minOrderDate = date('Y-m-d', strtotime('+'. ($preparationTime) .' days'));
|
||||
if (strtotime($minOrderDate) > strtotime($objCartBookingData->date_from)
|
||||
|| strtotime($minOrderDate . ' +1 day')> strtotime($objCartBookingData->date_to)
|
||||
) {
|
||||
$objBranchInfo = new HotelBranchInformation(
|
||||
$objCartBookingData->id_hotel,
|
||||
$context->language->id
|
||||
);
|
||||
$controller->errors[] = sprintf(
|
||||
'You can not book rooms for hotel \'%s\' before date %s. Please remove these rooms to proceed.',
|
||||
$objBranchInfo->hotel_name,
|
||||
Tools::displayDate($minOrderDate)
|
||||
);
|
||||
$error = true;
|
||||
}
|
||||
}
|
||||
$date_join = strtotime($data['date_from']).strtotime($data['date_to']);
|
||||
$cart_data[$date_join]['date_from'] = $data['date_from'];
|
||||
$cart_data[$date_join]['date_to'] = $data['date_to'];
|
||||
@@ -145,6 +110,45 @@ class HotelOrderRestrictDate extends ObjectModel
|
||||
$cart_data[$date_join]['id_rms'][] = $data['id_room'];
|
||||
}
|
||||
foreach ($cart_data as $cl_key => $cl_val) {
|
||||
if ($maxOrderDate = HotelOrderRestrictDate::getMaxOrderDate($cl_val['id_hotel'])) {
|
||||
if (strtotime('-1 day', strtotime($maxOrderDate)) < strtotime($cl_val['date_from'])
|
||||
|| strtotime($maxOrderDate) < strtotime($cl_val['date_to'])
|
||||
) {
|
||||
$objBranchInfo = new HotelBranchInformation(
|
||||
$cl_val['id_hotel'],
|
||||
$context->language->id
|
||||
);
|
||||
$controller->errors[] = sprintf(
|
||||
'You can not book rooms for hotel \'%s\' after date %s. Please remove rooms from %s - %s to proceed.',
|
||||
$objBranchInfo->hotel_name,
|
||||
Tools::displayDate($maxOrderDate),
|
||||
Tools::displayDate($cl_val['date_from']),
|
||||
Tools::displayDate($cl_val['date_to'])
|
||||
);
|
||||
$error = true;
|
||||
}
|
||||
}
|
||||
$preparationTime = HotelOrderRestrictDate::getPreparationTime($cl_val['id_hotel']);
|
||||
if ($preparationTime !== false) {
|
||||
$minOrderDate = date('Y-m-d', strtotime('+'. ($preparationTime) .' days'));
|
||||
if (strtotime($minOrderDate) > strtotime($cl_val['date_from'])
|
||||
|| strtotime($minOrderDate . ' +1 day')> strtotime($cl_val['date_to'])
|
||||
) {
|
||||
$objBranchInfo = new HotelBranchInformation(
|
||||
$cl_val['id_hotel'],
|
||||
$context->language->id
|
||||
);
|
||||
$controller->errors[] = sprintf(
|
||||
'You can not book rooms for hotel \'%s\' before date %s. Please remove rooms from %s - %s to proceed.',
|
||||
$objBranchInfo->hotel_name,
|
||||
Tools::displayDate($minOrderDate),
|
||||
Tools::displayDate($cl_val['date_from']),
|
||||
Tools::displayDate($cl_val['date_to'])
|
||||
);
|
||||
$error = true;
|
||||
}
|
||||
}
|
||||
|
||||
$bookingParams = array(
|
||||
'date_from' => $cl_val['date_from'],
|
||||
'date_to' => $cl_val['date_to'],
|
||||
|
||||
@@ -471,11 +471,10 @@ class HotelReservationSystemDb
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link` (`id_settings_link`, `icon`, `link`, `new_window`, `position`, `unremovable`, `active`, `date_add`, `date_upd`) VALUES
|
||||
(1, 'icon-cogs', 'index.php?controller=AdminHotelGeneralSettings', 0, 0, 1, 1, NOW(), NOW()),
|
||||
(2, 'icon-list-alt', 'index.php?controller=AdminOrderRestrictSettings', 0, 1, 1, 1, NOW(), NOW()),
|
||||
(3, 'icon-dollar', 'index.php?controller=AdminHotelFeaturePricesSettings', 0, 2, 1, 1, NOW(), NOW()),
|
||||
(4, 'icon-plus-square', 'index.php?controller=AdminRoomTypeGlobalDemand', 0, 3, 1, 1, NOW(), NOW()),
|
||||
(5, 'icon-file-text', 'index.php?controller=AdminAboutHotelBlockSetting', 0, 4, 0, 1, NOW(), NOW()),
|
||||
(6, 'icon-th-list', 'index.php?controller=AdminFeaturesModuleSetting', 0, 5, 0, 1, NOW(), NOW());",
|
||||
(2, 'icon-dollar', 'index.php?controller=AdminHotelFeaturePricesSettings', 0, 2, 1, 1, NOW(), NOW()),
|
||||
(3, 'icon-plus-square', 'index.php?controller=AdminRoomTypeGlobalDemand', 0, 3, 1, 1, NOW(), NOW()),
|
||||
(4, 'icon-file-text', 'index.php?controller=AdminAboutHotelBlockSetting', 0, 4, 0, 1, NOW(), NOW()),
|
||||
(5, 'icon-th-list', 'index.php?controller=AdminFeaturesModuleSetting', 0, 5, 0, 1, NOW(), NOW());",
|
||||
|
||||
"CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."htl_settings_link_lang` (
|
||||
`id_settings_link` int(10) unsigned NOT NULL,
|
||||
@@ -491,27 +490,22 @@ class HotelReservationSystemDb
|
||||
ORDER BY `id_lang`;",
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link_lang` (`id_settings_link`, `id_lang`, `name`, `hint`)
|
||||
SELECT 2, `id_lang`, 'Order Restrict', 'Configure if you want to restrict orders till a specific date for your hotels.'
|
||||
SELECT 2, `id_lang`, 'Advanced Price Rules', 'Here set Advanced price rules for specific dates.'
|
||||
FROM `"._DB_PREFIX_."lang`
|
||||
ORDER BY `id_lang`;",
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link_lang` (`id_settings_link`, `id_lang`, `name`, `hint`)
|
||||
SELECT 3, `id_lang`, 'Advanced Price Rules', 'Here set Advanced price rules for specific dates.'
|
||||
SELECT 3, `id_lang`, 'Additional Facilities', 'Here create Additional facilities and their prices for room types.'
|
||||
FROM `"._DB_PREFIX_."lang`
|
||||
ORDER BY `id_lang`;",
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link_lang` (`id_settings_link`, `id_lang`, `name`, `hint`)
|
||||
SELECT 4, `id_lang`, 'Additional Facilities', 'Here create Additional facilities and their prices for room types.'
|
||||
SELECT 4, `id_lang`, 'Hotel Interior Block', 'Configure Hotel Interior block. You can display hotel interior images using this block. This block will be displayed on home page.'
|
||||
FROM `"._DB_PREFIX_."lang`
|
||||
ORDER BY `id_lang`;",
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link_lang` (`id_settings_link`, `id_lang`, `name`, `hint`)
|
||||
SELECT 5, `id_lang`, 'Hotel Interior Block', 'Configure Hotel Interior block. You can display hotel interior images using this block. This block will be displayed on home page.'
|
||||
FROM `"._DB_PREFIX_."lang`
|
||||
ORDER BY `id_lang`;",
|
||||
|
||||
"INSERT INTO `"._DB_PREFIX_."htl_settings_link_lang` (`id_settings_link`, `id_lang`, `name`, `hint`)
|
||||
SELECT 6, `id_lang`, 'Hotel Amenities Block', 'Configure Hotels Amenities settings. You can display hotel amenities images using this block. This block will be displayed on home page.'
|
||||
SELECT 5, `id_lang`, 'Hotel Amenities Block', 'Configure Hotels Amenities settings. You can display hotel amenities images using this block. This block will be displayed on home page.'
|
||||
FROM `"._DB_PREFIX_."lang`
|
||||
ORDER BY `id_lang`;",
|
||||
);
|
||||
|
||||
@@ -120,7 +120,7 @@ class RoomTypeServiceProduct extends ObjectModel
|
||||
if (Product::isBookingProduct($idProduct)) {
|
||||
$sql = 'SELECT p.`id_product` FROM `'._DB_PREFIX_.'htl_room_type_service_product` rsp
|
||||
INNER JOIN `'._DB_PREFIX_.'product` p ON (rsp.`id_product` = p.`id_product` AND p.`auto_add_to_cart` = 1)
|
||||
WHERE `id_element` = '.(int)$idProduct.' AND `element_type` = '.self::WK_ELEMENT_TYPE_ROOM_TYPE;
|
||||
WHERE p.`active` = 1 AND `id_element` = '.(int)$idProduct.' AND `element_type` = '.self::WK_ELEMENT_TYPE_ROOM_TYPE;
|
||||
if (!is_null($priceAdditionType)) {
|
||||
$sql .= ' AND p.`price_addition_type` = '.$priceAdditionType;
|
||||
}
|
||||
|
||||
@@ -107,16 +107,24 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
if ($useTax === null)
|
||||
$useTax = Product::$_taxCalculationMethod == PS_TAX_EXC ? false : true;
|
||||
|
||||
$idLang = Context::getContext()->language->id;
|
||||
|
||||
$sql = 'SELECT rscd.`id_product`, rscd.`quantity`, cbd.`id_cart`, cbd.`id` as `htl_cart_booking_id` ,
|
||||
cbd.`id_product` as `room_type_id_product`, cbd.`adults`, cbd.`children`';
|
||||
if (!$getTotalPrice) {
|
||||
$sql .= ', cbd.`id_guest`, cbd.`id_customer`, p.`auto_add_to_cart`, p.`price_addition_type`,
|
||||
$sql .= ', pl.`name`, cbd.`id_guest`, cbd.`id_customer`, p.`auto_add_to_cart`, p.`price_addition_type`,
|
||||
cbd.`id_hotel`, cbd.`id_room`, cbd.`date_from`, cbd.`date_to`, cbd.`is_refunded`';
|
||||
}
|
||||
$sql .= ' FROM `'._DB_PREFIX_.'htl_cart_booking_data` cbd
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_service_product_cart_detail` rscd ON(rscd.`htl_cart_booking_id` = cbd.`id`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = rscd.`id_product`)
|
||||
WHERE 1';
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_service_product_cart_detail` rscd
|
||||
ON(rscd.`htl_cart_booking_id` = cbd.`id`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'product` p
|
||||
ON (p.`id_product` = rscd.`id_product`)';
|
||||
if (!$getTotalPrice) {
|
||||
$sql .= ' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
|
||||
ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$idLang.')';
|
||||
}
|
||||
$sql .= ' WHERE 1';
|
||||
|
||||
if (!is_null($autoAddToCart)) {
|
||||
$sql .= ' AND p.`auto_add_to_cart` = '. (int)$autoAddToCart;
|
||||
@@ -165,7 +173,6 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
);
|
||||
|
||||
} else {
|
||||
$roomTypeInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($product['room_type_id_product']);
|
||||
$qty = $product['quantity'] ? (int)$product['quantity'] : 1;
|
||||
if (isset($selectedServiceProducts[$product['htl_cart_booking_id']])) {
|
||||
if ($product['id_product']) {
|
||||
@@ -175,6 +182,7 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
} else {
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['selected_products_info'][$product['id_product']] = array(
|
||||
'id_product' => $product['id_product'],
|
||||
'name' => $product['name'],
|
||||
'auto_add_to_cart' => $product['auto_add_to_cart'],
|
||||
'price_addition_type' => $product['price_addition_type'],
|
||||
'quantity' => $product['quantity'],
|
||||
@@ -220,6 +228,7 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['children'] = $product['children'];
|
||||
if ($idProduct) {
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['id_product'] = $product['id_product'];
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['name'] = $product['name'];
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['quantity'] = $product['quantity'];
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['auto_add_to_cart'] = $product['auto_add_to_cart'];
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['price_addition_type'] = $product['price_addition_type'];
|
||||
@@ -243,6 +252,7 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
$selectedServiceProducts[$product['htl_cart_booking_id']]['selected_products_info'] = ($product['id_product']) ? array(
|
||||
$product['id_product'] => array(
|
||||
'id_product' => $product['id_product'],
|
||||
'name' => $product['name'],
|
||||
'quantity' => $product['quantity'],
|
||||
'auto_add_to_cart' => $product['auto_add_to_cart'],
|
||||
'price_addition_type' => $product['price_addition_type'],
|
||||
@@ -341,4 +351,20 @@ class RoomTypeServiceProductCartDetail extends ObjectModel
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function validateServiceProductsInCart()
|
||||
{
|
||||
$context = Context::getContext();
|
||||
if ($cartProducts = $context->cart->getProducts()) {
|
||||
$objRoomTypeServiceProductCartDetail = new RoomTypeServiceProductCartDetail();
|
||||
foreach ($cartProducts as $product) {
|
||||
if (!$product['active'] && !$product['booking_product']) {
|
||||
$serviceProducts = $objRoomTypeServiceProductCartDetail->getServiceProductsInCart($context->cart->id, $product['id_product']);
|
||||
foreach ($serviceProducts as $serviceProduct) {
|
||||
$objRoomTypeServiceProductCartDetail->removeServiceProductByIdHtlCartBooking($serviceProduct['htl_cart_booking_id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -576,6 +576,7 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
|
||||
public function ajaxProcessUploadHotelImages()
|
||||
{
|
||||
$response = array('success' => false);
|
||||
$idHotel = Tools::getValue('id_hotel');
|
||||
if ($idHotel) {
|
||||
$invalidImg = ImageManager::validateUpload(
|
||||
@@ -584,27 +585,32 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
);
|
||||
if (!$invalidImg) {
|
||||
// Add Hotel images
|
||||
$kwargs = [
|
||||
'id_hotel' => $idHotel,
|
||||
'hotel_image' => $_FILES['hotel_image'],
|
||||
];
|
||||
$objHotelImage = new HotelImage();
|
||||
$imageDetail = $objHotelImage->uploadHotelImages($_FILES['hotel_image'], $idHotel);
|
||||
if ($imageDetail) {
|
||||
die(json_encode($imageDetail));
|
||||
$response['success'] = true;
|
||||
$imageDetail['image_link'] = $this->context->link->getMediaLink($objHotelImage->getImageLink($imageDetail['id'],ImageType::getFormatedName('large')));
|
||||
$imageDetail['image_link_small'] = $this->context->link->getMediaLink($objHotelImage->getImageLink($imageDetail['id'], ImageType::getFormatedName('small')));
|
||||
$response['data']['image_info'] = $imageDetail;
|
||||
// get image row
|
||||
$this->context->smarty->assign(array(
|
||||
'image' => $imageDetail,
|
||||
'hotel_info' => array('id' => $idHotel)
|
||||
));
|
||||
$response['data']['image_row'] = $this->context->smarty->fetch(
|
||||
_PS_MODULE_DIR_.$this->module->name.
|
||||
'/views/templates/admin/add_hotel/_partials/htl-images-list-row.tpl'
|
||||
);
|
||||
} else {
|
||||
die(json_encode(array('hasError' => true)));
|
||||
$response['errors'][] = $this->l('Unable to uploade image. Please try again');
|
||||
}
|
||||
} else {
|
||||
die(
|
||||
json_encode(
|
||||
array('hasError' => true, 'message' => $_FILES['hotel_image']['name'].': '.$invalidImg)
|
||||
)
|
||||
);
|
||||
$response['errors'][] = $_FILES['hotel_image']['name'].': '.$invalidImg;
|
||||
}
|
||||
} else {
|
||||
die(json_encode(array('hasError' => true)));
|
||||
$response['errors'][] = $this->l('Hotel info not found. Please try reloading the page');
|
||||
}
|
||||
$this->ajaxDie(json_encode($response));
|
||||
}
|
||||
|
||||
public function ajaxProcessChangeCoverImage()
|
||||
|
||||
@@ -40,11 +40,12 @@ class AdminAssignHotelFeaturesController extends ModuleAdminController
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'htl_branch_info` hi ON (hi.`id` = a.`id_hotel`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'htl_branch_info_lang` hil
|
||||
ON (hi.`id` = hil.`id` AND hil.id_lang = '.(int)$this->context->language->id.')';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = hi.`state_id`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (cl.`id_country` = hi.`country_id`
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'address` addr ON (addr.`id_hotel` = hi.`id`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = addr.`id_state`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (cl.`id_country` = addr.`id_country`
|
||||
AND cl.`id_lang` = '.(int)$this->context->language->id.')';
|
||||
|
||||
$this->_select .= 'hi.`city` as htl_city, hi.`id` as htl_id, hil.`hotel_name` as htl_name,
|
||||
$this->_select .= 'addr.`city` as htl_city, hi.`id` as htl_id, hil.`hotel_name` as htl_name,
|
||||
s.`name` as `state_name`, cl.`name`';
|
||||
$this->_group = 'GROUP BY a.`id_hotel`';
|
||||
|
||||
@@ -57,12 +58,12 @@ class AdminAssignHotelFeaturesController extends ModuleAdminController
|
||||
'htl_name' => array(
|
||||
'title' => $this->l('Hotel Name'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'hi!hotel_name',
|
||||
'filter_key' => 'hil!hotel_name',
|
||||
),
|
||||
'htl_city' => array(
|
||||
'title' => $this->l('City'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'hi!city',
|
||||
'filter_key' => 'addr!city',
|
||||
),
|
||||
|
||||
'state_name' => array(
|
||||
@@ -225,4 +226,4 @@ class AdminAssignHotelFeaturesController extends ModuleAdminController
|
||||
$this->addJs(_MODULE_DIR_.'hotelreservationsystem/views/js/HotelReservationAdmin.js');
|
||||
$this->addCSS(_MODULE_DIR_.'hotelreservationsystem/views/css/HotelReservationAdmin.css');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,27 +40,15 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
}
|
||||
|
||||
if (!isset($this->context->cookie->id_cart)) {
|
||||
// create a new cart
|
||||
$objCart = new Cart();
|
||||
$objCart->recyclable = 0;
|
||||
$objCart->gift = 0;
|
||||
$objCart->id_shop = (int) $this->context->shop->id;
|
||||
$objCart->id_lang = (($id_lang = (int) Tools::getValue('id_lang')) ? $id_lang : (int) Configuration::get('PS_LANG_DEFAULT'));
|
||||
$objCart->id_currency = (($id_currency = (int) Tools::getValue('id_currency')) ? $id_currency : (int) Configuration::get('PS_CURRENCY_DEFAULT'));
|
||||
$objCart->id_address_delivery = 0;
|
||||
$objCart->id_address_invoice = 0;
|
||||
$objCart->id_currency = (int) Configuration::get('PS_CURRENCY_DEFAULT');
|
||||
$objCart->id_guest = (int) $this->context->cookie->id_guest;
|
||||
$objCart->setNoMultishipping();
|
||||
|
||||
$this->context->cart = $objCart;
|
||||
$this->context->cart->save();
|
||||
|
||||
$objCart = $this->createNewCart();
|
||||
$this->context->cookie->id_cart = (int) $objCart->id;
|
||||
} else {
|
||||
// use previous cart
|
||||
$this->context->cart = new Cart($this->context->cookie->id_cart);
|
||||
if (!validate::isLoadedObject($objCart = new Cart($this->context->cookie->id_cart))) {
|
||||
$objCart = $this->createNewCart();
|
||||
}
|
||||
}
|
||||
$this->context->cart = $objCart;
|
||||
|
||||
$objCustomer = new Customer();
|
||||
$objCustomer->id_gender = 0;
|
||||
@@ -77,6 +65,26 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$this->context->customer = $objCustomer;
|
||||
}
|
||||
|
||||
protected function createNewCart()
|
||||
{
|
||||
// create a new cart
|
||||
$objCart = new Cart();
|
||||
$objCart->recyclable = 0;
|
||||
$objCart->gift = 0;
|
||||
$objCart->id_shop = (int) $this->context->shop->id;
|
||||
$objCart->id_lang = (($id_lang = (int) Tools::getValue('id_lang')) ? $id_lang : (int) Configuration::get('PS_LANG_DEFAULT'));
|
||||
$objCart->id_currency = (($id_currency = (int) Tools::getValue('id_currency')) ? $id_currency : (int) Configuration::get('PS_CURRENCY_DEFAULT'));
|
||||
$objCart->id_address_delivery = 0;
|
||||
$objCart->id_address_invoice = 0;
|
||||
$objCart->id_currency = (int) Configuration::get('PS_CURRENCY_DEFAULT');
|
||||
$objCart->id_guest = (int) $this->context->cookie->id_guest;
|
||||
$objCart->setNoMultishipping();
|
||||
|
||||
$objCart->save();
|
||||
return $objCart;
|
||||
}
|
||||
|
||||
|
||||
public function postProcess()
|
||||
{
|
||||
if (Tools::getValue('date_from')) {
|
||||
@@ -260,6 +268,10 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
'booking_product' => $this->booking_product,
|
||||
'is_occupancy_wise_search' => $isOccupancyWiseSearch,
|
||||
));
|
||||
MediaCore::addJsDef(array(
|
||||
'initialDate' => $this->date_from
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
public function renderView()
|
||||
@@ -300,7 +312,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
|
||||
$allotmentTypes = HotelBookingDetail::getAllAllotmentTypes();
|
||||
$occupancyRequiredForBooking = false;
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_FRONT_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
|
||||
@@ -466,6 +478,19 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
$bookingParams['date_from'] = $cal_date_from;
|
||||
$bookingParams['date_to'] = $cal_date_to;
|
||||
$eventData = $objBookingDetail->getBookingData($bookingParams);
|
||||
if (!$eventData) {
|
||||
$eventData['stats'] = array(
|
||||
'total_room_type' => 0,
|
||||
'total_rooms' => 0,
|
||||
'max_avail_occupancy' => 0,
|
||||
'num_unavail' => 0,
|
||||
'num_cart' => 0,
|
||||
'num_booked' => 0,
|
||||
'num_avail' => 0,
|
||||
'num_part_avai' => 0,
|
||||
);
|
||||
}
|
||||
|
||||
$eventData['date_format'] = Tools::displayDate($cal_date_from);
|
||||
$events[strtotime($bookingParams['date_from'])] = array(
|
||||
'is_notification' => 1,
|
||||
@@ -765,7 +790,7 @@ 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) {
|
||||
if (Configuration::get('PS_BACKOFFICE_ROOM_BOOKING_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
$occupancyRequiredForBooking = true;
|
||||
}
|
||||
$jsVars = array(
|
||||
|
||||
@@ -164,7 +164,7 @@ class AdminOrderRefundRequestsController extends ModuleAdminController
|
||||
}
|
||||
$this->fields_list = array(
|
||||
'id_order_return' => array(
|
||||
'title' => $this->l('ID'),
|
||||
'title' => $this->l('Refund ID'),
|
||||
'align' => 'center',
|
||||
'class' => 'fixed-width-xs',
|
||||
),
|
||||
@@ -448,6 +448,8 @@ class AdminOrderRefundRequestsController extends ModuleAdminController
|
||||
|
||||
Hook::exec('actionOrderSlipAdd', array('order' => $objOrder, 'bookingList' => $bookingList));
|
||||
|
||||
$params['{credit_slip_url}'] = $this->context->link->getPageLink('order-slip', true);
|
||||
|
||||
@Mail::Send(
|
||||
(int)$objOrder->id_lang,
|
||||
'credit_slip',
|
||||
|
||||
@@ -411,65 +411,6 @@ $(document).ready(function() {
|
||||
$(this).parents('.child_feature_row').remove();
|
||||
});
|
||||
|
||||
/*For swaping rooms in the modal*/
|
||||
$("#realloc_allocated_rooms").on('click', function(e) {
|
||||
$(".error_text").text('');
|
||||
if ($('#realloc_avail_rooms').val() == 0) {
|
||||
$("#realloc_sel_rm_err_p").text(slct_rm_err);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$("#swap_allocated_rooms").on('click', function(e) {
|
||||
$(".error_text").text('');
|
||||
if ($('#swap_avail_rooms').val() == 0) {
|
||||
$("#swap_sel_rm_err_p").text(slct_rm_err);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$('#mySwappigModal').on('hidden.bs.modal', function(e) {
|
||||
$(".modal_date_from").val('');
|
||||
$(".modal_date_to").val('');
|
||||
$(".modal_id_room").val('');
|
||||
$(".modal_curr_room_num").val('');
|
||||
$(".cust_name").text('');
|
||||
$(".cust_email").text('');
|
||||
$(".swp_rm_opts").remove();
|
||||
$(".realloc_rm_opts").remove();
|
||||
});
|
||||
|
||||
$('#mySwappigModal').on('shown.bs.modal', function(e) {
|
||||
$(".modal_date_from").val(e.relatedTarget.dataset.date_from);
|
||||
$(".modal_date_to").val(e.relatedTarget.dataset.date_to);
|
||||
$(".modal_id_room").val(e.relatedTarget.dataset.id_room);
|
||||
$(".modal_curr_room_num").val(e.relatedTarget.dataset.room_num);
|
||||
$(".cust_name").text(e.relatedTarget.dataset.cust_name);
|
||||
$(".cust_email").text(e.relatedTarget.dataset.cust_email);
|
||||
html = '';
|
||||
if (e.relatedTarget.dataset.avail_rm_realloc) {
|
||||
var json_arr_rm_swp = JSON.parse(e.relatedTarget.dataset.avail_rm_swap);
|
||||
$.each(json_arr_rm_swp, function(key, val) {
|
||||
html += '<option class="swp_rm_opts" value="' + val.id_room + '" >' + val.room_num + '</option>';
|
||||
});
|
||||
}
|
||||
if (html != '') {
|
||||
$("#swap_avail_rooms").append(html);
|
||||
}
|
||||
|
||||
html = '';
|
||||
if (e.relatedTarget.dataset.avail_rm_realloc) {
|
||||
var json_arr_rm_realloc = JSON.parse(e.relatedTarget.dataset.avail_rm_realloc);
|
||||
$.each(json_arr_rm_realloc, function(key, val) {
|
||||
html += '<option class="realloc_rm_opts" value="' + val.id_room + '" >' + val.room_num + '</option>';
|
||||
});
|
||||
}
|
||||
if (html != '') {
|
||||
$("#realloc_avail_rooms").append(html);
|
||||
}
|
||||
});
|
||||
|
||||
/* ---- Book Now page Admin ---- */
|
||||
|
||||
/* ---- HotelConfigurationSettingController Admin ---- */
|
||||
|
||||
if ($('#WK_SHOW_MSG_ON_BO_on').prop('checked') === true) {
|
||||
|
||||
@@ -23,6 +23,7 @@ $(document).ready(function() {
|
||||
if ($('#fullcalendar').length) {
|
||||
var calendar = new FullCalendar.Calendar($('#fullcalendar').get(0), {
|
||||
initialView: 'dayGridMonth',
|
||||
initialDate: initialDate,
|
||||
events: {
|
||||
url: rooms_booking_url,
|
||||
method: 'POST',
|
||||
@@ -49,7 +50,7 @@ $(document).ready(function() {
|
||||
$(info.el).closest('td').find('.day-info svg circle').attr('fill', '#7EC77B');
|
||||
} else if (info.event.extendedProps.data.stats.num_part_avai > 0) {
|
||||
$(info.el).closest('td').find('.day-info svg circle').attr('fill', '#FFC224');
|
||||
} else if (info.event.extendedProps.data.stats.num_booked == info.event.extendedProps.data.stats.total_rooms) {
|
||||
} else if ((info.event.extendedProps.data.stats.num_booked == info.event.extendedProps.data.stats.total_rooms) && info.event.extendedProps.data.stats.total_rooms != 0) {
|
||||
$(info.el).closest('td').find('.day-info svg circle').attr('fill', '#00AFF0');
|
||||
} else {
|
||||
$(info.el).closest('td').find('.day-info svg circle').attr('fill', '#FF3838');
|
||||
@@ -312,7 +313,7 @@ $(document).ready(function() {
|
||||
occupancy = false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return occupancy;
|
||||
@@ -954,4 +955,61 @@ $(document).ready(function() {
|
||||
return [true, ""];
|
||||
}
|
||||
}
|
||||
|
||||
/*For swaping rooms in the modal*/
|
||||
$("#realloc_allocated_rooms").on('click', function(e) {
|
||||
$(".error_text").text('');
|
||||
if ($('#realloc_avail_rooms').val() == 0) {
|
||||
$("#realloc_sel_rm_err_p").text(slct_rm_err);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$("#swap_allocated_rooms").on('click', function(e) {
|
||||
$(".error_text").text('');
|
||||
if ($('#swap_avail_rooms').val() == 0) {
|
||||
$("#swap_sel_rm_err_p").text(slct_rm_err);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$('#mySwappigModal').on('hidden.bs.modal', function(e) {
|
||||
$(".modal_date_from").val('');
|
||||
$(".modal_date_to").val('');
|
||||
$(".modal_id_room").val('');
|
||||
$(".modal_curr_room_num").val('');
|
||||
$(".cust_name").text('');
|
||||
$(".cust_email").text('');
|
||||
$(".swp_rm_opts").remove();
|
||||
$(".realloc_rm_opts").remove();
|
||||
});
|
||||
|
||||
$('#mySwappigModal').on('shown.bs.modal', function(e) {
|
||||
$(".modal_date_from").val(e.relatedTarget.dataset.date_from);
|
||||
$(".modal_date_to").val(e.relatedTarget.dataset.date_to);
|
||||
$(".modal_id_room").val(e.relatedTarget.dataset.id_room);
|
||||
$(".modal_curr_room_num").val(e.relatedTarget.dataset.room_num);
|
||||
$(".cust_name").text(e.relatedTarget.dataset.cust_name);
|
||||
$(".cust_email").text(e.relatedTarget.dataset.cust_email);
|
||||
html = '';
|
||||
if (e.relatedTarget.dataset.avail_rm_realloc) {
|
||||
var json_arr_rm_swp = JSON.parse(e.relatedTarget.dataset.avail_rm_swap);
|
||||
$.each(json_arr_rm_swp, function(key, val) {
|
||||
html += '<option class="swp_rm_opts" value="' + val.id_room + '" >' + val.room_num + '</option>';
|
||||
});
|
||||
}
|
||||
if (html != '') {
|
||||
$("#swap_avail_rooms").append(html);
|
||||
}
|
||||
|
||||
html = '';
|
||||
if (e.relatedTarget.dataset.avail_rm_realloc) {
|
||||
var json_arr_rm_realloc = JSON.parse(e.relatedTarget.dataset.avail_rm_realloc);
|
||||
$.each(json_arr_rm_realloc, function(key, val) {
|
||||
html += '<option class="realloc_rm_opts" value="' + val.id_room + '" >' + val.room_num + '</option>';
|
||||
});
|
||||
}
|
||||
if (html != '') {
|
||||
$("#realloc_avail_rooms").append(html);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -27,104 +27,75 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
$("#hotel_images").on("change", function(event) {
|
||||
files = event.target.files;
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var formData = new FormData();
|
||||
var file = files[i];
|
||||
|
||||
if (typeof file != 'undefined') {
|
||||
if (file.size > maxSizeAllowed) {
|
||||
showErrorMessage(filesizeError + '[' + file.name + ']');
|
||||
} else {
|
||||
formData.append('hotel_image', file);
|
||||
uploadHotelImages(formData);
|
||||
}
|
||||
}
|
||||
}
|
||||
$('#hotel_images').val(null);
|
||||
const files = Array.from(event.target.files);
|
||||
uploadSelectedImages(files);
|
||||
});
|
||||
|
||||
function uploadHotelImages(formData) {
|
||||
var idHotel = $("#id-hotel").val();
|
||||
formData.append('id_hotel', idHotel);
|
||||
formData.append('ajax', true);
|
||||
formData.append('action', 'uploadHotelImages');
|
||||
function uploadSelectedImages(files)
|
||||
{
|
||||
if (files.length == 0) return; // all done
|
||||
let file = files[0];
|
||||
files.splice(0, 1);
|
||||
createImageUploadRequest(file).then((formData) => {
|
||||
uploadHotelImages(formData).then(() => {
|
||||
uploadSelectedImages(files)
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type:'POST',
|
||||
url: adminHotelCtrlUrl,
|
||||
data: formData,
|
||||
cache:false,
|
||||
contentType: false,
|
||||
processData: false,
|
||||
success:function(image){
|
||||
image = JSON.parse(image);
|
||||
if (!image.hasError) {
|
||||
$('.list-empty-tr').remove();
|
||||
var html = '';
|
||||
html += '<tr class="';
|
||||
if(image.cover) {
|
||||
html += 'cover-image-tr';
|
||||
}
|
||||
html += '">';
|
||||
html += '<td class="text-center">'+image.id_image+'</td>';
|
||||
html += '<td class="text-center">';
|
||||
html += '<a class="htl-img-preview" href="'+image.image_url+'">';
|
||||
html += '<img class="img-thumbnail" width="100" src="'+image.image_url+'"/>';
|
||||
html += '</a>';
|
||||
html += '</td>';
|
||||
html += '<td class="text-center ';
|
||||
if(image.cover) {
|
||||
html += 'cover-image-td';
|
||||
}
|
||||
html += '">';
|
||||
html += '<a href="#" class="';
|
||||
if(image.cover) {
|
||||
html += 'text-success';
|
||||
} else {
|
||||
html += 'text-danger';
|
||||
}
|
||||
html += ' changer-cover-image" data-id-hotel="'+idHotel+'" data-is-cover="';
|
||||
if(image.cover) {
|
||||
html += '1';
|
||||
} else {
|
||||
html += '0';
|
||||
}
|
||||
html += '" data-id-image="'+image.id_image+'">';
|
||||
if(image.cover) {
|
||||
html += '<i class="icon-check"></i>';
|
||||
} else {
|
||||
html += '<i class="icon-times"></i>';
|
||||
}
|
||||
html += '</a>';
|
||||
html += '</td>';
|
||||
html += '<td class="text-center">';
|
||||
html += '<button type="button" class="btn btn-default delete-hotel-image" data-id-hotel="'+idHotel+'" data-is-cover="';
|
||||
if(image.cover) {
|
||||
html += '1';
|
||||
} else {
|
||||
html += '0';
|
||||
}
|
||||
html += '" data-id-image="'+image.id_image+'"><i class="icon-trash"></i></button>';
|
||||
html += '</td>';
|
||||
html += '</tr>';
|
||||
$("#hotel-image-table tbody").append(html);
|
||||
|
||||
showSuccessMessage(imgUploadSuccessMsg);
|
||||
function createImageUploadRequest(file)
|
||||
{
|
||||
return new Promise((resolve, reject) => {
|
||||
if (typeof file != 'undefined') {
|
||||
if (file.size > maxSizeAllowed) {
|
||||
reject(filesizeError + '[' + file.name + ']');
|
||||
} else {
|
||||
if (typeof image.message != 'undefined') {
|
||||
showErrorMessage(image.message);
|
||||
} else {
|
||||
showErrorMessage(imgUploadErrorMsg);
|
||||
}
|
||||
var formData = new FormData();
|
||||
var idHotel = $("#id-hotel").val();
|
||||
formData.append('hotel_image', file);
|
||||
formData.append('id_hotel', idHotel);
|
||||
formData.append('ajax', true);
|
||||
formData.append('action', 'uploadHotelImages');
|
||||
resolve(formData);
|
||||
}
|
||||
},
|
||||
error: function(data) {
|
||||
showErrorMessage(imgUploadErrorMsg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function uploadHotelImages(formData) {
|
||||
return new Promise((resolve, reject) => {
|
||||
$.ajax({
|
||||
type:'POST',
|
||||
dataType:'JSON',
|
||||
url: adminHotelCtrlUrl,
|
||||
data: formData,
|
||||
cache:false,
|
||||
contentType: false,
|
||||
processData: false,
|
||||
success:function(response){
|
||||
if (response.success) {
|
||||
$('.list-empty-tr').remove();
|
||||
$("#hotel-image-table tbody").append(response.data.image_row);
|
||||
showSuccessMessage(imgUploadSuccessMsg);
|
||||
resolve(imgUploadSuccessMsg);
|
||||
} else {
|
||||
if (typeof response.errors != 'undefined') {
|
||||
showErrorMessage(response.errors);
|
||||
reject(response.errors);
|
||||
} else {
|
||||
showErrorMessage(imgUploadErrorMsg);
|
||||
reject(imgUploadErrorMsg);
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(data) {
|
||||
showErrorMessage(imgUploadErrorMsg);
|
||||
reject(imgUploadErrorMsg);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$('body').on('click', '.changer-cover-image', function(e){
|
||||
e.preventDefault();
|
||||
var idHotel = $(this).attr('data-id-hotel');
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
{**
|
||||
* 2010-2022 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-2022 Webkul IN
|
||||
* @license LICENSE.txt
|
||||
*}
|
||||
|
||||
<tr class="{if $image.cover == 1}cover-image-tr{/if}">
|
||||
<td class="text-center">{$image.id|escape:'html':'UTF-8'}</td>
|
||||
<td class="text-center">
|
||||
<a class="htl-img-preview" href="{$image.image_link|escape:'html':'UTF-8'}">
|
||||
<img class="img-thumbnail" width="100" src="{$image.image_link_small|escape:'html':'UTF-8'}"/>
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center {if $image.cover == 1}cover-image-td{/if}">
|
||||
<a href="#" class="{if $image.cover == 1}text-success{else}text-danger{/if} changer-cover-image" data-id-hotel="{$hotel_info.id|escape:'html':'UTF-8'}" data-is-cover="{if $image.cover == 1}1{else}0{/if}" data-id-image="{$image.id|escape:'html':'UTF-8'}">
|
||||
{if $image.cover == 1}
|
||||
<i class="icon-check"></i>
|
||||
{else}
|
||||
<i class="icon-times"></i>
|
||||
{/if}
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<button type="button" class="btn btn-default delete-hotel-image" data-id-hotel="{$hotel_info.id|escape:'html':'UTF-8'}" data-is-cover="{if $image.cover == 1}1{else}0{/if}" data-id-image="{$image.id|escape:'html':'UTF-8'}"><i class="icon-trash"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -0,0 +1,47 @@
|
||||
{**
|
||||
* 2010-2022 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-2022 Webkul IN
|
||||
* @license LICENSE.txt
|
||||
*}
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table" id="hotel-image-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">{l s='Image Id' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Image' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Cover' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Action' mod='hotelreservationsystem'}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{if isset($hotelImages) && $hotelImages}
|
||||
{foreach from=$hotelImages item=image name=hotelImage}
|
||||
{include file="./htl-images-list-row.tpl"}
|
||||
{/foreach}
|
||||
{else}
|
||||
<tr class="list-empty-tr">
|
||||
<td class="list-empty" colspan="5">
|
||||
<div class="list-empty-msg">
|
||||
<i class="icon-warning-sign list-empty-icon"></i>
|
||||
{l s='No Image Found' mod='hotelreservationsystem'}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -304,53 +304,7 @@
|
||||
<h4><i class="icon-image"></i> <span>{l s='Hotel Images' mod='hotelreservationsystem'}</span></h4>
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table" id="hotel-image-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">{l s='Image Id' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Image' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Cover' mod='hotelreservationsystem'}</th>
|
||||
<th class="text-center">{l s='Action' mod='hotelreservationsystem'}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{if isset($hotelImages) && $hotelImages}
|
||||
{foreach from=$hotelImages item=image name=hotelImage}
|
||||
<tr class="{if $image.cover == 1}cover-image-tr{/if}">
|
||||
<td class="text-center">{$image.id|escape:'html':'UTF-8'}</td>
|
||||
<td class="text-center">
|
||||
<a class="htl-img-preview" href="{$image.image_link|escape:'html':'UTF-8'}">
|
||||
<img class="img-thumbnail" width="100" src="{$image.image_link_small|escape:'html':'UTF-8'}"/>
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center {if $image.cover == 1}cover-image-td{/if}">
|
||||
<a href="#" class="{if $image.cover == 1}text-success{else}text-danger{/if} changer-cover-image" data-id-hotel="{$hotel_info.id|escape:'html':'UTF-8'}" data-is-cover="{if $image.cover == 1}1{else}0{/if}" data-id-image="{$image.id|escape:'html':'UTF-8'}">
|
||||
{if $image.cover == 1}
|
||||
<i class="icon-check"></i>
|
||||
{else}
|
||||
<i class="icon-times"></i>
|
||||
{/if}
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<button type="button" class="btn btn-default delete-hotel-image" data-id-hotel="{$hotel_info.id|escape:'html':'UTF-8'}" data-is-cover="{if $image.cover == 1}1{else}0{/if}" data-id-image="{$image.id|escape:'html':'UTF-8'}"><i class="icon-trash"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{else}
|
||||
<tr class="list-empty-tr">
|
||||
<td class="list-empty" colspan="5">
|
||||
<div class="list-empty-msg">
|
||||
<i class="icon-warning-sign list-empty-icon"></i>
|
||||
{l s='No Image Found' mod='hotelreservationsystem'}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{include file="../../_partials/htl-images-list.tpl"}
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
<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>
|
||||
<label>{l s='Children'} <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>
|
||||
@@ -159,7 +159,7 @@
|
||||
<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>
|
||||
<label>{l s='Children'} <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>
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
<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>
|
||||
<label>{l s='Children'} <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>
|
||||
@@ -123,7 +123,7 @@
|
||||
<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>
|
||||
<label>{l s='Children'} <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>
|
||||
@@ -218,7 +218,7 @@
|
||||
</ul>
|
||||
<div class="tab-content panel active">
|
||||
<div role="tabpanel" class="tab-pane active" id="reallocate_room_tab">
|
||||
<form method="post" action="{$formAction|escape:'htmlall':'UTF-8'}">
|
||||
<form method="post" action="">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="realloc_myModalLabel">{l s='Reallocate Rooms'}</h4>
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
<th>{l s='Hotel' mod='hotelreservationsystem'}</th>
|
||||
<th>{l s='Duration' mod='hotelreservationsystem'}</th>
|
||||
<th>{l s='Total rooms paid (tax incl.)'}</th>
|
||||
<th>{l s='Additional facilities price (tax incl.)'}</th>
|
||||
<th>{l s='Additional services price (tax incl.)'}</th>
|
||||
{if !$isRefundCompleted}
|
||||
<th>{l s='Rooms cancelation charges' mod='hotelreservationsystem'}</th>
|
||||
{/if}
|
||||
@@ -137,7 +137,7 @@
|
||||
<td>{$booking['hotel_name']|escape:'htmlall':'UTF-8'}</td>
|
||||
<td>{$booking['date_from']|date_format:"%d-%m-%Y"} {l s='To' mod='hotelreservationsystem'} {$booking['date_to']|date_format:"%d-%m-%Y"}</td>
|
||||
<td>{displayPrice price=$booking['total_paid_amount'] currency=$orderCurrency['id']}</td>
|
||||
<td>{displayPrice price=$booking['extra_demands_price_tax_incl'] currency=$orderCurrency['id']}</td>
|
||||
<td>{displayPrice price=($booking['extra_demands_price_tax_incl'] + $booking['additional_services_tax_incl']) currency=$orderCurrency['id']}</td>
|
||||
{if !$isRefundCompleted}
|
||||
<td>{displayPrice price=$booking['cancelation_charge'] currency=$orderCurrency['id']}</td>
|
||||
{/if}
|
||||
|
||||
@@ -641,7 +641,6 @@ class QloCleaner extends Module
|
||||
array('warehouse_carrier', 'id_carrier', 'carrier', 'id_carrier'),
|
||||
array('warehouse_product_location', 'id_product', 'product', 'id_product'),
|
||||
array('warehouse_product_location', 'id_warehouse', 'warehouse', 'id_warehouse'),
|
||||
array('product_comment', 'id_product', 'product', 'id_product'),
|
||||
array('specific_price', 'id_product', 'customer', 'id_customer'),
|
||||
array('specific_price', 'id_group', 'group', 'id_group'),
|
||||
array('htl_features_block_data_lang', 'id_features_block', 'htl_features_block_data', 'id_features_block'),
|
||||
|
||||
@@ -202,10 +202,11 @@ class StatsBestProducts extends ModuleGrid
|
||||
FROM `'._DB_PREFIX_.'product` p
|
||||
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
|
||||
ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int) $id_lang .')
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt
|
||||
ON (hrt.`id_product` = p.`id_product`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_branch_info_lang` hbil
|
||||
ON (hbil.`id` = hrt.`id_hotel` AND hbil.`id_lang` = '.(int) $id_lang .')';
|
||||
ON (hbil.`id` = hrt.`id_hotel` AND hbil.`id_lang` = '.(int) $id_lang .')
|
||||
WHERE p.`booking_product` = 1';
|
||||
|
||||
if (Validate::IsName($this->_sort)) {
|
||||
$this->query .= ' ORDER BY `'.bqSQL($this->_sort).'`';
|
||||
|
||||
@@ -46,7 +46,7 @@ class StatsCatalog extends Module
|
||||
|
||||
parent::__construct();
|
||||
|
||||
$this->displayName = $this->l('Catalog statistics');
|
||||
$this->displayName = $this->l('Hotel statistics');
|
||||
$this->description = $this->l('Adds a tab containing general statistics about your catalog to the Stats dashboard.');
|
||||
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.7.0.99');
|
||||
}
|
||||
@@ -119,7 +119,7 @@ class StatsCatalog extends Module
|
||||
LEFT JOIN `'._DB_PREFIX_.'page` pa ON pv.`id_page` = pa.`id_page`
|
||||
LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = pa.`id_page_type`
|
||||
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = pa.`id_object`
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
'.Shop::addSqlAssociation('product', 'p').'
|
||||
'.$this->join.'
|
||||
WHERE pt.`name` IN ("product.php", "product")
|
||||
@@ -149,7 +149,7 @@ class StatsCatalog extends Module
|
||||
FROM `'._DB_PREFIX_.'image` i
|
||||
LEFT JOIN `'._DB_PREFIX_.'product` p
|
||||
ON (p.`id_product` = i.`id_product`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt
|
||||
ON (hrt.`id_product` = i.`id_product`)
|
||||
WHERE hrt.`id_hotel` = hbi.`id`
|
||||
) AS room_type_images
|
||||
@@ -174,7 +174,7 @@ class StatsCatalog extends Module
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order`
|
||||
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = od.`product_id`
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
'.Shop::addSqlAssociation('product', 'p').'
|
||||
'.$this->join.'
|
||||
WHERE o.valid = 1
|
||||
@@ -194,7 +194,7 @@ class StatsCatalog extends Module
|
||||
$sql = 'SELECT p.id_product, pl.name, pl.link_rewrite
|
||||
FROM `'._DB_PREFIX_.'product` p
|
||||
'.Shop::addSqlAssociation('product', 'p').'
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (p.`id_product` = hrt.`id_product`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
|
||||
ON (pl.`id_product` = p.`id_product` AND pl.id_lang = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
|
||||
'.$this->join.'
|
||||
@@ -282,12 +282,18 @@ class StatsCatalog extends Module
|
||||
<div class="row row-margin-bottom">
|
||||
<p>
|
||||
<i class="icon-asterisk"></i>'.$this->l('Defines the average conversion rate for the room type page. It is possible to book a room type without viewing the room type page, so this rate can be greater than 1.').'
|
||||
</p>';
|
||||
|
||||
$link = $this->context->link->getAdminLink('AdminModules').'&configure=statsdata';
|
||||
$html .='
|
||||
<p>
|
||||
<strong>'.$this->l('Note: ').'</strong>'.$this->l('You must enable the "Save global page views" option from ').'<a href="'.$link.'" target="_blank">Data mining for statistics</a>'.$this->l(' module for accurate data, or use the QloApps Google Analytics module.').'
|
||||
</p>
|
||||
</div>';
|
||||
|
||||
if (count($products_nb) && count($products_nb) < 50) {
|
||||
$html .= '
|
||||
<div class="panel-heading">'.$this->l('Room types never booked').'</div>
|
||||
<div class="col-sm-12"><div class="panel-heading">'.$this->l('Room types never booked').'</div></div>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
||||
@@ -91,6 +91,8 @@ class StatsCheckUp extends Module
|
||||
.$this->displayName.'
|
||||
</div>';
|
||||
|
||||
$activeTab = 'hotels';
|
||||
|
||||
if (Tools::isSubmit('submitCheckupRoomType')) {
|
||||
$confs = array(
|
||||
'ROOM_TYPE_CHECKUP_DESCRIPTIONS_LT',
|
||||
@@ -129,6 +131,25 @@ class StatsCheckUp extends Module
|
||||
$this->html .= $this->displayConfirmation($this->l('Configuration updated.'));
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('submitCheckupService')) {
|
||||
$confs = array(
|
||||
'SERVICE_CHECKUP_DESCRIPTIONS_SHORT_LT',
|
||||
'SERVICE_CHECKUP_DESCRIPTIONS_SHORT_GT',
|
||||
'SERVICE_CHECKUP_IMAGES_LT',
|
||||
'SERVICE_CHECKUP_IMAGES_GT',
|
||||
'SERVICE_CHECKUP_ORDERS_LT',
|
||||
'SERVICE_CHECKUP_ORDERS_GT',
|
||||
);
|
||||
|
||||
foreach ($confs as $confname) {
|
||||
Configuration::updateValue($confname, (int)Tools::getValue($confname));
|
||||
}
|
||||
|
||||
$this->html .= $this->displayConfirmation($this->l('Configuration updated.'));
|
||||
|
||||
$activeTab = 'services';
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('submitCheckupOrder')) {
|
||||
$this->context->cookie->checkup_order = (int)Tools::getValue('submitCheckupOrder');
|
||||
$this->html .= $this->displayConfirmation($this->l('Configuration updated.'));
|
||||
@@ -142,6 +163,35 @@ class StatsCheckUp extends Module
|
||||
$this->id_hotel = (int) Tools::getValue('id_hotel');
|
||||
}
|
||||
|
||||
$this->html .= '
|
||||
<ul class="nav nav-tabs">
|
||||
<li '.($activeTab == 'hotels' ? 'class="active"' : '').'>
|
||||
<a href="#statscheckup_hotels" data-toggle="tab">
|
||||
<span>'.$this->l('Hotels').'</span>
|
||||
</a>
|
||||
</li>
|
||||
<li '.($activeTab == 'services' ? 'class="active"' : '').'>
|
||||
<a href="#statscheckup_services" data-toggle="tab">
|
||||
<span>'.$this->l('Services').'</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content panel panel-sm">
|
||||
<div class="tab-pane '.($activeTab == 'hotels' ? 'active' : '').'" id="statscheckup_hotels">
|
||||
'.$this->getHotelsTab().'
|
||||
</div>
|
||||
<div class="tab-pane '.($activeTab == 'services' ? 'active' : '').'" id="statscheckup_services">
|
||||
'.$this->getServicesTab().'
|
||||
</div>
|
||||
</div>
|
||||
';
|
||||
|
||||
return $this->html;
|
||||
}
|
||||
|
||||
private function getHotelsTab()
|
||||
{
|
||||
$employee = Context::getContext()->employee;
|
||||
$prop30 = ((strtotime($employee->stats_date_to.' 23:59:59') - strtotime($employee->stats_date_from.' 00:00:00')) / 60 / 60 / 24) / 30;
|
||||
|
||||
@@ -187,7 +237,7 @@ class StatsCheckUp extends Module
|
||||
'TOTAL_ROOMS' => array('name' => $this->l('Total rooms'), 'text' => $this->l('rooms')),
|
||||
);
|
||||
|
||||
$this->html .= '
|
||||
$hotelsHtml = '
|
||||
<form action="'.Tools::safeOutput(AdminController::$currentIndex.'&token='.Tools::getValue('token').'&module='.$this->name.($this->id_hotel ? '&id_hotel='.$this->id_hotel : '')).'" method="post" class="checkup form-horizontal">
|
||||
<table class="table checkup">
|
||||
<thead>
|
||||
@@ -200,7 +250,7 @@ class StatsCheckUp extends Module
|
||||
foreach ($array_conf as $conf => $translations) {
|
||||
$confKeyLt = ($this->id_hotel ? 'ROOM_TYPE' : 'HOTEL').'_CHECKUP_'.$conf.'_LT';
|
||||
$confKeyGt = ($this->id_hotel ? 'ROOM_TYPE' : 'HOTEL').'_CHECKUP_'.$conf.'_GT';
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
@@ -227,7 +277,7 @@ class StatsCheckUp extends Module
|
||||
</tr>
|
||||
</tbody>';
|
||||
}
|
||||
$this->html .= '</table>
|
||||
$hotelsHtml .= '</table>
|
||||
<button type="submit" name="'.($this->id_hotel ? 'submitCheckupRoomType' : 'submitCheckupHotel').'" class="btn btn-default pull-right">
|
||||
<i class="icon-save"></i> '.$this->l('Save').'
|
||||
</button>
|
||||
@@ -251,12 +301,12 @@ class StatsCheckUp extends Module
|
||||
<thead>
|
||||
<tr>
|
||||
<th><span class="title_box active">'.$this->l('ID').'</span></th>
|
||||
<th><span class="title_box active">'.$this->l('Room type').'</span></th>
|
||||
<th><span class="title_box active">'.(!$this->id_hotel ? $this->l('Hotel') : $this->l('Room type')).'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Active').'</span></th>';
|
||||
foreach ($languages as $language) {
|
||||
$this->html .= '<th><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
$hotelsHtml .= '<th><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
}
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<th class="center"><span class="title_box active">'.$this->l('Images').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Orders').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Total rooms').'</span></th>
|
||||
@@ -280,17 +330,6 @@ 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,7 +341,7 @@ class StatsCheckUp extends Module
|
||||
$totals['images'] += (int)$scores['images'];
|
||||
$totals['orders'] += (int)$scores['orders'];
|
||||
$totals['total_rooms'] += (int)$scores['total_rooms'];
|
||||
$descriptions = $this->getDescriptions($row['id_object']);
|
||||
$descriptions = $this->getDescriptions($this->id_hotel ? 'room_type' : 'hotel', $row['id_object']);
|
||||
foreach ($descriptions as $description) {
|
||||
if (isset($description['iso_code']) && isset($description['description'])) {
|
||||
$row['desclength_'.$description['iso_code']] = Tools::strlen(strip_tags($description['description']));
|
||||
@@ -321,16 +360,16 @@ class StatsCheckUp extends Module
|
||||
} else {
|
||||
$objectLink = $this->context->link->getAdminLink('AdminAddHotel').'&updatehtl_branch_info&id='.$row['id_object'];
|
||||
}
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<tr>
|
||||
<td>'.$row['id_object'].'</td>
|
||||
<td><a href="'.$objectLink.'" target="_blank">'.Tools::substr($row['object_name'], 0, 42).'</a></td>
|
||||
<td class="center">'.$array_colors[$scores['active']].'</td>';
|
||||
foreach ($languages as $language) {
|
||||
if (isset($row['desclength_'.$language['iso_code']])) {
|
||||
$this->html .= '<td class="center">'.(int)$row['desclength_'.$language['iso_code']].' '.$array_colors[$scores['description_'.$language['iso_code']]].'</td>';
|
||||
$hotelsHtml .= '<td class="center">'.(int)$row['desclength_'.$language['iso_code']].' '.$array_colors[$scores['description_'.$language['iso_code']]].'</td>';
|
||||
} else {
|
||||
$this->html .= '<td>0 '.$array_colors[0].'</td>';
|
||||
$hotelsHtml .= '<td>0 '.$array_colors[0].'</td>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,7 +378,7 @@ class StatsCheckUp extends Module
|
||||
$objectViewLink = $this->context->link->getAdminLink('AdminStats').'&module='.$this->name.'&id_hotel='.$row['id_object'];
|
||||
}
|
||||
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<td class="center">'.(int)$row['nbImages'].' '.$array_colors[$scores['images']].'</td>
|
||||
<td class="center">'.(int)$row['nbOrders'].' '.$array_colors[$scores['orders']].'</td>
|
||||
<td class="center">'.(int)$row['totalRooms'].' '.$array_colors[$scores['total_rooms']].'</td>
|
||||
@@ -348,7 +387,7 @@ class StatsCheckUp extends Module
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$this->html .= '</tbody>';
|
||||
$hotelsHtml .= '</tbody>';
|
||||
|
||||
$totals['active'] = $totals['active'] / $totals['products'];
|
||||
$totals['active'] = ($totals['active'] < 1 ? 0 : ($totals['active'] > 1.5 ? 2 : 1));
|
||||
@@ -365,15 +404,15 @@ class StatsCheckUp extends Module
|
||||
$totals['average'] = array_sum($totals) / $divisor;
|
||||
$totals['average'] = ($totals['average'] < 1 ? 0 : ($totals['average'] > 1.5 ? 2 : 1));
|
||||
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th colspan="2"></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Active').'</span></th>';
|
||||
foreach ($languages as $language) {
|
||||
$this->html .= '<th class="center"><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
$hotelsHtml .= '<th class="center"><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
}
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<th class="center"><span class="title_box active">'.$this->l('Images').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Orders').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Total rooms').'</span></th>
|
||||
@@ -384,19 +423,248 @@ class StatsCheckUp extends Module
|
||||
<td colspan="2"></td>
|
||||
<td class="center">'.$array_colors[$totals['active']].'</td>';
|
||||
foreach ($languages as $language) {
|
||||
$this->html .= '<td class="center">'.$array_colors[$totals['description_'.$language['iso_code']]].'</td>';
|
||||
$hotelsHtml .= '<td class="center">'.$array_colors[$totals['description_'.$language['iso_code']]].'</td>';
|
||||
}
|
||||
$this->html .= '
|
||||
$hotelsHtml .= '
|
||||
<td class="center">'.$array_colors[$totals['images']].'</td>
|
||||
<td class="center">'.$array_colors[$totals['orders']].'</td>
|
||||
<td class="center">'.$array_colors[$totals['total_rooms']].'</td>
|
||||
<td class="center">'.$array_colors[$totals['average']].'</td>
|
||||
'.(!$this->id_hotel ? '<td></td>' : '').'
|
||||
</tr>
|
||||
'.($this->id_hotel ? '
|
||||
<tr>
|
||||
<td colspan="100%">
|
||||
<a class="btn btn-default" href="'.$this->context->link->getAdminLink('AdminStats').'&module='.$this->name.''.'">
|
||||
<i class="icon-arrow-circle-left"></i> '.$this->l('Back').'
|
||||
</a>
|
||||
</td>
|
||||
</tr>' : '').'
|
||||
</tfoot>
|
||||
</table></div>';
|
||||
|
||||
return $this->html;
|
||||
return $hotelsHtml;
|
||||
}
|
||||
|
||||
private function getServicesTab()
|
||||
{
|
||||
$employee = Context::getContext()->employee;
|
||||
$prop30 = ((strtotime($employee->stats_date_to.' 23:59:59') - strtotime($employee->stats_date_from.' 00:00:00')) / 60 / 60 / 24) / 30;
|
||||
|
||||
// Get languages
|
||||
$sql = 'SELECT l.*
|
||||
FROM '._DB_PREFIX_.'lang l'
|
||||
.Shop::addSqlAssociation('lang', 'l');
|
||||
$languages = Db::getInstance()->executeS($sql);
|
||||
|
||||
$array_colors = array(
|
||||
0 => '<img src="../modules/'.$this->name.'/img/red.png" alt="'.$this->l('Bad').'" title="'.$this->l('Bad').'" />',
|
||||
1 => '<img src="../modules/'.$this->name.'/img/orange.png" alt="'.$this->l('Average').'" title="'.$this->l('Average').'" />',
|
||||
2 => '<img src="../modules/'.$this->name.'/img/green.png" alt="'.$this->l('Good').'" title="'.$this->l('Good').'" />'
|
||||
);
|
||||
|
||||
$divisor = 4;
|
||||
$totals = array('services' => 0, 'active' => 0, 'images' => 0, 'orders' => 0, 'associated_room_types' => 0);
|
||||
foreach ($languages as $language) {
|
||||
$divisor++;
|
||||
$totals['description_'.$language['iso_code']] = 0;
|
||||
}
|
||||
|
||||
// set data from here
|
||||
$result = $this->getServiceStats();
|
||||
|
||||
if (!$result) {
|
||||
return $this->l('No service was found.');
|
||||
}
|
||||
|
||||
$array_conf = array(
|
||||
'DESCRIPTIONS_SHORT' => array('name' => $this->l('Descriptions'), 'text' => $this->l('chars (without HTML)')),
|
||||
'IMAGES' => array('name' => $this->l('Images'), 'text' => $this->l('images')),
|
||||
'ORDERS' => array('name' => $this->l('Orders'), 'text' => $this->l('orders / month')),
|
||||
);
|
||||
|
||||
$servicesHtml = '
|
||||
<form action="'.Tools::safeOutput(AdminController::$currentIndex.'&token='.Tools::getValue('token').'&module='.$this->name).'" method="post" class="checkup form-horizontal">
|
||||
<table class="table checkup">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th><span class="title_box active">'.$array_colors[0].' '.$this->l('Not enough').'</span></th>
|
||||
<th><span class="title_box active">'.$array_colors[2].' '.$this->l('Alright').'</span></th>
|
||||
</tr>
|
||||
</thead>';
|
||||
foreach ($array_conf as $conf => $translations) {
|
||||
$confKeyLt = 'SERVICE_CHECKUP_'.$conf.'_LT';
|
||||
$confKeyGt = 'SERVICE_CHECKUP_'.$conf.'_GT';
|
||||
$servicesHtml .= '
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<label class="control-label col-lg-12">'.$translations['name'].'</label>
|
||||
</td>
|
||||
<td>
|
||||
<div class="row">
|
||||
<div class="col-lg-11 input-group">
|
||||
<span class="input-group-addon">'.$this->l('Less than').'</span>
|
||||
<input type="text" name="'.$confKeyLt.'" value="'.Tools::safeOutput(Tools::getValue($confKeyLt, Configuration::get($confKeyLt))).'" />
|
||||
<span class="input-group-addon">'.$translations['text'].'</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 input-group">
|
||||
<span class="input-group-addon">'.$this->l('Greater than').'</span>
|
||||
<input type="text" name="'.$confKeyGt.'" value="'.Tools::safeOutput(Tools::getValue($confKeyGt, Configuration::get($confKeyGt))).'" />
|
||||
<span class="input-group-addon">'.$translations['text'].'</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>';
|
||||
}
|
||||
$servicesHtml .= '</table>
|
||||
<button type="submit" name="submitCheckupService" class="btn btn-default pull-right">
|
||||
<i class="icon-save"></i> '.$this->l('Save').'
|
||||
</button>
|
||||
</form>
|
||||
<form action="'.Tools::safeOutput(AdminController::$currentIndex.'&token='.Tools::getValue('token').'&module='.$this->name).'" method="post" class="form-horizontal alert">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<label class="control-label pull-left">'.$this->l('Order by').'</label>
|
||||
<div class="col-lg-3">
|
||||
<select name="submitCheckupOrder" onchange="this.form.submit();">
|
||||
<option value="'.self::ORDER_BY_ID.'">'.$this->l('ID').'</option>
|
||||
<option value="'.self::ORDER_BY_NAME.'" '.($this->context->cookie->checkup_order == self::ORDER_BY_NAME ? 'selected="selected"' : '').'>'.$this->l('Name').'</option>
|
||||
<option value="'.self::ORDER_BY_ORDERS.'" '.($this->context->cookie->checkup_order == self::ORDER_BY_ORDERS ? 'selected="selected"' : '').'>'.$this->l('Orders').'</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div style="overflow-x:auto">
|
||||
<table class="table checkup2">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><span class="title_box active">'.$this->l('ID').'</span></th>
|
||||
<th><span class="title_box active">'.$this->l('Service').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Active').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Associated room types').'</span></th>';
|
||||
foreach ($languages as $language) {
|
||||
$servicesHtml .= '<th class="center"><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
}
|
||||
$servicesHtml .= '
|
||||
<th class="center"><span class="title_box active">'.$this->l('Images').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Orders').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Overall status').'</span></th>
|
||||
'.(!$this->id_hotel ? '<th class="center"><span class="title_box active">'.$this->l('Action').'</span></th>' : '').'
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
|
||||
$confCheckup = array(
|
||||
'IMAGES_LT' => Configuration::get('SERVICE_CHECKUP_IMAGES_LT'),
|
||||
'IMAGES_GT' => Configuration::get('SERVICE_CHECKUP_IMAGES_GT'),
|
||||
'ORDERS_LT' => Configuration::get('SERVICE_CHECKUP_ORDERS_LT'),
|
||||
'ORDERS_GT' => Configuration::get('SERVICE_CHECKUP_ORDERS_GT'),
|
||||
'DESCRIPTIONS_SHORT_LT' => Configuration::get('SERVICE_CHECKUP_DESCRIPTIONS_SHORT_LT'),
|
||||
'DESCRIPTIONS_SHORT_GT' => Configuration::get('SERVICE_CHECKUP_DESCRIPTIONS_SHORT_GT'),
|
||||
);
|
||||
|
||||
foreach ($result as $row) {
|
||||
$totals['services']++;
|
||||
$scores = array(
|
||||
'active' => ($row['active'] ? 2 : 0),
|
||||
'images' => ($row['nbImages'] < $confCheckup['IMAGES_LT'] ? 0 : ($row['nbImages'] > $confCheckup['IMAGES_GT'] ? 2 : 1)),
|
||||
'orders' => (($row['nbOrders'] * $prop30 < $confCheckup['ORDERS_LT']) ? 0 : (($row['nbOrders'] * $prop30 > $confCheckup['ORDERS_GT']) ? 2 : 1)),
|
||||
);
|
||||
$totals['active'] += (int)$scores['active'];
|
||||
$totals['images'] += (int)$scores['images'];
|
||||
$totals['orders'] += (int)$scores['orders'];
|
||||
$descriptions = $this->getDescriptions('service', $row['id_object']);
|
||||
foreach ($descriptions as $description) {
|
||||
if (isset($description['iso_code']) && isset($description['description_short'])) {
|
||||
$row['desclength_'.$description['iso_code']] = Tools::strlen(strip_tags($description['description_short']));
|
||||
}
|
||||
if (isset($description['iso_code'])) {
|
||||
$scores['description_'.$description['iso_code']] = ($row['desclength_'.$description['iso_code']] < $confCheckup['DESCRIPTIONS_SHORT_LT'] ? 0 : ($row['desclength_'.$description['iso_code']] > $confCheckup['DESCRIPTIONS_SHORT_GT'] ? 2 : 1));
|
||||
$totals['description_'.$description['iso_code']] += $scores['description_'.$description['iso_code']];
|
||||
}
|
||||
}
|
||||
$scores['average'] = array_sum($scores) / $divisor;
|
||||
$scores['average'] = ($scores['average'] < 1 ? 0 : ($scores['average'] > 1.5 ? 2 : 1));
|
||||
|
||||
$objectLink = $this->context->link->getAdminLink('AdminNormalProducts').'&updateproduct&id_product='.$row['id_object'];
|
||||
$servicesHtml .= '
|
||||
<tr>
|
||||
<td>'.$row['id_object'].'</td>
|
||||
<td><a href="'.$objectLink.'" target="_blank">'.Tools::substr($row['object_name'], 0, 42).'</a></td>
|
||||
<td class="center">'.$array_colors[$scores['active']].'</td>
|
||||
<td class="center">'.$row['nbAssociatedRoomTypes'].'</td>';
|
||||
foreach ($languages as $language) {
|
||||
if (isset($row['desclength_'.$language['iso_code']])) {
|
||||
$servicesHtml .= '<td class="center">'.(int)$row['desclength_'.$language['iso_code']].' '.$array_colors[$scores['description_'.$language['iso_code']]].'</td>';
|
||||
} else {
|
||||
$servicesHtml .= '<td class="center">0 '.$array_colors[0].'</td>';
|
||||
}
|
||||
}
|
||||
|
||||
$servicesHtml .= '
|
||||
<td class="center">'.(int)$row['nbImages'].' '.$array_colors[$scores['images']].'</td>
|
||||
<td class="center">'.(int)$row['nbOrders'].' '.$array_colors[$scores['orders']].'</td>
|
||||
<td class="center">'.$array_colors[$scores['average']].'</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$servicesHtml .= '</tbody>';
|
||||
|
||||
$totals['active'] = $totals['active'] / $totals['services'];
|
||||
$totals['active'] = ($totals['active'] < 1 ? 0 : ($totals['active'] > 1.5 ? 2 : 1));
|
||||
$totals['images'] = $totals['images'] / $totals['services'];
|
||||
$totals['images'] = ($totals['images'] < 1 ? 0 : ($totals['images'] > 1.5 ? 2 : 1));
|
||||
$totals['orders'] = $totals['orders'] / $totals['services'];
|
||||
$totals['orders'] = ($totals['orders'] < 1 ? 0 : ($totals['orders'] > 1.5 ? 2 : 1));
|
||||
$totals['associated_room_types'] = $totals['associated_room_types'] / $totals['services'];
|
||||
$totals['associated_room_types'] = ($totals['associated_room_types'] < 1 ? 0 : ($totals['associated_room_types'] > 1.5 ? 2 : 1));
|
||||
foreach ($languages as $language) {
|
||||
$totals['description_'.$language['iso_code']] = $totals['description_'.$language['iso_code']] / $totals['services'];
|
||||
$totals['description_'.$language['iso_code']] = ($totals['description_'.$language['iso_code']] < 1 ? 0 : ($totals['description_'.$language['iso_code']] > 1.5 ? 2 : 1));
|
||||
}
|
||||
$totals['average'] = array_sum($totals) / $divisor;
|
||||
$totals['average'] = ($totals['average'] < 1 ? 0 : ($totals['average'] > 1.5 ? 2 : 1));
|
||||
|
||||
$servicesHtml .= '
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th colspan="2"></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Active').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Associated room types').'</span></th>';
|
||||
foreach ($languages as $language) {
|
||||
$servicesHtml .= '<th class="center"><span class="title_box active">'.$this->l('Desc.').' ('.Tools::strtoupper($language['iso_code']).')</span></th>';
|
||||
}
|
||||
$servicesHtml .= '
|
||||
<th class="center"><span class="title_box active">'.$this->l('Images').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Orders').'</span></th>
|
||||
<th class="center"><span class="title_box active">'.$this->l('Overall status').'</span></th>
|
||||
'.(!$this->id_hotel ? '<th></th>' : '').'
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"></td>
|
||||
<td class="center">'.$array_colors[$totals['active']].'</td>
|
||||
<td class="center">NA</td>';
|
||||
foreach ($languages as $language) {
|
||||
$servicesHtml .= '<td class="center">'.$array_colors[$totals['description_'.$language['iso_code']]].'</td>';
|
||||
}
|
||||
$servicesHtml .= '
|
||||
<td class="center">'.$array_colors[$totals['images']].'</td>
|
||||
<td class="center">'.$array_colors[$totals['orders']].'</td>
|
||||
<td class="center">'.$array_colors[$totals['average']].'</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table></div>';
|
||||
|
||||
return $servicesHtml;
|
||||
}
|
||||
|
||||
public function getHotelStats()
|
||||
@@ -479,20 +747,49 @@ class StatsCheckUp extends Module
|
||||
return Db::getInstance()->executeS($sql);
|
||||
}
|
||||
|
||||
public function getDescriptions($id_object)
|
||||
public function getServiceStats()
|
||||
{
|
||||
if ($this->id_hotel) {
|
||||
return Db::getInstance()->executeS(
|
||||
'SELECT l.`iso_code`, pl.`description`
|
||||
FROM '._DB_PREFIX_.'product_lang pl
|
||||
LEFT JOIN '._DB_PREFIX_.'lang l
|
||||
ON pl.`id_lang` = l.`id_lang`
|
||||
LEFT JOIN '._DB_PREFIX_.'htl_room_type hrt
|
||||
ON (hrt.`id_product` = pl.`id_product`)
|
||||
WHERE hrt.`id_hotel` = '.(int) $this->id_hotel.'
|
||||
AND pl.`id_product` = '.(int) $id_object
|
||||
);
|
||||
} else {
|
||||
$date_from = date('Y-m-d', strtotime($this->context->employee->stats_date_from));
|
||||
$date_to = date('Y-m-d', strtotime($this->context->employee->stats_date_to));
|
||||
$id_lang = $this->context->language->id;
|
||||
|
||||
$order_by = 'p.`id_product`';
|
||||
if ($this->context->cookie->checkup_order == self::ORDER_BY_NAME) {
|
||||
$order_by = 'object_name';
|
||||
} elseif ($this->context->cookie->checkup_order == self::ORDER_BY_ORDERS) {
|
||||
$order_by = 'nbOrders DESC';
|
||||
}
|
||||
|
||||
$sql = 'SELECT p.`id_product` AS id_object, p.`active`, pl.`name` AS object_name,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM '._DB_PREFIX_.'image i
|
||||
WHERE i.`id_product` = p.`id_product`
|
||||
) AS nbImages,
|
||||
(
|
||||
SELECT COUNT(DISTINCT rsod.`id_order`) FROM `'._DB_PREFIX_.'htl_room_type_service_product_order_detail` rsod
|
||||
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = rsod.`id_order`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_booking_detail` hbd ON (hbd.`id` = rsod.`id_htl_booking_detail`)
|
||||
WHERE rsod.`id_product` = p.`id_product` AND o.`valid` = 1
|
||||
AND hbd.`date_to` > "'.pSQL($date_from).'" AND hbd.`date_from` < "'.pSQL($date_to).'"
|
||||
) AS nbOrders,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM `'._DB_PREFIX_.'htl_room_type_service_product` rsp
|
||||
WHERE rsp.`id_product` = p.`id_product`
|
||||
) AS nbAssociatedRoomTypes
|
||||
FROM '._DB_PREFIX_.'product p
|
||||
LEFT JOIN '._DB_PREFIX_.'product_lang pl
|
||||
ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int) $id_lang.')
|
||||
WHERE p.`booking_product` = 0
|
||||
ORDER BY '.$order_by;
|
||||
|
||||
return Db::getInstance()->executeS($sql);
|
||||
}
|
||||
|
||||
public function getDescriptions($object_type, $id_object = null)
|
||||
{
|
||||
if ($object_type == 'hotel') {
|
||||
return Db::getInstance()->executeS(
|
||||
'SELECT l.`iso_code`, hbil.`description`
|
||||
FROM '._DB_PREFIX_.'htl_branch_info_lang hbil
|
||||
@@ -500,6 +797,27 @@ class StatsCheckUp extends Module
|
||||
ON hbil.`id_lang` = l.`id_lang`
|
||||
WHERE hbil.`id` = '.(int) $id_object
|
||||
);
|
||||
} elseif ($object_type == 'room_type') {
|
||||
return Db::getInstance()->executeS(
|
||||
'SELECT l.`iso_code`, pl.`description`
|
||||
FROM '._DB_PREFIX_.'product_lang pl
|
||||
LEFT JOIN '._DB_PREFIX_.'lang l
|
||||
ON pl.`id_lang` = l.`id_lang`
|
||||
INNER JOIN '._DB_PREFIX_.'htl_room_type hrt
|
||||
ON (hrt.`id_product` = pl.`id_product`)
|
||||
WHERE hrt.`id_hotel` = '.(int) $this->id_hotel.'
|
||||
AND pl.`id_product` = '.(int) $id_object
|
||||
);
|
||||
} elseif ($object_type == 'service') {
|
||||
return Db::getInstance()->executeS(
|
||||
'SELECT l.`iso_code`, pl.`description_short`
|
||||
FROM '._DB_PREFIX_.'product p
|
||||
LEFT JOIN '._DB_PREFIX_.'product_lang pl
|
||||
ON (pl.`id_product` = p.`id_product`)
|
||||
LEFT JOIN '._DB_PREFIX_.'lang l
|
||||
ON pl.`id_lang` = l.`id_lang`
|
||||
WHERE p.`booking_product` = 0'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ class StatsData extends Module
|
||||
FROM `'._DB_PREFIX_.'guest`
|
||||
WHERE `id_customer` = '.(int)$params['cookie']->id_customer);
|
||||
|
||||
if ((int)$result['id_guest']) {
|
||||
if (isset($result['id_guest']) && ( int)$result['id_guest']) {
|
||||
// The new guest is merged with the old one when it's connecting to an account
|
||||
$guest->mergeWithCustomer($result['id_guest'], $params['cookie']->id_customer);
|
||||
$params['cookie']->id_guest = $guest->id;
|
||||
|
||||
@@ -240,7 +240,7 @@ class StatsForecast extends Module
|
||||
|
||||
$this->html .= '
|
||||
<tr>
|
||||
<td class="fixed-width-sm">'.($this->context->cookie->stats_granularity == 42 ? (Tools::displayDate($row['fix_date']).' - '.Tools::displayDate($row['end_date'])) : Tools::displayDate($row['fix_date'])).'</td>
|
||||
<td class="fixed-width-sm">'.($this->context->cookie->stats_granularity == 42 ? (Tools::displayDate($row['fix_date']).' - '.Tools::displayDate($row['end_date'])) : $row['fix_date']).'</td>
|
||||
<td class="text-left">'.$visits_today.'</td>
|
||||
<td class="text-left">'.(int)$row['registrations'].'</td>
|
||||
<td class="text-left">'.(int)$row['countOrders'].'</td>
|
||||
|
||||
@@ -324,7 +324,7 @@ class StatsPersonalInfos extends ModuleGraph
|
||||
// Total unknown
|
||||
$sql = 'SELECT COUNT(`id_customer`) as total
|
||||
FROM `'._DB_PREFIX_.'customer`
|
||||
WHERE `birthday` IS NULL
|
||||
WHERE `birthday` = "0000-00-00"
|
||||
'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER);
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
|
||||
if (isset($result['total']) && $result['total']) {
|
||||
|
||||
@@ -119,6 +119,7 @@ class StatsProduct extends ModuleGraph
|
||||
$sql .= ' INNER JOIN `'._DB_PREFIX_.'htl_room_type` hrt ON (hrt.`id_product` = p.`id_product` AND hrt.`id_hotel` = '.(int)Tools::getValue('id_hotel').')';
|
||||
}
|
||||
$sql .= ' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang`='.(int)$this->context->language->id.')
|
||||
WHERE p.`booking_product` = 1
|
||||
ORDER BY pl.`name`';
|
||||
|
||||
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
||||
@@ -302,20 +303,8 @@ class StatsProduct extends ModuleGraph
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
$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'];
|
||||
}
|
||||
}
|
||||
}
|
||||
// get room types info
|
||||
foreach ($this->getProducts() as $product) {
|
||||
$this->html .= '
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
@@ -218,56 +218,48 @@ class WkRoomSearchHelper
|
||||
'location' => 4,
|
||||
'hotel' => 5,
|
||||
'date' => 5,
|
||||
'occupancy' => 5,
|
||||
'search' => 3
|
||||
'occupancy' => 4,
|
||||
'search' => 4
|
||||
);
|
||||
|
||||
if (!$locationEnabled) {
|
||||
unset($search_column_widths['location']);
|
||||
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['date'] += 2;
|
||||
$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['date'] += 2;
|
||||
$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']);
|
||||
|
||||
$search_column_widths['date'] += 1;
|
||||
if ($smartyVars['show_hotel_name'] || count($hotelsInfo) > 1) {
|
||||
$search_column_widths['hotel'] += 1;
|
||||
$search_column_widths['date'] += 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;
|
||||
|
||||
$search_column_widths['date'] += 1;
|
||||
}
|
||||
} else {
|
||||
$search_column_widths['date'] += 1;
|
||||
$search_column_widths['date'] += 4;
|
||||
$search_column_widths['date'] += 3;
|
||||
}
|
||||
}
|
||||
$smartyVars['column_widths'] = $search_column_widths;
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
height: unset;
|
||||
min-height: 45px;
|
||||
}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
height: unset;
|
||||
min-height: 45px;
|
||||
}
|
||||
/* #search_hotel_block_form #search_room_submit {
|
||||
height: 45px;
|
||||
} */
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 10;}
|
||||
|
||||
.header-rmsearch-hide-xs {
|
||||
background-image: url("../img/black-opacity-5.png");}
|
||||
.header-rmsearch-show-xs {
|
||||
@@ -50,7 +51,16 @@
|
||||
#make_booking_btn_div {
|
||||
margin-top: 20px;
|
||||
text-align: center;}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.header-rmsearch-wrapper #search_hotel_block_form.grid {
|
||||
grid-template-columns: 1fr;
|
||||
column-gap: 0px;
|
||||
}
|
||||
.header-rmsearch-wrapper {
|
||||
height: calc(100vw - 60px);
|
||||
width: calc(100vw - 60px);
|
||||
}
|
||||
}
|
||||
.fancy_search_header_xs {
|
||||
margin-top: 25px;
|
||||
padding-left: 15px;
|
||||
@@ -62,6 +72,10 @@
|
||||
float: left;
|
||||
margin-top: 5px;
|
||||
width: 125px;}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
height: unset;
|
||||
min-height: 45px;
|
||||
}
|
||||
/* .fancybox-inner #search_hotel_block_form {
|
||||
grid-template-columns: 1fr;
|
||||
} */
|
||||
@@ -64,6 +64,19 @@
|
||||
background-color: #FAFAFA;}
|
||||
.faded-txt {
|
||||
color: #777777;}
|
||||
#search_hotel_block_form #search_room_submit {
|
||||
height: unset;
|
||||
min-height: 45px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.header-rmsearch-wrapper #search_hotel_block_form.grid {
|
||||
grid-template-columns: 1fr;
|
||||
column-gap: 0px;
|
||||
}
|
||||
.header-rmsearch-details-wrapper .modify_roomtype_search_btn {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.header-rmsearch-wrapper .close_room_serach_wrapper {
|
||||
top: -8px;
|
||||
|
||||
@@ -42,7 +42,9 @@ $(document).ready(function() {
|
||||
padding: 0,
|
||||
autoScale: false,
|
||||
maxWidth: '100%',
|
||||
'hideOnContentClick': false,
|
||||
helpers: {
|
||||
overlay: { closeClick: false } //Disable click outside event
|
||||
},
|
||||
'afterClose': function() {
|
||||
$('.header-rmsearch-container').show();
|
||||
$('#xs_room_search_form').show();
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
<div class="col-sm-9 form-group">
|
||||
<div class="filter_header row">
|
||||
<div class="col-sm-12">
|
||||
<p>{l s='Searched results for' mod='wkroomsearchblock'}:</p>
|
||||
<p>{l s='Searched results for' mod='wkroomsearchblock'}:
|
||||
<button class="btn btn-default visible-xs modify_roomtype_search_btn pull-right"><i class="icon-pencil"></i></button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
@@ -35,7 +37,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<div class="col-sm-3 form-group hidden-xs">
|
||||
<button class="btn btn-default modify_roomtype_search_btn pull-right">{l s='Modify Search' mod='wkroomsearchblock'}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
</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">
|
||||
<button type="submit" class="btn btn btn-primary pull-right" name="search_room_submit" id="search_room_submit">
|
||||
<span>{l s='Search Rooms' mod='wkroomsearchblock'}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -168,7 +168,7 @@ class WkRoomSearchBlock extends Module
|
||||
$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 (Configuration::get('PS_FRONT_ROOM_UNIT_SELECTION_TYPE') == HotelBookingDetail::PS_ROOM_UNIT_SELECTION_TYPE_OCCUPANCY) {
|
||||
if ($occupancy = Tools::getValue('occupancy')) {
|
||||
$urlData['occupancy'] = $occupancy;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
{if !$order_date_restrict}
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label class="control-label">{l s='Check In - Check Out'}</label>
|
||||
<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}" />
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
<p>{$product['name']|escape:'html':'UTF-8'}</p>
|
||||
{if $product.allow_multiple_quantity}
|
||||
<div class="qty_container">
|
||||
<input type="text" class="form-control qty" id="qty_{$product.id_product}" name="service_product_qty_{$product.id_product}" data-id-product="{$product.id_product}" value="{if isset($cartRoom['selected_products']) && $cartRoom['selected_products'] && ($product['id_product']|in_array:$cartRoom['selected_products'])}{$cartRoom['selected_products_info'][$product['id_product']]['quantity']}{else}1{/if}">
|
||||
<input type="text" class="form-control qty" id="qty_{$product.id_product}" name="service_product_qty_{$product.id_product}" data-id-product="{$product.id_product}" data-max_quantity="{$product.max_quantity}" value="{if isset($cartRoom['selected_products']) && $cartRoom['selected_products'] && ($product['id_product']|in_array:$cartRoom['selected_products'])}{$cartRoom['selected_products_info'][$product['id_product']]['quantity']}{else}1{/if}">
|
||||
<div class="qty_controls">
|
||||
<a href="#" class="qty_up"><span><i class="icon-plus"></i></span></a>
|
||||
<a href="#" class="qty_down"><span><i class="icon-minus"></i></span></a>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
</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>
|
||||
<label class="col-sm-12">{l s='Children'}<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">
|
||||
@@ -134,7 +134,7 @@
|
||||
</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>
|
||||
<label class="col-sm-12">{l s='Children'} <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">
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user