Sumchenko Works
ENEnglish versionСменить тему
P—02 · Системный анализProduction

ТехРент

CRM для аренды спецтехники — бронирование с проверкой доступности, календарь парка, платежи, права менеджеров и журнал действий.

Код
Роль
Аналитика, проектирование, разработка в Claude Code (дипломный проект)
Период
2026.06 → 2026.10
Статус
Production
Стек
Go · PostgreSQL · React · TypeScript · Zustand · Docker · Nginx · OpenAPI · BPMN

Интерфейс

01 / 06
Календарь занятостиДиаграмма Ганта «техника × дни» за сентябрь: заказы по статусам и период обслуживания бульдозера жёлтой полосой.

Задача

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

Решение

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

Дипломный проект. Готовую систему я передал на обзор компании с собственным парком техники и получил обратную связь от её руководителя. Я вёл его как аналитик и архитектор — требования, модель данных, API, ролевая модель, — а код писал в Claude Code пошагово, с проверкой каждого шага. Отдельно разобрал главную фичу, бронирование, сквозным кейсом и принял реализацию по коду — так нашлись 11 расхождений с требованиями.

Цели

  1. 01Не допустить двойного бронирования и аренды неисправной техники
  2. 02Видеть занятость всего парка на месяц за одну минуту
  3. 03Считать стоимость и долги без ручных расчётов
  4. 04Давать менеджерам ровно те права, которые им нужны

Функции

Каталог техники: ставки за день и час, статусы, фото, периоды обслуживанияКлиенты (юрлица и физлица) и их объекты-стройплощадкиБронирование с проверкой доступности и расчётом стоимостиКалендарь занятости — диаграмма Ганта «техника × дни»Платежи с частичной оплатой и защитой от переплатыФинансовая сводка за период и список должниковПриглашение менеджеров по ссылке и права по модулямЖурнал действий: кто, что и когда изменил, данные до и после

Ключевые требования

IDТребованиеПриоритет
FR-01Одна техника не может быть занята двумя неотменёнными заказами на пересекающиеся даты — даже при одновременных запросах.Must
FR-02Сломанную технику забронировать нельзя (422), технику на обслуживании — в его даты (409).Must
FR-03Стоимость: несколько дней — ставка за день × дни включительно, один день — ставка за час × часы.Must
FR-04Сумма платежей по заказу не может превысить сумму заказа.Must
FR-05Номер заказа ТР-год-NNN уникален и не повторяется после удаления заказа.Must
FR-06Менеджер видит и меняет только разделы, открытые ему администратором.Should
NFR-01Целостность на уровне БД: CHECK, UNIQUE, внешние ключи и ограничение EXCLUDE.Must
NFR-02Каждое создание, изменение и удаление пишется в журнал; сбой журнала не отменяет операцию.Must
NFR-03Вся система поднимается одной командой docker compose up.Should

Сценарии

МенеджерБронирование техники
  1. 01Находит свободную технику в календаре и отмечает даты
  2. 02Форма подставляет ставки и считает сумму, менеджер выбирает клиента и объект
  3. 03Сервер в одной транзакции проверяет поломку, обслуживание и занятость
  4. 04Заказ получает номер ТР-2026-015, событие попадает в журнал
АдминистраторПриглашение менеджера
  1. 01Создаёт менеджера и отмечает разделы и действия, которые ему доступны
  2. 02Получает одноразовую ссылку на 7 дней и передаёт её
  3. 03Менеджер сам задаёт пароль — администратор его не видит
  4. 04Права попадают в токен при входе, меню показывает только разрешённое

Ход работы

  1. Шаги 1–3ОсноваDocker Compose, Go API на Chi, миграции, встроенные в бинарник, JWT и роли.
  2. Шаги 4–7УчётКаталог техники, клиенты и объекты, заказы с расчётом стоимости, платежи.
  3. Шаги 8–11КонтрольЖурнал действий, календарь Ганта, обслуживание техники, статусы заказов по датам.
  4. Шаги 12–14Персонал и финансыПанели деталей, приглашения и права менеджеров, финансовая сводка и должники.
  5. ПриёмкаКейс и обратная связьСквозной кейс «Бронирование», 11 замечаний по коду и отзыву компании; исправлены все три высоких и повтор номеров.
  6. ДалееУведомления и документыУведомления в Telegram, договор, счёт и акт в PDF, аналитика загрузки парка.

Сложности

Двойное бронирование при одновременных запросахПроверка и запись шли отдельными запросами. Теперь — одна транзакция с блокировкой строки техники, а в БД ограничение EXCLUDE: из 10 одновременных запросов проходит один, остальные получают 409.
В форме была видна только часть техникиКомпания с 24 машинами при обзоре не нашла нужную: сервер молча обрезал список до 20. Явная ошибка 400 вместо подмены и поле выбора с серверным поиском.
Номер заказа мог повторитьсяCOUNT + 1 выдавал занятый номер после удаления заказа. Таблица-счётчик по годам: номер выдаётся в транзакции заказа, не повторяется и не оставляет пропусков.
Статус заказа зависит от сегодняшней датыВ БД хранятся только «запланирован» и «отменён», а «активен» и «завершён» вычисляются в SQL при чтении — без ночных задач и рассинхронизации.

Результат

Работающая CRM из 14 шагов — около 5,5 тысячи строк Go и 6,5 тысячи строк TypeScript, — с обратной связью от реальной компании. Сквозной кейс бронирования, OpenAPI, BPMN и словарь данных; из 11 замечаний аналитика исправлены все три высоких и повтор номеров, гонки проверены одновременными запросами.

Дальше — права на изменение и отмену заказа на сервере, уведомления в Telegram и документы в PDF.

Технологии

Следующий · P—03AI-диспетчер задач