Merge branch 'develop' into gli-3047

This commit is contained in:
azhar bhat
2026-08-14 12:23:25 +05:30
59 changed files with 1526 additions and 57 deletions

View File

@@ -0,0 +1,68 @@
{**
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License version 3.0
* that is bundled with this package in the file LICENSE.md
* It is also available through the world-wide-web at this URL:
* https://opensource.org/license/osl-3-0-php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to support@qloapps.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to a 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
* @copyright Since 2010 Webkul
* @license https://opensource.org/license/osl-3-0-php Open Software License version 3.0
*}
<div class="panel">
<div class="panel-heading">
<i class="icon-list-ul"></i>
{l s='Guest Registration Card Information'}
</div>
<form id="grcCardInfoForm" method="post" action="{$guest_reg_card_form_action|escape:'html':'UTF-8'}" class="form-horizontal">
<input type="hidden" name="submitGrcCardInfo" value="1" />
<div class="form-group">
<label class="control-label col-lg-3">
<span title="" data-toggle="tooltip" class="label-tooltip" data-original-title="{l s='Select sections and fields to display on the Guest Registration Card PDF.'}">{l s='Select fields'}</span>
</label>
<div class="col-xs-7">
{$guest_reg_card_info_tree}
</div>
<div class="col-xs-2">
<a href="#" class="btn btn-default" data-toggle="modal" data-target="#guestRegPreviewModal">
<i class="icon-eye"></i> {l s='Preview'}
</a>
</div>
</div>
<div class="panel-footer">
<button type="submit" class="btn btn-default pull-right">
<i class="process-icon-save"></i> {l s='Save'}
</button>
</div>
</form>
</div>
<div class="modal fade" id="guestRegPreviewModal" tabindex="-1" role="dialog" aria-labelledby="guestRegPreviewModalLabel">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<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="guestRegPreviewModalLabel">{$guest_reg_card_preview_title|escape:'html':'UTF-8'}</h4>
</div>
<div class="modal-body text-center">
<img src="{$guest_reg_card_preview_img_url|escape:'html':'UTF-8'}" alt="{$guest_reg_card_preview_title|escape:'html':'UTF-8'}" class="img-responsive" style="max-width:100%;" />
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,32 @@
<?php
/**
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.md
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to support@qloapps.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to a 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
* @copyright Since 2010 Webkul
* @license https://opensource.org/licenses/afl-3.0.php Academic Free License 3.0
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../../../');
exit;

View File

@@ -164,6 +164,11 @@
<span class="badge badge-info">{if $data.num_checkin_documents > 0}{$data.num_checkin_documents}{else}0{/if}</span>
</a>
</li>
<li>
<a title="{l s='Guest Registration Card'}" href="{$link->getAdminLink('AdminPdf')|escape:'html':'UTF-8'}&amp;submitAction=generateGuestRegistrationFormPDF&amp;id_hotel_booking_detail={$data['id']}" target="_blank">
<i class="icon-download"></i> {l s='GRC'}
</a>
</li>
<li>
<a href="#" class="room_reallocate_swap" id="reallocate_room_{$data['id']}" data-room_type_name="{$data['room_type_name']}" data-toggle="modal" data-target="#mySwappigModal" data-id_htl_booking="{$data['id']}" data-id_order="{$data['id_order']}" data-room_num='{$data.room_num}' data-id_room_type='{$data.id_product}' data-cust_name='{$data.alloted_cust_name}' data-cust_email='{$data.alloted_cust_email}' data-avail_rm_swap='{$data.avail_rooms_to_swap|@json_encode}' data-avail_realloc_room_types='{$data.avail_room_types_to_realloc|@json_encode}' data-allotment_type='{$data.booking_type}' data-allotment_type_label='{if $data.booking_type == $ALLOTMENT_MANUAL}{l s='Manual'}{else}{l s='Auto'}{/if}' data-comment='{$data.comment}'>
<i class="icon-refresh"></i>

View File

@@ -543,14 +543,14 @@ class AddressCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'state` s
ON s.`id_country` = cl.`id_country` AND s.`id_state` = a.`id_state`
WHERE id_customer > 0 AND a.`deleted` = 0 AND
(a.`address1` LIKE \'%'.$query.'%\' OR
a.`postcode` LIKE \'%'.$query.'%\' OR
a.`city` LIKE \'%'.$query.'%\' OR
a.`phone` LIKE \'%'.$query.'%\' OR
a.`company` LIKE \'%'.$query.'%\' OR
a.`alias` LIKE \'%'.$query.'%\' OR
s.`name` LIKE \'%'.$query.'%\' OR
cl.`name` LIKE \'%'.$query.'%\'
(a.`address1` LIKE \'%'.pSQL($query).'%\' OR
a.`postcode` LIKE \'%'.pSQL($query).'%\' OR
a.`city` LIKE \'%'.pSQL($query).'%\' OR
a.`phone` LIKE \'%'.pSQL($query).'%\' OR
a.`company` LIKE \'%'.pSQL($query).'%\' OR
a.`alias` LIKE \'%'.pSQL($query).'%\' OR
s.`name` LIKE \'%'.pSQL($query).'%\' OR
cl.`name` LIKE \'%'.pSQL($query).'%\'
)
');
}

View File

@@ -146,7 +146,7 @@ class CustomerMessageCore extends ObjectModel
ON (ct.`id_customer_thread` = cm.`id_customer_thread`)
LEFT JOIN '._DB_PREFIX_.'customer c
ON (IFNULL(ct.`id_customer`, ct.`email`) = IFNULL(c.`id_customer`, c.`email`))
WHERE `message` LIKE \'%'.$query.'%\'
WHERE `message` LIKE \'%'.pSQL($query).'%\'
');
}

View File

@@ -677,8 +677,14 @@ abstract class PaymentModuleCore extends Module
$orderTotals[$order->id]['excl'] -= $used['excl'];
$cart_rules[$key]['remaining'] -= $used['excl'];
}
$order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping);
$order->addCartRule(
$cart_rule['obj']->id,
$cart_rule['obj']->name,
array('tax_incl' => $used['incl'], 'tax_excl' => $used['excl']),
0,
$cart_rule['obj']->free_shipping
);
if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) {
$cart_rule_used[] = $cart_rule['obj']->id;
@@ -691,7 +697,7 @@ abstract class PaymentModuleCore extends Module
$cart_rules_list[] = array(
'voucher_name' => $cart_rule['obj']->name,
'voucher_reduction' => ($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $this->context->currency, false)
'voucher_reduction' => ($used['incl'] != 0.00 ? '-' : '').Tools::displayPrice($used['incl'], $this->context->currency, false)
);
}

View File

@@ -1211,10 +1211,25 @@ class AdminControllerCore extends Controller
if (ob_get_level() && ob_get_length() > 0) {
ob_clean();
}
$fields_to_export = array();
if((int)Configuration::get('PS_EXPORT_FIELDS_TYPE') === HelperList::QLO_EXPORT_FIELDS_SELECTED){
$list_visibility = json_decode($this->context->cookie->{'list_visibility_'.$this->context->controller->controller_name});
foreach ($this->fields_list as $key => $field) {
if ((!isset($field['displayed']) || $field['displayed'])
&& (empty($field['optional'])
|| (!is_array($list_visibility) && !empty($field['visible_default']))
|| (is_array($list_visibility) && in_array($key, $list_visibility))
)) {
$fields_to_export[$key] = $field;
}
}
}
$this->getList($this->context->language->id, null, null, 0, false);
if (!count($this->_list)) {
return;
}
$fields_to_export = (int)Configuration::get('PS_EXPORT_FIELDS_TYPE') === HelperList::QLO_EXPORT_FIELDS_SELECTED ? $fields_to_export : $this->fields_list;
header('Content-type: text/csv');
header('Content-Type: application/force-download; charset=UTF-8');
@@ -1223,9 +1238,9 @@ class AdminControllerCore extends Controller
$fd = fopen('php://output', 'wb');
$headers = array();
foreach ($this->fields_list as $key => $datas) {
foreach ($fields_to_export as $key => $datas) {
if ('PDF' === $datas['title']) {
unset($this->fields_list[$key]);
unset($fields_to_export[$key]);
} else {
if ('ID' === $datas['title']) {
$headers[] = strtolower(Tools::htmlentitiesDecodeUTF8($datas['title']));
@@ -1239,7 +1254,7 @@ class AdminControllerCore extends Controller
foreach ($this->_list as $i => $row) {
$content = array();
$path_to_image = false;
foreach ($this->fields_list as $key => $params) {
foreach ($fields_to_export as $key => $params) {
$field_value = isset($row[$key]) ? Tools::htmlentitiesDecodeUTF8(Tools::nl2br($row[$key])) : '';
if ($key == 'image') {
if ($params['image'] != 'p' || Configuration::get('PS_LEGACY_IMAGES')) {

View File

@@ -29,6 +29,8 @@
*/
class HelperListCore extends Helper
{
const QLO_EXPORT_FIELDS_ALL = 0;
const QLO_EXPORT_FIELDS_SELECTED = 1;
/**
* @var int|null
*/

View File

@@ -0,0 +1,292 @@
<?php
/**
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License version 3.0
* that is bundled with this package in the file LICENSE.md
* It is also available through the world-wide-web at this URL:
* https://opensource.org/license/osl-3.0-php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to support@qloapps.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to a 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
* @copyright Since 2010 Webkul
* @license https://opensource.org/license/osl-3.0-php Open Software License version 3.0
*/
class HTMLTemplateGuestRegistrationFormCore extends HTMLTemplate
{
public $order;
public $available_in_your_account = false;
protected $hotelBookingDetail = null;
/**
* @param int $idHotelBookingDetail
* @param $smarty
*/
public function __construct($idHotelBookingDetail, $smarty)
{
$this->hotelBookingDetail = new HotelBookingDetail((int)$idHotelBookingDetail);
$this->order = new Order((int)$this->hotelBookingDetail->id_order);
$this->smarty = $smarty;
$this->date = Tools::displayDate($this->order->date_add);
$this->title = $this->order->getUniqReference();
$this->shop = new Shop((int)$this->order->id_shop);
}
/**
* Returns the template's HTML header
*
* @return string HTML header
*/
public function getHeader()
{
$this->assignCommonHeaderData();
$this->smarty->assign(array('header' => HTMLTemplateGuestRegistrationForm::l('Guest Registration Card')));
return $this->smarty->fetch($this->getTemplate('header'));
}
/**
* Returns the template's HTML content
*
* @return string HTML content
*/
public function getContent()
{
$idLang = (int)$this->order->id_lang;
$objHotelBookingDetail = $this->hotelBookingDetail;
$idHotel = (int)$objHotelBookingDetail->id_hotel;
$objHotelBranchInformation = null;
$hotelCountry = '';
if ($idHotel) {
$objHotelBranchInformation = new HotelBranchInformation($idHotel, $idLang);
if (Validate::isLoadedObject($objHotelBranchInformation)) {
if ($objHotelBranchInformation->id_country) {
$objCountry = new Country((int)$objHotelBranchInformation->id_country, $idLang);
if (Validate::isLoadedObject($objCountry)) {
$hotelCountry = (string)$objCountry->name;
}
}
} else {
$objHotelBranchInformation = null;
}
}
$ratePerNight = '';
$arrivalDateTime = '';
$departureDateTime = '';
if (Validate::isLoadedObject($objHotelBookingDetail)) {
$nights = (int)HotelHelper::getNumberOfDays($objHotelBookingDetail->date_from, $objHotelBookingDetail->date_to);
if ($nights > 0) {
$currency = new Currency((int)$this->order->id_currency);
$ratePerNight = Tools::displayPrice((float)$objHotelBookingDetail->total_price_tax_incl / $nights, $currency, false);
}
$arrivalDateTime = $objHotelBookingDetail->date_from ? Tools::displayDate($objHotelBookingDetail->date_from) : '';
$departureDateTime = $objHotelBookingDetail->date_to ? Tools::displayDate($objHotelBookingDetail->date_to) : '';
if ($arrivalDateTime && $objHotelBranchInformation && $objHotelBranchInformation->check_in && $objHotelBranchInformation->check_in != '00:00:00') {
$arrivalDateTime .= ' '.date('h:i a', strtotime($objHotelBranchInformation->check_in));
}
if ($departureDateTime && $objHotelBranchInformation && $objHotelBranchInformation->check_out && $objHotelBranchInformation->check_out != '00:00:00') {
$departureDateTime .= ' '.date('h:i a', strtotime($objHotelBranchInformation->check_out));
}
}
$additionalGuestsRows = 0;
if (Validate::isLoadedObject($objHotelBookingDetail)) {
$totalGuests = (int)$objHotelBookingDetail->adults + (int)$objHotelBookingDetail->children;
$additionalGuestsRows = ($totalGuests > 1) ? ($totalGuests - 1) : 0;
}
// Build saved config: [sectionId => [fieldId => true, ...]]
$grcFields = array();
$grcInfoJson = Configuration::get('QLO_GUEST_REGISTRATION_CARD_INFO');
if ($grcInfoJson !== false && $grcInfoJson !== '') {
$grcData = Tools::jsonDecode($grcInfoJson, true);
if (is_array($grcData)) {
foreach ($grcData as $sectionId => $fieldIds) {
$fieldIds = array_map('intval', (array)$fieldIds);
if (!empty($fieldIds)) {
$grcFields[(int)$sectionId] = array_flip($fieldIds);
}
}
}
}
// When nothing saved, show all sections and fields
$allVisible = empty($grcFields);
// One pass: build false|string label for every field directly.
// false = hidden, non-empty string = visible (used for both visibility check and label text in template).
$grcInfo = $this->hotelBookingDetail->getRegistrationCardInfo();
$fieldLabels = array();
foreach ($grcInfo as $sectionId => $section) {
$isSectionEnabled = $allVisible || isset($grcFields[$sectionId]);
$fieldLabels[$sectionId] = array();
foreach ($section['fields'] as $fieldId => $fieldLabel) {
$isVisible = $isSectionEnabled && ($allVisible || isset($grcFields[$sectionId][$fieldId]));
$fieldLabels[$sectionId][$fieldId] = $isVisible ? $fieldLabel : false;
}
}
$section1 = HotelBookingDetail::GRC_SECTION_GUEST_INFO;
$section2 = HotelBookingDetail::GRC_SECTION_TRAVEL_INFO;
$section3 = HotelBookingDetail::GRC_SECTION_BOOKING_INFO;
$section4 = HotelBookingDetail::GRC_SECTION_IDENTIFICATION;
$section5 = HotelBookingDetail::GRC_SECTION_ADDITIONAL_GUESTS;
$section6 = HotelBookingDetail::GRC_SECTION_BILLING_CORPORATE;
$section7 = HotelBookingDetail::GRC_SECTION_PAYMENT_DEPOSIT;
$section8 = HotelBookingDetail::GRC_SECTION_GUEST_SIGNATURE;
$section9 = HotelBookingDetail::GRC_SECTION_PROPERTY_REGS;
$section10 = HotelBookingDetail::GRC_SECTION_OFFICE_USE_ONLY;
// $labels: false = field hidden, label string = field visible.
// Template uses {if $labels.key} for visibility AND {$labels.key} for label — no separate boolean assigns.
$labels = array(
// Section 1: Guest Information
'title' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_TITLE],
'full_name' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_FULL_NAME],
'phone' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_PHONE],
'email' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_EMAIL],
'dob' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_DOB],
'nationality' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_NATIONALITY],
'city_country' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_CITY_COUNTRY],
'postal_code' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_POSTAL_CODE],
'address' => $fieldLabels[$section1][HotelBookingDetail::GRC_GUEST_ADDRESS],
// Section 2: Travel Information
'arrived_from' => $fieldLabels[$section2][HotelBookingDetail::GRC_TRAVEL_ARRIVED_FROM],
'next_dest' => $fieldLabels[$section2][HotelBookingDetail::GRC_TRAVEL_NEXT_DESTINATION],
'flight' => $fieldLabels[$section2][HotelBookingDetail::GRC_TRAVEL_FLIGHT_TRAIN],
'vehicle' => $fieldLabels[$section2][HotelBookingDetail::GRC_TRAVEL_VEHICLE_REG],
'purpose' => $fieldLabels[$section2][HotelBookingDetail::GRC_TRAVEL_PURPOSE_OF_VISIT],
// Section 3: Booking Information
'booking_ref' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_REFERENCE],
'booking_rate' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_RATE_PER_NIGHT],
'booking_arrival' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_ARRIVAL],
'booking_departure' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_DEPARTURE],
'booking_room_type' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_ROOM_TYPE],
'booking_room_number' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_ROOM_NUMBER],
'num_guests' => $fieldLabels[$section3][HotelBookingDetail::GRC_BOOKING_NUM_GUESTS],
// Section 4: Identification Document
'id_proof' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_IDENTITY_PROOF],
'id_number' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_NUMBER],
'passport' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_PASSPORT_NO],
'place_of_issue' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_PLACE_OF_ISSUE],
'date_of_issue' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_DATE_OF_ISSUE],
'date_of_expiry' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_DATE_OF_EXPIRY],
'visa' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_VISA_NUMBER],
'valid_until' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_VALID_UNTIL],
'arrival_in_country' => $fieldLabels[$section4][HotelBookingDetail::GRC_ID_ARRIVAL_DATE_IN_COUNTRY],
// Section 5: Additional Guests
'addguest_name' => $fieldLabels[$section5][HotelBookingDetail::GRC_ADD_GUEST_NAME],
'addguest_id_type' => $fieldLabels[$section5][HotelBookingDetail::GRC_ADD_GUEST_ID_TYPE],
'addguest_id_number' => $fieldLabels[$section5][HotelBookingDetail::GRC_ADD_GUEST_ID_NUMBER],
'addguest_nationality' => $fieldLabels[$section5][HotelBookingDetail::GRC_ADD_GUEST_NATIONALITY],
// Section 6: Billing & Corporate
'company' => $fieldLabels[$section6][HotelBookingDetail::GRC_BILLING_COMPANY],
'tax_id' => $fieldLabels[$section6][HotelBookingDetail::GRC_BILLING_TAX_ID],
// Section 7: Payment & Deposit
'payment_method' => $fieldLabels[$section7][HotelBookingDetail::GRC_PAYMENT_METHOD],
'card_number' => $fieldLabels[$section7][HotelBookingDetail::GRC_PAYMENT_CARD_NUMBER],
'security_deposit' => $fieldLabels[$section7][HotelBookingDetail::GRC_PAYMENT_SECURITY_DEPOSIT],
// Section 8: Guest Signature
'signature' => $fieldLabels[$section8][HotelBookingDetail::GRC_SIG_SIGNATURE],
'sig_date' => $fieldLabels[$section8][HotelBookingDetail::GRC_SIG_DATE],
// Section 9: Property Regulations (checkin/checkout share one visibility flag; two separate PDF sub-labels)
'checkin_time' => $fieldLabels[$section9][HotelBookingDetail::GRC_PROP_CHECKIN_CHECKOUT_TIME] ? 'Check-in Time' : false,
'checkout_time' => $fieldLabels[$section9][HotelBookingDetail::GRC_PROP_CHECKIN_CHECKOUT_TIME] ? 'Check-out Time' : false,
'hotel_policies' => $fieldLabels[$section9][HotelBookingDetail::GRC_PROP_HOTEL_POLICIES],
// Section 10: For Office Use Only
'staff_name' => $fieldLabels[$section10][HotelBookingDetail::GRC_OFFICE_STAFF_NAME],
'office_checkin_time' => $fieldLabels[$section10][HotelBookingDetail::GRC_OFFICE_CHECKIN_TIME],
'id_verified' => $fieldLabels[$section10][HotelBookingDetail::GRC_OFFICE_ID_VERIFIED],
'reg_no' => $fieldLabels[$section10][HotelBookingDetail::GRC_OFFICE_REG_NO],
);
$showLocalIdGroup = (bool)$labels['id_proof'] || (bool)$labels['id_number'];
$showIntIdGroup = (bool)$labels['passport'] || (bool)$labels['place_of_issue'] || (bool)$labels['date_of_issue']
|| (bool)$labels['date_of_expiry'] || (bool)$labels['visa'] || (bool)$labels['valid_until']
|| (bool)$labels['arrival_in_country'];
$this->smarty->assign(array(
'style_tab' => $this->smarty->fetch($this->getTemplate('invoice.style-tab')),
'hotel' => $objHotelBranchInformation,
'hotel_country' => $hotelCountry,
'booking_reference' => $this->order->getUniqReference(),
'arrival_date_time' => $arrivalDateTime,
'departure_date_time' => $departureDateTime,
'room_type' => Validate::isLoadedObject($objHotelBookingDetail) ? $objHotelBookingDetail->room_type_name : '',
'room_number' => Validate::isLoadedObject($objHotelBookingDetail) ? $objHotelBookingDetail->room_num : '',
'adults' => Validate::isLoadedObject($objHotelBookingDetail) ? (int)$objHotelBookingDetail->adults : 0,
'children' => Validate::isLoadedObject($objHotelBookingDetail) ? (int)$objHotelBookingDetail->children : 0,
'rate_per_night' => $ratePerNight,
'additional_guests_rows' => $additionalGuestsRows,
// Section visibility
'show_section_guest_info' => !empty(array_filter($fieldLabels[$section1])),
'show_section_travel_info' => !empty(array_filter($fieldLabels[$section2])),
'show_section_booking_info' => !empty(array_filter($fieldLabels[$section3])),
'show_section_identification' => !empty(array_filter($fieldLabels[$section4])),
'show_section_additional_guests' => !empty(array_filter($fieldLabels[$section5])),
'show_section_billing_corporate' => !empty(array_filter($fieldLabels[$section6])),
'show_section_payment_deposit' => !empty(array_filter($fieldLabels[$section7])),
'show_section_guest_signature' => !empty(array_filter($fieldLabels[$section8])),
'show_section_property_regs' => !empty(array_filter($fieldLabels[$section9])),
'show_section_office_use' => !empty(array_filter($fieldLabels[$section10])),
'section_additional_guests' => $grcInfo[$section5]['name'],
'section_property_regs' => $grcInfo[$section9]['name'],
'local_id' => $showLocalIdGroup,
'int_id' => $showIntIdGroup,
'labels' => $labels,
));
return $this->smarty->fetch($this->getTemplate('guest-registration-form'));
}
/**
* Returns the template filename when using bulk rendering
*
* @return string filename
*/
public function getBulkFilename()
{
return 'guest-registration-forms.pdf';
}
/**
* Returns the template filename
*
* @return string filename
*/
public function getFilename()
{
$filename = 'guest-registration-form-'.$this->order->reference;
if ($this->hotelBookingDetail->id) {
$filename .= '-room-'.$this->hotelBookingDetail->id;
}
return $filename.'.pdf';
}
}

View File

@@ -37,6 +37,7 @@ class PDFCore
protected $smarty;
const TEMPLATE_INVOICE = 'Invoice';
const TEMPLATE_GUEST_REGISTRATION_FORM = 'GuestRegistrationForm';
const TEMPLATE_ORDER_RETURN = 'OrderReturn';
const TEMPLATE_ORDER_SLIP = 'OrderSlip';
const TEMPLATE_DELIVERY_SLIP = 'DeliverySlip';

View File

@@ -384,13 +384,13 @@ class AdminAddressesControllerCore extends AdminController
public function processExport($text_delimiter = '"')
{
$this->fields_list = array_merge($this->fields_list, array(
'email' => array('title' => $this->l('Customer Email')),
'phone' => array('title' => $this->l('Phone'), 'filter_key' => 'a!phone'),
'phone_mobile' => array('title' => $this->l('Mobile phone')),
'address1' => array('title' => $this->l('Address (2)')),
'dni' => array('title' => $this->l('Identification Number')),
'vat_number' => array('title' => $this->l('VAT number')),
'other' => array('title' => $this->l('Other')),
'email' => array('title' => $this->l('Customer Email'), 'displayed' => false),
'phone' => array('title' => $this->l('Phone'), 'filter_key' => 'a!phone', 'displayed' => false),
'phone_mobile' => array('title' => $this->l('Mobile phone'), 'displayed' => false),
'address2' => array('title' => $this->l('Address (2)'), 'displayed' => false),
'dni' => array('title' => $this->l('Identification Number'), 'displayed' => false),
'vat_number' => array('title' => $this->l('VAT number'), 'displayed' => false),
'other' => array('title' => $this->l('Other'), 'displayed' => false),
));
return parent::processExport($text_delimiter);

View File

@@ -0,0 +1,123 @@
<?php
/**
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License version 3.0
* that is bundled with this package in the file LICENSE.md
* It is also available through the world-wide-web at this URL:
* https://opensource.org/license/osl-3.0-php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to support@qloapps.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to a 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
* @copyright Since 2010 Webkul
* @license https://opensource.org/license/osl-3.0-php Open Software License version 3.0
*/
class AdminGuestRegistrationControllerCore extends AdminController
{
public function __construct()
{
$this->bootstrap = true;
$this->table = 'configuration';
$this->className = 'Configuration';
$this->identifier = 'id_configuration';
parent::__construct();
}
public function initContent()
{
$this->display = 'view';
$this->initToolbar();
parent::initContent();
}
public function renderView()
{
$grcInfoJson = Configuration::get('QLO_GUEST_REGISTRATION_CARD_INFO');
$savedSections = array();
if ($grcInfoJson !== false && $grcInfoJson !== '') {
$grcData = Tools::jsonDecode($grcInfoJson, true);
if (is_array($grcData)) {
$savedSections = $grcData;
}
}
$allSelected = empty($savedSections);
$nodes = array();
$objHotelBookingDetail = new HotelBookingDetail();
foreach ($objHotelBookingDetail->getRegistrationCardInfo() as $sectionId => $section) {
$sectionFields = isset($savedSections[$sectionId]) ? $savedSections[$sectionId] : array();
$fieldNodes = array();
foreach ($section['fields'] as $fieldId => $fieldName) {
$fieldSelected = $allSelected || in_array($fieldId, $sectionFields);
$fieldNodes[] = array(
'value' => $fieldId,
'name' => $fieldName,
'input_name' => 'grc_field_'.$sectionId,
'selected' => $fieldSelected,
);
}
$fieldsSelected = $allSelected || !empty(array_filter($fieldNodes, function ($n) { return $n['selected']; }));
$nodes[] = array(
'value' => $sectionId,
'name' => $section['name'],
'input_name' => 'grc_section',
'selected' => $fieldsSelected,
'children' => $fieldNodes,
);
}
$tree = new HelperTree('grc-card-info-tree');
$tree->setData($nodes)
->setUseCheckBox(true)
->setAutoSelectChildren(true)
->setUseBulkActions(true);
$this->context->smarty->assign(array(
'guest_reg_card_info_tree' => $tree->render(),
'guest_reg_card_form_action' => self::$currentIndex.'&token='.$this->token,
'guest_reg_card_preview_img_url' => $this->context->link->getBaseLink().'img/admin/guest_registration_preview.jpg',
'guest_reg_card_preview_title' => $this->l('Guest Registration Card Preview'),
));
return parent::renderView();
}
public function initToolbarTitle()
{
$this->toolbar_title = array($this->l('Guest Registration Card'));
}
public function postProcess()
{
if (Tools::isSubmit('submitGrcCardInfo')) {
$grcInfo = array();
$objHotelBookingDetail = new HotelBookingDetail();
foreach (array_keys($objHotelBookingDetail->getRegistrationCardInfo()) as $sectionId) {
$fields = array_values(array_filter(array_map('intval', (array)Tools::getValue('grc_field_'.$sectionId, array()))));
if (!empty($fields)) {
$grcInfo[$sectionId] = $fields;
}
}
if (empty($grcInfo)) {
$this->errors[] = $this->l('Please select at least one field for the Guest Registration Card.');
return;
}
Configuration::updateValue('QLO_GUEST_REGISTRATION_CARD_INFO', Tools::jsonEncode($grcInfo));
Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token.'&conf=4');
return;
}
parent::postProcess();
}
}

View File

@@ -64,6 +64,15 @@ class AdminPdfControllerCore extends AdminController
}
}
public function processGenerateGuestRegistrationFormPDF()
{
if (Tools::isSubmit('id_hotel_booking_detail')) {
$this->generateGuestRegistrationFormPDF((int)Tools::getValue('id_hotel_booking_detail'));
} else {
die(Tools::displayError('The hotel booking detail ID is missing.'));
}
}
public function processGenerateBookingVoucherPDF()
{
if (Tools::isSubmit('id_order')) {
@@ -234,6 +243,17 @@ class AdminPdfControllerCore extends AdminController
$this->generatePDF($order_invoice, PDF::TEMPLATE_INVOICE);
}
public function generateGuestRegistrationFormPDF($idHotelBookingDetail)
{
$idHotelBookingDetail = (int)$idHotelBookingDetail;
if (!$idHotelBookingDetail || !Validate::isLoadedObject(new HotelBookingDetail($idHotelBookingDetail))) {
die(Tools::displayError('The hotel booking cannot be found within your database.'));
}
$pdf = new PDF($idHotelBookingDetail, PDF::TEMPLATE_GUEST_REGISTRATION_FORM, Context::getContext()->smarty);
$pdf->render('I');
}
public function generateBookingVoucherPDFByIdOrder($id_order)
{
$order = new Order((int)$id_order);

View File

@@ -195,6 +195,19 @@ class AdminPreferencesControllerCore extends AdminController
'class' => 'fixed-width-xl',
'desc' => sprintf($this->l('If set to 0, the maximum limit will be %d characters.'), Configuration::PS_SHORT_DESC_LIMIT)
),
'PS_EXPORT_FIELDS_TYPE' => array(
'title' => $this->l('CSV export fields'),
'desc' => $this->l('Choose whether list CSV exports include all fields, or only the fields currently checked in the "Available Fields" selector of the list being exported.'),
'validation' => 'isInt',
'cast' => 'intval',
'type' => 'select',
'list' => array(
array('id' => HelperList::QLO_EXPORT_FIELDS_ALL, 'name' => $this->l('All Fields')),
array('id' => HelperList::QLO_EXPORT_FIELDS_SELECTED, 'name' => $this->l('Selected Fields')),
),
'identifier' => 'id',
'defaultValue' => HelperList::QLO_EXPORT_FIELDS_ALL,
),
// 'PS_DISPLAY_SUPPLIERS' => array(
// 'title' => $this->l('Display suppliers and manufacturers'),
// 'desc' => $this->l('Enable suppliers and manufacturers pages on your front office even when their respective modules are disabled.'),

View File

@@ -92,37 +92,45 @@ class CategoryControllerCore extends FrontController
public function init()
{
// Get category ID
$id_category = (int)Tools::getValue('id_category');
if (!$id_category || !Validate::isUnsignedId($id_category)) {
$this->errors[] = Tools::displayError('Missing category ID');
}
$idCategory = (int) Tools::getValue('id_category');
$this->category = new Category($idCategory, $this->context->language->id);
// validate dates if available
$dateFrom = Tools::getValue('date_from');
$dateTo = Tools::getValue('date_to');
$idHotel = HotelBranchInformation::getHotelIdByIdCategory($id_category);
if (!HotelHelper::validateDateRangeForHotel($dateFrom, $dateTo, $idHotel)) {
$idHotel = HotelBranchInformation::getHotelIdByIdCategory($idCategory);
if (!$idCategory || !Validate::isUnsignedId($idCategory)) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
}
// Instantiate category
$this->category = new Category($id_category, $this->context->language->id);
parent::init();
// Check if the category is active and return 404 error if is disable.
if (!$this->category->active || !Validate::isLoadedObject($this->category) || !$this->category->inShop() || !$this->category->isAssociatedToShop() || in_array($this->category->id, array(Configuration::get('PS_HOME_CATEGORY'), Configuration::get('PS_ROOT_CATEGORY')))) {
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
} elseif (!Validate::isLoadedObject($this->category) || !$this->category->active) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
} else
// Check if category can be accessible by current customer and return 403 if not
if (!$this->category->checkAccess($this->context->customer->id)) {
} elseif ($idHotel && !(new HotelBranchInformation())->hotelBranchInfoByCategoryId($idCategory)) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
} elseif ($idHotel && !HotelHelper::validateDateRangeForHotel($dateFrom, $dateTo, $idHotel)) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
} else {
parent::init();
if (
!$this->category->inShop()
|| !$this->category->isAssociatedToShop()
|| in_array(
$this->category->id,
array(
Configuration::get('PS_HOME_CATEGORY'),
Configuration::get('PS_ROOT_CATEGORY')
)
)
) {
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
} elseif (!$this->category->checkAccess($this->context->customer->id)) {
header('HTTP/1.1 403 Forbidden');
header('Status: 403 Forbidden');
$this->errors[] = Tools::displayError('You do not have access to this category.');
$this->customer_access = false;
}
}
}
/**
@@ -130,14 +138,15 @@ class CategoryControllerCore extends FrontController
*/
public function initContent()
{
if (!$this->customer_access) {
$this->display_column_left = false;
$this->display_column_right = false;
}
parent::initContent();
$this->setTemplate(_PS_THEME_DIR_.'category.tpl');
if (!$this->customer_access) {
return;
}
$id_category = Tools::getValue('id_category');
$displayAllRoomsTypes = false;

View File

@@ -126,6 +126,12 @@ class ProductControllerCore extends FrontController
$objHotelRoomType = new HotelRoomType();
if ($hotelRoomInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($this->product->id)) {
$idHotel = (int) $hotelRoomInfo['id_hotel'];
// If the hotel this room type belongs to is disabled, redirect to home page
if (!(new HotelBranchInformation())->hotelBranchesInfo(false, 1, 0, $idHotel)) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
}
if (!HotelHelper::validateDateRangeForHotel($dateFrom, $dateTo, $idHotel)) {
Tools::redirect($this->context->link->getPageLink('pagenotfound'));
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

View File

@@ -120,6 +120,9 @@
<tab id="Order_Messages" id_parent="Orders" active="1" hide_host_mode="0">
<class_name>AdminOrderMessage</class_name>
</tab>
<tab id="Guest_Registration" id_parent="Orders" active="1" hide_host_mode="0">
<class_name>AdminGuestRegistration</class_name>
</tab>
<tab id="Customers_1" id_parent="Customers" active="1" hide_host_mode="0">
<class_name>AdminCustomers</class_name>
</tab>

View File

@@ -15,7 +15,7 @@
<theme_meta id="theme_meta_6" id_theme="1" id_meta="6" left_column="1" right_column="0"/>
<theme_meta id="theme_meta_7" id_theme="1" id_meta="7" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_8" id_theme="1" id_meta="8" left_column="1" right_column="0"/>
<theme_meta id="theme_meta_9" id_theme="1" id_meta="9" left_column="1" right_column="0"/>
<theme_meta id="theme_meta_9" id_theme="1" id_meta="9" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_10" id_theme="1" id_meta="10" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_11" id_theme="1" id_meta="11" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_12" id_theme="1" id_meta="12" left_column="0" right_column="0"/>
@@ -29,9 +29,9 @@
<theme_meta id="theme_meta_20" id_theme="1" id_meta="20" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_21" id_theme="1" id_meta="21" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_22" id_theme="1" id_meta="22" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_23" id_theme="1" id_meta="23" left_column="1" right_column="0"/>
<theme_meta id="theme_meta_23" id_theme="1" id_meta="23" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_24" id_theme="1" id_meta="24" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_25" id_theme="1" id_meta="25" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_25" id_theme="1" id_meta="25" left_column="1" right_column="0"/>
<theme_meta id="theme_meta_26" id_theme="1" id_meta="26" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_27" id_theme="1" id_meta="27" left_column="0" right_column="0"/>
<theme_meta id="theme_meta_28" id_theme="1" id_meta="28" left_column="0" right_column="0"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Кредитни известия"/>
<tab id="Statuses" name="Статуси"/>
<tab id="Order_Messages" name="Съобщения при поръчка"/>
<tab id="Guest_Registration" name="Карта за регистрация на гост"/>
<tab id="Customers_1" name="Клиенти"/>
<tab id="Addresses" name="Адреси"/>
<tab id="Groups" name="Групи"/>

View File

@@ -39,6 +39,7 @@
<tab id='Credit_Slips' name='বকেয়া বিল'/>
<tab id='Statuses' name='অবস্থা'/>
<tab id='Order_Messages' name='অর্ডার এর মাসাআজ'/>
<tab id='Guest_Registration' name='অতিথি নিবন্ধন কার্ড'/>
<tab id='Customers_1' name='গ্রাহকরা'/>
<tab id='Addresses' name='ঠিকানা'/>
<tab id='Groups' name='দল'/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Monitoramento"/>
<tab id="Multistore" name="Multiloja"/>
<tab id="Order_Messages" name="Mensagens de compras"/>
<tab id="Guest_Registration" name="Cartão de Registro de Hóspede"/>
<tab id="Orders_2" name="Compras"/>
<tab id="Orders" name="Compras"/>
<tab id="Orders_1" name="Compras"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Dobropisy"/>
<tab id="Statuses" name="Stavy objednávek"/>
<tab id="Order_Messages" name="Zprávy k objednávkám"/>
<tab id="Guest_Registration" name="Registrační karta hosta"/>
<tab id="Customers_1" name="Zákazníci"/>
<tab id="Addresses" name="Adresy"/>
<tab id="Groups" name="Skupiny zákazníků"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Kontrollübersicht"/>
<tab id="Multistore" name="Multishop"/>
<tab id="Order_Messages" name="Bestellnachrichten"/>
<tab id="Guest_Registration" name="Gästeregistrierungskarte"/>
<tab id="Orders_2" name="Bestellungen"/>
<tab id="Orders" name="Bestellungen"/>
<tab id="Orders_1" name="Bestellungen"/>

View File

@@ -38,6 +38,7 @@
<tab id="Credit_Slips" name="Credit Slips"/>
<tab id="Statuses" name="Statuses"/>
<tab id="Order_Messages" name="Order Messages"/>
<tab id="Guest_Registration" name="Guest Registration Card"/>
<tab id="Customers_1" name="Customers"/>
<tab id="Addresses" name="Addresses"/>
<tab id="Groups" name="Groups"/>

View File

@@ -36,6 +36,7 @@
<tab id="Credit_Slips" name="Factura de abonos"/>
<tab id="Statuses" name="Estados"/>
<tab id="Order_Messages" name="Mensajes predefinidos"/>
<tab id="Guest_Registration" name="Tarjeta de Registro de Huésped"/>
<tab id="Customers_1" name="Clientes"/>
<tab id="Addresses" name="Direcciones"/>
<tab id="Groups" name="Grupos"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="رسیدهای اعتبار"/>
<tab id="Statuses" name="وضعیت‌ها"/>
<tab id="Order_Messages" name="پیام‌های سفارش"/>
<tab id="Guest_Registration" name="کارت ثبت نام مهمان"/>
<tab id="Customers_1" name="مشتریان"/>
<tab id="Addresses" name="آدرس‌ها"/>
<tab id="Groups" name="گروه‌ها"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Suivi"/>
<tab id="Multistore" name="Multiboutique"/>
<tab id="Order_Messages" name="Messages prédéfinis"/>
<tab id="Guest_Registration" name="Carte d'enregistrement des hôtes"/>
<tab id="Orders_2" name="Commandes"/>
<tab id="Orders" name="Commandes"/>
<tab id="Orders_1" name="Commandes"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="שוברי זיכוי"/>
<tab id="Statuses" name="סטטוסי הזמנה ומלאי"/>
<tab id="Order_Messages" name="תבניות עבור הודעות הזמנה"/>
<tab id="Guest_Registration" name="כרטיס רישום אורח"/>
<tab id="Customers_1" name="לקוחות"/>
<tab id="Addresses" name="כתובות"/>
<tab id="Groups" name="קבוצות"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Kreditne note"/>
<tab id="Statuses" name="Statusi"/>
<tab id="Order_Messages" name="Poruke narudžbe"/>
<tab id="Guest_Registration" name="Kartica registracije gosta"/>
<tab id="Customers_1" name="Kupci"/>
<tab id="Addresses" name="Adrese"/>
<tab id="Groups" name="Grupe"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Credit Slips"/>
<tab id="Statuses" name="Statuses"/>
<tab id="Order_Messages" name="Order Messages"/>
<tab id="Guest_Registration" name="Vendég regisztráció"/>
<tab id="Customers_1" name="Vásárlók"/>
<tab id="Addresses" name="Címek"/>
<tab id="Groups" name="Csoportok"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Nota kredit"/>
<tab id="Statuses" name="Status"/>
<tab id="Order_Messages" name="Pesan"/>
<tab id="Guest_Registration" name="Kartu Registrasi Tamu"/>
<tab id="Customers_1" name="Pelanggan"/>
<tab id="Addresses" name="Alamat"/>
<tab id="Groups" name="Grup"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Monitoraggio"/>
<tab id="Multistore" name="Multi-negozio"/>
<tab id="Order_Messages" name="Messaggi predefiniti"/>
<tab id="Guest_Registration" name="Scheda di registrazione ospite"/>
<tab id="Orders_2" name="Ordini"/>
<tab id="Orders" name="Ordini"/>
<tab id="Orders_1" name="Ordini"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Grąžinimo kuponai"/>
<tab id="Statuses" name="Būsenos"/>
<tab id="Order_Messages" name="Užsakymo pranešimai"/>
<tab id="Guest_Registration" name="Svečio registracijos kortelė"/>
<tab id="Customers_1" name="Klientai"/>
<tab id="Addresses" name="Adresai"/>
<tab id="Groups" name="Grupės"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Кредитни исечоци"/>
<tab id="Statuses" name="Состојби"/>
<tab id="Order_Messages" name="Пораки за нарачки"/>
<tab id="Guest_Registration" name="Картичка за регистрација на гостин"/>
<tab id="Customers_1" name="Клиенти"/>
<tab id="Addresses" name="Адреси"/>
<tab id="Groups" name="Групи"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Creditnota's"/>
<tab id="Statuses" name="Statussen"/>
<tab id="Order_Messages" name="Bestellingsberichten"/>
<tab id="Guest_Registration" name="Gasten registratiekaart"/>
<tab id="Customers_1" name="Klanten"/>
<tab id="Addresses" name="Adressen"/>
<tab id="Groups" name="Groepen"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Credit Slips"/>
<tab id="Statuses" name="Statuses"/>
<tab id="Order_Messages" name="Order Messages"/>
<tab id="Guest_Registration" name="Guest Registration Card"/>
<tab id="Customers_1" name="Customers"/>
<tab id="Addresses" name="Addresses"/>
<tab id="Groups" name="Groups"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Monitorowanie"/>
<tab id="Multistore" name="Zestawienie sklepów ?"/>
<tab id="Order_Messages" name="Treść powiadomienia zamówień"/>
<tab id="Guest_Registration" name="Karta rejestracji gościa"/>
<tab id="Orders_2" name="Zamówienia"/>
<tab id="Orders" name="Zamówienia"/>
<tab id="Orders_1" name="Zamówienia"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Monitoramento"/>
<tab id="Multistore" name="Multi loja"/>
<tab id="Order_Messages" name="Mensagens de encomendas"/>
<tab id="Guest_Registration" name="Cartão de Registo de Hóspede"/>
<tab id="Orders_2" name="Encomendas"/>
<tab id="Orders" name="Encomendas"/>
<tab id="Orders_1" name="Encomendas"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Suivi"/>
<tab id="Multistore" name="Multiboutique"/>
<tab id="Order_Messages" name="Messages prédéfinis"/>
<tab id="Guest_Registration" name="Carte d'enregistrement des hôtes"/>
<tab id="Orders_2" name="Commandes"/>
<tab id="Orders" name="Commandes"/>
<tab id="Orders_1" name="Commandes"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Note de credit"/>
<tab id="Statuses" name="Stadii"/>
<tab id="Order_Messages" name="Mesaje la comenzi"/>
<tab id="Guest_Registration" name="Card de înregistrare a oaspeților"/>
<tab id="Customers_1" name="Clienți"/>
<tab id="Addresses" name="Adrese"/>
<tab id="Groups" name="Grupuri"/>

View File

@@ -56,6 +56,7 @@
<tab id="Monitoring" name="Мониторинг"/>
<tab id="Multistore" name="Мульти-магазин"/>
<tab id="Order_Messages" name="Сообщения"/>
<tab id="Guest_Registration" name="Карта регистрации гостя"/>
<tab id="Orders_2" name="Заказы"/>
<tab id="Orders" name="Заказы"/>
<tab id="Orders_1" name="Заказы"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Dobropisi"/>
<tab id="Statuses" name="Statusi"/>
<tab id="Order_Messages" name="Sporočila ob naročilu"/>
<tab id="Guest_Registration" name="Kartica za registracijo gosta"/>
<tab id="Customers_1" name="Kupci"/>
<tab id="Addresses" name="Naslovi"/>
<tab id="Groups" name="Skupine"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Komadi kredita"/>
<tab id="Statuses" name="Statusi"/>
<tab id="Order_Messages" name="Poruke porudžbina"/>
<tab id="Guest_Registration" name="Kartica za registraciju gosta"/>
<tab id="Customers_1" name="Kupci"/>
<tab id="Addresses" name="Adrese"/>
<tab id="Groups" name="Grupe"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Kreditnota"/>
<tab id="Statuses" name="Statusar"/>
<tab id="Order_Messages" name="Ordermeddelanden"/>
<tab id="Guest_Registration" name="Gästregistreringskort"/>
<tab id="Customers_1" name="Kunder"/>
<tab id="Addresses" name="Adresser"/>
<tab id="Groups" name="Grupper"/>

View File

@@ -39,6 +39,7 @@
<tab id="Credit_Slips" name="折讓單"/>
<tab id="Statuses" name="狀態"/>
<tab id="Order_Messages" name="訂單訊息"/>
<tab id="Guest_Registration" name="住客登記表"/>
<tab id="Customers_1" name="客戶"/>
<tab id="Addresses" name="地址"/>
<tab id="Groups" name="群組"/>

View File

@@ -54,6 +54,7 @@
<tab id="Monitoring" name="Gi&#xE1;m s&#xE1;t"/>
<tab id="Multistore" name="Multistore"/>
<tab id="Order_Messages" name="Tin nh&#x1EAF;n &#x111;&#x1A1;n h&#xE0;ng"/>
<tab id="Guest_Registration" name="Thẻ đăng ký khách"/>
<tab id="Orders" name="&#x111;&#x1EB7;t h&#xE0;ng"/>
<tab id="Orders_1" name="&#x110;&#x1A1;n h&#xE0;ng"/>
<tab id="Orders_2" name="&#x110;&#x1A1;n h&#xE0;ng"/>

View File

@@ -37,6 +37,7 @@
<tab id="Credit_Slips" name="Credit Slips"/>
<tab id="Statuses" name="Statuses"/>
<tab id="Order_Messages" name="Order Messages"/>
<tab id="Guest_Registration" name="住客登记卡"/>
<tab id="Customers_1" name="Customers"/>
<tab id="Addresses" name="Addresses"/>
<tab id="Groups" name="Groups"/>

View File

@@ -25,7 +25,9 @@
var current_product = null;
var ajaxQueries = new Array();
if (typeof jQuery !== 'undefined' && jQuery.effects && !jQuery.effects.effect) {
jQuery.effects.effect = {};
}
$(document).ready(function() {
// Init all events
init();

View File

@@ -23,6 +23,85 @@
class HotelBookingDetail extends ObjectModel
{
// Guest Registration Card — Section IDs
const GRC_SECTION_GUEST_INFO = 1;
const GRC_SECTION_TRAVEL_INFO = 2;
const GRC_SECTION_BOOKING_INFO = 3;
const GRC_SECTION_IDENTIFICATION = 4;
const GRC_SECTION_ADDITIONAL_GUESTS = 5;
const GRC_SECTION_BILLING_CORPORATE = 6;
const GRC_SECTION_PAYMENT_DEPOSIT = 7;
const GRC_SECTION_GUEST_SIGNATURE = 8;
const GRC_SECTION_PROPERTY_REGS = 9;
const GRC_SECTION_OFFICE_USE_ONLY = 10;
// Guest Registration Card — Guest Information fields (section 1)
const GRC_GUEST_TITLE = 1;
const GRC_GUEST_FULL_NAME = 2;
const GRC_GUEST_PHONE = 3;
const GRC_GUEST_EMAIL = 4;
const GRC_GUEST_DOB = 5;
const GRC_GUEST_NATIONALITY = 6;
const GRC_GUEST_CITY_COUNTRY = 7;
const GRC_GUEST_POSTAL_CODE = 8;
const GRC_GUEST_ADDRESS = 9;
// Guest Registration Card — Travel Information fields (section 2)
const GRC_TRAVEL_ARRIVED_FROM = 1;
const GRC_TRAVEL_NEXT_DESTINATION = 2;
const GRC_TRAVEL_FLIGHT_TRAIN = 3;
const GRC_TRAVEL_VEHICLE_REG = 4;
const GRC_TRAVEL_PURPOSE_OF_VISIT = 5;
// Guest Registration Card — Booking Information fields (section 3)
const GRC_BOOKING_REFERENCE = 1;
const GRC_BOOKING_RATE_PER_NIGHT = 2;
const GRC_BOOKING_ARRIVAL = 3;
const GRC_BOOKING_DEPARTURE = 4;
const GRC_BOOKING_ROOM_TYPE = 5;
const GRC_BOOKING_ROOM_NUMBER = 6;
const GRC_BOOKING_NUM_GUESTS = 7;
// Guest Registration Card — Identification Document fields (section 4)
const GRC_ID_IDENTITY_PROOF = 1;
const GRC_ID_NUMBER = 2;
const GRC_ID_PASSPORT_NO = 3;
const GRC_ID_PLACE_OF_ISSUE = 4;
const GRC_ID_DATE_OF_ISSUE = 5;
const GRC_ID_DATE_OF_EXPIRY = 6;
const GRC_ID_VISA_NUMBER = 7;
const GRC_ID_VALID_UNTIL = 8;
const GRC_ID_ARRIVAL_DATE_IN_COUNTRY = 9;
// Guest Registration Card — Additional Guests fields (section 5)
const GRC_ADD_GUEST_NAME = 1;
const GRC_ADD_GUEST_ID_TYPE = 2;
const GRC_ADD_GUEST_ID_NUMBER = 3;
const GRC_ADD_GUEST_NATIONALITY = 4;
// Guest Registration Card — Billing & Corporate Details fields (section 6)
const GRC_BILLING_COMPANY = 1;
const GRC_BILLING_TAX_ID = 2;
// Guest Registration Card — Payment & Deposit fields (section 7)
const GRC_PAYMENT_METHOD = 1;
const GRC_PAYMENT_CARD_NUMBER = 2;
const GRC_PAYMENT_SECURITY_DEPOSIT = 3;
// Guest Registration Card — Guest Signature fields (section 8)
const GRC_SIG_SIGNATURE = 1;
const GRC_SIG_DATE = 2;
// Guest Registration Card — Property Regulations fields (section 9)
const GRC_PROP_CHECKIN_CHECKOUT_TIME = 1;
const GRC_PROP_HOTEL_POLICIES = 2;
// Guest Registration Card — For Office Use Only fields (section 10)
const GRC_OFFICE_STAFF_NAME = 1;
const GRC_OFFICE_CHECKIN_TIME = 2;
const GRC_OFFICE_ID_VERIFIED = 3;
const GRC_OFFICE_REG_NO = 4;
private $allReqDates;
private $dltDates;
private $partAvaiDates; // used to remove cart rooms from partial available rooms
@@ -3814,4 +3893,119 @@ class HotelBookingDetail extends ObjectModel
return parent::add($auto_date, $null_values);
}
/**
* Returns all Guest Registration Card sections and their fields.
* Modules may add, remove, or reorder sections/fields via the hook.
*
* @return array sectionId => ['name' => string, 'fields' => [fieldId => string, ...]]
*/
public function getRegistrationCardInfo()
{
$guestRegCardInfo = array(
self::GRC_SECTION_GUEST_INFO => array(
'name' => $this->moduleInstance->l('Guest Information', 'hotelreservationsystem'),
'fields' => array(
self::GRC_GUEST_TITLE => $this->moduleInstance->l('Title', 'hotelreservationsystem'),
self::GRC_GUEST_FULL_NAME => $this->moduleInstance->l('Full Name (As per ID)', 'hotelreservationsystem'),
self::GRC_GUEST_PHONE => $this->moduleInstance->l('Phone / Mobile', 'hotelreservationsystem'),
self::GRC_GUEST_EMAIL => $this->moduleInstance->l('Email', 'hotelreservationsystem'),
self::GRC_GUEST_DOB => $this->moduleInstance->l('Date of Birth', 'hotelreservationsystem'),
self::GRC_GUEST_NATIONALITY => $this->moduleInstance->l('Nationality', 'hotelreservationsystem'),
self::GRC_GUEST_CITY_COUNTRY => $this->moduleInstance->l('City / Country', 'hotelreservationsystem'),
self::GRC_GUEST_POSTAL_CODE => $this->moduleInstance->l('Postal Code', 'hotelreservationsystem'),
self::GRC_GUEST_ADDRESS => $this->moduleInstance->l('Address', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_TRAVEL_INFO => array(
'name' => $this->moduleInstance->l('Travel Information', 'hotelreservationsystem'),
'fields' => array(
self::GRC_TRAVEL_ARRIVED_FROM => $this->moduleInstance->l('Arrived From', 'hotelreservationsystem'),
self::GRC_TRAVEL_NEXT_DESTINATION => $this->moduleInstance->l('Next Destination', 'hotelreservationsystem'),
self::GRC_TRAVEL_FLIGHT_TRAIN => $this->moduleInstance->l('Flight / Train Number', 'hotelreservationsystem'),
self::GRC_TRAVEL_VEHICLE_REG => $this->moduleInstance->l('Vehicle Reg. No.', 'hotelreservationsystem'),
self::GRC_TRAVEL_PURPOSE_OF_VISIT => $this->moduleInstance->l('Purpose of Visit', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_BOOKING_INFO => array(
'name' => $this->moduleInstance->l('Booking Information', 'hotelreservationsystem'),
'fields' => array(
self::GRC_BOOKING_REFERENCE => $this->moduleInstance->l('Booking Reference No.', 'hotelreservationsystem'),
self::GRC_BOOKING_RATE_PER_NIGHT => $this->moduleInstance->l('Rate per Night', 'hotelreservationsystem'),
self::GRC_BOOKING_ARRIVAL => $this->moduleInstance->l('Arrival Date & Time', 'hotelreservationsystem'),
self::GRC_BOOKING_DEPARTURE => $this->moduleInstance->l('Departure Date & Time', 'hotelreservationsystem'),
self::GRC_BOOKING_ROOM_TYPE => $this->moduleInstance->l('Room Type', 'hotelreservationsystem'),
self::GRC_BOOKING_ROOM_NUMBER => $this->moduleInstance->l('Room Number', 'hotelreservationsystem'),
self::GRC_BOOKING_NUM_GUESTS => $this->moduleInstance->l('Number of Guests', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_IDENTIFICATION => array(
'name' => $this->moduleInstance->l('Identification Document', 'hotelreservationsystem'),
'fields' => array(
self::GRC_ID_IDENTITY_PROOF => $this->moduleInstance->l('Identity Proof', 'hotelreservationsystem'),
self::GRC_ID_NUMBER => $this->moduleInstance->l('ID Number', 'hotelreservationsystem'),
self::GRC_ID_PASSPORT_NO => $this->moduleInstance->l('Passport No.', 'hotelreservationsystem'),
self::GRC_ID_PLACE_OF_ISSUE => $this->moduleInstance->l('Place of Issue', 'hotelreservationsystem'),
self::GRC_ID_DATE_OF_ISSUE => $this->moduleInstance->l('Date of Issue', 'hotelreservationsystem'),
self::GRC_ID_DATE_OF_EXPIRY => $this->moduleInstance->l('Date of Expiry', 'hotelreservationsystem'),
self::GRC_ID_VISA_NUMBER => $this->moduleInstance->l('Visa Number', 'hotelreservationsystem'),
self::GRC_ID_VALID_UNTIL => $this->moduleInstance->l('Valid Until', 'hotelreservationsystem'),
self::GRC_ID_ARRIVAL_DATE_IN_COUNTRY => $this->moduleInstance->l('Arrival Date in Country', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_ADDITIONAL_GUESTS => array(
'name' => $this->moduleInstance->l('Additional Guests', 'hotelreservationsystem'),
'fields' => array(
self::GRC_ADD_GUEST_NAME => $this->moduleInstance->l('Guest Name', 'hotelreservationsystem'),
self::GRC_ADD_GUEST_ID_TYPE => $this->moduleInstance->l('ID Type', 'hotelreservationsystem'),
self::GRC_ADD_GUEST_ID_NUMBER => $this->moduleInstance->l('ID Number', 'hotelreservationsystem'),
self::GRC_ADD_GUEST_NATIONALITY => $this->moduleInstance->l('Nationality', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_BILLING_CORPORATE => array(
'name' => $this->moduleInstance->l('Billing & Corporate Details', 'hotelreservationsystem'),
'fields' => array(
self::GRC_BILLING_COMPANY => $this->moduleInstance->l('Company / Agent', 'hotelreservationsystem'),
self::GRC_BILLING_TAX_ID => $this->moduleInstance->l('Tax ID / VAT No.', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_PAYMENT_DEPOSIT => array(
'name' => $this->moduleInstance->l('Payment & Deposit', 'hotelreservationsystem'),
'fields' => array(
self::GRC_PAYMENT_METHOD => $this->moduleInstance->l('Payment Method', 'hotelreservationsystem'),
self::GRC_PAYMENT_CARD_NUMBER => $this->moduleInstance->l('Credit Card Number', 'hotelreservationsystem'),
self::GRC_PAYMENT_SECURITY_DEPOSIT => $this->moduleInstance->l('Security Deposit', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_GUEST_SIGNATURE => array(
'name' => $this->moduleInstance->l('Guest Signature', 'hotelreservationsystem'),
'fields' => array(
self::GRC_SIG_SIGNATURE => $this->moduleInstance->l('Signature', 'hotelreservationsystem'),
self::GRC_SIG_DATE => $this->moduleInstance->l('Date', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_PROPERTY_REGS => array(
'name' => $this->moduleInstance->l('Property Regulations', 'hotelreservationsystem'),
'fields' => array(
self::GRC_PROP_CHECKIN_CHECKOUT_TIME => $this->moduleInstance->l('Check-in / Check-out Time', 'hotelreservationsystem'),
self::GRC_PROP_HOTEL_POLICIES => $this->moduleInstance->l('Hotel Policies', 'hotelreservationsystem'),
),
),
self::GRC_SECTION_OFFICE_USE_ONLY => array(
'name' => $this->moduleInstance->l('For Office Use Only', 'hotelreservationsystem'),
'fields' => array(
self::GRC_OFFICE_STAFF_NAME => $this->moduleInstance->l('Staff Name', 'hotelreservationsystem'),
self::GRC_OFFICE_CHECKIN_TIME => $this->moduleInstance->l('Check-in Time', 'hotelreservationsystem'),
self::GRC_OFFICE_ID_VERIFIED => $this->moduleInstance->l('ID Verified', 'hotelreservationsystem'),
self::GRC_OFFICE_REG_NO => $this->moduleInstance->l('Registration No.', 'hotelreservationsystem'),
),
),
);
Hook::exec('actionGuestRegCardInfoModifier', array(
'guest_registration_info' => &$guestRegCardInfo,
));
return $guestRegCardInfo;
}
}

View File

@@ -87,7 +87,7 @@ class HotelBranchRefundRules extends ObjectModel
$condition .= ' AND `id_refund_rule` = '.(int)$idRefundRule;
}
if ($notInVals) {
$condition .= ' AND `id_refund_rule` NOT IN ('.implode(',', $notInVals).')';
$condition .= ' AND `id_refund_rule` NOT IN ('.implode(',', array_map('intval', $notInVals)).')';
}
return Db::getInstance()->delete(
'htl_branch_refund_rules',

View File

@@ -149,7 +149,7 @@ class HotelRoomTypeFeaturePricing extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_feature_pricing` rtfp
ON (rtfpr.`id_feature_price` = rtfp.`id_feature_price` AND rtfp.`id_product`='.(int) $idRoomType.')
LEFT JOIN `'._DB_PREFIX_.'htl_room_type_feature_pricing_group` rtfpg
ON (rtfp.`id_feature_price` = rtfpg.`id_feature_price` '.($groups ? ' AND rtfpg.`id_group` IN ('.pSQL(implode(', ',$groups)).')' : ' ' ).')
ON (rtfp.`id_feature_price` = rtfpg.`id_feature_price` '.($groups ? ' AND rtfpg.`id_group` IN ('.implode(', ', array_map('intval', $groups)).')' : ' ' ).')
WHERE 1 '.( !is_null($active) ? ' AND rtfp.`active`= '.(int) $active: ' ').' ' .(!is_null($skipFeaturePriceId) ? ' AND rtfpr.`id_feature_price`!='.(int) $skipFeaturePriceId : ' ');
$sqlWhere = '';
if ($restrictions && is_array($restrictions)) {

View File

@@ -113,7 +113,7 @@ class HotelRoomTypeGlobalDemandAdvanceOption extends ObjectModel
$sql = 'SELECT * FROM `'._DB_PREFIX_.'htl_room_type_global_demand_advance_option`
WHERE `id_global_demand` = '.(int)$idGlobalDemand;
if (count($skipIds)) {
$sql .= ' AND `id_option` NOT IN ('.pSQL(implode(',', $skipIds)).')' ;
$sql .= ' AND `id_option` NOT IN ('.implode(',', array_map('intval', $skipIds)).')' ;
}
if ($advOptions = Db::getInstance()->executeS($sql)) {
foreach ($advOptions as &$option) {

View File

@@ -61,6 +61,12 @@ class QloHotelReviewDefaultModuleFrontController extends ModuleFrontController
$errors['general'][] = $objModule->l('Invalid order ID.', 'default');
}
$submittedSecureKey = Tools::getValue('order_secure_key', '');
if (!Validate::isLoadedObject($objOrder) || !$submittedSecureKey || $submittedSecureKey !== $objOrder->secure_key ) {
$errors['general'][] = $objModule->l('You are not authorized to submit a review.', 'default');
$this->ajaxDie(json_encode(array('status' => false, 'errors' => $errors)));
}
if (!$subject) {
$errors['by_key']['subject'] = $objModule->l('This field can not be empty.', 'default');
} elseif(!Validate::isGenericName($subject)) {

View File

@@ -199,10 +199,12 @@ class QloHotelReview extends Module
&& !QhrHotelReview::getByIdOrder($idOrder)
) {
if ($hotel = QhrHotelReviewHelper::getHotelByOrder($idOrder)) {
$objOrder = new Order((int) $idOrder);
$this->smarty->assign(array(
'id_order' => (int) $idOrder,
'id_hotel' => $hotel['id_hotel'],
'hotel_name' => $hotel['hotel_name'],
'order_secure_key' => $objOrder->secure_key,
));
return $this->display(__FILE__, 'booking-action.tpl');
}

View File

@@ -21,10 +21,12 @@
*/
var QhrReviewForm = {
init: function(idOrder, idHotel, hotelName) {
orderSecureKey: '',
init: function(idOrder, idHotel, hotelName, secureKey) {
$('#add-review-form').find('[name="id_order"]').val(idOrder);
$('#add-review-form').find('[name="id_hotel"]').val(idHotel);
$('#add-review-popup').find('.hotel-name').html(hotelName);
QhrReviewForm.orderSecureKey = secureKey || '';
QhrReviewImages.init();
},
show: function() {
@@ -47,6 +49,7 @@ var QhrReviewForm = {
formData.append('ajax', true);
formData.append('token', qlo_hotel_review_js_vars.review_ajax_token);
formData.append('action', 'AddReview');
formData.append('order_secure_key', QhrReviewForm.orderSecureKey);
$.ajax({
url: qlo_hotel_review_js_vars.review_ajax_link,
data: formData,
@@ -228,7 +231,8 @@ $(document).on('click', '#add-review-btn', function(e) {
var idOrder = parseInt($(this).data('id-order'));
var idHotel = parseInt($(this).data('id-hotel'));
var hotelName = $(this).data('hotel-name');
QhrReviewForm.init(idOrder, idHotel, hotelName);
var secureKey = $(this).data('secure-key') || '';
QhrReviewForm.init(idOrder, idHotel, hotelName, secureKey);
QhrReviewForm.show();
});

View File

@@ -20,6 +20,6 @@
* @license https://opensource.org/license/osl-3-0-php Open Software License version 3.0
*}
<a class="btn btn-default btn-review pull-right" id="add-review-btn" data-id-order="{$id_order}" data-id-hotel="{$id_hotel}" data-hotel-name="{$hotel_name}">
<a class="btn btn-default btn-review pull-right" id="add-review-btn" data-id-order="{$id_order}" data-id-hotel="{$id_hotel}" data-hotel-name="{$hotel_name}" data-secure-key="{$order_secure_key}">
{l s='Write a Review' mod='qlohotelreview'}
</a>

View File

@@ -0,0 +1,631 @@
{*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License version 3.0
* that is bundled with this package in the file LICENSE.txt
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to a 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 Since 2010 Webkul
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
{$style_tab}
<table width="100%" id="body" border="0" cellpadding="0" cellspacing="0" style="margin:0;">
<tr>
<td colspan="12" class="center" style="font-size: 12pt; font-weight: bold; vertical-align: top;">
{if $hotel}{$hotel->hotel_name|escape:'html':'UTF-8'}{/if}
</td>
</tr>
<tr>
<td colspan="12" class="center" style="vertical-align: top;">
{if $hotel && $hotel->city}{$hotel->city|escape:'html':'UTF-8'}{if $hotel_country}, {/if}{/if}{if $hotel_country}{$hotel_country|escape:'html':'UTF-8'}{/if}
</td>
</tr>
{* ===== SECTION 1: GUEST INFORMATION ===== *}
{if $show_section_guest_info}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.title || $labels.full_name}
<tr>
{if $labels.title && $labels.full_name}
<td width="25%" class="bold">{l s=$labels.title pdf='true'}:</td>
<td width="25%" class="white">
<span style="font-family: freeserif;">&#9633;</span> {l s='Mr.' pdf='true'} &nbsp;
<span style="font-family: freeserif;">&#9633;</span> {l s='Ms.' pdf='true'} &nbsp;
</td>
<td width="25%" class="bold">{l s=$labels.full_name pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
{elseif $labels.title}
<td width="25%" class="bold">{l s=$labels.title pdf='true'}:</td>
<td width="75%" colspan="3" class="white">
<span style="font-family: freeserif;">&#9633;</span> {l s='Mr.' pdf='true'} &nbsp;
<span style="font-family: freeserif;">&#9633;</span> {l s='Ms.' pdf='true'} &nbsp;
</td>
{else}
<td width="25%" class="bold">{l s=$labels.full_name pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{/if}
</tr>
{/if}
{if $labels.phone || $labels.email}
<tr>
{if $labels.phone && $labels.email}
<td width="25%" class="bold">{l s=$labels.phone pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
<td width="25%" class="bold">{l s=$labels.email pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
{elseif $labels.phone}
<td width="25%" class="bold">{l s=$labels.phone pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.email pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{/if}
</tr>
{/if}
{if $labels.dob || $labels.nationality}
<tr>
{if $labels.dob && $labels.nationality}
<td width="25%" class="bold">{l s=$labels.dob pdf='true'}:</td>
<td width="25%" class="white">____ / ____ / ________</td>
<td width="25%" class="bold">{l s=$labels.nationality pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
{elseif $labels.dob}
<td width="25%" class="bold">{l s=$labels.dob pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____ / ____ / ________</td>
{else}
<td width="25%" class="bold">{l s=$labels.nationality pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{/if}
</tr>
{/if}
{if $labels.city_country || $labels.postal_code}
<tr>
{if $labels.city_country && $labels.postal_code}
<td width="25%" class="bold">{l s=$labels.city_country pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
<td width="25%" class="bold">{l s=$labels.postal_code pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
{elseif $labels.city_country}
<td width="25%" class="bold">{l s=$labels.city_country pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.postal_code pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{/if}
</tr>
{/if}
{if $labels.address}
<tr>
<td width="25%" class="bold">{l s=$labels.address pdf='true'}:</td>
<td width="75%" colspan="3" class="white">__________________________________________________________________________________</td>
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 2: TRAVEL INFORMATION ===== *}
{if $show_section_travel_info}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.arrived_from || $labels.next_dest}
<tr>
{if $labels.arrived_from && $labels.next_dest}
<td width="25%" class="bold">{l s=$labels.arrived_from pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
<td width="25%" class="bold">{l s=$labels.next_dest pdf='true'}:</td>
<td width="25%" class="white">___________________</td>
{elseif $labels.arrived_from}
<td width="25%" class="bold">{l s=$labels.arrived_from pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.next_dest pdf='true'}:</td>
<td width="75%" colspan="3" class="white">___________________</td>
{/if}
</tr>
{/if}
{if $labels.flight || $labels.vehicle}
<tr>
{if $labels.flight && $labels.vehicle}
<td width="25%" class="bold">{l s=$labels.flight pdf='true'}:</td>
<td width="25%" class="white">________________________</td>
<td width="25%" class="bold">{l s=$labels.vehicle pdf='true'}:</td>
<td width="25%" class="white">___________________</td>
{elseif $labels.flight}
<td width="25%" class="bold">{l s=$labels.flight pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.vehicle pdf='true'}:</td>
<td width="75%" colspan="3" class="white">___________________</td>
{/if}
</tr>
{/if}
{if $labels.purpose}
<tr>
<td width="25%" class="bold">{l s=$labels.purpose pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________</td>
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 3: BOOKING INFORMATION ===== *}
{if $show_section_booking_info}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.booking_ref || $labels.booking_rate}
<tr>
{if $labels.booking_ref && $labels.booking_rate}
<td width="25%" class="bold">{l s=$labels.booking_ref pdf='true'}:</td>
<td width="25%" class="white">{$booking_reference|escape:'html':'UTF-8'}</td>
<td width="25%" class="bold">{l s=$labels.booking_rate pdf='true'}:</td>
<td width="25%" class="white">
{if $rate_per_night}{$rate_per_night|escape:'html':'UTF-8'}{else}__________{/if}
</td>
{elseif $labels.booking_ref}
<td width="25%" class="bold">{l s=$labels.booking_ref pdf='true'}:</td>
<td width="75%" colspan="3" class="white">{$booking_reference|escape:'html':'UTF-8'}</td>
{else}
<td width="25%" class="bold">{l s=$labels.booking_rate pdf='true'}:</td>
<td width="75%" colspan="3" class="white">
{if $rate_per_night}{$rate_per_night|escape:'html':'UTF-8'}{else}__________{/if}
</td>
{/if}
</tr>
{/if}
{if $labels.booking_arrival || $labels.booking_departure}
<tr>
{if $labels.booking_arrival && $labels.booking_departure}
<td width="25%" class="bold">{l s=$labels.booking_arrival pdf='true'}:</td>
<td width="25%" class="white">
{if $arrival_date_time}{$arrival_date_time|escape:'html':'UTF-8'}{else}____ / ____ / ____ ______{/if}
</td>
<td width="25%" class="bold">{l s=$labels.booking_departure pdf='true'}:</td>
<td width="25%" class="white">
{if $departure_date_time}{$departure_date_time|escape:'html':'UTF-8'}{else}____ / ____ / ____ ______{/if}
</td>
{elseif $labels.booking_arrival}
<td width="25%" class="bold">{l s=$labels.booking_arrival pdf='true'}:</td>
<td width="75%" colspan="3" class="white">
{if $arrival_date_time}{$arrival_date_time|escape:'html':'UTF-8'}{else}____ / ____ / ____ ______{/if}
</td>
{else}
<td width="25%" class="bold">{l s=$labels.booking_departure pdf='true'}:</td>
<td width="75%" colspan="3" class="white">
{if $departure_date_time}{$departure_date_time|escape:'html':'UTF-8'}{else}____ / ____ / ____ ______{/if}
</td>
{/if}
</tr>
{/if}
{if $labels.booking_room_type || $labels.booking_room_number}
<tr>
{if $labels.booking_room_type && $labels.booking_room_number}
<td width="25%" class="bold">{l s=$labels.booking_room_type pdf='true'}:</td>
<td width="25%" class="white">{$room_type|escape:'html':'UTF-8'}</td>
<td width="25%" class="bold">{l s=$labels.booking_room_number pdf='true'}:</td>
<td width="25%" class="white">{$room_number|escape:'html':'UTF-8'}</td>
{elseif $labels.booking_room_type}
<td width="25%" class="bold">{l s=$labels.booking_room_type pdf='true'}:</td>
<td width="75%" colspan="3" class="white">{$room_type|escape:'html':'UTF-8'}</td>
{else}
<td width="25%" class="bold">{l s=$labels.booking_room_number pdf='true'}:</td>
<td width="75%" colspan="3" class="white">{$room_number|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/if}
{if $labels.num_guests}
<tr>
<td width="25%" class="bold">{l s=$labels.num_guests pdf='true'}:</td>
<td width="25%" class="white">
{l s='Adults:' pdf='true'} {$adults|escape:'html':'UTF-8'} &nbsp;
{l s='Children:' pdf='true'} {$children|escape:'html':'UTF-8'}
</td>
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 4: IDENTIFICATION DOCUMENT ===== *}
{if $show_section_identification}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
{if $local_id}
<tr>
<td class="white">
<strong><span style="font-family: freeserif; font-size: 14pt;">&#9633;</span> {l s='LOCAL GUEST' pdf='true'}</strong><br /><br />
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.id_proof}
<tr>
<td width="25%" class="bold">{l s=$labels.id_proof pdf='true'}:</td>
<td width="75%" class="white">________________________________</td>
</tr>
{/if}
{if $labels.id_number}
<tr>
<td width="25%" class="bold">{l s=$labels.id_number pdf='true'}:</td>
<td width="75%" class="white">________________________________</td>
</tr>
{/if}
</table>
</td>
</tr>
{/if}
{if $int_id}
<tr>
<td class="white">
<strong><span style="font-family: freeserif; font-size: 14pt;">&#9633;</span> {l s='INTERNATIONAL GUEST' pdf='true'}</strong><br /><br />
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.passport || $labels.place_of_issue}
<tr>
{if $labels.passport && $labels.place_of_issue}
<td width="25%" class="bold">{l s=$labels.passport pdf='true'}:</td>
<td width="25%" class="white">____________________</td>
<td width="25%" class="bold">{l s=$labels.place_of_issue pdf='true'}:</td>
<td width="25%" class="white">____________________</td>
{elseif $labels.passport}
<td width="25%" class="bold">{l s=$labels.passport pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.place_of_issue pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____________________</td>
{/if}
</tr>
{/if}
{if $labels.date_of_issue || $labels.date_of_expiry}
<tr>
{if $labels.date_of_issue && $labels.date_of_expiry}
<td width="25%" class="bold">{l s=$labels.date_of_issue pdf='true'}:</td>
<td width="25%" class="white">____ / ____ / ____</td>
<td width="25%" class="bold">{l s=$labels.date_of_expiry pdf='true'}:</td>
<td width="25%" class="white">____ / ____ / ____</td>
{elseif $labels.date_of_issue}
<td width="25%" class="bold">{l s=$labels.date_of_issue pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____ / ____ / ____</td>
{else}
<td width="25%" class="bold">{l s=$labels.date_of_expiry pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____ / ____ / ____</td>
{/if}
</tr>
{/if}
{if $labels.visa || $labels.valid_until}
<tr>
{if $labels.visa && $labels.valid_until}
<td width="25%" class="bold">{l s=$labels.visa pdf='true'}:</td>
<td width="25%" class="white">____________________</td>
<td width="25%" class="bold">{l s=$labels.valid_until pdf='true'}:</td>
<td width="25%" class="white">____ / ____ / ____</td>
{elseif $labels.visa}
<td width="25%" class="bold">{l s=$labels.visa pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.valid_until pdf='true'}:</td>
<td width="75%" colspan="3" class="white">____ / ____ / ____</td>
{/if}
</tr>
{/if}
{if $labels.arrival_in_country}
<tr>
<td width="25%" class="bold">{l s=$labels.arrival_in_country pdf='true'}:</td>
<td width="75%" class="white">____ / ____ / ____</td>
</tr>
{/if}
</table>
</td>
</tr>
{/if}
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 5: ADDITIONAL GUESTS ===== *}
{if $show_section_additional_guests}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<thead>
<tr>
<th class="header-left"> {$section_additional_guests|upper} ({l s='if any' pdf='true'})</th>
</tr>
</thead>
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
<tr>
<th class="header small" width="8%">{l s='S.No.' pdf='true'}</th>
{if $labels.addguest_name}<th class="header small" width="40%">{l s=$labels.addguest_name pdf='true'}</th>{/if}
{if $labels.addguest_id_type}<th class="header small" width="20%">{l s=$labels.addguest_id_type pdf='true'}</th>{/if}
{if $labels.addguest_id_number}<th class="header small" width="17%">{l s=$labels.addguest_id_number pdf='true'}</th>{/if}
{if $labels.addguest_nationality}<th class="header small" width="15%">{l s=$labels.addguest_nationality pdf='true'}</th>{/if}
</tr>
{section name=ag loop=$additional_guests_rows}
<tr class="color_line_even">
<td class="center white">{$smarty.section.ag.iteration}</td>
{if $labels.addguest_name}<td class="white">______________________________</td>{/if}
{if $labels.addguest_id_type}<td class="white">________________</td>{/if}
{if $labels.addguest_id_number}<td class="white">________________</td>{/if}
{if $labels.addguest_nationality}<td class="white">____________</td>{/if}
</tr>
{/section}
{if !$additional_guests_rows}
<tr class="color_line_even">
<td class="center white">1</td>
{if $labels.addguest_name}<td class="white">______________________________</td>{/if}
{if $labels.addguest_id_type}<td class="white">________________</td>{/if}
{if $labels.addguest_id_number}<td class="white">________________</td>{/if}
{if $labels.addguest_nationality}<td class="white">____________</td>{/if}
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 6: BILLING & CORPORATE DETAILS ===== *}
{if $show_section_billing_corporate}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.company}
<tr>
<td width="25%" class="bold">{l s=$labels.company pdf='true'}:</td>
<td width="75%" class="white">______________________________________________</td>
</tr>
{/if}
{if $labels.tax_id}
<tr>
<td width="25%" class="bold">{l s=$labels.tax_id pdf='true'}:</td>
<td width="75%" class="white">______________________________________________</td>
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 7: PAYMENT & DEPOSIT ===== *}
{if $show_section_payment_deposit}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.payment_method}
<tr>
<td width="25%" class="bold">{l s=$labels.payment_method pdf='true'}:</td>
<td width="75%" class="white">________________________________</td>
</tr>
{/if}
{if $labels.card_number || $labels.security_deposit}
<tr>
{if $labels.card_number && $labels.security_deposit}
<td width="25%" class="bold">{l s=$labels.card_number pdf='true'}:</td>
<td width="35%" class="white">________________________________</td>
<td width="20%" class="bold">{l s=$labels.security_deposit pdf='true'}:</td>
<td width="20%" class="white">__________________</td>
{elseif $labels.card_number}
<td width="25%" class="bold">{l s=$labels.card_number pdf='true'}:</td>
<td width="75%" colspan="3" class="white">________________________________</td>
{else}
<td width="25%" class="bold">{l s=$labels.security_deposit pdf='true'}:</td>
<td width="75%" colspan="3" class="white">__________________</td>
{/if}
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 8: GUEST SIGNATURE ===== *}
{if $show_section_guest_signature}
<tr>
<td colspan="12" height="10">&nbsp;</td>
</tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
<tr>
{if $labels.signature && $labels.sig_date}
<td width="20%" class="bold">{l s=$labels.signature pdf='true'}:</td>
<td width="50%" class="white">______________________________________</td>
<td width="10%" class="bold">{l s=$labels.sig_date pdf='true'}:</td>
<td width="20%" class="white">____ / ____ / ________</td>
{elseif $labels.signature}
<td width="20%" class="bold">{l s=$labels.signature pdf='true'}:</td>
<td width="80%" colspan="3" class="white">______________________________________</td>
{else}
<td width="20%" class="bold">{l s=$labels.sig_date pdf='true'}:</td>
<td width="80%" colspan="3" class="white">____ / ____ / ________</td>
{/if}
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 9: PROPERTY REGULATIONS ===== *}
{if $show_section_property_regs}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<thead>
<tr>
<th class="header-left">{$section_property_regs|upper}</th>
</tr>
</thead>
<tbody>
{if $labels.checkin_time}
<tr>
<td class="white">
<strong> {l s=$labels.checkin_time pdf='true'}:</strong>
{if $hotel && $hotel->check_in && $hotel->check_in != '00:00:00'}{$hotel->check_in|escape:'html':'UTF-8'}{else}__________{/if}
&nbsp;&nbsp;&nbsp;
<strong>{l s=$labels.checkout_time pdf='true'}:</strong>
{if $hotel && $hotel->check_out && $hotel->check_out != '00:00:00'}{$hotel->check_out|escape:'html':'UTF-8'}{else}__________{/if}
</td>
</tr>
{/if}
{if $labels.hotel_policies}
<tr>
<td class="white">
<strong> {l s=$labels.hotel_policies pdf='true'}:</strong>
{if $hotel && $hotel->policies && !($hotel->policies|@is_array)}
{$hotel->policies}
{else}
______________________________<br />
______________________________<br />
______________________________
{/if}
</td>
</tr>
{/if}
</tbody>
</table>
</td>
</tr>
{/if}
{* ===== SECTION 10: FOR OFFICE USE ONLY ===== *}
{if $show_section_office_use}
<tr><td colspan="12" height="10">&nbsp;</td></tr>
<tr>
<td colspan="12">
<table class="bordered-table" width="100%" cellpadding="5" cellspacing="0" nobr="true">
<tbody>
<tr>
<td class="white">
<table width="100%" cellpadding="4" cellspacing="0">
{if $labels.staff_name || $labels.office_checkin_time}
<tr>
{if $labels.staff_name && $labels.office_checkin_time}
<td width="20%" class="bold">{l s=$labels.staff_name pdf='true'}:</td>
<td width="30%" class="white">____________________</td>
<td width="20%" class="bold">{l s=$labels.office_checkin_time pdf='true'}:</td>
<td width="30%" class="white">____________________</td>
{elseif $labels.staff_name}
<td width="20%" class="bold">{l s=$labels.staff_name pdf='true'}:</td>
<td width="80%" colspan="3" class="white">____________________</td>
{else}
<td width="20%" class="bold">{l s=$labels.office_checkin_time pdf='true'}:</td>
<td width="80%" colspan="3" class="white">____________________</td>
{/if}
</tr>
{/if}
{if $labels.id_verified || $labels.reg_no}
<tr>
{if $labels.id_verified && $labels.reg_no}
<td width="20%" class="bold">{l s=$labels.id_verified pdf='true'}:</td>
<td width="30%" class="white"><span style="font-family: freeserif;">&#9633;</span> {l s='Yes' pdf='true'} &nbsp; <span style="font-family: freeserif;">&#9633;</span> {l s='No' pdf='true'}</td>
<td width="20%" class="bold">{l s=$labels.reg_no pdf='true'}:</td>
<td width="30%" class="white">____________________</td>
{elseif $labels.id_verified}
<td width="20%" class="bold">{l s=$labels.id_verified pdf='true'}:</td>
<td width="80%" colspan="3" class="white"><span style="font-family: freeserif;">&#9633;</span> {l s='Yes' pdf='true'} &nbsp; <span style="font-family: freeserif;">&#9633;</span> {l s='No' pdf='true'}</td>
{else}
<td width="20%" class="bold">{l s=$labels.reg_no pdf='true'}:</td>
<td width="80%" colspan="3" class="white">____________________</td>
{/if}
</tr>
{/if}
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
{/if}
{if isset($HOOK_DISPLAY_PDF)}
<tr>
<td colspan="12" height="10">&nbsp;</td>
</tr>
<tr>
<td colspan="12">
{$HOOK_DISPLAY_PDF}
</td>
</tr>
{/if}
</table>

View File

@@ -24,6 +24,11 @@
*}
{block name='category'}
{block name='errors'}
{include file="$tpl_dir./errors.tpl"}
{/block}
{if !isset($errors) OR !sizeof($errors)}
<div class="row cat_cont">
<div class="col-sm-12">
{block name='category_top_left'}
@@ -54,6 +59,7 @@
</div>
</div>
</div>
{/if}
{block name='category_js_vars'}
{strip}