Задача
Tabla Ops — небольшая ресторанная группа из четырёх заведений. Смены планировались в общей Excel-таблице: менеджеры перетирали друг другу правки, повара узнавали о графике из скриншотов в чатах, а бухгалтерия каждый месяц вручную сводила табель с фактическими выходами. На каждую точку уходило до шести часов ручной возни в неделю, и любая замена в последний момент превращалась в телефонный квест.
Группе нужен был общий операционный инструмент: расписание, замены, табель и уведомления — с разными правами для владельца, менеджера, шефа и линейного персонала.
Решение
Я разработал веб-приложение на Go с роутером chi — без тяжёлых фреймворков, с прозрачной слоистой архитектурой: HTTP-слой, сервисы, репозитории поверх PostgreSQL. Доменные правила живут в одном месте: пересечения смен, лимиты часов, обязательные перерывы — всё валидируется на сервере, а не на совести менеджера.
Ключевая механика — живые обновления через Server-Sent Events. Когда менеджер двигает смену, у всех открытых экранов расписание перестраивается мгновенно, без перезагрузки и без WebSocket-инфраструктуры: SSE проще в эксплуатации и дружит с обычным HTTP. Сотрудник открывает своё расписание по ссылке из Telegram-уведомления, подтверждает смену или просит замену в один клик — запрос сразу виден менеджеру.
Ролевая модель построена на четырёх ролях с разными правами: владелец видит все точки и сводную аналитику, менеджер управляет своей точкой, шеф подтверждает состав кухни, сотрудник видит только своё. Табель собирается автоматически из подтверждённых выходов и выгружается в CSV для бухгалтерии.
Результат
Ручная работа с графиками сократилась примерно на шесть часов в неделю на точку — менеджеры перестали быть диспетчерами и занялись залом. Замены находятся за минуты: свободные слоты видят все подходящие сотрудники сразу. Бухгалтерия получает табель одним файлом вместо недельной сверки.
Это концептуальный кейс: группа вымышлена, метрики иллюстративны. Демо — живое приложение на Go и PostgreSQL с работающим расписанием и SSE-обновлениями, открывается кнопкой выше.