Merge branch 'develop' into gli-1517_2
This commit is contained in:
@@ -1,39 +0,0 @@
|
||||
{*
|
||||
* Since 2010 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright Since 2010 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*}
|
||||
{extends file="helpers/tree/tree.tpl"}
|
||||
<script>
|
||||
{block name="script" append}
|
||||
$(document).ready(function () {
|
||||
$('#{$id|escape:'html':'UTF-8'}').find('[name="hotel_box[]"]').on('click', function(){
|
||||
if ($(this).is(":checked")) {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', true);
|
||||
$(this).parent().addClass('tree-selected');
|
||||
});
|
||||
} else {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', false);
|
||||
$(this).parent().removeClass('tree-selected');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
{/block}
|
||||
</script>
|
||||
@@ -84,6 +84,22 @@
|
||||
});
|
||||
{/if}
|
||||
|
||||
{if isset($auto_select_children) && $auto_select_children == true}
|
||||
$('#{$id|escape:'html':'UTF-8'}').find(':input[type=checkbox]').on('click', function(){
|
||||
if ($(this).is(":checked")) {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', true);
|
||||
$(this).parent().addClass('tree-selected');
|
||||
});
|
||||
} else {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', false);
|
||||
$(this).parent().removeClass('tree-selected');
|
||||
});
|
||||
}
|
||||
});
|
||||
{/if}
|
||||
|
||||
$(document).ready(function () {
|
||||
var tree = $("#{$id|escape:'html':'UTF-8'}").tree('collapseAll');
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ class HelperTreeCore extends TreeCore
|
||||
private $_use_bulk_actions;
|
||||
private $_use_checkbox;
|
||||
private $_show_collapse_expand_button = true;
|
||||
private $_auto_select_children = false;
|
||||
private $_max_height = 350;
|
||||
|
||||
|
||||
@@ -43,6 +44,18 @@ class HelperTreeCore extends TreeCore
|
||||
return (isset($this->_use_search) && $this->_use_search);
|
||||
}
|
||||
|
||||
public function setAutoSelectChildren($value)
|
||||
{
|
||||
$this->_auto_select_children = (bool)$value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function autoSelectChildren()
|
||||
{
|
||||
return (isset($this->_auto_select_children) && $this->_auto_select_children);
|
||||
}
|
||||
|
||||
|
||||
public function setUseBulkActions($value)
|
||||
{
|
||||
$this->_use_bulk_actions = (bool)$value;
|
||||
@@ -119,6 +132,7 @@ class HelperTreeCore extends TreeCore
|
||||
);
|
||||
$this->setAttribute('use_search', $this->useSearch());
|
||||
}
|
||||
$this->setAttribute('auto_select_children', $this->autoSelectChildren());
|
||||
|
||||
if ($this->showCollapseExpandButton()) {
|
||||
$collapse_all = new TreeToolbarLink(
|
||||
|
||||
@@ -3507,6 +3507,7 @@ class AdminNormalProductsControllerCore extends AdminController
|
||||
'selectedElements' => $selectedElements
|
||||
]))
|
||||
->setUseCheckBox(true)
|
||||
->setAutoSelectChildren(true)
|
||||
->setUseBulkActions(true)
|
||||
->setUseSearch(true);
|
||||
$data->assign('hotel_tree', $tree->render());
|
||||
|
||||
@@ -469,8 +469,6 @@ class OrderConfirmationControllerCore extends FrontController
|
||||
{
|
||||
if (Tools::getValue('ajax') != 'true') {
|
||||
parent::setMedia();
|
||||
$this->addCSS(_THEME_CSS_DIR_.'history.css');
|
||||
$this->addJS(_THEME_JS_DIR_.'history.js');
|
||||
$this->addJS(_THEME_JS_DIR_.'order-confirmation.js');
|
||||
$this->addCSS(_THEME_CSS_DIR_.'order-confirmation.css');
|
||||
$this->addJqueryPlugin(array('fancybox')); //fancybox not found for some client theme
|
||||
|
||||
@@ -185,7 +185,7 @@ class HotelBookingDetail extends ObjectModel
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getBookingDataParams($params)
|
||||
public function getBookingDataParams(&$params)
|
||||
{
|
||||
if (!isset($params['id_room_type'])) {
|
||||
$params['id_room_type'] = 0;
|
||||
@@ -211,6 +211,9 @@ class HotelBookingDetail extends ObjectModel
|
||||
if (!isset($params['search_cart_rms'])) {
|
||||
$params['search_cart_rms'] = 0;
|
||||
}
|
||||
if (!isset($params['hourly_booking'])) {
|
||||
$params['hourly_booking'] = false;
|
||||
}
|
||||
|
||||
if (!isset($params['only_active_roomtype'])) {
|
||||
$params['only_active_roomtype'] = 1;
|
||||
@@ -236,6 +239,8 @@ class HotelBookingDetail extends ObjectModel
|
||||
$params['only_search_data'] = 0;
|
||||
}
|
||||
|
||||
Hook::exec('actionBookingDataParamsModifier', array('params' => &$params));
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
@@ -292,32 +297,34 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
// Unavailable Rooms
|
||||
if ($search_unavai) {
|
||||
$params = array(
|
||||
$searchParams = array(
|
||||
'idHotel' => $hotel_id,
|
||||
'dateFrom' => $date_from,
|
||||
'dateTo' => $date_to,
|
||||
'idRoomType' => $id_room_type,
|
||||
'allowedIdRoomTypes' => $allowedIdRoomTypes,
|
||||
'applyLosRestriction' => $applyLosRestriction,
|
||||
'allParams' => $params,
|
||||
);
|
||||
$unavailRoomTypes = $this->getSearchUnavailableRooms($params);
|
||||
$unavailRoomTypes = $this->getSearchUnavailableRooms($searchParams);
|
||||
}
|
||||
|
||||
// Cart Rooms
|
||||
if ($search_cart_rms) {
|
||||
$params = array(
|
||||
$searchParams = array(
|
||||
'idHotel' => $hotel_id,
|
||||
'idCart' => $id_cart,
|
||||
'idGuest' => $id_guest,
|
||||
'idRoomType' => $id_room_type,
|
||||
'allowedIdRoomTypes' => $allowedIdRoomTypes,
|
||||
'allParams' => $params,
|
||||
);
|
||||
$cartRoomTypes = $this->getSearchCartRooms($params);
|
||||
$cartRoomTypes = $this->getSearchCartRooms($searchParams);
|
||||
}
|
||||
|
||||
// Available Rooms
|
||||
if ($search_available) {
|
||||
$params = array(
|
||||
$searchParams = array(
|
||||
'idHotel' => $hotel_id,
|
||||
'dateFrom' => $date_from,
|
||||
'dateTo' => $date_to,
|
||||
@@ -327,16 +334,28 @@ class HotelBookingDetail extends ObjectModel
|
||||
'searchOccupancy' => $occupancy,
|
||||
'allowedIdRoomTypes' => $allowedIdRoomTypes,
|
||||
'applyLosRestriction' => $applyLosRestriction,
|
||||
'hourlyBooking' => $hourly_booking,
|
||||
'allParams' => $params,
|
||||
);
|
||||
$availableRoomTypes = $this->getSearchAvailableRooms($params);
|
||||
$availableRoomTypes = $this->getSearchAvailableRooms($searchParams);
|
||||
if ($availableRoomTypes['unavailableRoomTypes'] && $search_unavai) {
|
||||
// format unavailable room types
|
||||
foreach ($availableRoomTypes['unavailableRoomTypes'] as $idProduct => $roomTypeDetail) {
|
||||
if (!isset($unavailRoomTypes[$idProduct])) {
|
||||
$unavailRoomTypes[$idProduct] = array();
|
||||
foreach ($roomTypeDetail as $idRoom => $roomDetail) {
|
||||
if (!isset($unavailRoomTypes[$idProduct][$idRoom])) {
|
||||
$unavailRoomTypes[$idProduct][$idRoom] = array(
|
||||
'id_product' => $roomDetail['id_product'],
|
||||
'id_room' => $roomDetail['id_room'],
|
||||
'id_hotel' => $roomDetail['id_hotel'],
|
||||
'room_num' => $roomDetail['room_num'],
|
||||
'detail' => array()
|
||||
);
|
||||
}
|
||||
$unavailRoomTypes[$idProduct][$idRoom]['detail'][] = array(
|
||||
'id_status' => $roomDetail['id_status'],
|
||||
'room_comment' => $roomDetail['room_comment']
|
||||
);
|
||||
}
|
||||
|
||||
// FYI: used array_merge because we have int index
|
||||
$unavailRoomTypes[$idProduct] = array_merge($unavailRoomTypes[$idProduct], $roomTypeDetail);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,19 +364,20 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
// Booked Rooms
|
||||
if ($search_booked) {
|
||||
$params = array(
|
||||
$searchParams = array(
|
||||
'idHotel' => $hotel_id,
|
||||
'dateFrom' => $date_from,
|
||||
'dateTo' => $date_to,
|
||||
'idRoomType' => $id_room_type,
|
||||
'allowedIdRoomTypes' => $allowedIdRoomTypes,
|
||||
'allParams' => $params,
|
||||
);
|
||||
$bookedRoomTypes = $this->getSearchBookedRooms($params);
|
||||
$bookedRoomTypes = $this->getSearchBookedRooms($searchParams);
|
||||
}
|
||||
|
||||
// Partially available Rooms
|
||||
if ($search_partial) {
|
||||
$params = array(
|
||||
$searchParams = array(
|
||||
'idHotel' => $hotel_id,
|
||||
'dateFrom' => $date_from,
|
||||
'dateTo' => $date_to,
|
||||
@@ -366,21 +386,14 @@ class HotelBookingDetail extends ObjectModel
|
||||
'idRoomType' => $id_room_type,
|
||||
'searchOccupancy' => $occupancy,
|
||||
'allowedIdRoomTypes' => $allowedIdRoomTypes,
|
||||
'hourlyBooking' => $hourly_booking,
|
||||
'allParams' => $params,
|
||||
);
|
||||
|
||||
$partiallyAvailRoomTypes = $this->getSearchPartiallyAvailRooms($params);
|
||||
|
||||
if ($partiallyAvailRoomTypes['unavailableRoomTypes'] && $search_unavai) {
|
||||
foreach ($partiallyAvailRoomTypes['unavailableRoomTypes'] as $idProduct => $roomTypeDetail) {
|
||||
if (!isset($unavailRoomTypes[$idProduct])) {
|
||||
$unavailRoomTypes[$idProduct] = array();
|
||||
}
|
||||
|
||||
// FYI: used array_merge because we have int index
|
||||
$unavailRoomTypes[$idProduct] = array_merge($unavailRoomTypes[$idProduct], $roomTypeDetail);
|
||||
}
|
||||
}
|
||||
$partiallyAvailRoomTypes = $this->getSearchPartiallyAvailRooms($searchParams);
|
||||
|
||||
// Unavailable rooms and booked rooms are already included in there respective search
|
||||
// So, no need to seperate them here
|
||||
$partiallyAvailRoomsCount = $partiallyAvailRoomTypes['partiallyAvailRoomsCount'];
|
||||
$partiallyAvailRoomTypes = $partiallyAvailRoomTypes['partiallyAvailRooms'];
|
||||
}
|
||||
@@ -480,6 +493,7 @@ class HotelBookingDetail extends ObjectModel
|
||||
* 'idRoomType' => ...,
|
||||
* 'allowedIdRoomTypes' => ...,
|
||||
* 'applyLosRestriction' => ...,
|
||||
* 'allParams' => ...,
|
||||
* );
|
||||
*/
|
||||
protected function getSearchUnavailableRooms($params)
|
||||
@@ -501,34 +515,64 @@ class HotelBookingDetail extends ObjectModel
|
||||
$stayStartDate = date('Y-m-d', strtotime($dateFrom));
|
||||
|
||||
// Room status inactive
|
||||
$sql1 = 'SELECT `id` AS `id_room`, `id_product`, `id_hotel`, `room_num`, `comment` AS `room_comment`
|
||||
$sql = array();
|
||||
$sql[] = 'SELECT `id` AS `id_room`, `id_product`, `id_hotel`, `room_num`, `comment` AS `room_comment`, `id_status`, NULL AS `date_from`, NULL AS `date_to`
|
||||
FROM `'._DB_PREFIX_.'htl_room_information`
|
||||
WHERE `id_hotel`='.(int)$idHotel.' AND `id_status` = '. HotelRoomInformation::STATUS_INACTIVE.' AND IF('.(int)$idRoomType.' > 0, `id_product` = '.(int)$idRoomType.', 1) AND `id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
// check room is temperory inactive
|
||||
$sql2 = 'SELECT hri.`id` AS `id_room`, hri.`id_product`, hri.`id_hotel`, hri.`room_num`, hri.`comment` AS `room_comment`
|
||||
$sql[] = 'SELECT hri.`id` AS `id_room`, hri.`id_product`, hri.`id_hotel`, hri.`room_num`, hri.`comment` AS `room_comment`, hri.`id_status`, hrdd.`date_from` AS `date_from`, hrdd.`date_to` AS `date_to`
|
||||
FROM `'._DB_PREFIX_.'htl_room_information` AS hri
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_disable_dates` AS hrdd ON (hrdd.`id_room_type` = hri.`id_product` AND hrdd. id_room = hri.`id`)
|
||||
WHERE hri.`id_hotel`='.$idHotel.' AND hri.`id_status` = '. HotelRoomInformation::STATUS_TEMPORARY_INACTIVE .' AND hrdd.`date_from` <= \''.pSql($dateFrom).'\' AND hrdd.`date_to` >= \''.pSql($dateTo).'\' AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
WHERE hri.`id_hotel`='.$idHotel.' AND hri.`id_status` = '. HotelRoomInformation::STATUS_TEMPORARY_INACTIVE .' AND (
|
||||
(hrdd.`date_from` <= \''.pSQL($dateFrom).'\' AND hrdd.`date_to` > \''.pSQL($dateFrom).'\' AND hrdd.`date_to` <= \''.pSQL($dateTo).'\') OR
|
||||
(hrdd.`date_from` >= \''.pSQL($dateFrom).'\' AND hrdd.`date_to` > \''.pSQL($dateFrom).'\' AND hrdd.`date_to` <= \''.pSQL($dateTo).'\') OR
|
||||
(hrdd.`date_from` >= \''.pSQL($dateFrom).'\' AND hrdd.`date_from` < \''.pSQL($dateTo).'\' AND hrdd.`date_to` >= \''.pSQL($dateTo).'\') OR
|
||||
(hrdd.`date_from` <= \''.pSql($dateFrom).'\' AND hrdd.`date_to` >= \''.pSql($dateTo).'\')
|
||||
) AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
$sql = $sql1.' UNION '.$sql2;
|
||||
|
||||
if ($applyLosRestriction) {
|
||||
$sql3 = 'SELECT hri.`id` AS `id_room`, hri.`id_product`, hri.`id_hotel`, hri.`room_num`, hri.`comment` AS `room_comment`
|
||||
$sql[] = 'SELECT hri.`id` AS `id_room`, hri.`id_product`, hri.`id_hotel`, hri.`room_num`, hri.`comment` AS `room_comment`, '.HotelRoomInformation::STATUS_SEARCH_LOS_UNSATISFIED.' AS `id_status`, NULL AS `date_from`, NULL AS `date_to`
|
||||
FROM `'._DB_PREFIX_.'htl_room_information` AS hri
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` AS hrt ON (hrt.`id_product` = hri.`id_product`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_restriction_date_range` AS hrtr ON (hrt.`id_product` = hrtr.`id_product` AND (hrtr.`date_from` <= \''.pSQL($stayStartDate).'\' AND hrtr.`date_to` > \''.pSQL($stayStartDate).'\'))
|
||||
WHERE hri.`id_hotel`='.(int)$idHotel.' AND (IFNULL(hrtr.`min_los`, hrt.`min_los`) >'. (int)$lengthOfStay.' OR IF(IFNULL(hrtr.`max_los`, hrt.`max_los`) > 0, IFNULL(hrtr.`max_los`, hrt.`max_los`) < '.(int)$lengthOfStay.', 0)) AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
$sql = $sql.' UNION '.$sql3;
|
||||
}
|
||||
|
||||
$sql .= ' ORDER BY id_room ASC';
|
||||
Hook::exec('actionUnavailRoomSearchSqlModifier', array(
|
||||
'sql' => &$sql,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'all_params' => $allParams
|
||||
)
|
||||
));
|
||||
|
||||
$sql = implode(' UNION ', $sql);
|
||||
$sql .= ' ORDER BY `id_room`, `date_from` ASC';
|
||||
|
||||
$unavailRoomTypes = array();
|
||||
if ($unavailRooms = Db::getInstance()->executeS($sql)) {
|
||||
foreach ($unavailRooms as $unavailRoomDetail) {
|
||||
$unavailRoomTypes[$unavailRoomDetail['id_product']][] = $unavailRoomDetail;
|
||||
if (!isset($unavailRoomTypes[$unavailRoomDetail['id_product']][$unavailRoomDetail['id_room']])) {
|
||||
$unavailRoomTypes[$unavailRoomDetail['id_product']][$unavailRoomDetail['id_room']] = array(
|
||||
'id_product' => $unavailRoomDetail['id_product'],
|
||||
'id_room' => $unavailRoomDetail['id_room'],
|
||||
'id_hotel' => $unavailRoomDetail['id_hotel'],
|
||||
'room_num' => $unavailRoomDetail['room_num'],
|
||||
'detail' => array()
|
||||
);
|
||||
}
|
||||
$unavailRoomTypes[$unavailRoomDetail['id_product']][$unavailRoomDetail['id_room']]['detail'][] = array(
|
||||
'id_status' => $unavailRoomDetail['id_status'],
|
||||
'room_comment' => $unavailRoomDetail['room_comment'],
|
||||
'date_from' => $unavailRoomDetail['date_from'],
|
||||
'date_to' => $unavailRoomDetail['date_to'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,6 +586,7 @@ class HotelBookingDetail extends ObjectModel
|
||||
* 'idGuest' => ...,
|
||||
* 'idRoomType' => ...,
|
||||
* 'allowedIdRoomTypes' => ...,
|
||||
* 'allParams' => ...,
|
||||
* );
|
||||
*/
|
||||
protected function getSearchCartRooms($params)
|
||||
@@ -550,10 +595,40 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
$cartRoomTypes = array();
|
||||
if ($idCart && $idGuest) {
|
||||
$sql = 'SELECT cbd.`id_product`, cbd.`id_room`, cbd.`id_hotel`, cbd.`booking_type`, cbd.`comment`, rf.`room_num`, cbd.`date_from`, cbd.`date_to`
|
||||
FROM `'._DB_PREFIX_.'htl_cart_booking_data` AS cbd
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_information` AS rf ON (rf.`id` = cbd.`id_room`)
|
||||
WHERE cbd.`id_hotel`= '.(int)$idHotel.' AND cbd.`id_cart` = '.(int)$idCart.' AND cbd.`id_guest` ='.(int)$idGuest.' AND cbd.`is_refunded` = 0 AND cbd.`is_back_order` = 0 AND IF('.(int)$idRoomType.' > 0, rf.`id_product` = '.(int)$idRoomType.', 1) AND rf.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
$selectCartRoomSearch = 'SELECT cbd.`id_product`, cbd.`id_room`, cbd.`id_hotel`, cbd.`booking_type`,
|
||||
cbd.`comment`, rf.`room_num`, cbd.`date_from`, cbd.`date_to`';
|
||||
$joinCartRoomSearch = 'INNER JOIN `'._DB_PREFIX_.'htl_room_information` AS rf ON (rf.`id` = cbd.`id_room`)';
|
||||
$whereCartRoomSearch = 'WHERE cbd.`id_hotel`= '.(int)$idHotel.' AND cbd.`id_cart` = '.(int)$idCart.'
|
||||
AND cbd.`id_guest` ='.(int)$idGuest.' AND cbd.`is_refunded` = 0 AND cbd.`is_back_order` = 0
|
||||
AND IF('.(int)$idRoomType.' > 0, rf.`id_product` = '.(int)$idRoomType.', 1) AND rf.`id_product`
|
||||
IN ('.$allowedIdRoomTypes.')';
|
||||
$groupByCartRoomSearch = '';
|
||||
$orderByCartRoomSearch = '';
|
||||
$orderWayCartRoomSearch = '';
|
||||
|
||||
Hook::exec('actionCartRoomSearchSqlModifier', array(
|
||||
'select' => $selectCartRoomSearch,
|
||||
'join' => &$joinCartRoomSearch,
|
||||
'where' => &$whereCartRoomSearch,
|
||||
'group_by' => &$groupByCartRoomSearch,
|
||||
'order_by' => &$orderByCartRoomSearch,
|
||||
'order_way' => &$orderWayCartRoomSearch,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'idCart' => $idCart,
|
||||
'idGuest' => $idGuest,
|
||||
'all_params' => $allParams
|
||||
)
|
||||
));
|
||||
|
||||
$sql = $selectCartRoomSearch;
|
||||
$sql .= ' FROM `'._DB_PREFIX_.'htl_cart_booking_data` AS cbd';
|
||||
$sql .= ' '.$joinCartRoomSearch;
|
||||
$sql .= ' '.$whereCartRoomSearch;
|
||||
$sql .= ' '.$groupByCartRoomSearch;
|
||||
$sql .= ' '.$orderByCartRoomSearch;
|
||||
$sql .= ' '.$orderWayCartRoomSearch;
|
||||
|
||||
if ($cartRooms = Db::getInstance()->executeS($sql)) {
|
||||
foreach ($cartRooms as $cartRoomDetail) {
|
||||
@@ -568,15 +643,17 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
/**
|
||||
* $params = array(
|
||||
* 'idHotel' => ...,
|
||||
* 'dateFrom' => ...,
|
||||
* 'dateTo' => ...,
|
||||
* 'idCart' => ...,
|
||||
* 'idGuest' => ...,
|
||||
* 'idRoomType' => ...,
|
||||
* 'searchOccupancy' => ...,
|
||||
* 'allowedIdRoomTypes' => ...,
|
||||
* 'applyLosRestriction' => ...,
|
||||
* 'idHotel' => ...,
|
||||
* 'dateFrom' => ...,
|
||||
* 'dateTo' => ...,
|
||||
* 'idCart' => ...,
|
||||
* 'idGuest' => ...,
|
||||
* 'idRoomType' => ...,
|
||||
* 'searchOccupancy' => ...,
|
||||
* 'allowedIdRoomTypes' => ...,
|
||||
* 'applyLosRestriction' => ...,
|
||||
* 'hourlyBooking' => ...,
|
||||
* 'allParams' => ...,
|
||||
* );
|
||||
*/
|
||||
protected function getSearchAvailableRooms($params)
|
||||
@@ -606,15 +683,15 @@ class HotelBookingDetail extends ObjectModel
|
||||
}
|
||||
|
||||
// Exculde Booked rooms
|
||||
$exclude_ids = 'SELECT `id_room`
|
||||
$excludeRoomId = array();
|
||||
$excludeRoomId['checked_out'] = 'SELECT `id_room`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail`
|
||||
WHERE `id_hotel` = '.(int)$idHotel.' AND `is_back_order` = 0 AND `is_refunded` = 0 AND IF(`id_status` = '. self::STATUS_CHECKED_OUT.', (
|
||||
(DATE_FORMAT(`check_out`, "%Y-%m-%d") > \''.pSQL($dateFrom).'\' AND DATE_FORMAT(`check_out`, "%Y-%m-%d") <= \''.PSQL($dateTo).'\') AND (
|
||||
WHERE `id_hotel` = '.(int)$idHotel.' AND `is_back_order` = 0 AND `is_refunded` = 0 AND IF(`id_status` = '. self::STATUS_CHECKED_OUT.',
|
||||
IF('.(int) $hourlyBooking.', 1, (DATE_FORMAT(`check_out`, "%Y-%m-%d") != DATE_FORMAT(\''.pSQL($dateFrom).'\', "%Y-%m-%d")) AND (`check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.PSQL($dateTo).'\')) AND (
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.PSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `date_from` < \''.pSQL($dateTo).'\' AND `check_out` >= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `check_out` >= \''.pSQL($dateTo).'\')
|
||||
)
|
||||
), (
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `date_to` > \''.pSQL($dateFrom).'\' AND `date_to` <= \''.PSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `date_to` <= \''.pSQL($dateTo).'\') OR
|
||||
@@ -622,55 +699,54 @@ class HotelBookingDetail extends ObjectModel
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `date_to` >= \''.pSQL($dateTo).'\')
|
||||
)) AND IF('.(int)$idRoomType.' > 0, `id_product` = '.(int)$idRoomType.', 1) AND `id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
// We have removed cart rooms after finally getting available rooms from booking
|
||||
// Exclude temporary disable rooms
|
||||
$exclude_ids .= ' UNION
|
||||
SELECT hri.`id` AS id_room
|
||||
$excludeRoomId['disabled'] = 'SELECT hri.`id` AS id_room
|
||||
FROM `'._DB_PREFIX_.'htl_room_information` AS hri
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_disable_dates` AS hrdd ON (hrdd.`id_room_type` = hri.`id_product` AND hrdd.`id_room` = hri.`id`)
|
||||
WHERE hri.`id_hotel`='.(int)$idHotel.' AND hri.`id_status` = '. HotelRoomInformation::STATUS_TEMPORARY_INACTIVE .' AND (hrdd.`date_from` < \''.pSql($dateTo).'\' AND hrdd.`date_to` > \''.pSql($dateFrom).'\') AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
// LOS Restriction. Also, Remember to check max LOS restriction is greater than zero
|
||||
if ($applyLosRestriction) {
|
||||
$exclude_ids .= ' UNION
|
||||
SELECT hri.`id` AS `id_room`
|
||||
$excludeRoomId['length_of_stay'] = 'SELECT hri.`id` AS `id_room`
|
||||
FROM `'._DB_PREFIX_.'htl_room_information` AS hri
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` AS hrt ON (hrt.`id_product` = hri.`id_product`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_restriction_date_range` AS hrtr ON (hrt.`id_product` = hrtr.`id_product` AND (hrtr.`date_from` <= \''.pSQL($stayStartDate).'\' AND hrtr.`date_to` > \''.pSQL($stayStartDate).'\'))
|
||||
WHERE hri.`id_hotel`='.(int)$idHotel.' AND (IFNULL(hrtr.`min_los`, hrt.`min_los`) >'. (int)$lengthOfStay.' OR IF(IFNULL(hrtr.`max_los`, hrt.`max_los`) > 0, IFNULL(hrtr.`max_los`, hrt.`max_los`) < '.(int)$lengthOfStay.', 0)) AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
}
|
||||
// We will remove cart rooms after finally getting available rooms from booking
|
||||
|
||||
$selectAvailRoomSearch = 'SELECT ri.`id` AS `id_room`, ri.`id_product`, ri.`id_hotel`, ri.`room_num`, ri.`comment` AS `room_comment`, hrt.`max_adults` AS max_adult, hrt.`max_children`, hrt.`max_guests` AS max_occupancy';
|
||||
|
||||
$joinAvailRoomSearch = 'INNER JOIN `'._DB_PREFIX_.'htl_room_type` AS hrt ON (hrt.`id_product` = ri.`id_product`)';
|
||||
|
||||
$whereAvailRoomSearch = 'WHERE ri.`id_hotel`='.(int)$idHotel.' AND ri.`id_status` != '. HotelRoomInformation::STATUS_INACTIVE.' AND ri.`id` NOT IN ('.$exclude_ids.') AND IF('.(int)$idRoomType.' > 0, ri.`id_product` = '.(int)$idRoomType.', 1) AND ri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
$whereAvailRoomSearch = 'WHERE ri.`id_hotel`='.(int)$idHotel.' AND ri.`id_status` != '. HotelRoomInformation::STATUS_INACTIVE.' AND IF('.(int)$idRoomType.' > 0, ri.`id_product` = '.(int)$idRoomType.', 1) AND ri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
$groupByAvailRoomSearch = '';
|
||||
$orderByAvailRoomSearch = 'ORDER BY ri.`id`';
|
||||
$orderWayAvailRoomSearch = 'ASC';
|
||||
|
||||
Hook::exec('actionAvailRoomSearchSqlModifier',
|
||||
array(
|
||||
'select' => $selectAvailRoomSearch,
|
||||
'join' => &$joinAvailRoomSearch,
|
||||
'where' => &$whereAvailRoomSearch,
|
||||
'group_by' => &$groupByAvailRoomSearch,
|
||||
'order_by' => &$orderByAvailRoomSearch,
|
||||
'order_way' => &$orderWayAvailRoomSearch,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo
|
||||
)
|
||||
Hook::exec('actionAvailRoomSearchSqlModifier', array(
|
||||
'select' => $selectAvailRoomSearch,
|
||||
'join' => &$joinAvailRoomSearch,
|
||||
'where' => &$whereAvailRoomSearch,
|
||||
'exclude_room_id' => &$excludeRoomId,
|
||||
'group_by' => &$groupByAvailRoomSearch,
|
||||
'order_by' => &$orderByAvailRoomSearch,
|
||||
'order_way' => &$orderWayAvailRoomSearch,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'all_params' => $allParams
|
||||
)
|
||||
);
|
||||
));
|
||||
|
||||
$sql = $selectAvailRoomSearch;
|
||||
$sql .= ' FROM `'._DB_PREFIX_.'htl_room_information` AS ri';
|
||||
$sql .= ' '.$joinAvailRoomSearch;
|
||||
$sql .= ' '.$whereAvailRoomSearch;
|
||||
$sql .= ' AND ri.`id` NOT IN ('.implode(' UNION ', $excludeRoomId).')';
|
||||
$sql .= ' '.$groupByAvailRoomSearch;
|
||||
$sql .= ' '.$orderByAvailRoomSearch;
|
||||
$sql .= ' '.$orderWayAvailRoomSearch;
|
||||
@@ -708,7 +784,19 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
if ($QLO_SEARCH_TYPE == HotelBookingDetail::SEARCH_TYPE_OWS && $searchOccupancy) {
|
||||
$availableRoomTypes = $this->getAvailableRoomSatisfingOccupancy($searchOccupancy, $availableRoomTypes, $QLO_OWS_SEARCH_ALGO_TYPE);
|
||||
|
||||
// segregating available and unavailable roomTypes
|
||||
$unavailableRoomTypes = $availableRoomTypes['unavailableRoomTypes'];
|
||||
if ($unavailableRoomTypes) {
|
||||
// Adding an id_status key to the unavailable rooms array to identify rooms unavailable due to unsatisfied occupancy search criteria.
|
||||
// if in case we need to add multiple keys then we can use array union operator
|
||||
// Instead of looping here, we can do this in the getavailableRoomSatisfingOccupancy function
|
||||
foreach ($unavailableRoomTypes as $idProduct => $roomTypeDetail) {
|
||||
foreach ($roomTypeDetail as $idRoom => $roomDetail) {
|
||||
$unavailableRoomTypes[$idProduct][$roomDetail['id_room']]['id_status'] = HotelRoomInformation::STATUS_SEARCH_OCCUPANCY_UNSATISFIED;
|
||||
}
|
||||
}
|
||||
}
|
||||
$availableRoomTypes = $availableRoomTypes['availableRoomTypes'];
|
||||
}
|
||||
|
||||
@@ -915,29 +1003,30 @@ class HotelBookingDetail extends ObjectModel
|
||||
* 'idRoomType' => ...,
|
||||
* 'searchOccupancy' => ...,
|
||||
* 'allowedIdRoomTypes' => ...,
|
||||
* 'hourlyBooking' => ...,
|
||||
* 'allParams' => ...,
|
||||
* );
|
||||
*/
|
||||
protected function getSearchPartiallyAvailRooms($params)
|
||||
{
|
||||
extract($params);
|
||||
|
||||
$sql1 = 'SELECT bd.`id_product`, bd.`id_room`, bd.`id_hotel`, bd.`id_customer`, bd.`booking_type`, bd.`id_status` AS booking_status, bd.`comment` AS `room_comment`, rf.`room_num`, bd.`date_from`, IF(bd.`id_status` = '. self::STATUS_CHECKED_OUT .', bd.`check_out`, bd.`date_to`) AS `date_to`, hrt.`max_adults` AS `max_adult`, hrt.`max_children`, hrt.`max_guests` AS `max_occupancy`
|
||||
$sql = array();
|
||||
$sql[] = 'SELECT bd.`id_product`, bd.`id_room`, bd.`id_hotel`, bd.`id_customer`, bd.`booking_type`, bd.`id_status` AS booking_status, bd.`comment` AS `room_comment`, rf.`room_num`, bd.`date_from`, IF(bd.`id_status` = '. self::STATUS_CHECKED_OUT .', bd.`check_out`, bd.`date_to`) AS `date_to`, hrt.`max_adults` AS `max_adult`, hrt.`max_children`, hrt.`max_guests` AS `max_occupancy`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` AS bd
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_information` AS rf ON (rf.`id` = bd.`id_room`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` AS hrt ON (hrt.`id_product` = rf.`id_product`)
|
||||
WHERE bd.`id_hotel`='.(int)$idHotel.' AND rf.`id_status` != '. HotelRoomInformation::STATUS_INACTIVE .' AND bd.`is_back_order` = 0 AND bd.`is_refunded` = 0 AND IF(bd.`id_status` = '. self::STATUS_CHECKED_OUT .', (
|
||||
(DATE_FORMAT(`check_out`, "%Y-%m-%d") > \''.pSQL($dateFrom).'\' AND DATE_FORMAT(`check_out`, "%Y-%m-%d") < \''.PSQL($dateTo).'\') AND (
|
||||
(bd.`date_from` <= \''.pSQL($dateFrom).'\' AND bd.`check_out` > \''.pSQL($dateFrom).'\' AND bd.`check_out` < \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`check_out` >= \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`check_out` > \''.pSQL($dateFrom).'\' AND bd.`check_out` < \''.pSQL($dateTo).'\')
|
||||
)
|
||||
WHERE bd.`id_hotel`='.(int)$idHotel.' AND rf.`id_status` != '. HotelRoomInformation::STATUS_INACTIVE .' AND bd.`is_back_order` = 0 AND bd.`is_refunded` = 0 AND IF(bd.`id_status` = '. self::STATUS_CHECKED_OUT .', IF('.(int) $hourlyBooking.', 1, (DATE_FORMAT(`check_out`, "%Y-%m-%d") != DATE_FORMAT(\''.pSQL($dateFrom).'\', "%Y-%m-%d")) AND (`check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.PSQL($dateTo).'\')) AND (
|
||||
(bd.`date_from` <= \''.pSQL($dateFrom).'\' AND bd.`check_out` > \''.pSQL($dateFrom).'\' AND bd.`check_out` < \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`check_out` >= \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`check_out` > \''.pSQL($dateFrom).'\' AND bd.`check_out` < \''.pSQL($dateTo).'\')
|
||||
), (
|
||||
(bd.`date_from` <= \''.pSQL($dateFrom).'\' AND bd.`date_to` > \''.pSQL($dateFrom).'\' AND bd.`date_to` < \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`date_to` >= \''.pSQL($dateTo).'\') OR
|
||||
(bd.`date_from` > \''.pSQL($dateFrom).'\' AND bd.`date_from` < \''.pSQL($dateTo).'\' AND bd.`date_to` < \''.pSQL($dateTo).'\')
|
||||
)) AND IF('.(int)$idRoomType.' > 0, rf.`id_product` = '.(int)$idRoomType.', 1) AND rf.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
$sql2 = 'SELECT hri.`id_product`, hrdd.`id_room`, hri.`id_hotel`, 0 AS `id_customer`, 0 AS `booking_type`, 0 AS `booking_status`, 0 AS `room_comment`, hri.`room_num`, hrdd.`date_from`, hrdd.`date_to`, hrt.`max_adults` AS `max_adult`, hrt.`max_children`, hrt.`max_guests` AS `max_occupancy`
|
||||
$sql[] = 'SELECT hri.`id_product`, hrdd.`id_room`, hri.`id_hotel`, 0 AS `id_customer`, 0 AS `booking_type`, 0 AS `booking_status`, 0 AS `room_comment`, hri.`room_num`, hrdd.`date_from`, hrdd.`date_to`, hrt.`max_adults` AS `max_adult`, hrt.`max_children`, hrt.`max_guests` AS `max_occupancy`
|
||||
FROM `'._DB_PREFIX_.'htl_room_information` AS hri
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_type` AS hrt ON (hrt.`id_product` = hri.`id_product`)
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_disable_dates` AS hrdd ON (hrdd.`id_room_type` = hri.`id_product` AND hrdd.`id_room` = hri.`id`)
|
||||
@@ -947,7 +1036,20 @@ class HotelBookingDetail extends ObjectModel
|
||||
(hrdd.`date_from` > \''.pSQL($dateFrom).'\' AND hrdd.`date_from` < \''.pSQL($dateTo).'\' AND hrdd.`date_to` < \''.pSQL($dateTo).'\')
|
||||
) AND IF('.(int)$idRoomType.' > 0, hri.`id_product` = '.(int)$idRoomType.', 1) AND hri.`id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
|
||||
$sql = $sql1.' UNION '.$sql2.' ORDER BY id_room ASC';
|
||||
Hook::exec('actionPartiallyAvailRoomSearchSqlModifier', array(
|
||||
'sql' => &$sql,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'all_params' => $allParams
|
||||
)
|
||||
));
|
||||
|
||||
$sql = implode(' UNION ', $sql);
|
||||
$sql .= ' ORDER BY id_room ASC';
|
||||
|
||||
$part_arr = Db::getInstance()->executeS($sql);
|
||||
|
||||
// Get date wise available rooms
|
||||
@@ -1207,16 +1309,14 @@ class HotelBookingDetail extends ObjectModel
|
||||
}
|
||||
} else {
|
||||
// If all dates are not covered then move all partially available room types to unavailable
|
||||
foreach ($partiallyAvailRooms as $roomDetail) {
|
||||
if (!isset($unavailableRoomTypes[$roomDetail['id_product']][$roomDetail['id_room']])) {
|
||||
$unavailableRoomTypes[$roomDetail['id_product']][$roomDetail['id_room']] = array(
|
||||
'id_room' => $roomDetail['id_room'],
|
||||
'id_product' => $roomDetail['id_product'],
|
||||
'id_hotel' => $roomDetail['id_hotel'],
|
||||
'room_num' => $roomDetail['room_num'],
|
||||
'room_comment' => ''
|
||||
);
|
||||
}
|
||||
foreach ($partiallyAvailRooms as $partAvailRoomDetail) {
|
||||
$unavailableRoomTypes[$partAvailRoomDetail['id_product']][$partAvailRoomDetail['id_room']] = array(
|
||||
'id_room' => $partAvailRoomDetail['id_room'],
|
||||
'id_product' => $partAvailRoomDetail['id_product'],
|
||||
'id_hotel' => $partAvailRoomDetail['id_hotel'],
|
||||
'room_num' => $partAvailRoomDetail['room_num'],
|
||||
'room_comment' => ''
|
||||
);
|
||||
}
|
||||
|
||||
$partiallyAvailRooms = array();
|
||||
@@ -1246,11 +1346,46 @@ class HotelBookingDetail extends ObjectModel
|
||||
{
|
||||
extract($params);
|
||||
|
||||
$sql = 'SELECT bd.`id`, bd.`id_product`, bd.`id_room`, bd.`id_hotel`, bd.`id_customer`, bd.`booking_type`, bd.`id_status` AS booking_status, bd.`comment`, rf.`room_num`, bd.`date_from`, bd.`date_to`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` AS bd
|
||||
INNER JOIN `'._DB_PREFIX_.'htl_room_information` AS rf ON (rf.`id` = bd.`id_room`)
|
||||
WHERE bd.`id_hotel`='.(int)$idHotel.' AND bd.`is_refunded` = 0 AND bd.`is_back_order` = 0 AND IF(bd.`id_status` = '. self::STATUS_CHECKED_OUT .', bd.`date_from` <= \''.pSQL($dateFrom).'\' AND bd.`check_out` >= \''.pSQL($dateTo).'\', bd.`date_from` <= \''.pSQL($dateFrom).'\' AND bd.date_to >= \''.pSQL($dateTo).'\') AND IF('.(int)$idRoomType.' > 0, rf.`id_product` = '.(int)$idRoomType.', 1) AND rf.`id_product` IN ('.$allowedIdRoomTypes.')
|
||||
ORDER BY bd.`id_room` ASC';
|
||||
$selectBookedRoomSearch = 'SELECT `id`, `id_order`, `id_product`, `id_room`, `id_hotel`, `id_customer`, `booking_type`, `id_status` AS booking_status, `comment`, `room_num`, `date_from`, IF(`id_status` = '. self::STATUS_CHECKED_OUT.', `check_out`,`date_to`) AS `date_to`, `check_in`, `check_out`, `date_to` AS `booking_date_to`';
|
||||
$joinBookedRoomSearch = '';
|
||||
$whereBookedRoomSearch = 'WHERE `id_hotel` = '.(int)$idHotel.' AND `is_back_order` = 0 AND `is_refunded` = 0 AND IF(`id_status` = '. self::STATUS_CHECKED_OUT.', (
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.PSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `check_out` > \''.pSQL($dateFrom).'\' AND `check_out` <= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `date_from` < \''.pSQL($dateTo).'\' AND `check_out` >= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `check_out` >= \''.pSQL($dateTo).'\')
|
||||
), (
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `date_to` > \''.pSQL($dateFrom).'\' AND `date_to` <= \''.PSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `date_to` <= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` >= \''.pSQL($dateFrom).'\' AND `date_from` < \''.pSQL($dateTo).'\' AND `date_to` >= \''.pSQL($dateTo).'\') OR
|
||||
(`date_from` <= \''.pSQL($dateFrom).'\' AND `date_to` >= \''.pSQL($dateTo).'\')
|
||||
)) AND IF('.(int)$idRoomType.' > 0, `id_product` = '.(int)$idRoomType.', 1) AND `id_product` IN ('.$allowedIdRoomTypes.')';
|
||||
$groupByBookedRoomSearch = '';
|
||||
$orderByBookedRoomSearch = 'ORDER BY `id_room`, `date_from`';
|
||||
$orderWayBookedRoomSearch = 'ASC';
|
||||
|
||||
Hook::exec('actionBookedRoomSearchSqlModifier', array(
|
||||
'select' => $selectBookedRoomSearch,
|
||||
'join' => &$joinBookedRoomSearch,
|
||||
'where' => &$whereBookedRoomSearch,
|
||||
'group_by' => &$groupByBookedRoomSearch,
|
||||
'order_by' => &$orderByBookedRoomSearch,
|
||||
'order_way' => &$orderWayBookedRoomSearch,
|
||||
'params' => array(
|
||||
'id_hotel' => $idHotel,
|
||||
'id_product' => $idRoomType,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'all_params' => $allParams
|
||||
)
|
||||
));
|
||||
|
||||
$sql = $selectBookedRoomSearch;
|
||||
$sql .= ' FROM `'._DB_PREFIX_.'htl_booking_detail`';
|
||||
$sql .= ' '.$joinBookedRoomSearch;
|
||||
$sql .= ' '.$whereBookedRoomSearch;
|
||||
$sql .= ' '.$groupByBookedRoomSearch;
|
||||
$sql .= ' '.$orderByBookedRoomSearch;
|
||||
$sql .= ' '.$orderWayBookedRoomSearch;
|
||||
|
||||
$bookedRoomTypes = array();
|
||||
if ($booked_rooms = Db::getInstance()->executeS($sql)) {
|
||||
@@ -1400,25 +1535,24 @@ class HotelBookingDetail extends ObjectModel
|
||||
* @param [date] $dateTo [End date of the booking]
|
||||
*
|
||||
* @return [int] [Returns number of days between two dates]
|
||||
* @deprecated use hotelBookingDetail::getDays() instead
|
||||
* @deprecated use HotelHelper::getNumberOfDays() instead
|
||||
*/
|
||||
public function getNumberOfDays($dateFrom, $dateTo)
|
||||
{
|
||||
return self::getDays($dateFrom, $dateTo);
|
||||
// $startDate = new DateTime($dateFrom);
|
||||
// $endDate = new DateTime($dateTo);
|
||||
// $daysDifference = $startDate->diff($endDate)->days;
|
||||
|
||||
// return $daysDifference;
|
||||
return HotelHelper::getNumberOfDays($dateFrom, $dateTo);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param [date] $dateFrom [Start date of the booking]
|
||||
* @param [date] $dateTo [End date of the booking]
|
||||
*
|
||||
* @return [int] [Returns number of days between two dates]
|
||||
* @deprecated use HotelHelper::getNumberOfDays() instead
|
||||
*/
|
||||
public static function getDays($dateFrom, $dateTo)
|
||||
{
|
||||
$startDate = new DateTime($dateFrom);
|
||||
$endDate = new DateTime($dateTo);
|
||||
$daysDifference = $startDate->diff($endDate)->days;
|
||||
|
||||
return $daysDifference;
|
||||
return HotelHelper::getNumberOfDays($dateFrom, $dateTo);
|
||||
}
|
||||
|
||||
public function generateRoomOccupancyWeight($availRoomTypeCount, $totalOccupancy, $totalAdult, $totalChildren)
|
||||
@@ -1517,10 +1651,18 @@ class HotelBookingDetail extends ObjectModel
|
||||
|
||||
$this->context = Context::getContext();
|
||||
|
||||
$bookingParams['search_available'] = 1;
|
||||
$bookingParams['search_partial'] = 0;
|
||||
$bookingParams['search_booked'] = 0;
|
||||
$bookingParams['search_unavai'] = 0;
|
||||
if (!isset($bookingParams['search_available'])) {
|
||||
$bookingParams['search_available'] = 1;
|
||||
}
|
||||
if (!isset($bookingParams['search_partial'])) {
|
||||
$bookingParams['search_partial'] = 0;
|
||||
}
|
||||
if (!isset($bookingParams['search_booked'])) {
|
||||
$bookingParams['search_booked'] = 0;
|
||||
}
|
||||
if (!isset($bookingParams['search_unavai'])) {
|
||||
$bookingParams['search_unavai'] = 0;
|
||||
}
|
||||
|
||||
$bookingData = $this->getBookingData($bookingParams);
|
||||
|
||||
|
||||
@@ -2730,11 +2730,7 @@ class HotelHelper
|
||||
if (isset($rooms[$roomType['value']])) {
|
||||
$roomType['children'] = $rooms[$roomType['value']];
|
||||
}
|
||||
$roomType['hint'] = 'This is Room type hint';
|
||||
$roomType['badge'] = array(
|
||||
'class' => 'badge-danger',
|
||||
'title' => 'Disabled'
|
||||
);
|
||||
|
||||
if ($previousElements) {
|
||||
$return[$roomType['id_hotel']][] = $roomType;
|
||||
} else {
|
||||
|
||||
@@ -34,6 +34,9 @@ class HotelRoomInformation extends ObjectModel
|
||||
const STATUS_INACTIVE = 2;
|
||||
const STATUS_TEMPORARY_INACTIVE = 3;
|
||||
|
||||
const STATUS_SEARCH_LOS_UNSATISFIED = 4;
|
||||
const STATUS_SEARCH_OCCUPANCY_UNSATISFIED = 5;
|
||||
|
||||
public static $definition = array(
|
||||
'table' => 'htl_room_information',
|
||||
'primary' => 'id',
|
||||
@@ -76,7 +79,7 @@ class HotelRoomInformation extends ObjectModel
|
||||
{
|
||||
if ($idRoom = $this->id) {
|
||||
// delete rooms from cart which are set inactive
|
||||
if ($this->id_status == self::STATUS_INACTIVE) {
|
||||
if ($this->id_status == HotelRoomInformation::STATUS_INACTIVE) {
|
||||
$objCartBookingData = new HotelCartBookingData();
|
||||
if (!$objCartBookingData->deleteCartBookingData(0, 0, $idRoom)) {
|
||||
return false;
|
||||
@@ -138,25 +141,37 @@ class HotelRoomInformation extends ObjectModel
|
||||
|
||||
public function getAllRoomStatus()
|
||||
{
|
||||
$moduleInstance = Module::getInstanceByName('hotelreservationsystem');
|
||||
|
||||
$status = array(
|
||||
'STATUS_ACTIVE' => array(
|
||||
'id' => self::STATUS_ACTIVE,
|
||||
'status' => $moduleInstance->l('Active', 'hotelreservationsystem')
|
||||
'id' => HotelRoomInformation::STATUS_ACTIVE,
|
||||
'status' => self::getRoomStatusTitle(HotelRoomInformation::STATUS_ACTIVE)
|
||||
),
|
||||
'STATUS_INACTIVE' => array(
|
||||
'id' => self::STATUS_INACTIVE,
|
||||
'status' => $moduleInstance->l('Inactive', 'hotelreservationsystem')
|
||||
'id' => HotelRoomInformation::STATUS_INACTIVE,
|
||||
'status' => self::getRoomStatusTitle(HotelRoomInformation::STATUS_INACTIVE)
|
||||
),
|
||||
'STATUS_TEMPORARY_INACTIVE' => array(
|
||||
'id' => self::STATUS_TEMPORARY_INACTIVE,
|
||||
'status' => $moduleInstance->l('Temporarily Inactive', 'hotelreservationsystem')
|
||||
'id' => HotelRoomInformation::STATUS_TEMPORARY_INACTIVE,
|
||||
'status' => self::getRoomStatusTitle(HotelRoomInformation::STATUS_TEMPORARY_INACTIVE)
|
||||
),
|
||||
);
|
||||
return $status;
|
||||
}
|
||||
|
||||
public static function getRoomStatusTitle($idStatus)
|
||||
{
|
||||
$moduleInstance = Module::getInstanceByName('hotelreservationsystem');
|
||||
$status = array(
|
||||
HotelRoomInformation::STATUS_ACTIVE => $moduleInstance->l('Active', 'hotelreservationsystem'),
|
||||
HotelRoomInformation::STATUS_INACTIVE => $moduleInstance->l('Inactive', 'hotelreservationsystem'),
|
||||
HotelRoomInformation::STATUS_TEMPORARY_INACTIVE => $moduleInstance->l('Temporarily Inactive', 'hotelreservationsystem'),
|
||||
HotelRoomInformation::STATUS_SEARCH_LOS_UNSATISFIED => $moduleInstance->l('Length of stay restriction not satisfied', 'hotelreservationsystem'),
|
||||
HotelRoomInformation::STATUS_SEARCH_OCCUPANCY_UNSATISFIED => $moduleInstance->l('Occupancy exceeds room capacity', 'hotelreservationsystem'),
|
||||
);
|
||||
|
||||
return isset($status[$idStatus]) ? $status[$idStatus] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* [getHotelRoomInfoByProductId :: To get all rooms information belong to a room type(product) by product id]
|
||||
* @param [int] $id_product [Id of the product]
|
||||
|
||||
@@ -379,6 +379,7 @@ class AdminHotelRoomsBookingController extends ModuleAdminController
|
||||
'occupancy_required_for_booking' => $occupancyRequiredForBooking,
|
||||
'max_child_age' => Configuration::get('WK_GLOBAL_CHILD_MAX_AGE'),
|
||||
'max_child_in_room' => Configuration::get('WK_GLOBAL_MAX_CHILD_IN_ROOM'),
|
||||
'link' => $this->context->link
|
||||
));
|
||||
|
||||
if (Configuration::get('PS_BACKOFFICE_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS) {
|
||||
|
||||
@@ -216,7 +216,13 @@ p.room_cat_data
|
||||
font-weight: 700;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.status-info-tooltip {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
left: 100%;
|
||||
margin-left: -10px;
|
||||
padding: 0px;
|
||||
}
|
||||
.color_indicate
|
||||
{
|
||||
width: 10px;
|
||||
@@ -239,6 +245,7 @@ p.room_cat_data
|
||||
margin: 10px 0px;
|
||||
}
|
||||
|
||||
|
||||
.cart-table-thead
|
||||
{
|
||||
border-bottom: 1px solid #555!important;
|
||||
@@ -279,7 +286,10 @@ p.room_cat_data
|
||||
font-size: 14px!important;
|
||||
font-weight: 600!important;
|
||||
}
|
||||
|
||||
#htl_rooms_list table td {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
#room-status-tabs li
|
||||
{
|
||||
font-size: 14px;
|
||||
|
||||
@@ -954,10 +954,56 @@ $(document).ready(function() {
|
||||
success: function(result) {
|
||||
if (result.success) {
|
||||
$(".htl_room_data_cont").html(result.data.stats_panel);
|
||||
initstatstooltip();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
initstatstooltip();
|
||||
|
||||
function initstatstooltip()
|
||||
{
|
||||
$(".htl_room_data_cont").find('.status-info-tooltip').tooltip({
|
||||
trigger : 'hover',
|
||||
show: {
|
||||
delay: 100,
|
||||
},
|
||||
hide: {
|
||||
delay: 300,
|
||||
},
|
||||
open: function(event, ui)
|
||||
{
|
||||
if(event.buttons == 1 || event.buttons == 3){
|
||||
ui.tooltip.remove();
|
||||
}
|
||||
|
||||
if (typeof(event.originalEvent) === 'undefined') {
|
||||
return false;
|
||||
}
|
||||
|
||||
var $id = $(ui.tooltip).attr('id');
|
||||
|
||||
// close any lingering tooltips
|
||||
if ($('div.ui-tooltip').not('#' + $id).length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// ajax function to pull in data and add it to the tooltip goes here
|
||||
},
|
||||
close: function(event, ui)
|
||||
{
|
||||
ui.tooltip.hover(function() {
|
||||
$(this).stop(true).fadeTo(300, 1);
|
||||
},
|
||||
function() {
|
||||
$(this).fadeOut('300', function()
|
||||
{
|
||||
$(this).remove();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var allotmentTypes = {
|
||||
auto: ALLOTMENT_AUTO,
|
||||
|
||||
@@ -203,6 +203,7 @@
|
||||
<tr>
|
||||
<th><span class="title_box">{l s='Room No.' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Duration' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Order' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Message' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Allotment Type' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Reallocate' mod='hotelreservationsystem'}</span></th>
|
||||
@@ -216,6 +217,7 @@
|
||||
<td rowspan="{$booked_v['detail']|count}">{$booked_v['room_num']|escape:'htmlall':'UTF-8'} {hook h='displayRoomNumAfter' data=$booked_v key=$rm_dtl_k type='booked'}</td>
|
||||
{/if}
|
||||
<td>{dateFormat date=date('Y-m-d', strtotime($rm_dtl_v['date_from']))} - {dateFormat date=date('Y-m-d', strtotime($rm_dtl_v['date_to']))}</td>
|
||||
<td><a href="{$link->getAdminLink('AdminOrders')}&id_order={$rm_dtl_v['id_order']|intval}&vieworder" target="_blank">#{$rm_dtl_v['id_order']}</a></td>
|
||||
<td>{$rm_dtl_v['comment']|escape:'htmlall':'UTF-8'}</td>
|
||||
<td>
|
||||
{if $rm_dtl_v['booking_type'] == HotelBookingDetail::ALLOTMENT_AUTO}{l s='Auto Allotment' mod='hotelreservationsystem'}{elseif $rm_dtl_v['booking_type'] == HotelBookingDetail::ALLOTMENT_MANUAL}{l s='Manual Allotment' mod='hotelreservationsystem'}{/if}
|
||||
@@ -242,15 +244,29 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th><span class="title_box">{l s='Room No.' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Status' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Duration' mod='hotelreservationsystem'}</span></th>
|
||||
<th><span class="title_box">{l s='Message' mod='hotelreservationsystem'}</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach from=$book_v['data']['unavailable'] key=unavai_k item=unavai_v}
|
||||
<tr>
|
||||
<td>{$unavai_v['room_num']|escape:'htmlall':'UTF-8'}</td>
|
||||
<td>{$unavai_v['room_comment']|escape:'htmlall':'UTF-8'}</td>
|
||||
</tr>
|
||||
{foreach from=$unavai_v['detail'] key=rm_dtl_k item=unavail_dtl_v}
|
||||
<tr>
|
||||
{if $unavail_dtl_v@first}
|
||||
<td rowspan="{$unavai_v['detail']|count}">{$unavai_v['room_num']|escape:'htmlall':'UTF-8'}</td>
|
||||
{/if}
|
||||
<td>{HotelRoomInformation::getRoomStatusTitle($unavail_dtl_v['id_status'])|escape:'htmlall':'UTF-8'}</td>
|
||||
<td>
|
||||
{if $unavail_dtl_v['date_from'] && $unavail_dtl_v['date_to']}
|
||||
{dateFormat date=date('Y-m-d', strtotime($unavail_dtl_v['date_from']))} - {dateFormat date=date('Y-m-d', strtotime($unavail_dtl_v['date_to']))}
|
||||
{else}
|
||||
--
|
||||
{/if}
|
||||
</td>
|
||||
<td>{$unavail_dtl_v['room_comment']|escape:'htmlall':'UTF-8'}</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<div class="htl_room_data_cont">
|
||||
<div class="status-info-tooltip" title="{l s='Due to the dynamic nature of room availability, a single room can fall under multiple categories in the stats panel. For example, if a room is booked from 1st to 3th and then marked as unavailable for maintenance on 4th to 5th, it would be counted in both the "Booked Rooms" and "Unavailable Rooms" categories for those respective dates if search is done from 1st to 6th. This allows admin to understand the room\'s status across different periods accurately.' mod='hotelreservationsystem'}">
|
||||
<i class="icon-info-circle"></i>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="row">
|
||||
|
||||
@@ -23,91 +23,83 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{if (isset($extraDemands) && $extraDemands) || (isset($additionalServices) && $additionalServices)}
|
||||
<div class="">
|
||||
<ul class="nav nav-tabs">
|
||||
{if isset($extraDemands) && $extraDemands}
|
||||
<li class="active"><a href="#room_type_demands_desc" data-toggle="tab">{l s='Facilities'}</a></li>
|
||||
{/if}
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
<li{if !isset($extraDemands) || !$extraDemands} class="active"{/if}><a href="#room_type_service_product_desc" data-toggle="tab">{l s='Services'}</a></li>
|
||||
{/if}
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
{if isset($extraDemands) && $extraDemands}
|
||||
<div id="room_type_demands_desc" class="tab-pane active">
|
||||
<div class="rooms_extra_demands_head">
|
||||
<p class="rooms_extra_demands_text">{l s='Facilities chosen for this booking.'}</p>
|
||||
</div>
|
||||
{assign var=roomCount value=1}
|
||||
{foreach $extraDemands as $roomDemand}
|
||||
<div class="room_demands">
|
||||
<div class="demand_header">
|
||||
{l s='Room'} {$roomCount|string_format:'%02d'}
|
||||
<span>({if {$roomDemand['adults']} <= 9}0{$roomDemand['adults']}{else}{$roomDemand['adults']}{/if} {if $roomDemand['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $roomDemand['children'] > 0}, {if {$roomDemand['children']} <= 9}0{$roomDemand['children']}{else}{$roomDemand['children']}{/if} {if $roomDemand['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if})</span>
|
||||
</div>
|
||||
<div class="room_demand_detail">
|
||||
{foreach $roomDemand['extra_demands'] as $demand}
|
||||
<div class="room_demand_block">
|
||||
<div class="">{$demand['name']|escape:'html':'UTF-8'}</div>
|
||||
<ul class="nav nav-tabs">
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
<li class="active"><a href="#room_type_service_product_desc" data-toggle="tab">{l s='Services'}</a></li>
|
||||
{/if}
|
||||
{if isset($extraDemands) && $extraDemands}
|
||||
<li {if !isset($additionalServices) || !$additionalServices} class="active" {/if}><a href="#room_type_demands_desc" data-toggle="tab">{l s='Facilities'}</a></li>
|
||||
{/if}
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
<div id="room_type_service_product_desc" class="tab-pane {if isset($additionalServices) && $additionalServices}active{/if}">
|
||||
{assign var=roomCount value=1}
|
||||
{foreach $additionalServices as $key => $roomAdditionalService}
|
||||
<div class="room_demands">
|
||||
<div class="demand_header">
|
||||
{l s='Room'} {$roomCount|string_format:'%02d'}
|
||||
<span>({if {$roomAdditionalService['adults']} <= 9}0{$roomAdditionalService['adults']}{else}{$roomAdditionalService['adults']}{/if} {if $roomAdditionalService['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $roomAdditionalService['children'] > 0}, {if {$roomAdditionalService['children']} <= 9}0{$roomAdditionalService['children']}{else}{$roomAdditionalService['children']}{/if} {if $roomAdditionalService['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if})</span>
|
||||
</div>
|
||||
<div class="room_demand_detail">
|
||||
{foreach $roomAdditionalService['additional_services'] as $additionalService}
|
||||
<div class="room_demand_block">
|
||||
<div class="">
|
||||
<div class="">
|
||||
<span>
|
||||
{if $useTax}
|
||||
{displayPrice price="{$demand['total_price_tax_incl']|escape:'html':'UTF-8'}" currency=$objOrder->id_currency}
|
||||
{else}
|
||||
{displayPrice price="{$demand['total_price_tax_excl']|escape:'html':'UTF-8'}" currency=$objOrder->id_currency}
|
||||
{/if}
|
||||
</span>
|
||||
{$additionalService['name']|escape:'html':'UTF-8'}
|
||||
{if $additionalService['allow_multiple_quantity']}
|
||||
<span class="quantity">{l s='(Quantity: %s)' sprintf=[$additionalService['quantity']|string_format:'%02d']}</span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{assign var=roomCount value=$roomCount+1}
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if isset($additionalServices) && $additionalServices}
|
||||
<div id="room_type_service_product_desc" class="tab-pane{if !isset($extraDemands) || !$extraDemands} active{/if}">
|
||||
<div class="rooms_extra_demands_head">
|
||||
<p class="rooms_extra_demands_text">{l s='Services chosen for this booking.'}</p>
|
||||
</div>
|
||||
{assign var=roomCount value=1}
|
||||
{foreach $additionalServices as $key => $roomAdditionalService}
|
||||
<div class="room_demands">
|
||||
<div class="demand_header">
|
||||
{l s='Room'} {$roomCount|string_format:'%02d'}
|
||||
<span>({if {$roomAdditionalService['adults']} <= 9}0{$roomAdditionalService['adults']}{else}{$roomAdditionalService['adults']}{/if} {if $roomAdditionalService['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $roomAdditionalService['children'] > 0}, {if {$roomAdditionalService['children']} <= 9}0{$roomAdditionalService['children']}{else}{$roomAdditionalService['children']}{/if} {if $roomAdditionalService['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if})</span>
|
||||
</div>
|
||||
<div class="room_demand_detail">
|
||||
{foreach $roomAdditionalService['additional_services'] as $additionalService}
|
||||
<div class="room_demand_block">
|
||||
<div class="">
|
||||
<div class="">
|
||||
{$additionalService['name']|escape:'html':'UTF-8'}
|
||||
{if $additionalService['allow_multiple_quantity']}
|
||||
<span class="quantity">{l s='(Quantity: %s)' sprintf=[$additionalService['quantity']|string_format:'%02d']}</span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="">
|
||||
<span>
|
||||
{if $useTax}
|
||||
{displayPrice price=$additionalService['total_price_tax_incl']|escape:'html':'UTF-8' currency=$objOrder->id_currency}
|
||||
{else}
|
||||
{displayPrice price=$additionalService['total_price_tax_excl']|escape:'html':'UTF-8' currency=$objOrder->id_currency}
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
<div class="">
|
||||
<span>
|
||||
{if $useTax}
|
||||
{displayPrice price=$additionalService['total_price_tax_incl']|escape:'html':'UTF-8' currency=$objOrder->id_currency}
|
||||
{else}
|
||||
{displayPrice price=$additionalService['total_price_tax_excl']|escape:'html':'UTF-8' currency=$objOrder->id_currency}
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
{assign var=roomCount value=$roomCount+1}
|
||||
{/foreach}
|
||||
</div>
|
||||
{assign var=roomCount value=$roomCount+1}
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
{if isset($extraDemands) && $extraDemands}
|
||||
<div id="room_type_demands_desc" class="tab-pane {if !isset($additionalServices) || !$additionalServices}active{/if}">
|
||||
{assign var=roomCount value=1}
|
||||
{foreach $extraDemands as $roomDemand}
|
||||
<div class="room_demands">
|
||||
<div class="demand_header">
|
||||
{l s='Room'} {$roomCount|string_format:'%02d'}
|
||||
<span>({if {$roomDemand['adults']} <= 9}0{$roomDemand['adults']}{else}{$roomDemand['adults']}{/if} {if $roomDemand['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $roomDemand['children'] > 0}, {if {$roomDemand['children']} <= 9}0{$roomDemand['children']}{else}{$roomDemand['children']}{/if} {if $roomDemand['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if})</span>
|
||||
</div>
|
||||
<div class="room_demand_detail">
|
||||
{foreach $roomDemand['extra_demands'] as $demand}
|
||||
<div class="room_demand_block">
|
||||
<div class="">{$demand['name']|escape:'html':'UTF-8'}</div>
|
||||
<div class="">
|
||||
<span>
|
||||
{if $useTax}
|
||||
{displayPrice price="{$demand['total_price_tax_incl']|escape:'html':'UTF-8'}" currency=$objOrder->id_currency}
|
||||
{else}
|
||||
{displayPrice price="{$demand['total_price_tax_excl']|escape:'html':'UTF-8'}" currency=$objOrder->id_currency}
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{assign var=roomCount value=$roomCount+1}
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -8981,7 +8981,6 @@ a.open_rooms_extra_services_panel {
|
||||
margin-bottom: 18px;} */
|
||||
|
||||
#rooms_extra_services .room_demand_block {
|
||||
margin-bottom: 15px;
|
||||
color: #333;
|
||||
font-size: 14px;}
|
||||
#rooms_extra_services .checkbox {
|
||||
|
||||
@@ -113,12 +113,15 @@
|
||||
}
|
||||
/* card-tabs - end */
|
||||
|
||||
#rooms_extra_services .card-body{
|
||||
padding: 0px 18px;
|
||||
}
|
||||
|
||||
#rooms_extra_services .nav-tabs {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#rooms_extra_services .nav-tabs > li {
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
}
|
||||
@@ -160,7 +163,6 @@
|
||||
}
|
||||
|
||||
#rooms_extra_services .tab-content .room_demands {
|
||||
padding: 0 18px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
@@ -190,4 +192,24 @@
|
||||
|
||||
#rooms_extra_services .nav-tabs > li.active:after {
|
||||
content: unset;
|
||||
}
|
||||
}
|
||||
|
||||
#rooms_extra_services .services_not_booked {
|
||||
text-align: center;
|
||||
margin: 30px 0px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.price-info-tooltip-cont {
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
.price-info-tooltip-cont .list-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
.price-info-tooltip-cont .list-row p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@@ -750,16 +750,6 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ui-tooltip.price-tootip {
|
||||
box-shadow: 0 2px 6px 0 rgb(0 0 0 / 20%);
|
||||
background: #FFFFFF;
|
||||
border: unset;
|
||||
color: #333;
|
||||
padding: 2px 10px;
|
||||
max-height: 310px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.price-info-tooltip-cont {
|
||||
min-width: 180px;
|
||||
}
|
||||
@@ -1013,12 +1003,15 @@
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
#popup-view-extra-services .card-body{
|
||||
padding: 0px 18px;
|
||||
}
|
||||
|
||||
#popup-view-extra-services .nav-tabs {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#popup-view-extra-services .nav-tabs > li {
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
}
|
||||
@@ -1059,7 +1052,6 @@
|
||||
}
|
||||
|
||||
#popup-view-extra-services .tab-content .room_demands {
|
||||
padding: 0 18px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
@@ -1089,6 +1081,12 @@
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#popup-view-extra-services .services_not_booked {
|
||||
text-align: center;
|
||||
margin: 30px 0px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Guest Tracking page styles - start */
|
||||
.transform-account .card-text p {
|
||||
margin: 0;
|
||||
|
||||
@@ -70,4 +70,41 @@ $(document).ready(function(){
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
initPriceTooltip();
|
||||
});
|
||||
|
||||
function initPriceTooltip() {
|
||||
if ($('.order-price-info').length) {
|
||||
$('.order-price-info').each(function () {
|
||||
$(this).tooltip({
|
||||
content: $(this).closest('td').find('.price-info-container').html(),
|
||||
items: 'span',
|
||||
trigger: 'hover',
|
||||
tooltipClass: 'price-tootip',
|
||||
open: function (event, ui) {
|
||||
if (typeof (event.originalEvent) === 'undefined') {
|
||||
return false;
|
||||
}
|
||||
|
||||
var $id = $(ui.tooltip).attr('id');
|
||||
|
||||
// close any lingering tooltips
|
||||
if ($('div.ui-tooltip').not('#' + $id).length) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
close: function (event, ui) {
|
||||
ui.tooltip.hover(function () {
|
||||
$(this).stop(true).fadeTo(400, 1);
|
||||
},
|
||||
function () {
|
||||
$(this).fadeOut('400', function () {
|
||||
$(this).remove();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user