← Вернуться к кейсу

Код, который можно проверить.

Технический разбор для команды разработки и работодателя. Это самостоятельный фронтенд-прототип на HTML, CSS и JavaScript; серверной части нет.

Разделение ответственности

Проверка перед сохранением

Интервалы пересекаются, когда начало новой брони раньше конца существующей, а её конец позже начала существующей. Равные границы допустимы. Текущая редактируемая запись и отменённые брони исключаются из сравнения.

 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 сценариев: пересечения, соседние интервалы, отмена, изменение собственной брони, время закрытия, неверная дата и ввод. Это проверки правил, а не доказательство готовности к промышленной эксплуатации.

Что важно для продолжения разработки

Вернуться к решениям в интерфейсе ↗