Untitled
plain_text
a month ago
122 kB
1
Indexable
Never
var ADMIN_HOTEL_EXTEND = { init: function () { Number.prototype.formatCurrency = function(){ return this.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); }; $(document).ready(function () { $("#tlb-list-room-price .btn-show-detail").on("click", function (e) { $('.box-form-update-room-price-by-calendar').removeClass('hidden'); window.scrollTo({ top: 280, left: 0, behavior: "smooth" }); if (!$(this).hasClass("on-detail")) { // check popup and popup active not show $(this).removeClass("on-detail").addClass("on-detail") $('#popup-detail-rp').css('display', 'block') const hotel_id = $(this).attr("hotel_id"); const rname = $(this).attr("rname") const rtypename = $(this).attr("rtypename") let priceStock = parseInt($(this).attr("rprice")); const room_id = $(this).attr("room_id") $('.price-one-night').text(`${priceStock.toLocaleString('en-US')} VND/ 1 đêm`) // show roomprice in popup $('.price-one-night-hidden').text(priceStock); // show price stock of room $('.rp-name').text(rname); // show name of room $('.price-input-change-date').removeAttr('value').attr('value', Intl.NumberFormat().format(priceStock)) // set value price stock to get when you need $('.button-view-by-price').addClass('button-view-by-active'); $('.calendar-container-note-by-price').css('display', 'flex') $('.calendar-container-note-by-rule').css('display', 'none'); $('.button-view-by-rule').removeClass('button-view-by-active') const urlChangeHotelPrices = URL_DATA_JSON + 'hotel/' + hotel_id + "/hotel_change_prices.json"; // fetch changed prices in file json const urlHotelPrices = URL_DATA_JSON + 'hotel/' + hotel_id + "/hotel_prices.json"; // fetch room prices in file json fetchData(urlHotelPrices, urlChangeHotelPrices) .then(function ([dataHotelPrices, dataChangeJson]) { function formatDate(date) { // Format form dd/mm/yyyy -> yyy-mm-dd let dateFormat = date.split('/'); return `${dateFormat[2]}-${dateFormat[1]}-${dateFormat[0]}`; } function formatDate_dd_mm_yyyy(date) { // Format form dd/mm/yyyy -> yyy-mm-dd let dateFormat = date.split('-'); return `${dateFormat[2]}-${dateFormat[1]}-${dateFormat[0]}`; } const sourceObj = dataHotelPrices?.[rname]?.[rtypename] || {}; let arrData = []; let listCondition = [] colorArr = ['#E57C23', '#47A992', '#482121']; // order: rule, promo, voucher colorArrLoop = ['#a95c1c', '#2a695a', '#7b3e3e']; // order: rule, promo, voucher sourceObj && Object.keys(sourceObj).length > 0 && Object.keys(sourceObj).map((itemType, indexType) => { let objSelect = sourceObj[itemType]; objSelect && Object.keys(objSelect).length && Object.keys(objSelect).map((item, index) => { let objSelectItem = objSelect[item]; listCondition.push({ id: objSelectItem.id, name: objSelectItem.name }); objSelectItem.single?.length > 0 && objSelectItem.single.map((item2, index2) => { // handle single let temp = {} let itemEnd = new Date(formatDate(item2.d_end)); let itemEndNext = new Date(itemEnd.getFullYear(), itemEnd.getMonth(), itemEnd.getDate() + 2); temp.title = `⇌ ${item}`; temp.start = formatDate(item2.d_start); temp.end = itemEndNext.toISOString().split('T')[0]; temp.priceObj = objSelectItem.discount; temp.type = itemType; temp.backgroundColor = colorArr[indexType]; temp.isLoop = 'single'; temp.typeId = objSelectItem.id; arrData.push(temp) }) objSelectItem.loop?.length > 0 && objSelectItem.loop.map((item3, index3) => { //handle loop let arr = []; let currentDate = new Date(formatDate(item3.d_start)); let targetDate = new Date(formatDate(item3.d_end)); while (currentDate <= targetDate) { if (currentDate.getDay() === (parseInt(item3.day_of_week) - 1) || currentDate.getDay() === (parseInt(item3.day_of_week) - 8)) { // SUNDAY in vera sys = 8 // arr.push(currentDate) let temp = {} temp.title = `↺ ${item}`; temp.start = new Date(currentDate).toISOString().split('T')[0]; temp.end = new Date(currentDate.setDate(currentDate.getDate() + 1)).toISOString().split('T')[0]; temp.priceObj = objSelectItem.discount; temp.type = itemType; temp.backgroundColor = colorArrLoop[indexType]; temp.isLoop = 'loop'; temp.typeId = objSelectItem.id; arrData.push(temp) } currentDate.setDate(currentDate.getDate() + 1); } }) objSelectItem.special?.length > 0 && objSelectItem.special.map((item4, index3) => { //handle loop let temp = {} temp.title = `↝ ${item}`; temp.priceObj = objSelectItem.discount; temp.type = itemType; temp.backgroundColor = colorArrLoop[indexType]; temp.isLoop = 'special'; temp.typeId = objSelectItem.id; temp.specialObj = item4; arrData.push(temp) }) }) }) let htmlListCondition = ''; listCondition.map((item, index) => { htmlListCondition += `<input type="checkbox" id="${item.id}"></input> <label for="${item.id}">${item.name}</label><br/>` }) function formatPriceWithDot(price) { const priceInt = parseInt(price); return priceInt.formatCurrency(); // return priceInt.toLocaleString('en-US', { currency: 'VND' }); } function formatPriceRemoveDot(price) { return parseInt(price.replaceAll(',', '')); } function checkMonthLoaded(data, dataNext) { const map = new Set(); data.map((item) => { if (!map.has[item.end]) { map.add(item.end); } }) for (let i = 0; i < dataNext.length; i++) { if (map.has(dataNext[i].end)) { return true; } } // if(data[data.length-1].id == dataNext[dataNext.length-1].id) { // return true // } return false } function refeshDataCalendar(className, data, currentMonth = "") { $(className).fullCalendar("destroy"); $(className).fullCalendar({ themeSystem: "bootstrap4", height: 700, locale: "vi", header: { left: "prev, next", center: "title", right: "today" }, defaultDate: new Date(currentMonth), events: data || [], //result arrData eventClick: function (info) { var obj_this_room = $(this); let hotelPricesInfo = ""; const isClosed = info.isClosed ? "checked" : ""; const hotel_is_included_fee = dataHotelPrices.hotel_is_included_fee; hotelPricesInfo += ` <div class='sbold'>Trạng thái phòng:</div> <input type='checkbox' id='isClosed' ${isClosed} disabled value='1' name='isClosed'></input> <label style="transform: translateY(-3px);" for='isClosed'>Đóng phòng</label><br/> <div class='sbold'>Điều kiện giá phòng:</div> `; let isUnchecked = (valueUnchecked = ""); info.detail?.map((item, index) => { if (item.isUnchecked == true) return; isUnchecked = item.isUnchecked ? "" : "checked"; valueUnchecked = item.isUnchecked ? 'value="0"' : 'value="1"'; if (item.type == "rule") { if (item.priceObj.suffix == "VND") { hotelPricesInfo += `<input type='checkbox' id='${ item.typeId }_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${ item.type }|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-suffix='VND' data-type='${ item.priceObj?.type }' data-price_vnd='${ item.priceObj?.price_vnd }' data-condition='rule' ${valueUnchecked} name='${ item.type }|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${ item.typeId }_${index}'>${item.title}: ${ item.priceObj?.type }${formatPriceWithDot( item.priceObj?.price_vnd )} VNĐ</label><br/>`; } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-suffix='%' data-type='${item.priceObj?.type}' data-price_percent='${item.priceObj?.price_percent}' data-condition='rule' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: ${item.priceObj?.type}${item.priceObj?.price_percent}%</label><br/>`; } } else if (item.type == "promo") { // Process promo % only hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-price_percent='${item.priceObj?.price_percent}' data-condition='promo' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.price_percent} %</label><br/>`; } else { if (item.priceObj.voucher_type == 1) { hotelPricesInfo += `<input type='checkbox' id='${ item.typeId }_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${ item.type }|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-voucher_price='${ item.priceObj?.voucher_price }' data-voucher_type='1' data-condition='voucher' ${valueUnchecked} name='${ item.type }|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${ item.typeId }_${index}'>${ item.title }: -${formatPriceWithDot( item.priceObj?.voucher_price )} VNĐ</label><br/>`; } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-voucher_percent='${item.priceObj?.voucher_percent}' data-voucher_type='2' data-condition='voucher' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.voucher_percent} %</label><br/>`; } } }); if (info.detail.length == 0) { hotelPricesInfo += "Chưa có điều kiện giá phòng nào.<br/>"; } if (dataHotelPrices.hotel_is_included_fee == "0") { hotelPricesInfo += `Giá đã bao gồm hoa hồng. (${dataHotelPrices.hotel_fee}%)`; } $(".info-prices-title").html( "Giá sau khi thay đổi (theo đêm):" ); //set title $(".info-prices-price").html(info.title); // set gia $(".info-prices-price-hidden").html(info.price); // set gia $(".list-change-price") .html(hotelPricesInfo) .addClass("show-list-change-price"); $(".list-checkbox-change-price").html(hotelPricesInfo); // set $(".custom-edit-price").addClass("show-custom-edit-price"); $(".current-date-selected").val(info.start._i); $(".display-current-date-selected").text( `Ngày đang chọn: ${formatDate_dd_mm_yyyy(info.start._i)}` ); obj_this_room.addClass(formatDate_dd_mm_yyyy(info.start._i)); if (info.inputChange) { const inputChange = parseInt( info.inputChange.replace(",", "").replace(",", "") ); $(".price-input-change-date") .css("display", "none") .val(Intl.NumberFormat().format(inputChange)); $(".reset-change-by-date").css("display", "inline"); } else { $(".price-input-change-date") .css("display", "none") .val(Intl.NumberFormat().format(priceStock)); $(".reset-change-by-date").css("display", "none"); } if (info.price) { $(".price-input-change-final").val( Intl.NumberFormat().format(info.price) ); } else { $(".price-input-change-final").val( Intl.NumberFormat().format(priceStock) ); } $(".form-hotel-id").val(hotel_id); $(".form-room-id").val(room_id); $(".form-room-index").val(rtypename); $("#form-change-by-date").removeClass("show-form-change"); $(".info-price-and-edit").css("display", "block"); $(".form-price-change-rule").val(0); $(".form-price-change-promo").val(0); $(".form-price-change-voucher").val(0); $(".form-price-change-rose").val(0); $(".info-price-rose-container").css("display", "none"); // $('.price-input-change-final').removeAttr("value") setDisplayPriceAfterChange(info.price); }, }); } function refeshDataCalendar_by_rule(classname, data, dataPrice, currentMonth = '') { $('#calendar_detail').fullCalendar("destroy"); $(classname).fullCalendar("destroy"); $(classname).fullCalendar({ themeSystem: 'bootstrap4', height: 700, locale: 'vi', header: { left: "prev, next", center: "title", right: "today" }, // editable: !0, defaultDate: new Date(currentMonth), events: data || [], eventClick: function (itemEvent) { switch (itemEvent.type) { case "condition": let info_rule = ''; itemEvent.detail?.map((item) => { if (item.type == 'rule') { if (item.priceObj.suffix == 'VND') { info_rule += ` <div class="sbold">Rule giá phòng:</div> <label>${item.title}: ${item.priceObj?.type}${formatPriceWithDot(item.priceObj?.price_vnd)} VNĐ</label><br/>` } else { info_rule += `<div class="sbold">Rule giá phòng:</div> <label>${item.title}: ${item.priceObj?.type}${item.priceObj?.price_percent}%</label><br/>` } } else if (item.type == 'promo') { // Process promo % only info_rule += `<div class="sbold">Promo:</div> <label> ${item.title}: -${item.priceObj?.price_percent} %</label><br/>` } else { if (item.priceObj.voucher_type == 1) { info_rule += `<div class="sbold">Voucher:</div> <label'>${item.title}: -${formatPriceWithDot(item.priceObj?.voucher_price)} VNĐ</label><br/>`; } else { info_rule += `<div class="sbold">Voucher:</div> <label> ${item.title}: -${item.priceObj?.voucher_percent} %</label><br/>`; } } }) if (info_rule == '') info_rule = 'Ngày không bị ảnh hưởng bởi điều kiện nào.'; $('.calendar-container-notification').empty(); $('.info-show-info-rule').html(info_rule); $('.popup-info-show-info-rule').css('display', 'block') $('.display-current-date-selected').text(`Ngày đang chọn: ${formatDate_dd_mm_yyyy(itemEvent.start._i)}`) $('.info-price-and-edit').css('display', 'none'); $('.list-change-price').removeClass('show-list-change-price').empty(); break; case "price": let hotelPricesInfo = ''; const isClosed = itemEvent.isClosed ? 'checked' : ''; hotelPricesInfo += ` <div class='sbold'>Trạng thái phòng:</div> <input type='checkbox' id='isClosed' ${isClosed} disabled value='1' name='isClosed'></input> <label style="transform: translateY(-3px);" for='isClosed'>Đóng phòng</label><br/> <div class='sbold'>Điều kiện giá phòng:</div> `; itemEvent.detail?.map((item, index) => { if(item.isUnchecked == true) return; const isUnchecked = item.isUnchecked ? '' : 'checked' const valueUnchecked = item.isUnchecked ? 'value="0"' : 'value="1"' if (item.type == 'rule') { if (item.priceObj.suffix == 'VND') { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-suffix='VND' data-type='${item.priceObj?.type}' data-price_vnd='${item.priceObj?.price_vnd}' data-condition='rule' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: ${item.priceObj?.type}${formatPriceWithDot(item.priceObj?.price_vnd)} VNĐ</label><br/>` } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-suffix='%' data-type='${item.priceObj?.type}' data-price_percent='${item.priceObj?.price_percent}' data-condition='rule' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: ${item.priceObj?.type}${item.priceObj?.price_percent}%</label><br/>` } } else if (item.type == 'promo') { // Process promo % only hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-price_percent='${item.priceObj?.price_percent}' data-condition='promo' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.price_percent} %</label><br/>` } else { if (item.priceObj.voucher_type == 1) { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-voucher_price='${item.priceObj?.voucher_price}' data-voucher_type='1' data-condition='voucher' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: -${formatPriceWithDot(item.priceObj?.voucher_price)} VNĐ</label><br/>`; } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-voucher_percent='${item.priceObj?.voucher_percent}' data-voucher_type='2' data-condition='voucher' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.voucher_percent} %</label><br/>`; } } }) // kiem tra ngay dang cho co data hay khong $('.info-show-info-rule').empty(); $('.popup-info-show-info-rule').css('display', 'none') $('.calendar-container-notification').empty(); $('.info-prices-title').html('Giá sau khi thay đổi (theo đêm):') //set title $('.info-prices-price').html(itemEvent?.titlePrice) // set gia $('.info-prices-price-hidden').html(itemEvent?.price) // set gia $('.list-change-price').html(hotelPricesInfo).addClass("show-list-change-price"); $('.list-checkbox-change-price').html(hotelPricesInfo); // set $('.custom-edit-price').addClass('show-custom-edit-price'); $('.current-date-selected').val(itemEvent?.start); $('.display-current-date-selected').text(`Ngày đang chọn: ${formatDate_dd_mm_yyyy(itemEvent.start._i)}`) // $('.price-input-change-date').css('display', 'none').val(priceStock); if (itemEvent.inputChange) { const inputChange = parseInt((itemEvent.inputChange).replaceAll(',', '')); $('.price-input-change-date').css('display', 'none').val(Intl.NumberFormat().format(inputChange)); $('.reset-change-by-date').css('display', 'inline'); } else { $('.price-input-change-date').css('display', 'none').val(Intl.NumberFormat().format(priceStock)); $('.reset-change-by-date').css('display', 'none'); } $('.form-hotel-id').val(hotel_id); $('.form-room-id').val(room_id); $('.form-room-index').val(rtypename); $('#form-change-by-date').removeClass('show-form-change') $('.info-price-and-edit').css('display', 'block'); $('.form-price-change-rule').val(0); $('.form-price-change-promo').val(0); $('.form-price-change-voucher').val(0); $('.form-price-change-rose').val(0); break; default: break; } }, dayClick: function (date, allDay, jsEvent, view) { const dateFormat = (date._d).toISOString().split('T')[0]; const dataDayClicked = dataPrice.find((item) => { if (item.start == dateFormat) { return item; } }); let hotelPricesInfo = ''; dataDayClicked?.detail?.map((item, index) => { const isUnchecked = item.isUnchecked ? '' : 'checked' const valueUnchecked = item.isUnchecked ? 'value="0"' : 'value="1"' if (item.type == 'rule') { if (item.priceObj.suffix == 'VND') { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-suffix='VND' data-type='${item.priceObj?.type}' data-price_vnd='${item.priceObj?.price_vnd}' data-condition='rule' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: ${item.priceObj?.type}${formatPriceWithDot(item.priceObj?.price_vnd)} VNĐ</label><br/>` } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-suffix='%' data-type='${item.priceObj?.type}' data-price_percent='${item.priceObj?.price_percent}' data-condition='rule' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: ${item.priceObj?.type}${item.priceObj?.price_percent}%</label><br/>` } } else if (item.type == 'promo') { // Process promo % only hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-price_percent='${item.priceObj?.price_percent}' data-condition='promo' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.price_percent} %</label><br/>` } else { if (item.priceObj.voucher_type == 1) { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'> </input> <input type='hidden' class="input-hidden" data-voucher_price='${item.priceObj?.voucher_price}' data-voucher_type='1' data-condition='voucher' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'>${item.title}: -${formatPriceWithDot(item.priceObj?.voucher_price)} VNĐ</label><br/>`; } else { hotelPricesInfo += `<input type='checkbox' id='${item.typeId}_${index}' ${isUnchecked} disabled ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <input type='hidden' class="input-hidden" data-voucher_percent='${item.priceObj?.voucher_percent}' data-voucher_type='2' data-condition='voucher' ${valueUnchecked} name='${item.type}|${item.isLoop}|${item.typeId}'></input> <label style="transform: translateY(-3px);" for='${item.typeId}_${index}'> ${item.title}: -${item.priceObj?.voucher_percent} %</label><br/>`; } } }) // kiem tra ngay dang cho co data hay khong $('.info-show-info-rule').empty(); if (dataDayClicked) { $('.calendar-container-notification').empty(); $('.info-prices-title').html('Giá sau khi thay đổi (theo đêm):') //set title $('.info-prices-price').html(dataDayClicked?.title) // set gia $('.info-prices-price-hidden').html(dataDayClicked?.price) // set gia $('.list-change-price').html(hotelPricesInfo).addClass("show-list-change-price"); $('.list-checkbox-change-price').html(hotelPricesInfo); // set $('.custom-edit-price').addClass('show-custom-edit-price'); $('.current-date-selected').val(dataDayClicked?.start); $('.display-current-date-selected').text(`Ngày đang chọn: ${formatDate_dd_mm_yyyy(dataDayClicked?.start)}`) $('.price-input-change-date').css('display', 'none').val(Intl.NumberFormat().format(priceStock)); $('.form-hotel-id').val(hotel_id); $('.form-room-id').val(room_id); $('.form-room-index').val(rtypename); $('#form-change-by-date').removeClass('show-form-change') $('.info-price-and-edit').css('display', 'block'); } else { $('.info-price-and-edit').css('display', 'none') // an gia cua ngay do $('.list-change-price').removeClass('show-list-change-price').css('display', 'none') // an list rule cua ngay trc $('.calendar-container-notification').text("Ngày vừa chọn đang thuộc tháng chưa được tải dữ liệu lên. Về chế độ xem theo giá để tải.") } } }) } function convert_date_vn_to_en(dateString) { const [, monthIndex, year] = dateString.split(" "); const monthName = new Date(year, parseInt(monthIndex) - 1).toLocaleString('en', { month: 'long' }); return `${monthName} ${year}`; } function calendarRecursive(firstDay, lastDay, data, price) { let priceStock = parseInt(price) let result = []; if (firstDay <= lastDay) { let temp = {}; let listType = []; let totalPrice = priceStock; let priceRoomByRule = totalPrice; let isClosed = false; firstDay.setDate(firstDay.getDate() + 1); let encodedFirstDay = firstDay.toISOString().split('T')[0]; let count = 0; let exitRule = false; let checkPromo = false; let checkVoucher = false; let checkPromoShow = false; let checkVoucherShow = false; let priceTemp = 0; let ruleQueue = []; let priceRuleTemp = 0; let priceCheckColor = 0; if (data.length > 0) { // co bat ky dieu kien gia data.map((item, index) => { const key = `${room_id}|${rtypename}|${encodedFirstDay}` if (item.isLoop == "special" || item.start == encodedFirstDay || ((encodedFirstDay > item.start && firstDay <= new Date(item.end)))) { if (!!dataChangeJson && dataChangeJson[key]) { // trường hợp ngày custom giá temp.inputChange = dataChangeJson[key]['price_change_by_date'] ? dataChangeJson[key]['price_change_by_date'] : null; isClosed = dataChangeJson[key]['isClosed'] ? true : false; isClosed ? temp.backgroundColor = '#C8C6C6' : temp.backgroundColor = "#85b5cd"; totalPrice = parseInt(dataChangeJson[key]['price_final']); isClosed = dataChangeJson[key]['isClosed'] ? true : false; const itemType = item.type; const itemTypeId = item.typeId; const datadataChangeJsonKey = dataChangeJson[key]; const listOfType = datadataChangeJsonKey[itemType] ? datadataChangeJsonKey[itemType] : undefined; const listChecking = (listOfType && listOfType.idx) ? listOfType.idx : []; let itemClone = {}; if (!listOfType || (listChecking.length > 0 && listChecking.includes(itemTypeId) === false)) { itemClone = structuredClone(item); itemClone.isUnchecked = true; listType.push(itemClone); itemClone = {}; } else { itemClone = structuredClone(item); itemClone.isUnchecked = false; listType.push(itemClone); itemClone = {}; } count = -1; } else { // trường hợp ngày chưa custom giá let itemClone = structuredClone(item); itemClone.isUnchecked = false; // listType.push(itemClone); switch (itemClone.type) { case 'rule': listType.push(itemClone); break; case 'promo': if (!checkPromoShow) { listType.push(itemClone); checkPromoShow = true; } break; case 'voucher': if (!checkVoucherShow) { listType.push(itemClone); checkVoucherShow = true; } break; default: break; } // trường họp type là rule if(item.type === 'rule') { priceRuleTemp = totalPrice; ruleQueue.push(item); totalPrice += calculatePrices(totalPrice, priceStock, item.priceObj, item.type); priceCheckColor = totalPrice; } else { if (item.type == 'promo') { if (!checkPromo) { if(priceRuleTemp !== 0) { totalPrice = priceRuleTemp } totalPrice += calculatePrices(priceRoomByRule, priceStock, item.priceObj, item.type); priceTemp = totalPrice; checkPromo = true; if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee); priceCheckColor = totalPrice; if(ruleQueue.length > 0) { let priceCalRule = 0; priceCalRule = totalPrice/(100+hotel_fee)*100; totalPrice = priceCalRule; priceCheckColor = priceCalRule; ruleQueue.map(item1 => { totalPrice += calculatePrices(priceCalRule, priceStock, item1.priceObj, item1.type); }) } else { priceCheckColor = totalPrice/(100+hotel_fee)*100; } } else { priceCheckColor = totalPrice; if(ruleQueue.length > 0) { ruleQueue.map(item1 => { totalPrice += calculatePrices(totalPrice, priceStock, item1.priceObj, item1.type); }) } } } } if(item.type == 'voucher') { if (item.isLoop === 'loop' || item.isLoop === "single") { if (!checkVoucher) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { let priceToCalVoucher; const hotel_fee = parseInt(dataHotelPrices.hotel_fee) if(priceTemp !== 0 ) { totalPrice = priceTemp; } if( priceTemp == 0 && priceRuleTemp !== 0) { totalPrice = priceRuleTemp; } priceToCalVoucher = totalPrice/(100+hotel_fee)*100; if(priceCheckColor !== 0) { priceCheckColor = priceToCalVoucher; } let priceToCalVoucherWithRule = 0; if(ruleQueue.length > 0) { ruleQueue.map(item => { totalPrice = priceToCalVoucher; totalPrice += calculatePrices(priceToCalVoucher, priceStock, item.priceObj, item.type); priceToCalVoucherWithRule = totalPrice; }) totalPrice += calculatePrices(priceToCalVoucherWithRule, priceStock, item.priceObj, item.type); totalPrice = totalPrice + totalPrice/100*hotel_fee; } else { totalPrice = priceToCalVoucher; totalPrice += calculatePrices(totalPrice, priceStock, item.priceObj, item.type); totalPrice += totalPrice/100*hotel_fee checkVoucher = true; } } else { let currentPrice = totalPrice; totalPrice += calculatePrices(currentPrice, priceStock, item.priceObj, item.type); } } } else { if (!checkVoucher) { if (item.isLoop === 'special' && priceRoomByRule > formatPriceRemoveDot(item.specialObj?.v_price)) { let currentPrice = totalPrice; totalPrice += calculatePrices(currentPrice, priceStock, item.priceObj, item.type); } } } checkVoucher = true; } // promo vs voucher vai tro nhu nhau nen tinh theo gia cua phong theo rule exitRule = true; // lan sau khong cong gia hoa hong vao nua count = -1; // da cong hoa hong thi ben duoi k can cong nua } } temp.start = encodedFirstDay; temp.end = encodedFirstDay; temp.type = item.title; temp.isLoop = item.isLoop; temp.typeId = item.typeId; // listType.push(item); } else { // truong hop co rule nhung khong thuoc ngay trong data change if (!!dataChangeJson && dataChangeJson[key]) { totalPrice = parseInt(dataChangeJson[key]['price_final']); count = -1; isClosed = dataChangeJson[key]['isClosed'] ? true : false; isClosed ? temp.backgroundColor = '#C8C6C6' : temp.backgroundColor = "#85b5cd"; temp.inputChange = dataChangeJson[key]['price_change_by_date'] ? dataChangeJson[key]['price_change_by_date'] : null; } } return result; }) } else { // khong co bat ky dieu kien gia count = -1; const key = `${room_id}|${rtypename}|${encodedFirstDay}` if (dataChangeJson && dataChangeJson[key]) { totalPrice = parseInt(dataChangeJson[key]['price_final']); isClosed = dataChangeJson[key]['isClosed'] ? true : false; isClosed ? temp.backgroundColor = '#C8C6C6' : temp.backgroundColor = "#85b5cd"; temp.inputChange = dataChangeJson[key]['price_change_by_date'] ? dataChangeJson[key]['price_change_by_date'] : null; } } if (count == 0) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = totalPrice + totalPrice / 100 * hotel_fee; } } count = 0; if (temp.backgroundColor === undefined) { if (totalPrice > priceCheckColor) { temp.backgroundColor = '#b34c60' } else temp.backgroundColor = '#53B987'; if (isClosed) temp.backgroundColor = '#C8C6C6'; } temp.start = encodedFirstDay; temp.end = encodedFirstDay; temp.title = isClosed ? 'Tạm đóng' : `${Math.round(totalPrice).toLocaleString('en-US', { currency: 'VND' })} VND`; temp.isClosed = isClosed; temp.price = totalPrice; temp.detail = listType; result.push(temp); totalPrice = priceStock; temp = {}; listType = []; result.push(...calendarRecursive(firstDay, lastDay, data, price)); } return result; } function calendarForRuleRecursive(firstDay, lastDay, data, price) { let priceStock = parseInt(price) let result = []; if (firstDay <= lastDay) { let temp = {}; let tempRule = {}; let listType = []; let isClosed = false; let totalPrice = priceStock; let priceRoomByRule = totalPrice; let count = 0; let priceTemp = 0; let priceRuleTemp = 0; let checkPromo = false; let checkVoucher = false; let checkPromoShow = false; let checkVoucherShow = false; let exitRule = false; let ruleQueue = []; let priceCheckColor = 0; firstDay.setDate(firstDay.getDate() + 1); let encodedFirstDay = firstDay.toISOString().split('T')[0]; if (data.length > 0) { data.map((item, index) => { const key = `${room_id}|${rtypename}|${encodedFirstDay}` if (item.isLoop == "special" || item.start == encodedFirstDay || ((encodedFirstDay > item.start && firstDay <= new Date(item.end)))) { if (!!dataChangeJson && dataChangeJson[key]) { temp.inputChange = dataChangeJson[key]['price_change_by_date'] ? dataChangeJson[key]['price_change_by_date'] : null; totalPrice = parseInt(dataChangeJson[key]['price_final']); isClosed = dataChangeJson[key]['isClosed'] ? true : false; const itemType = item.type; const itemTypeId = item.typeId; const datadataChangeJsonKey = dataChangeJson[key]; const listOfType = datadataChangeJsonKey[itemType]; const listChecking = (listOfType && listOfType.idx) ? listOfType.idx : []; if (listOfType == undefined || (listChecking.length !== 0 && listChecking.includes(itemTypeId) === false)) { let itemClone = structuredClone(item); itemClone.isUnchecked = true; isClosed ? temp.backgroundColor = '#C8C6C6' : temp.backgroundColor = "#85b5cd"; listType.push(itemClone); } else { let itemClone = structuredClone(item); itemClone.isUnchecked = false; listType.push(itemClone); } count = -1; } else { // item.isUnchecked = false; let itemClone = structuredClone(item); itemClone.isUnchecked = false; // listType.push(itemClone); switch (itemClone.type) { case 'rule': listType.push(itemClone); break; case 'promo': if (!checkPromoShow) { listType.push(itemClone); checkPromoShow = true; } break; case 'voucher': if (!checkVoucherShow) { listType.push(itemClone); checkVoucherShow = true; } break; default: break; } if(item.type === 'rule') { priceRuleTemp = totalPrice; ruleQueue.push(item); totalPrice += calculatePrices(totalPrice, priceStock, item.priceObj, item.type); priceCheckColor = totalPrice; } else { if (item.type == 'promo') { if (!checkPromo) { if(priceRuleTemp !== 0) { totalPrice = priceRuleTemp } totalPrice += calculatePrices(priceRoomByRule, priceStock, item.priceObj, item.type); priceTemp = totalPrice; checkPromo = true; if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee); priceCheckColor = totalPrice; if(ruleQueue.length > 0) { let priceCalRule = 0; priceCalRule = totalPrice/(100+hotel_fee)*100; totalPrice = priceCalRule; priceCheckColor = priceCalRule; ruleQueue.map(item1 => { totalPrice += calculatePrices(priceCalRule, priceStock, item1.priceObj, item1.type); }) } else { priceCheckColor = totalPrice/(100+hotel_fee)*100; } } else { priceCheckColor = totalPrice; if(ruleQueue.length > 0) { ruleQueue.map(item1 => { totalPrice += calculatePrices(totalPrice, priceStock, item1.priceObj, item1.type); }) } } } } else { if (item.isLoop === 'loop' || item.isLoop === "single") { if (!checkVoucher) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { let priceToCalVoucher; const hotel_fee = parseInt(dataHotelPrices.hotel_fee) if(priceTemp !== 0 ) { totalPrice = priceTemp; } if( priceTemp == 0 && priceRuleTemp !== 0) { totalPrice = priceRuleTemp; } priceToCalVoucher = totalPrice/(100+hotel_fee)*100; if(priceCheckColor !== 0) { priceCheckColor = priceToCalVoucher; } let priceToCalVoucherWithRule = 0; if(ruleQueue.length > 0) { ruleQueue.map(item => { totalPrice = priceToCalVoucher; totalPrice += calculatePrices(priceToCalVoucher, priceStock, item.priceObj, item.type); priceToCalVoucherWithRule = totalPrice; }) totalPrice += calculatePrices(priceToCalVoucherWithRule, priceStock, item.priceObj, item.type); totalPrice = totalPrice + totalPrice/100*hotel_fee; } else { totalPrice = priceToCalVoucher; totalPrice += calculatePrices(totalPrice, priceStock, item.priceObj, item.type); totalPrice += totalPrice/100*hotel_fee checkVoucher = true; } } else { let currentPrice = totalPrice; totalPrice += calculatePrices(currentPrice, priceStock, item.priceObj, item.type); } } } else { if (!checkVoucher) { if (item.isLoop === 'special' && priceRoomByRule > formatPriceRemoveDot(item.specialObj?.v_price)) { let currentPrice = totalPrice; totalPrice += calculatePrices(currentPrice, priceStock, item.priceObj, item.type); checkVoucher = true; } } } } // promo vs voucher vai tro nhu nhau nen tinh theo gia cua phong theo rule exitRule = true; // lan sau khong cong gia hoa hong vao nua count = -1; // da cong hoa hong thi ben duoi k can cong nua } } temp.start = encodedFirstDay; temp.end = encodedFirstDay; temp.type = item.title; temp.isLoop = item.isLoop; temp.typeId = item.typeId; // listType.push(item); } return result; }) } else { // khong co bat ky dieu kien gia count = -1; const key = `${room_id}|${rtypename}|${encodedFirstDay}` if (dataChangeJson && dataChangeJson[key]) { totalPrice = parseInt(dataChangeJson[key]['price_final']); isClosed = dataChangeJson[key]['isClosed'] ? true : false; isClosed ? temp.backgroundColor = '#C8C6C6' : temp.backgroundColor = "#85b5cd"; temp.inputChange = dataChangeJson[key]['price_change_by_date'] ? dataChangeJson[key]['price_change_by_date'] : null; } } if (count == 0) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = totalPrice + totalPrice / 100 * hotel_fee; } count = 0; } if (temp.backgroundColor === undefined) { if (totalPrice > priceCheckColor) { temp.backgroundColor = '#b34c60' } else temp.backgroundColor = '#53B987'; if (isClosed) temp.backgroundColor = '#C8C6C6'; } temp.start = encodedFirstDay; temp.end = encodedFirstDay; temp.title = isClosed ? 'Tạm đóng' : `Giá`; temp.titlePrice = `${Math.round(totalPrice).toLocaleString('en-US', { currency: 'VND' })} VND` temp.isClosed = isClosed; // if(isClosed) temp.backgroundColor = "#C8C6C6"; temp.price = totalPrice; temp.detail = listType; temp.type = 'price'; tempRule.start = encodedFirstDay; tempRule.end = encodedFirstDay; tempRule.title = `Điều kiện (${listType.length})`; tempRule.type = 'condition' tempRule.detail = listType; tempRule.backgroundColor = '#213555'; result.push(tempRule); result.push(temp); totalPrice = priceStock; temp = {}; tempRule = {} listType = []; result.push(...calendarForRuleRecursive(firstDay, lastDay, data, price)); } return result; } function setDisplayPriceAfterChange(price) { $('.info-prices-price-hidden').text(price); $('.form-price-final').val(price); $('.info-prices-price').text(`${Math.round(price).toLocaleString('en-US', { currency: 'VND' })} VND`); } function setViewPriceAfterChange(price, inputprice) { $('.info-prices-price-hidden').text(price); $('.form-price-final').val(price); $('.info-prices-price').text(`${Math.round(inputprice).toLocaleString('en-US', { currency: 'VND' })} VND`); } function checkExistPromoVoucher(type) { let count = 0; if(type == 'rule') { return false; } else { const arrChecked = $('input[type=hidden].input-hidden'); arrChecked.map((item, index) => { const elementItem = index; if (elementItem.getAttribute('type') == "hidden" && index.dataset.condition == type && elementItem.value == '1') { count++; } }) if(count == 0) { return false; } else { return true; } } } function update_price() { const inputPrice = parseInt($('.price-input-change-date').val().replace(',', '').replace(',', '')); let arrElementChecked = $('input[type=hidden].input-hidden'); let totalPrice = inputPrice; // gia cua input let priceRoomByRule = totalPrice; let checkAddFee = false; let totalChangeRule = 0; arrElementChecked.map(function () { if (this.value === '1') { let priceObj = {}; priceObj.suffix = this.getAttribute('data-suffix') || undefined; priceObj.price_vnd = this.getAttribute('data-price_vnd') || undefined; priceObj.price_percent = this.getAttribute('data-price_percent') || undefined; priceObj.voucher_price = this.getAttribute('data-voucher_price') || undefined; priceObj.voucher_percent = this.getAttribute('data-voucher_percent') || undefined; priceObj.voucher_type = this.getAttribute('data-voucher_type') || undefined; priceObj.condition = this.getAttribute('data-condition') || undefined; priceObj.type = this.getAttribute('data-type') || undefined; if (priceObj.condition === 'rule') { totalPrice += calculatePrices(totalPrice, inputPrice, priceObj, priceObj.condition); totalChangeRule += calculatePrices(totalPrice, inputPrice, priceObj, priceObj.condition); $('.form-price-change-rule').val(totalChangeRule) priceRoomByRule = totalPrice } else { // promo vs voucher vai tro nhu nhau nen tinh theo gia cua phong theo rule if (!checkAddFee) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) const priceRose = totalPrice / 100 * hotel_fee; totalPrice = totalPrice + totalPrice / 100 * hotel_fee; $('.form-price-change-rose').val(priceRose); priceRoomByRule = totalPrice } if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "1") { $('.form-price-change-rose').val(0); } if(priceObj.condition === 'promo') { totalPrice += calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition); $('.form-price-change-promo').val(calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition)) } if(priceObj.condition === 'voucher') { totalPrice += calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition); $('.form-price-change-voucher').val(calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition)) } checkAddFee = true; } else { if(priceObj.condition === 'promo') { totalPrice += calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition); $('.form-price-change-promo').val(calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition)) } if(priceObj.condition === 'voucher') { totalPrice += calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition); $('.form-price-change-voucher').val(calculatePrices(priceRoomByRule, priceStock, priceObj, priceObj.condition)) } } } } }) if (!checkAddFee) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = totalPrice + totalPrice / 100 * hotel_fee; } } return setDisplayPriceAfterChange(totalPrice); } function update_price_final() { const inputPrice = parseInt($('.price-input-change-final').val().replace(',', '').replace(',', '')); let arrElementChecked = $('input[type=hidden].input-hidden'); let totalPrice = inputPrice; let inputPriceShow = inputPrice; if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) inputPriceShow = inputPriceShow + inputPriceShow/100*hotel_fee; totalPrice = inputPriceShow; } // gia cua input let priceRoomByRule = totalPrice; let checkAddFee = false; let totalChangeRule = 0; let voucherByPercent = false; let voucherPercentSave = 0; let hasPromo = false; let hasRule = false; if(arrElementChecked.length == 0) { if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { $('.form-price-standard').val(totalPrice) const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = (totalPrice * 100) / (100 + hotel_fee); const priceRose = totalPrice / 100 * hotel_fee; const roundedPriceRose = Math.round(priceRose); $('.form-price-change-rose').val(roundedPriceRose); } } else { for (let i = arrElementChecked.length - 1; i >= 0; i--) { let priceObj = {}; priceObj.suffix = arrElementChecked[i].getAttribute('data-suffix') || undefined; priceObj.price_vnd = arrElementChecked[i].getAttribute('data-price_vnd') || undefined; priceObj.price_percent = arrElementChecked[i].getAttribute('data-price_percent') || undefined; priceObj.voucher_price = arrElementChecked[i].getAttribute('data-voucher_price') || undefined; priceObj.voucher_percent = arrElementChecked[i].getAttribute('data-voucher_percent') || undefined; priceObj.voucher_type = arrElementChecked[i].getAttribute('data-voucher_type') || undefined; priceObj.condition = arrElementChecked[i].getAttribute('data-condition') || undefined; priceObj.type = arrElementChecked[i].getAttribute('data-type') || undefined; if(priceObj.condition == 'voucher' && priceObj.voucher_type !== '1') { voucherByPercent = true; voucherPercentSave = parseInt(priceObj.voucher_percent); } if(priceObj.condition == 'voucher' && priceObj.voucher_type == '1') { totalPrice += parseInt(priceObj.voucher_price); voucherPercentSave = 0; $('.form-price-change-voucher').val(Math.round(parseInt(priceObj.voucher_price))) } if(priceObj.condition == 'promo') { const promoPercent = parseInt(priceObj.price_percent) if(voucherByPercent) { totalPrice = (totalPrice / (100 - promoPercent - voucherPercentSave)) * 100; const priceChangeVoucher = totalPrice * voucherPercentSave / 100; const priceChangrPromo = totalPrice * promoPercent / 100; $('.form-price-change-voucher').val(Math.round(-priceChangeVoucher)); $('.form-price-change-promo').val(Math.round(-priceChangrPromo)); } else { const totalAfterPromo = totalPrice; totalPrice = (totalPrice / (100 - promoPercent)) * 100; $('.form-price-change-promo').val(Math.round(totalPrice - totalAfterPromo)) } hasPromo = true; } if(priceObj.condition == 'rule') { $('.form-price-standard').val(totalPrice) if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = (totalPrice * 100) / (100 + hotel_fee); const priceRose = totalPrice / 100 * hotel_fee; const roundedPriceRose = Math.round(priceRose); $('.form-price-change-rose').val(roundedPriceRose); } totalPrice += calculatePricesBack(totalPrice, totalPrice, priceObj, priceObj.condition) totalChangeRule += calculatePricesBack(totalPrice, totalPrice, priceObj, priceObj.condition) $('.form-price-change-rule').val(Math.round(-totalChangeRule)); hasRule = true } } if(!hasRule) { $('.form-price-standard').val(totalPrice) if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) totalPrice = (totalPrice * 100) / (100 + hotel_fee); const priceRose = totalPrice / 100 * hotel_fee; const roundedPriceRose = Math.round(priceRose); $('.form-price-change-rose').val(roundedPriceRose); } } } const roundedPrice = Math.round(totalPrice); if (dataHotelPrices && dataHotelPrices.hotel_is_included_fee == "0") { const hotel_fee = parseInt(dataHotelPrices.hotel_fee) const priceWithRose = inputPrice + inputPrice/100*hotel_fee; // $('.info-price-rose-price').text(priceWithRose) $('.info-price-rose-container').css('display', 'block') $('.info-price-rose-price').text(`${formatPriceWithDot(priceWithRose)} VND` ) } $('.price-input-change-date').val(roundedPrice.formatCurrency()) // return setDisplayPriceAfterChange(inputPriceShow); return setViewPriceAfterChange(inputPriceShow, inputPrice) } function calculatePrices(currentPrice, priceStock, priceObj, condition) { let caculatedPrice = 0; // Gia se duoc tinh theo thu tu rule --> promo ==== voucher // Process rule if (condition === 'rule') { const priceVnd = parseInt(priceObj.price_vnd) const pricePercent = parseInt(priceObj.price_percent) if (priceObj.suffix === 'VND') // suffix VND { if (priceObj.type === '+') { caculatedPrice = priceVnd } else { caculatedPrice = -priceVnd; } } else { // suffix % let caculatedPricePercent = (currentPrice * pricePercent) / 100; if (priceObj.type === '+') { caculatedPrice = caculatedPricePercent; } else { caculatedPrice = -caculatedPricePercent; } } } // Process promo if (condition === 'promo') { const promoPercent = parseInt(priceObj.price_percent) const pricePercent = (currentPrice * promoPercent) / 100; caculatedPrice = -pricePercent; } // Process voucher if (condition === 'voucher') { const voucherPrice = priceObj.voucher_price const voucherPercent = priceObj.voucher_percent if (priceObj.voucher_type == 1) { caculatedPrice = -voucherPrice; } else { let pricePercent = (currentPrice * voucherPercent) / 100; caculatedPrice = -pricePercent; } } return caculatedPrice; } function calculatePricesBack(currentPrice, priceStock, priceObj, condition) { let caculatedPrice = 0; if (condition === 'rule') { const priceVnd = parseInt(priceObj.price_vnd) const pricePercent = parseInt(priceObj.price_percent) if (priceObj.suffix === 'VND') // suffix VND { if (priceObj.type === '+') { caculatedPrice = -priceVnd } else { caculatedPrice = priceVnd; } } else { // suffix % let caculatedPricePercent = (currentPrice / (100- pricePercent) * 100); if (priceObj.type === '+') { caculatedPrice = -caculatedPricePercent; } else { caculatedPrice = +caculatedPricePercent; } } } return caculatedPrice; } let nowDay = new Date(); let startDay = new Date(); let firstDay = new Date(nowDay.getFullYear(), nowDay.getMonth(), 1); let lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() + 1, 0); // lastDay = new Date(firstDay.setDate(firstDay.getDate() + 30)); let dataFilter = calendarRecursive(firstDay, lastDay, arrData, priceStock); let firstDay2 = new Date(nowDay.getFullYear(), nowDay.getMonth(), 1); let lastDay2 = new Date(firstDay2.getFullYear(), firstDay2.getMonth() + 1, 0); let dataFilterRule = calendarForRuleRecursive(firstDay2, lastDay2, arrData, priceStock) $('body').on('click', 'button.fc-prev-button', function () { // handle click prev month let currentMonth = $('.fc-toolbar .fc-center').text(); currentMonth = convert_date_vn_to_en(currentMonth); let startDayOfMonth = new Date(currentMonth); let startDayNext = new Date(startDayOfMonth.getFullYear(), startDayOfMonth.getMonth(), 1); let lastDayNext = new Date(startDayOfMonth.getFullYear(), startDayOfMonth.getMonth() + 1, 0); let dataFilterNext = []; if ($('.button-view-by-price').hasClass('button-view-by-active')) { dataFilterNext = calendarRecursive(startDayNext, lastDayNext, arrData, priceStock); if (!checkMonthLoaded(dataFilter, dataFilterNext)) { let dataFilterNew = dataFilter.concat(dataFilterNext); dataFilter = dataFilterNew; } refeshDataCalendar("#calendar_detail", dataFilter, currentMonth); } if ($('.button-view-by-rule').hasClass('button-view-by-active')) { dataFilterNext = calendarForRuleRecursive(startDayNext, lastDayNext, arrData, priceStock); if (!checkMonthLoaded(dataFilterRule, dataFilterNext)) { let dataFilterNew = dataFilterRule.concat(dataFilterNext); dataFilterRule = dataFilterNew; } refeshDataCalendar_by_rule("#calendar_detail_by_rule", dataFilterRule, dataFilter, currentMonth); } }); $('body').on('click', 'button.fc-next-button', function () { // handle click next month let currentMonth = $('.fc-toolbar .fc-center').text(); currentMonth = convert_date_vn_to_en(currentMonth); let startDayOfMonth = new Date(currentMonth); let startDayNext = startDayOfMonth; let lastDayNext = new Date(startDayOfMonth.getFullYear(), startDayOfMonth.getMonth() + 1, 0); let dataFilterNext = []; if ($('.button-view-by-price').hasClass('button-view-by-active')) { dataFilterNext = calendarRecursive(startDayNext, lastDayNext, arrData, priceStock); if (!checkMonthLoaded(dataFilter, dataFilterNext)) { let dataFilterNew = dataFilter.concat(dataFilterNext); dataFilter = dataFilterNew; } refeshDataCalendar("#calendar_detail", dataFilter, currentMonth); } if ($('.button-view-by-rule').hasClass('button-view-by-active')) { dataFilterNext = calendarForRuleRecursive(startDayNext, lastDayNext, arrData, priceStock); if (!checkMonthLoaded(dataFilterRule, dataFilterNext)) { let dataFilterNew = dataFilterRule.concat(dataFilterNext); dataFilterRule = dataFilterNew; } refeshDataCalendar_by_rule("#calendar_detail_by_rule", dataFilterRule, dataFilter, currentMonth); } }); // handle click icon close form $('.close-form-change-price').on('click', function () { $('#form-change-by-date').removeClass('show-form-change'); $('.list-change-price').addClass('show-list-change-price'); $('.box-form-update-room-price-by-calendar input[type=checkbox]').attr('disabled', true); $('.info-price-and-edit').css('display', 'block'); $('.list-change-price').css('display', 'block') }) $('.custom-edit-price').on('click', function () { // $('.price-input-change-date').css('display', 'block'); $('.price-input-change-date').css('display', 'none'); // $('.box-form-update-room-price-by-calendar input[type=checkbox]').removeAttr('disabled'); $('.box-form-update-room-price-by-calendar input[type=checkbox]#isClosed').removeAttr('disabled'); $('#form-change-by-date').addClass('show-form-change'); $('.list-change-price').removeClass('show-list-change-price'); $('.list-change-price').css('display', 'none').empty(); }) $('.close-popup-info-show-info-rule').on('click', function () { $('.popup-info-show-info-rule').css('display', 'none') }) $('.submit-change-by-date').on('click', function () { // update_price(); Swal.fire({ title: 'Bạn có chắc muốn cập nhật giá phòng ?', icon: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Đồng ý', cancelButtonText: 'Hủy', }).then(function (result) { if (result.value) { const form_data = $('form').serialize(); let obj_data_list = { action: 'admin_hotel_room_price_change_from_calendar', data: form_data }; var is_finished_data = false; $('.submit-change-by-date').html("<i class='fa fa-spin fa-spinner'></i>") $.post(adminurl, obj_data_list, function () { //success }) .done(function () { is_finished_data = true; }) .fail(function (data_results) { is_finished_data = false; }) .always(function (data_results) { if (is_finished_data) { var str_date_selected = $(".current-date-selected").val(); var str_date_selected_format = formatDate_dd_mm_yyyy(str_date_selected); var str_price_final_format = $('.info-prices-price').text(); $(".fc-event-container a.fc-day-grid-event."+str_date_selected_format+" .fc-content .fc-title").text(str_price_final_format); $(".fc-event-container a.fc-day-grid-event."+str_date_selected_format).css({background:'#85b5cd'}); Swal.fire('Cập nhật thành công', '', 'success') } $('.submit-change-by-date').text("Lưu") }); } }); }) $('.reset-change-by-date').on('click', function () { update_price(); Swal.fire({ title: 'Bạn có chắc muốn đặt giá phòng về ban đầu không ?', icon: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Đồng ý', cancelButtonText: 'Hủy', }).then(function (result) { if (result.value) { const form_data = $('form').serialize(); let obj_data_list = { action: 'admin_hotel_room_price_reset_change_from_calendar', data: form_data }; var is_finished_data = false; $('.reset-change-by-date').html("<i class='fa fa-spin fa-spinner'></i>") $.post(adminurl, obj_data_list, function () { }) .done(function () { is_finished_data = true; }) .fail(function (data_results) { is_finished_data = false; }) .always(function (data_results) { if (is_finished_data) { Swal.fire('Đặt lại giá phòng thành công', '', 'success') .then(function () { $('.closeButton').click() }) } $('.reset-change-by-date').text("Đặt lại giá") }); } }); }) // Change input edit price $('body').on('change', '.price-input-change-date', function () { update_price(); }) // Change input edit price final $('body').on('change', '.price-input-change-final', function () { update_price_final(); }) // check/uncheck rule, promo, voucher $('#form-change-by-date').on('change', '.list-checkbox-change-price input[type=checkbox]', function () { let check = false; const nameThis = $(this).attr('name'); const hiddenInput = $('input[type="hidden"][name="' + nameThis + '"]') if (this.checked) { $(this).val('1') const dataChecked = hiddenInput.data('condition'); check = checkExistPromoVoucher(dataChecked); if(!check) { hiddenInput.attr("value","1") update_price(); } else { hiddenInput.attr('value', '0') $(this).val('0').removeAttr('checked'); this.checked = false; Swal.fire({ icon: 'error', title: 'Thông báo', text: 'Giá chỉ được áp dụng duy nhất một Promo và Voucher!, nếu có lỗi không mong muốn hãy chọn lại ngày và thử lại!', }) } } else { $(this).val('0') $(this).removeAttr('checked'); hiddenInput.attr('value','0') update_price(); } // $(this).off('change') }) $('.button-view-by-rule').on('click', function () { $('.list-change-price').empty(); $('.info-prices-title').empty(); $('.info-prices-price').empty(); $('.display-current-date-selected').empty(); $('.calendar-container-notification').empty(); $('.custom-edit-price').removeClass('show-custom-edit-price'); refeshDataCalendar_by_rule('#calendar_detail_by_rule', dataFilterRule, dataFilter, nowDay); $('.button-view-by-price').removeClass('button-view-by-active') $(this).addClass('button-view-by-active') $('.calendar-container-note-by-price').css('display', 'none') $('.calendar-container-note-by-rule').css('display', 'flex') }) $('.button-view-by-price').on('click', function () { $('#calendar_detail_by_rule').fullCalendar("destroy"); refeshDataCalendar("#calendar_detail", dataFilter, nowDay); $('.button-view-by-rule').removeClass('button-view-by-active') $(this).addClass('button-view-by-active'); $('.list-change-price').html("Chọn ngày để xem chi tiết về thay đổi giá phòng."); $('.info-show-info-rule').empty(); $('.calendar-container-notification').empty(); $('.display-current-date-selected').empty(); $('.calendar-container-note-by-price').css('display', 'flex') $('.calendar-container-note-by-rule').css('display', 'none'); $('.popup-info-show-info-rule').css('display', 'none') }) refeshDataCalendar("#calendar_detail", dataFilter, nowDay) // init calendar current }) .catch(function (error) { // Handle the error if needed console.error('Error'); }); } else if ($(this).hasClass("on-detail")) { $(this).removeClass("on-detail"); $("#calendar_detail").fullCalendar('destroy'); $('.list-change-price').html("Chọn ngày để xem chi tiết về thay đổi giá phòng."); $('.info-prices-title').empty(); $('.info-prices-price').empty(); $('.display-current-date-selected').empty(); $('#form-change-by-date').removeClass('show-form-change'); $('.custom-edit-price').removeClass('show-custom-edit-price'); $('.button-view-by-rule').removeClass('button-view-by-active'); $('#popup-detail-rp').css('display', 'none'); } else { e.preventDefault(); } }); }); }, close_popup_button: function () { $('#form-change-by-date').off('change', '.list-checkbox-change-price input[type=checkbox]') $(".info-price-and-edit").css('display', 'none'); $('#calendar_detail').fullCalendar("destroy"); $('#calendar_detail_by_rule').fullCalendar("destroy"); $('.info-show-info-rule').empty(); $('.display-current-date-selected').empty(); $('.list-checkbox-change-price').empty(); $('.list-change-price').empty(); $('.close-form-change-price').click(); $('.list-change-price').removeClass('show-list-change-price'); $('.list-checkbox-change-price input[type=checkbox]').off("change") $('.btn-show-detail').removeClass('on-detail'); $('#popup-detail-rp').css('display', 'none'); $('.info-price-and-edit').css('display', 'none'); } } ADMIN_HOTEL_EXTEND.init(); async function fetchData(urlHotelPrices, urlChangeHotelPrices) { let dataChangeHotelPrices; let dataHotelPrices; try { $('#calendar_detail').html("<i class='fa fa-spin fa-spinner fa-2x'></i>") const response1 = await fetch(urlHotelPrices, { headers: { 'Cache-Control': 'no-cache' } }); const text1 = await response1.text(); dataHotelPrices = text1 !== '' ? JSON.parse(text1) : null; const response2 = await fetch(urlChangeHotelPrices, { headers: { 'Cache-Control': 'no-cache' } }); if (!response2.redirected) { const text2 = await response2.text(); dataChangeHotelPrices = !!text2 ? JSON.parse(text2) : null; } else { dataChangeHotelPrices = {} } $('#calendar_detail').empty(); return [dataHotelPrices, dataChangeHotelPrices]; } catch (error) { console.error("Data change price not exist...") dataChangeHotelPrices = {}; return [dataHotelPrices, dataChangeHotelPrices] } }