Веб-приложение для автошколы: как собрать расписание вождений с учетом авто, инструкторов, буферов, переносов и уведомлений, без конфликтов.

Хаос редко начинается с большого провала. Обычно все ломается с мелочей: один ученик просит перенести занятие, инструктор уезжает на техосмотр, а администратор «временно» фиксирует изменения в чате. Через неделю уже непонятно, кто, где и на какой машине должен быть.
Самая частая боль - накладки. Ученик приезжает на площадку, а инструктор в это время уже в городе с другим учеником. Или машина записана сразу на два урока, потому что «вроде была свободна». Когда переносы делаются вручную, ошибки становятся нормой.
В расписании участвуют разные люди, и у каждого своя задача. Администратору важно быстро видеть занятость и свободные окна, инструктору - понятный план дня без сюрпризов, ученику - точное время и место. Поэтому все обычно начинается не с «красивого календаря», а с правил и понятного способа фиксировать изменения.
На старте достаточно четырех вещей: календарь с быстрым поиском свободного времени, правила против конфликтов, уведомления о переносах и единый источник правды вместо разрозненных записей.
Данные почти всегда уже есть: Excel-таблица, заметки в телефоне, переписка в мессенджере, бумажный журнал. Проблема в том, что они не обновляются синхронно. Например, администратор поменял время в таблице, но забыл написать инструктору. Хорошая система делает наоборот: одно изменение обновляет план и уведомляет всех, кого это касается.
Календарь не «умнеет» сам по себе. Он начинает работать, когда вы договорились, какие объекты есть в системе и какие поля обязательны. Тогда приложение сможет находить свободные окна, показывать загрузку и предупреждать о проблемах.
Обычно хватает пяти: ученик, инструктор, автомобиль, занятие и локация (или маршрут).
Дальше важно наполнить профили данными, которые реально влияют на планирование.
Ученик. Помимо ФИО нужен способ связи (телефон, мессенджер, email) и статус (активен, пауза, завершил). Часто полезно хранить тариф или пакет (сколько часов осталось) и предпочтения по времени: «только после 18:30», «только выходные». Если ученик привязан к точке старта (например, у метро), это тоже стоит фиксировать.
Инструктор. Нужны рабочие часы по дням недели, выходные, отпуска. Добавьте допуски: на каких типах авто он работает, какие районы берет, проводит ли только «площадку» или только «город». Если этого не указать, календарь будет предлагать заведомо невозможные варианты.
Автомобиль. Обычно достаточно типа (МКПП/АКПП), идентификатора (госномер или внутренний код), доступности и периодов недоступности: техосмотр, ремонт, замена резины.
Простой пример: ученик просит «вечером в центре», инструктор работает до 19:00, а машина в ремонте до четверга. Если это записано, система сразу отсеет лишние слоты и оставит только реальные варианты.
Расписание чаще всего ломается там, где правила существуют только в голове у администратора. Чтобы календарь собирался без накладок, ограничения нужно описать явно и одинаково для всех.
Базовые ограничения простые: один инструктор не может вести два занятия одновременно, и одна машина не может быть назначена на два урока в одно и то же время. Но в реальности почти всегда есть третье правило, которое спасает день: буфер до и после занятия.
Буфер нужен не для красоты. Он закрывает пересадку ученика, выезд с площадки, парковку, заправку, короткий отдых и задержки из-за пробок. Если урок длится 60 минут, то в календаре он часто должен занимать 80-90 минут: 10-15 минут до и 10-15 минут после. Иначе любое опоздание превращается в цепочку сбоев.
Что обычно стоит задать заранее:
Пример: инструктор Иван ведет уроки на машине Kia. Вы ставите урок 18:00-19:00, но с буфером 15 минут система блокирует слот 17:45-19:15. Тогда второе занятие в 19:00 уже не появится, даже если ученик просит.
Чтобы расписание не превращалось в ручную «табличку с примечаниями», урок нужно описать как понятный объект с четкими полями. Тогда календарь сможет проверять конфликты, считать загрузку инструкторов и правильно отправлять уведомления.
Базовый набор полей обычно такой: дата и время начала, длительность (например, 60 или 90 минут), буфер до и после. Дальше идут «ресурсы»: инструктор, автомобиль и место старта (адрес или условная точка вроде «площадка», «город»). Если у вас несколько филиалов, место старта помогает избежать ситуации, когда занятие формально без конфликта, но физически невыполнимо.
Статусы показывают не только «когда», но и «насколько это уже точно». Для начала хватает такого набора:
Важно: «перенос» лучше хранить с историей изменений, а не просто перезаписывать время.
Переносы почти всегда повторяются по типовым причинам: погода, болезнь, поломка авто, экзамен. Если причина фиксируется, потом легче понять, где ломается процесс (например, если «поломка авто» всплывает слишком часто).
История изменений - страховка от споров и хаоса. Минимум: кто перенес, когда, с какого времени на какое, и короткий комментарий.
Чтобы расписание не разваливалось, приложению нужно считать не только «свободно или занято», а реальную доступность с учетом правил. Для автошколы это почти всегда пересечения по времени плюс буферы.
Практичный подход такой: каждое занятие превращается в «занятый интервал», а вокруг него добавляются защитные окна. Урок с 18:00 до 19:00 и буфер 15 минут до и после означает, что ресурс занят с 17:45 до 19:15. При поиске нового слота приложение сравнивает интервалы и отбрасывает все пересечения.
Дальше включается проверка конфликтов по всем участникам. Минимальный набор:
Когда система нашла несколько подходящих окон, важно выбрать не «первый попавшийся», а лучший по понятным правилам: ближайшее доступное время, затем предпочтения ученика (вечер, выходные), затем более ровная загрузка инструктора.
Если подходящего слота нет, приложение не должно молча отказывать. Лучше показать 3-5 альтернатив (например, ближайшие окна на два дня вперед) и дать вариант «встать в ожидание»: как только появляется окно, система предлагает его администратору.
Стабильное расписание начинается со справочников. Сначала внесите инструкторов и машины, затем задайте рабочие часы по дням недели, с перерывами и выходными. Сразу отметьте исключения (отпуск, ТО автомобиля), чтобы они не превращались во «внезапные переносы».
Дальше опишите правила простыми фразами, как если бы объясняли администратору: «между уроками нужен буфер 10 минут», «машина не может быть назначена двум ученикам одновременно», «в день не больше 6 занятий на инструктора». Эти правила должны проверяться автоматически при каждом назначении.
Рабочий порядок запуска, который обычно занимает 1-2 часа, если данные уже есть:
После первых 10-20 назначений включайте уведомления и понятное правило переносов. Важно решить, что делать при сдвиге: если ученик просит перенести на вечер, приложение должно пересобрать варианты и предложить 2-3 ближайших окна.
Для уведомлений заранее задайте минимум: кому уходят сообщения (ученик, инструктор, администратор), за сколько часов предупреждать, что делать, если слотов нет.
Хорошее приложение не просто показывает «кто когда едет». Оно помогает понять, где у вас потери времени и где риски срывов. Обычно хватает 2-3 представлений календаря и пары коротких отчетов.
Когда расписание видно по каждой машине, сразу заметны простои и перегруз. Такой вид помогает перераспределять уроки и не держать лишний парк.
Полезно, чтобы в карточке занятия были: тип урока, район, место старта, ученик, примечание (например, «экзаменационный маршрут»).
Это главный экран для управления загрузкой: часы работы, окна, переработки и «дырки» из-за буфера или разъездов. Если инструктор заканчивает на одном конце города, а следующий урок начинается на другом, календарь должен подсветить риск (или просто не дать поставить занятие).
Отдельно помогает «Сводка по дню» на сегодня/завтра: кто куда едет, телефоны учеников, адрес старта, время, комментарии.
Из отчетов обычно достаточно трех: общая загрузка (по людям и по авто), отмены и переносы (сколько и по каким причинам), среднее время до ближайшего свободного слота. Если ближайшее окно растет, расписание перестает «дышать».
Переносы в автошколе случаются постоянно: пробки, поломка машины, болезнь инструктора, экзамены. Если ученик узнает об этом за 10 минут до урока, вы теряете деньги и доверие. Поэтому уведомления должны быть частью расписания, а не ручной рассылкой.
Нормальный минимум: подтверждение записи, напоминание, сообщения об отмене или изменении. Важно, чтобы событие в календаре и уведомление всегда говорили одно и то же.
Кому отправлять зависит от события. При переносе сообщение должны получить ученик и инструктор, а администратор - копию или статус (чтобы понимать, что все увидели). При отмене администратору полезно сразу видеть причину и свободное окно, которое появилось.
Текст уведомления отвечает на три вопроса: что изменилось, когда было, когда стало, и что делать дальше. Например: «Занятие по вождению перенесено. Было: 18:00-19:00, 10 января. Стало: 19:30-20:30, 10 января. Ответьте “ОК”, если подходит, или предложите другое время».
Контроль доставки отличает приложение от «сообщений в мессенджере». Держите статус отправки (отправлено, доставлено, прочитано, ошибка), автоматический повтор при сбое и резервный канал, если основной не сработал.
Даже если календарь уже есть, расписание часто «сыпется» из-за мелочей, которые никто не записал как правила.
Уроки «впритык». В жизни между занятиями нужен буфер: выйти из машины, доехать, заправиться. Без буфера уроки начинают накладываться не в календаре, а на парковке.
Учитывают только людей и забывают про машину. Авто может быть на техосмотре, ремонте, мойке, смене резины. Если статус авто не фиксируется как занятость, его легко «раздать» на два места сразу.
Переносят вручную и не синхронизируют участников. Админ поменял время, инструктор увидел старое, ученик приехал как было.
Нет истории изменений. При конфликте невозможно понять, кто менял и что было согласовано.
Полезная проверка на старте:
Перед тем как открывать доступ администраторам и начать массово назначать занятия, пройдитесь по чеклисту. Он спасает от ситуации, когда календарь выглядит аккуратно, но в реальности дает конфликты.
Исходные данные:
Конфликты считаются правильно:
Переносы и контроль изменений:
Представьте вечерний пик после 18:00: у автошколы 3 инструктора (А, Б, В) и 2 машины (М1, М2). У каждого рабочий день до 21:00, и в расписании уже стоят занятия с короткими окнами. Один ученик пишет: «Не успеваю к 18:30, можно позже?»
Администратор открывает урок и меняет пожелание по времени, например на диапазон 19:00-20:30. Система проверяет занятость инструктора и машины. Частая ситуация: инструктор свободен, но М1 уже занята в 19:00, а М2 стоит у инструктора В в другом районе.
Дальше включаются правила, которые обычно забывают в таблицах: буфер 10-15 минут между уроками и границы рабочего дня. Поэтому вариант «поставить в 20:45» не пройдет, если он вылезает за 21:00 с учетом буфера.
Система показывает несколько безопасных альтернатив, например:
После выбора слота приложение обновляет вечерний календарь: снимает конфликт по авто, фиксирует буферы и обновляет занятость инструктора.
Уведомления уходят ученику и инструктору: новое время, кто ведет урок, какая машина, и напоминание заранее. А администратор видит в сводке дня, что изменилось и не появился ли новый «узкий участок».
Не пытайтесь сразу охватить все. На первом шаге важнее убрать конфликты в расписании и сделать переносы понятными для учеников и инструкторов.
Начните с минимума: один календарь, четкие правила и уведомления. Остальное (отчеты, интеграции, сложные роли) добавляйте, когда появятся реальные запросы.
Перед сборкой прототипа зафиксируйте короткое ТЗ, чтобы не спорить о деталях на ходу:
Если нужен быстрый способ проверить идею на живых данных, прототип можно собрать в TakProsto (takprosto.ai): правила и сценарии задаются текстом, а затем вы проверяете, как календарь ведет себя при переносах и накладках. Когда проект вырастет, пригодятся экспорт исходного кода, хостинг, подключение своего домена и снимки с откатом перед изменениями.
Хаос обычно начинается, когда изменения фиксируют в разных местах: часть в таблице, часть в чате, часть в голове администратора. Решение — сделать один «источник правды», где любое изменение сразу видно всем участникам и не требует ручной пересылки.
Минимально нужны пять сущностей: ученик, инструктор, автомобиль, занятие и локация (точка старта или маршрут). Если эти объекты описаны одинаково для всех, приложение может искать реальные свободные окна и заранее отсеивать невозможные варианты.
Начните с рабочих часов по дням недели, выходных и отпусков, затем добавьте допуски: на каких машинах и где инструктор работает, какие типы занятий ведет. Чем точнее эти правила, тем меньше «красивых, но невыполнимых» слотов будет предлагать календарь.
Укажите тип (МКПП/АКПП), идентификатор, периоды недоступности и причины недоступности вроде ТО или ремонта. Важно, чтобы недоступность машины учитывалась так же строго, как занятость инструктора, иначе накладки неизбежны.
Задайте буфер до и после урока, чтобы покрыть пересадку, парковку, выезд и задержки. Практичное правило — считать занятость не только по времени урока, а по расширенному интервалу с буферами, тогда система не даст поставить занятия «впритык».
Достаточно полей: начало, длительность, буфер, инструктор, автомобиль и место старта. Добавьте статусы вроде «черновик», «подтверждено», «перенос», «отмена», «проведено», чтобы было понятно, насколько запись уже согласована и что именно нужно сделать дальше.
Приложение должно проверять пересечения по времени с учетом буферов сразу для инструктора, машины и ученика. Если слота нет, лучше показать несколько ближайших альтернатив и возможность «ожидания», чтобы администратор не подбирал варианты вручную вслепую.
Оптимально хранить историю: кто поменял, когда, с какого времени на какое и почему. Это помогает быстро разрулить спорные ситуации и понять системные проблемы, например частые переносы из‑за поломок или перегруза в вечерние часы.
Минимум — подтверждение записи, напоминание и сообщение об изменении или отмене. В сообщении важно сразу указать, что изменилось, какое время было, какое стало, и что нужно сделать ученику дальше, чтобы не было переписок на десятки сообщений.
Начните со справочников (инструкторы, авто, локации), задайте правила конфликтов и буферы, затем импортируйте хотя бы ближайшую неделю занятий и протестируйте переносы. В TakProsto можно быстро собрать такой прототип в формате чата, а позже при необходимости подключить хостинг, свой домен, экспорт исходного кода и снимки с откатом.