160 lines
6.1 KiB
JavaScript
160 lines
6.1 KiB
JavaScript
const ROOM_TYPES = {
|
||
economy: { id: '2x-местный', name: '2x-местный', pricePerGuest: 1500 },
|
||
standard: { id: '3х-местный', name: '3х-местный', pricePerGuest: 2000 },
|
||
family: { id: 'Семейный', name: 'Семейный', pricePerGuest: 3000 },
|
||
vip: { id: 'Люкс', name: 'Люкс', pricePerGuest: 4500 }
|
||
};
|
||
|
||
const FURNITURE_TYPES = [
|
||
{ id: 'double_bed', name: 'Двуспальная кровать' },
|
||
{ id: 'single_beds', name: 'Односпальные кровати' },
|
||
{ id: 'sofa', name: 'Диван' },
|
||
{ id: 'wardrobe', name: 'Шкаф' },
|
||
{ id: 'table', name: 'Стол' },
|
||
{ id: 'chairs', name: 'Стулья' },
|
||
{ id: 'nightstands', name: 'Прикроватные тумбочки' },
|
||
{ id: 'hanger', name: 'Вешалка' },
|
||
{ id: 'mirror', name: 'Зеркало' }
|
||
];
|
||
|
||
const AMENITY_TYPES = [
|
||
{ id: 'has_ac', name: 'Кондиционер', icon: 'snowflake' },
|
||
{ id: 'has_tv', name: 'Телевизор', icon: 'tv' },
|
||
{ id: 'has_fridge', name: 'Холодильник', icon: 'sink' },
|
||
{ id: 'has_wifi', name: 'Wi-Fi интернет', icon: 'wifi' },
|
||
{ id: 'has_kettle', name: 'Электрический чайник', icon: 'mug-hot' },
|
||
{ id: 'has_hairdryer', name: 'Фен', icon: 'wind' },
|
||
{ id: 'has_shower', name: 'Душ в номере', icon: 'shower' },
|
||
{ id: 'has_sea_view', name: 'Вид на море', icon: 'water' }
|
||
];
|
||
|
||
const BOOKING_STATUSES = {
|
||
NEW: 'новая',
|
||
PAID: 'оплачена',
|
||
RESERVED: 'зарезервирована',
|
||
CHECKED_IN: 'заселена',
|
||
CHECKED_OUT: 'выехала',
|
||
CANCELLED: 'отменена'
|
||
};
|
||
|
||
const DEFAULT_ROOMS = [
|
||
{
|
||
type: ROOM_TYPES.economy.id,
|
||
name: '2x-местный',
|
||
description: 'Уютный номер на двоих с одной или двумя кроватями. Идеально для пары или друзей. Кондиционер, TV, холодильник, Wi-Fi.',
|
||
rooms_count: 15,
|
||
area_sqm: 20,
|
||
furniture: ['double_bed', 'wardrobe', 'chairs', 'nightstands', 'hanger', 'mirror'],
|
||
amenities: ['has_ac', 'has_tv', 'has_fridge', 'has_wifi', 'has_kettle'],
|
||
floors: [1, 2, 3],
|
||
max_guests: 2,
|
||
price_per_night: 1500,
|
||
image_path: 'img/1faae356b-9f79-489d-8165-c37a47b82040.webp',
|
||
extra_beds: 15,
|
||
extra_bed_price: 1000
|
||
},
|
||
{
|
||
type: ROOM_TYPES.standard.id,
|
||
name: '3х-местный',
|
||
description: 'Комфортный трёхместный номер с односпальными или двуспальной кроватью. Просторный и светлый с видом на море.',
|
||
rooms_count: 8,
|
||
area_sqm: 20,
|
||
furniture: ['single_beds', 'double_bed', 'table', 'wardrobe', 'chairs', 'nightstands', 'hanger', 'mirror'],
|
||
amenities: ['has_ac', 'has_tv', 'has_fridge', 'has_wifi', 'has_kettle', 'has_sea_view'],
|
||
floors: [1, 2, 3],
|
||
max_guests: 3,
|
||
price_per_night: 2000,
|
||
image_path: 'img/1006bc9be-64c6-43e3-9625-1a862d04930c.webp',
|
||
extra_beds: 0,
|
||
extra_bed_price: 0
|
||
},
|
||
{
|
||
type: ROOM_TYPES.family.id,
|
||
name: 'Семейный',
|
||
description: 'Просторный двухкомнатный номер для семьи до 4 человек. Две спальни с двуспальными кроватями. Возможны дополнительные места.',
|
||
rooms_count: 4,
|
||
area_sqm: 40,
|
||
furniture: ['double_bed', 'wardrobe', 'chairs', 'nightstands', 'hanger', 'mirror'],
|
||
amenities: ['has_ac', 'has_tv', 'has_fridge', 'has_wifi', 'has_kettle', 'has_hairdryer'],
|
||
floors: [2],
|
||
max_guests: 4,
|
||
price_per_night: 3000,
|
||
image_path: 'img/1eae46658-cfca-4b65-82f0-e5868af5541b.webp',
|
||
extra_beds: 15,
|
||
extra_bed_price: 1000
|
||
},
|
||
{
|
||
type: ROOM_TYPES.vip.id,
|
||
name: 'Люкс',
|
||
description: 'Элегантный двухкомнатный люкс с двуспальной кроватью, гостиной зоной и великолепным видом на море. Премиум-комфорт.',
|
||
rooms_count: 3,
|
||
area_sqm: 50,
|
||
furniture: ['double_bed', 'sofa', 'wardrobe', 'chairs', 'nightstands', 'hanger', 'mirror'],
|
||
amenities: ['has_ac', 'has_tv', 'has_fridge', 'has_wifi', 'has_kettle', 'has_hairdryer', 'has_shower', 'has_sea_view'],
|
||
floors: [2],
|
||
max_guests: 4,
|
||
price_per_night: 4500,
|
||
image_path: 'img/1eae46658-cfca-4b65-82f0-e5868af5541b.webp',
|
||
extra_beds: 0,
|
||
extra_bed_price: 0
|
||
}
|
||
];
|
||
|
||
const ROOM_PRICES = {
|
||
[ROOM_TYPES.economy.id]: ROOM_TYPES.economy.pricePerGuest,
|
||
[ROOM_TYPES.standard.id]: ROOM_TYPES.standard.pricePerGuest,
|
||
[ROOM_TYPES.family.id]: ROOM_TYPES.family.pricePerGuest,
|
||
[ROOM_TYPES.vip.id]: ROOM_TYPES.vip.pricePerGuest
|
||
};
|
||
|
||
const STATUS_LIST = [
|
||
BOOKING_STATUSES.NEW,
|
||
BOOKING_STATUSES.PAID,
|
||
BOOKING_STATUSES.RESERVED,
|
||
BOOKING_STATUSES.CHECKED_IN,
|
||
BOOKING_STATUSES.CHECKED_OUT,
|
||
BOOKING_STATUSES.CANCELLED
|
||
];
|
||
|
||
const ROOM_TYPE_LIST = [
|
||
ROOM_TYPES.economy.id,
|
||
ROOM_TYPES.standard.id,
|
||
ROOM_TYPES.family.id,
|
||
ROOM_TYPES.vip.id
|
||
];
|
||
|
||
function getRoomPrice(roomType) {
|
||
return ROOM_PRICES[roomType] || 0;
|
||
}
|
||
|
||
function calculateNights(checkin, checkout) {
|
||
const ci = new Date(checkin);
|
||
const co = new Date(checkout);
|
||
return Math.ceil((co - ci) / (1000 * 60 * 60 * 24));
|
||
}
|
||
|
||
function calculateBasePrice(roomType, checkin, checkout) {
|
||
const pricePerNight = getRoomPrice(roomType);
|
||
const nights = calculateNights(checkin, checkout);
|
||
return pricePerNight * nights;
|
||
}
|
||
|
||
function getRoomBasePriceByType(type) {
|
||
const room = DEFAULT_ROOMS.find(r => r.type === type);
|
||
return room ? room.price_per_night : 0;
|
||
}
|
||
|
||
module.exports = {
|
||
ROOM_TYPES,
|
||
FURNITURE_TYPES,
|
||
AMENITY_TYPES,
|
||
BOOKING_STATUSES,
|
||
DEFAULT_ROOMS,
|
||
ROOM_PRICES,
|
||
STATUS_LIST,
|
||
ROOM_TYPE_LIST,
|
||
getRoomPrice,
|
||
getRoomBasePriceByType,
|
||
calculateNights,
|
||
calculateBasePrice
|
||
}; |