Добрый День, не могу разобраться с алгоритмом для бронирование номеров :
CMS - на модели MVC рукописная.
А загвоздка в просчете дней на период бронирования + подсчет суммы на эти дни.
есть 10 номерных фондов у каждого цена разная зависит от человек от 1 до 4,
+ доп места для людей
+ разные категории цен на детей.
+ у каждого номерного фонда есть 10 категорий цен на период у которых цена иная и допы иные,
(как я это вижу просчет периода пользователя с указными датами)
01.07.2017 по 10.07.2017 итого =10дней
через многомерный массив проверяю есть ли там даты из 10 категорий, если есть то подсчитать сколько.)
Проще говоря --- Помогите ))) кто сталкивался с подобной задачей. может есть путь проще.
А в данном случае Дата действует по умолчанию. на все время кроме
(price_1_one_start/price_1_one_end, price_1_two_start/price_1_two_end, price_1_three_start/price_1_three_end, );
По данному виду как можно написать алгоритм работы ( еще не очень силен в PHP JAVA SQL);
- часть структура базы:
$options['price_1_ID'] - название Номерного Фонда
$options['price_1_1'] - цена за 1 гостя
$options['price_1_2'] - цена за 2 гостя
$options['price_1_3'] - цена за 3 гостя
$options['price_1_4'] - цена за 4 гостя
$options['price_1_food'] - название еды
$options['price_1_dop_1_ID'] - доп место название 1
$options['price_1_dop_1'] цена доп 1 место
$options['price_1_dop_2_ID']- доп место название 2
$options['price_1_dop_2'] - цена доп 2 место
$options['price_1_dop_3_ID']- доп место название 3
$options['price_1_dop_3'] - цена доп 3 место
$options['price_1_one_start'] - начало 1 даты акции (начало диапазона)
$options['price_1_one_end'] - конец 1 даты акции (конец диапазона)
$options['price_1_one_1'] - цена за 1 гостя
$options['price_1_one_2'] - цена за 2 гостя
$options['price_1_one_3'] - цена за 3 гостя
$options['price_1_one_4'] - цена за 4 гостя
$options['price_1_one_dop_1_ID'] доп место название 1 для 1 диапазона
$options['price_1_one_dop_1'] - доп место цена 1 для 1 диапазона
$options['price_1_one_dop_2_ID'] - доп место название 2 для 1 диапазона
$options['price_1_one_dop_2'] - доп место цена 2 для 1 диапазона
$options['price_1_one_dop_3_ID'] - доп место название 3 для 1 диапазона
$options['price_1_one_dop_3'] - доп место цена 3 для 1 диапазона
$options['price_1_two_start'] - начало 2 даты акции (начало диапазона)
$options['price_1_two_end'] - конец 2 даты акции (конец диапазона)
$options['price_1_two_1']
$options['price_1_two_2']
$options['price_1_two_3']
$options['price_1_two_4']
$options['price_1_two_dop_1_ID']
$options['price_1_two_dop_1']
$options['price_1_two_dop_2_ID']
$options['price_1_two_dop_2']
$options['price_1_two_dop_3_ID']
$options['price_1_two_dop_3']
$options['price_1_three_start']
$options['price_1_three_end']
$options['price_1_three_1']
$options['price_1_three_2']
$options['price_1_three_3']
$options['price_1_three_4']
$options['price_1_three_dop_1_ID']
$options['price_1_three_dop_1']
$options['price_1_three_dop_2_ID']
$options['price_1_three_dop_2']
$options['price_1_three_dop_3_ID']
$options['price_1_three_dop_3']
$options['price_2_ID'] - название Номерного Фонда 2
...
$options['price_3_ID'] - название Номерного Фонда 3
...... --//--
Честно, говоря я мало что понял в этом массиве. Как именно хранить все опции и рассчитывать цену номера за конкретный день не скажу - это сильно зависит от вашей бизнес-логики.
Храните массив цен по каждому дню отдельно. В интерфейсе редактирования цен менеджер может задать диапазон дат и цены, но при записи надо отдельно перезаписывать каждый день в БД. Тогда при подсчете общей стоимости бронирования это будет простой проход в цикле по всем дням периода бронирования с простым суммированием соотв. цен.
Возрастает объем хранимых данных, но это очень немного. Возрастает сложность при обновлении цен, хотя возможно наоборот падает в том плане что не надо пересчитывать как вновь заданный диапазон дат ложится на имеющиеся уже записи. И самое главное вы вообще убираете мороку с высчитыванием диапазона дат при вычислении стоимости бронирования.
Спасибо за ответ, по вашему примеру можно поподробнее ) как можно в данном случае это сделать с теми крематориями что выложил ниже.
Создавать отдельную ячейку под каждый день 365
maximw: Как Вообще сделать бронирование на интервал дат, с проверкой есть ли в этих датах интервал других дат.
Пример: я бронирую отель с 10.06.2017 по 20.06.2017 итого = 10 дней.
но у отеля акция с 15.06.2017 по 15.06.2017.
Получается я забронировал 10 дней из них 5 дней (1000р) по обычной цене а 5 по акции (2000р)
Итого: 15000к рур как просчитать это PHP SQL JAVA ???? HELP.
Условия - на период (бесконечность) если нет акции цены заданы.
есть 10 категорий в которых задаются даты начала и конец акции со своими ценами.
У вас должна быть функция (метод), которая считает цену на конкретный день. Входными параметрами являются: день бронирования, номер который бронируется, и все акции и параметры от которых зависит цена. Для каждого дня в интервале бронирования вызываете эту функцию и суммируете результат. К сумме потом применяете еще какие-либо вычисления, типа скидки за продолжительность. Заодно отмечаете в календаре бронирований каждый день когда номер забронирован со ссылкой на конкретную бронь.
(function($) {
"use strict";
function count_days(date1, date2) {
var each_day = 1000 * 60 * 60 * 24;//milliseconds in a day
var ms_date1 = date1.getTime();//milliseconds for date1
var ms_date2 = date2.getTime();//milliseconds for date2
var ms_date_diff = Math.abs(ms_date1 - ms_date2);//different of the two dates in milliseconds
var days = Math.round(ms_date_diff / each_day);//divided the different with millisecond in a day
var ed = end.subtract(1, 'days');
start.add('month', 1);
end.add('month', 1);
var day_start = new Date(start);
var start_date = day_start.getMonth()+"/"+day_start.getDate()+"/"+day_start.getFullYear();
var day_end = new Date(end);
var end_date = day_end.getMonth()+"/"+day_end.getDate()+"/"+day_end.getFullYear();
$(".date-end-js").val(end_date);
},
eventRender: function(event, el) {
el.find('.fc-time').remove();
},
});
}
function SecondsToDay(seconds){
var second = new Date(seconds);
var date = second.toLocaleDateString('de-DE', {
month: '2-digit',
day: '2-digit',
year: 'numeric',
}).replace(/\./g, '/');
return date;
unit_id int(10) UNSIGNED NOT NULL COMMENT 'Id гостиницы.',
year int(11) NOT NULL DEFAULT 0 COMMENT 'Календарный год, за который эта строка доступность соответствующих',
month int(11) NOT NULL DEFAULT 0 COMMENT 'Месяца, за который эта строка доступность соответствующих',
d1 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 1',
d2 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 2',
d3 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 3',
d4 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 4',
d5 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 5',
d6 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 6',
d7 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 7',
d8 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 8',
d9 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 9',
d10 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 10',
d11 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 11',
d12 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 12',
d13 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 13',
d14 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 14',
d15 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 15',
d16 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 16',
d17 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 17',
d18 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 18',
d19 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 19',
d20 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 20',
d21 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 21',
d22 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 22',
d23 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 23',
d24 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 24',
d25 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 25',
d26 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 26',
d27 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 27',
d28 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 28',
d29 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 29',
d30 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 30',
d31 int(11) NOT NULL DEFAULT 2 COMMENT 'Month Day 31',
INDEX month (month),
UNIQUE INDEX month_key (unit_id, year, month),
INDEX unit_id (unit_id),
INDEX year (year)