Merge branch 'webkul:develop' into fix-disable-dates

This commit is contained in:
abhishek-webkul
2023-03-16 11:56:20 +05:30
committed by GitHub
112 changed files with 2224 additions and 1397 deletions

View File

@@ -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'}&amp;id_cart={$cart->id|intval}&amp;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'}&amp;cart_id={$cart->id|intval}&amp;addorder"><i class="icon-shopping-cart"></i> {l s='Create an order from this cart.'}</a>
{/if}
{/if}
</div>

View File

@@ -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>

View File

@@ -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">

View File

@@ -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}

View File

@@ -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>&nbsp;{l s='Services'}
<i class="icon-pencil"></i>&nbsp;{l s='Services'}
</a>
{/if}
</td>

View File

@@ -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}

View File

@@ -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:'}&nbsp;{$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:'}&nbsp;{$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}

View File

@@ -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}

View File

@@ -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">

View File

@@ -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}

View File

@@ -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">

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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'];
}

View File

@@ -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

View File

@@ -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' : '');

View File

@@ -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);
}

View File

@@ -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));
}

View File

@@ -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;

View File

@@ -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(

View File

@@ -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']);

View File

@@ -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') {

View File

@@ -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') {

View File

@@ -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);

View File

@@ -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."').'&nbsp;'.$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."').'&nbsp;'.$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') {

View File

@@ -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()

View File

@@ -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);
}

View File

@@ -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)),

View File

@@ -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',

View File

@@ -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;

View File

@@ -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')) {

View File

@@ -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)) {

View File

@@ -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;
}

View File

@@ -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')).'"'.

View File

@@ -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)

View File

@@ -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()

View File

@@ -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.').'&nbsp;<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.');
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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();

View File

@@ -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');

View File

@@ -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,

View File

@@ -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>

View File

@@ -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');

View File

@@ -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,

File diff suppressed because one or more lines are too long

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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)

View File

@@ -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')) {

View File

@@ -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';

View File

@@ -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')) {

View File

@@ -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';

View File

@@ -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,

View File

@@ -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(

View File

@@ -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>

View File

@@ -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"

View File

@@ -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',

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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'],

View File

@@ -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`;",
);

View File

@@ -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;
}

View File

@@ -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']);
}
}
}
}
}
}

View File

@@ -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()

View File

@@ -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');
}
}
}

View File

@@ -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(

View File

@@ -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',

View File

@@ -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) {

View File

@@ -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);
}
});
});

View File

@@ -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');

View File

@@ -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>

View File

@@ -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>

View File

@@ -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}

View File

@@ -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>

View File

@@ -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">&times;</span></button>
<h4 class="modal-title" id="realloc_myModalLabel">{l s='Reallocate Rooms'}</h4>

View File

@@ -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}

View File

@@ -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'),

View File

@@ -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).'`';

View File

@@ -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>

View File

@@ -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'
);
}
}
}

View File

@@ -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;

View File

@@ -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>

View File

@@ -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']) {

View File

@@ -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>

View File

@@ -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;

View File

@@ -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;
} */

View File

@@ -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;
} */

View File

@@ -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;

View File

@@ -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();

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -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'} &nbsp;<i class="icon icon-minus"></i>&nbsp; {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}" />

View File

@@ -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>

View File

@@ -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