Код, который можно проверить.
Технический разбор для команды разработки и работодателя. Это самостоятельный фронтенд-прототип на HTML, CSS и JavaScript; серверной части нет.
Разделение ответственности
- core.js: время, даты, проверка пересечений и исходные данные. Функции работают без страницы и проверяются через Node.js.
- app.js: состояние, отображение, обработчики форм и сохранение в браузере.
- HTML и CSS: семантические формы, нативные диалоги и мобильная повестка вместо уменьшенной календарной сетки.
Проверка перед сохранением
Интервалы пересекаются, когда начало новой брони раньше конца существующей, а её конец позже начала существующей. Равные границы допустимы. Текущая редактируемая запись и отменённые брони исключаются из сравнения.
function validate(b,all=[]){
if(!b||typeof b.id!=='string'||!b.id||typeof b.client!=='string'||!b.client.trim()||b.client.length>60)return 'Укажите имя или название съёмки: до 60 символов.';
if(!validDate(b.date))return 'Выберите корректную дату съёмки.';
if(!['portrait','brand','video'].includes(b.kind)||!['pending','confirmed','cancelled'].includes(b.status))return 'Выберите тип съёмки и статус из списка.';
const start=minutes(b.start),duration=Number(b.duration);
if(!Number.isFinite(start)||start%30||![1,2,3,4].includes(duration)||start<OPEN||start+duration*60>CLOSE)return 'Студия открыта с 09:00 до 21:00. Выберите начало с шагом 30 минут и длительность от 1 до 4 часов.';
if(b.status!=='cancelled'){
const conflict=all.find(a=>a.id!==b.id&&a.date===b.date&&a.status!=='cancelled'&&start<minutes(a.start)+Number(a.duration)*60&&start+duration*60>minutes(a.start));
if(conflict)return `Это время занято: ${conflict.start}–${time(minutes(conflict.start)+Number(conflict.duration)*60)}. Выберите другой интервал или дату.`;
}
return '';
}
Как проверить самостоятельно
Скачайте core.js и core.test.cjs. Положите core.js в папку demo рядом с файлом проверок. В папке с проверками выполните:
node core.test.cjsПри проверке 29 сентября 2026 года прошли 20 сценариев: пересечения, соседние интервалы, отмена, изменение собственной брони, время закрытия, неверная дата и ввод. Это проверки правил, а не доказательство готовности к промышленной эксплуатации.
Что важно для продолжения разработки
- LocalStorage — демонстрационное хранение, не база данных. Нет синхронизации между вкладками или устройствами.
- Для нескольких администраторов проверка занятости должна выполняться атомарно на сервере.
- Буфер на уборку, предоплата, уведомления и правила отмены требуют отдельного согласования.
- Для реального запуска нужны авторизация, роли, журнал изменений и резервное копирование.