This commit is contained in:
2026-05-11 23:44:01 +05:00
parent 144aedab99
commit d6c939fd15
7 changed files with 209 additions and 10 deletions

View File

@@ -502,6 +502,7 @@
<div class="col-md-6">
<label class="form-label">Промокод</label>
<input type="text" class="form-control" id="promocodeInput" name="promocode" placeholder="Введите промокод" style="text-transform: uppercase;">
<div id="promocodeError" class="text-danger small mt-1" style="display: none;"></div>
</div>
<div class="col-md-6 d-flex align-items-end">
<button type="button" class="btn btn-outline-primary btn-sm" id="checkPromocodeBtn" style="width: 100%;">Проверить промокод</button>
@@ -536,8 +537,8 @@
</div>
<script src="js/bootstrap.bundle.min.js"></script>
<script src="js/rooms-public.js"></script>
<script src="js/main.js"></script>
<script src="js/rooms-public.js?v=20260511"></script>
<script src="js/main.js?v=20260511b"></script>
<script src="js/i18n.js"></script>
<script src="js/reviews.js"></script>

View File

@@ -212,11 +212,13 @@ async function checkPromocode() {
return;
}
const basePrice = ROOM_PRICES[room] ? ROOM_PRICES[room] * calculateNights(checkin, checkout) : 0;
const guests = parseInt(document.querySelector('[name="guests"]').value) || 1;
const basePrice = ROOM_PRICES[room] ? ROOM_PRICES[room] * guests * calculateNights(checkin, checkout) : 0;
if (!promocode) {
updatePriceDisplay(basePrice, 0, 0, basePrice);
currentPromocodeData = null;
hidePromocodeError();
return;
}
@@ -224,20 +226,37 @@ async function checkPromocode() {
const response = await fetch('/api/promocodes/validate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: promocode, room_type: room, checkin, checkout })
body: JSON.stringify({ code: promocode, room_type: room, checkin, checkout, guests })
});
const data = await response.json();
if (data.valid) {
currentPromocodeData = data;
updatePriceDisplay(data.base_price, data.discount_percent, data.discount_amount, data.total_price);
hidePromocodeError();
} else {
hidePriceInfo();
currentPromocodeData = null;
updatePriceDisplay(basePrice, 0, 0, basePrice);
showPromocodeError('Промокод не найден или срок его действия истёк');
}
} catch (error) {
console.error('Promocode validation error:', error);
hidePriceInfo();
showPromocodeError('Ошибка проверки промокода');
}
}
function showPromocodeError(message) {
const errorDiv = document.getElementById('promocodeError');
if (errorDiv) {
errorDiv.textContent = '✖ ' + message;
errorDiv.style.display = 'block';
}
}
function hidePromocodeError() {
const errorDiv = document.getElementById('promocodeError');
if (errorDiv) {
errorDiv.style.display = 'none';
}
}
@@ -245,6 +264,7 @@ document.getElementById('checkPromocodeBtn').addEventListener('click', checkProm
document.getElementById('promocodeInput').addEventListener('blur', checkPromocode);
document.querySelector('[name="checkin"]').addEventListener('change', checkPromocode);
document.querySelector('[name="checkout"]').addEventListener('change', checkPromocode);
document.querySelector('[name="guests"]').addEventListener('change', checkPromocode);
document.querySelectorAll('.btn-book').forEach(btn => {
btn.addEventListener('click', function() {
setTimeout(checkPromocode, 100);

View File

@@ -112,7 +112,7 @@ function initRoomBookingHandlers() {
const roomType = this.getAttribute('data-room-type');
const roomName = this.getAttribute('data-room-name');
const maxGuests = parseInt(this.getAttribute('data-max-guests')) || 4;
document.getElementById('selectedRoom').value = roomType + ' — ' + roomName;
document.getElementById('selectedRoom').value = roomType;
document.getElementById('selectedRoomId').value = roomId;
updateGuestOptionsDynamic(roomType, maxGuests);
hidePriceInfo();