diff --git a/admin/themes/default/sass/vendor/bootstrap-sass/_buttons.scss b/admin/themes/default/sass/vendor/bootstrap-sass/_buttons.scss index 271ae468f..75c8d0700 100644 --- a/admin/themes/default/sass/vendor/bootstrap-sass/_buttons.scss +++ b/admin/themes/default/sass/vendor/bootstrap-sass/_buttons.scss @@ -50,6 +50,14 @@ } } +// buttons text align +.btn-left { + text-align: left; +} +.btn-right { + text-align: right; +} + // Alternate buttons // -------------------------------------------------- @@ -140,8 +148,6 @@ .btn-block { display: block; width: 100%; - padding-left: 0; - padding-right: 0; } // Vertically space out multiple block buttons diff --git a/admin/themes/default/template/controllers/orders/_current_cart_details_data.tpl b/admin/themes/default/template/controllers/orders/_current_cart_details_data.tpl index b4159912d..35a13e9ac 100644 --- a/admin/themes/default/template/controllers/orders/_current_cart_details_data.tpl +++ b/admin/themes/default/template/controllers/orders/_current_cart_details_data.tpl @@ -23,7 +23,7 @@ {l s='Cart Details'}
-
+
@@ -31,6 +31,9 @@ + {if $occupancy_required_for_booking} + + {/if} @@ -42,7 +45,7 @@ {if isset($cart_detail_data) && $cart_detail_data} {assign var=curr_id value=$cart->id_currency|intval} {foreach from=$cart_detail_data item=data} - + + {if $occupancy_required_for_booking} + + {/if} - - {*{if ($order->hasBeenPaid())}{/if} {if $display_warehouse}{/if} {if ($order->hasBeenDelivered())}{/if} *} - + + {if isset($refundReqBookings) && $refundReqBookings} @@ -1113,9 +1208,14 @@ {if $refund_allowed && !$hasCompletelyRefunded} - +
+ + +
{/if} {/if} @@ -1485,6 +1585,21 @@ {addJsDefL name=txtSomeErr}{l s='Some error occurred. Please try again.' js=1}{/addJsDefL} {addJsDefL name=txtDeleteSucc}{l s='Deleted successfully' js=1}{/addJsDefL} {addJsDefL name=txtInvalidDemandVal}{l s='Invalid demand value found' js=1}{/addJsDefL} + {addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL} + {addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL} + {addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL} + {addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL} + {addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL} + {addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL} + {addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL} + {addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL} + {addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL} + {addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL} + {addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL} + {addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL} + {addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL} + {addJsDef max_child_age=$max_child_age|escape:'quotes':'UTF-8'} + {addJsDef max_child_in_room=$max_child_in_room|escape:'quotes':'UTF-8'} {/strip} {* Apply javascript for the page *} diff --git a/admin/themes/default/template/controllers/products/occupancy.tpl b/admin/themes/default/template/controllers/products/occupancy.tpl index c38cd0b92..1605e2818 100644 --- a/admin/themes/default/template/controllers/products/occupancy.tpl +++ b/admin/themes/default/template/controllers/products/occupancy.tpl @@ -24,27 +24,25 @@

{l s='Occupancy'}

- {l s='Set the occupancy of this room type. Enter how much adults and children this room type can accomodate.'} -

- {l s='Note'} : {l s='These occupancy settings will not affect "ROOM TYPE ADDITIONAL FACILITIES" any way. It will work separately.'} + {l s='Below, enter the base occupancy of this room type.'}
- +
@@ -53,6 +51,46 @@
+
+ +
+ {l s='Below, enter the maximum of adults or children which can be accommodated in a room of this room type. Also, enter maximum number of guests for this room type.'} +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
{l s='Room Image'} {l s='Room Type'} {l s='Duration'}{l s='Occupancy'}{l s='Unit Price (tax excl)'} {l s='Additinal Facilities (tax excl)'} {l s='Total Rooms Price (tax excl)'}
{$data.room_num|escape:'html':'UTF-8'} @@ -58,13 +61,71 @@ {/if} {dateFormat date=$data.date_from} - {dateFormat date=$data.date_to} + + {if $data.feature_price_diff != 0} {assign var=shown_room_type_price value=$data.feature_price_tax_excl} {else} {assign var=shown_room_type_price value=$data.product_price_tax_excl} {/if} - + {if isset($data.extra_demands) && $data.extra_demands} diff --git a/admin/themes/default/template/controllers/orders/_documents.tpl b/admin/themes/default/template/controllers/orders/_documents.tpl index 6d7e49034..8b1436d34 100644 --- a/admin/themes/default/template/controllers/orders/_documents.tpl +++ b/admin/themes/default/template/controllers/orders/_documents.tpl @@ -112,7 +112,7 @@ {if !isset($document->is_delivery)} {if $document->getRestPaid()} - + {l s='Enter payment'} diff --git a/admin/themes/default/template/controllers/orders/_new_product.tpl b/admin/themes/default/template/controllers/orders/_new_product.tpl index e67cc63ff..141e9e68b 100644 --- a/admin/themes/default/template/controllers/orders/_new_product.tpl +++ b/admin/themes/default/template/controllers/orders/_new_product.tpl @@ -64,7 +64,7 @@ + {if $order->with_occupancy && $data['children']} + + {else} + {if $data['adults']}{$data['adults']}{/if} {if $data['adults'] > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if {$data['children']}}, {$data['children']} {if $data['children'] > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if} + {/if} + {if $order->with_occupancy} + + {else} + + {/if} diff --git a/admin/themes/default/template/controllers/orders/form.tpl b/admin/themes/default/template/controllers/orders/form.tpl index 28280d9ba..48cd3737c 100644 --- a/admin/themes/default/template/controllers/orders/form.tpl +++ b/admin/themes/default/template/controllers/orders/form.tpl @@ -241,12 +241,13 @@ e.preventDefault(); var cart_row = $(this).closest('tr'); var params = { - id_booking_data: parseInt($(this).attr('data-id-booking-data')), - id_product: parseInt($(this).attr('data-id-product')), - id_room: parseInt($(this).attr('data-id-room')), - date_from: $(this).attr('data-date-from'), - date_to: $(this).attr('data-date-to'), - price: $(this).val(), + id_booking_data: parseInt($(cart_row).attr('data-id-booking-data')), + id_product: parseInt($(cart_row).attr('data-id-product')), + id_room: parseInt($(cart_row).attr('data-id-room')), + date_from: $(cart_row).attr('data-date-from'), + date_to: $(cart_row).attr('data-date-to'), + price: new Number($(this).val().replace(",",".")).toFixed(4).toString(), + id_cart: id_cart }; updateProductPrice(params, cart_row); }) @@ -272,6 +273,7 @@ } }); }); + resetBind(); $('#customer').focus(); @@ -332,6 +334,205 @@ $('#search-customer-form-group').show(); $(this).blur(); }); + + {literal} + $(document).on('click', '.booking_occupancy_wrapper .remove-room-link', function(e) { + e.preventDefault(); + + booking_occupancy_inner = $(this).closest('.booking_occupancy_inner'); + $(this).closest('.occupancy_info_block').remove(); + $(booking_occupancy_inner).find('.room_num_wrapper').each(function(key, val) { + $(this).text(room_txt + ' - '+ (key+1) ); + }); + setRoomTypeGuestOccupancy($(booking_occupancy_inner).closest('.booking_occupancy_wrapper')); + }); + + $(document).on('change', '.num_occupancy', function(e) { + let current_room_occupancy = 0; + $(this).closest('.occupancy_info_block').find('.num_occupancy').each(function(){ + current_room_occupancy += parseInt($(this).val()); + }); + let max_guests_in_room = $(this).closest(".booking_occupancy_wrapper").find('.max_guests').val(); + let max_allowed_for_current = (max_guests_in_room - current_room_occupancy) + parseInt($(this).val()); + if ($(this).val() > $(this).attr('max')) { + $(this).val($(this).attr('max')); + } + if ($(this).val() > max_allowed_for_current) { + $(this).val(max_allowed_for_current); + } + if ($(this).hasClass('num_children')) { + var totalChilds = $(this).closest('.occupancy_info_block').find('.guest_child_age').length; + if (totalChilds < $(this).val()) { + if (totalChilds < max_child_in_room) { + $(this).closest('.occupancy_info_block').find('.children_age_info_block').show(); + while ($(this).closest('.occupancy_info_block').find('.guest_child_age').length < $(this).val()) { + + + var roomBlockIndex = parseInt($(this).closest('.occupancy_info_block').attr('occ_block_index')); + + var childAgeSelect = '

'; + childAgeSelect += ''; + childAgeSelect += '

'; + $(this).closest('.occupancy_info_block').find('.children_ages').append(childAgeSelect); + } + } + } else { + let child = $(this).val(); + $(this).closest('.occupancy_info_block').find('.guest_child_age').each(function(ind, element) { + if (child <= ind) { + $(element).parent().remove(); + } + }); + if (child == 0) { + $(this).closest('.occupancy_info_block').find('.children_age_info_block').hide(); + } + + } + } + setRoomTypeGuestOccupancy($(this).closest('.booking_occupancy_wrapper')); + + }); + + + $(document).on('click', '.booking_guest_occupancy', function(e) { + $(this).parent().toggleClass('open'); + }); + + $(document).on('click', function(e) { + if ($('.booking_occupancy_wrapper:visible').length) { + var occupancy_wrapper = $('.booking_occupancy_wrapper:visible'); + $(occupancy_wrapper).find(".occupancy_info_block").addClass('selected'); + if (!($(e.target).closest(".booking_occupancy_wrapper").length || $(e.target).closest(".booking_guest_occupancy").length || $(e.target).closest(".ajax_add_to_cart_button").length || $(e.target).closest(".exclusive.book_now_submit").length)) { + let hasErrors = 0; + + let adults = $(occupancy_wrapper).find(".num_adults").map(function(){return $(this).val();}).get(); + let children = $(occupancy_wrapper).find(".num_children").map(function(){return $(this).val();}).get(); + let child_ages = $(occupancy_wrapper).find(".guest_child_age").map(function(){return $(this).val();}).get(); + + // start validating above values + if (!adults.length || (adults.length != children.length)) { + hasErrors = 1; + showErrorMessage(invalid_occupancy_txt); + } else { + $(occupancy_wrapper).find('.occupancy_count').removeClass('error_border'); + + // validate values of adults and children + adults.forEach(function (item, index) { + if (isNaN(item) || parseInt(item) < 1) { + hasErrors = 1; + $(occupancy_wrapper).find(".num_adults").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); + } + if (isNaN(children[index])) { + hasErrors = 1; + $(occupancy_wrapper).find(".num_children").eq(index).closest('.occupancy_count_block').find('.occupancy_count').addClass('error_border'); + } + }); + + // validate values of selected child ages + $(occupancy_wrapper).find('.guest_child_age').parent().removeClass('has-error'); + child_ages.forEach(function (age, index) { + age = parseInt(age); + if (isNaN(age) || (age < 0) || (age >= parseInt(max_child_age))) { + hasErrors = 1; + $(occupancy_wrapper).find(".guest_child_age").eq(index).parent().addClass('has-error'); + } + }); + } + if (hasErrors == 0) { + $(occupancy_wrapper).parent().removeClass('open'); + $(document).trigger( "QloApps:updateRoomOccupancy", [occupancy_wrapper]); + } + } + } + }); + + $(document).on('QloApps:updateRoomOccupancy', function (e, occupancy_wrapper) { + e.preventDefault(); + let cart_row = $(occupancy_wrapper).closest('tr'); + let occupancy = getBookingOccupancyDetails(cart_row); + let params = { + id_cart: id_cart, + id_booking_data: parseInt($(cart_row).attr('data-id-booking-data')), + occupancy : occupancy.shift(), + }; + updateRoomOccupancy(params, cart_row); + }); + + function getBookingOccupancyDetails(bookingform) + { + let occupancy = []; + let selected_occupancy = $(bookingform).find(".occupancy_info_block.selected") + if (selected_occupancy.length) { + $(selected_occupancy).each(function(ind, element) { + if (parseInt($(element).find('.num_adults').val())) { + let child_ages = []; + $(element).find('.guest_child_age').each(function(index) { + if ($(this).val() > -1) { + child_ages.push($(this).val()); + } + }); + if ($(element).find('.num_children').val()) { + if (child_ages.length != $(element).find('.num_children').val()) { + $(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open'); + } + } + occupancy.push({ + 'adults': $(element).find('.num_adults').val(), + 'children': $(element).find('.num_children').val(), + 'child_ages': child_ages + }); + } else { + $(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open'); + } + }); + } else { + $(bookingform).find('.booking_occupancy_wrapper').parent().addClass('open'); + } + + return occupancy; + } + + function setRoomTypeGuestOccupancy(booking_occupancy_wrapper) + { + var adults = 0; + var children = 0; + var rooms = $(booking_occupancy_wrapper).find('.occupancy_info_block').length; + + $(booking_occupancy_wrapper).find(".num_adults" ).each(function(key, val) { + adults += parseInt($(this).val()); + }); + $(booking_occupancy_wrapper).find(".num_children" ).each(function(key, val) { + children += parseInt($(this).val()); + }); + + var guestButtonVal = parseInt(adults) + ' '; + if (parseInt(adults) > 1) { + guestButtonVal += adults_txt; + } else { + guestButtonVal += adult_txt; + } + if (parseInt(children) > 0) { + if (parseInt(children) > 1) { + guestButtonVal += ', ' + parseInt(children) + ' ' + children_txt; + } else { + guestButtonVal += ', ' + parseInt(children) + ' ' + child_txt; + } + } + // if (parseInt(rooms) > 1) { + // guestButtonVal += ', ' + parseInt(rooms) + ' ' + rooms_txt; + // } else { + // guestButtonVal += ', ' + parseInt(rooms) + ' ' + room_txt; + // } + // console.log($(booking_occupancy_wrapper).siblings('.booking_guest_occupancy > span')); + $(booking_occupancy_wrapper).siblings('.booking_guest_occupancy').find('span').text(guestButtonVal); + } + {/literal} }); function resetBind() @@ -389,12 +590,8 @@ }); } - function updateProductPrice(params, cart_row) { - $.extend(params, { - id_cart: id_cart, - price: new Number(params.price.replace(",",".")).toFixed(4).toString(), - }); - + function updateProductPrice(params, cart_row) + { $.ajax({ type:"POST", url: "{$link->getAdminLink('AdminCarts')|addslashes}", @@ -414,6 +611,29 @@ }); } + function updateRoomOccupancy(params, cart_row) + { + debugger; + $.ajax({ + type:"POST", + url: "{$link->getAdminLink('AdminCarts')|addslashes}", + async: true, + dataType: "JSON", + data: { + ajax: "1", + token: "{getAdminToken tab='AdminCarts'}", + tab: "AdminCarts", + action: "updateRoomOccupancy", + params: params, + }, + success : function(response) { + updateCartLine(response.curr_booking_info, cart_row); + updateCartSummaryData(response.cart_info); + } + }); + } + + function updateCartLine(data, cart_row) { $(cart_row).find('.cart_line_total_rooms_price').html(data.amt_with_qty); $(cart_row).find('.cart_line_total_price').html(data.total_price); @@ -1807,6 +2027,23 @@ +{strip} + {addJsDef max_child_age=$max_child_age} + {addJsDef max_child_in_room=$max_child_in_room} + {addJsDefL name='select_age_txt'}{l s='Select age' js=1}{/addJsDefL} + {addJsDefL name='under_1_age'}{l s='Under 1' js=1}{/addJsDefL} + {addJsDefL name='room_txt'}{l s='Room' js=1}{/addJsDefL} + {addJsDefL name='rooms_txt'}{l s='Rooms' js=1}{/addJsDefL} + {addJsDefL name='remove_txt'}{l s='Remove' js=1}{/addJsDefL} + {addJsDefL name='adult_txt'}{l s='Adult' js=1}{/addJsDefL} + {addJsDefL name='adults_txt'}{l s='Adults' js=1}{/addJsDefL} + {addJsDefL name='child_txt'}{l s='Child' js=1}{/addJsDefL} + {addJsDefL name='children_txt'}{l s='Children' js=1}{/addJsDefL} + {addJsDefL name='below_txt'}{l s='Below' js=1}{/addJsDefL} + {addJsDefL name='years_txt'}{l s='years' js=1}{/addJsDefL} + {addJsDefL name='all_children_txt'}{l s='All Children' js=1}{/addJsDefL} + {addJsDefL name='invalid_occupancy_txt'}{l s='Invalid occupancy(adults/children) found.' js=1}{/addJsDefL} +{/strip}
diff --git a/admin/themes/default/template/controllers/orders/helpers/view/view.tpl b/admin/themes/default/template/controllers/orders/helpers/view/view.tpl index 784324e04..b84467ddd 100644 --- a/admin/themes/default/template/controllers/orders/helpers/view/view.tpl +++ b/admin/themes/default/template/controllers/orders/helpers/view/view.tpl @@ -470,7 +470,7 @@
-
+
{l s="Payment"} {$order->getOrderPayments()|@count} @@ -495,13 +495,14 @@ {/foreach} *}

{/if} -
+
+ @@ -513,6 +514,7 @@ + {/foreach} - - - - - - - - +
{l s='Date'} {l s='Payment method'}{l s='Payment source'} {l s='Transaction ID'} {l s='Amount'} {l s='Invoice'}
{dateFormat date=$payment['date_add'] full=true} {$payment['payment_method']|escape:'html':'UTF-8'}{$payment_types[$payment['payment_type']]['name']|escape:'html':'UTF-8'} {$payment['transaction_id']|escape:'html':'UTF-8'} {displayPrice price=$payment['real_paid_amount'] currency=$payment['id_currency']} @@ -569,57 +571,91 @@
- {l s='No payment methods are available'} + {l s='No payment records'}
-
- -
- -
-
-
- - - {foreach from=$payment_methods item=payment_method} - - - - - - - - {if count($invoices_collection) > 0} - - {/if} - - -
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+
+
+ +
+ + + {foreach from=$payment_methods item=payment_method} + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ {if count($invoices_collection) > 0} + +
+ +
+ {/if} +
+ + +
{if (!$order->valid && sizeof($currencies) > 1)}
@@ -1022,6 +1058,64 @@
+ {if is_array($returns) && count($returns)} +
+
+ {l s='Refunds'} +
+ + + + + + + + + {foreach from=$returns item=return_info} + + + + + {/foreach} + +
{l s='Refund ID'}{l s='Status'}
+ #{$return_info.id_order_return} + + {capture name=refund_status} + {if isset($return_info.payment_mode) && $return_info.payment_mode != ''}{l s='Payment Mode: '}{$return_info.payment_mode}
{/if} + {if isset($return_info.id_transaction) && $return_info.id_transaction != ''}{l s='Transaction ID: '}{$return_info.id_transaction}
{/if} + {if isset($return_info.id_return_type) && isset($return_info.return_type) && $return_info.id_return_type && $return_info.return_type} + {if $return_info.return_type == OrderReturn::RETURN_TYPE_CART_RULE} + {l s='Voucher ID: '} + + #{$return_info.id_return_type} + + {elseif $return_info.return_type == OrderReturn::RETURN_TYPE_ORDER_SLIP} + {l s='Credit Slip ID: '} + #{$return_info.id_return_type} + + {l s='Download' mod='hotelreservationsystem'} + + {/if} +
+ {/if} + {if isset($return_info.id_cart_rule) && $return_info.id_cart_rule} + {l s='Voucher ID: '} + + #{$return_info.id_cart_rule} + +
+ {/if} + {/capture} + + {if $smarty.capture.refund_status|trim != ''} + {$smarty.capture.refund_status} + {else} + {$return_info.state_name} + {/if} +
+
+ {/if} {hook h="displayAdminOrderRight" id_order=$order->id}
@@ -1034,7 +1128,7 @@ -
+
{l s='Rooms In This Order'} {$order_detail_data|@count} @@ -1054,6 +1148,7 @@
{l s='Room Type'} {l s='Hotel Name'} {l s='Duration'}{l s='Occupancy'} {l s='Unit Price (Tax excl.)'} {l s='Total Price (Tax incl.)'}