Модель данных
Модуль сервиса автоштрафов хранит данные о штрафах ПДД и обо всём, что с ними связано: об автомобилях, водителях, компаниях-нарушителях, о привязке машин к компаниям-арендодателям, о журнале синхронизации и об отправленных клиентам уведомлениях. Все справочники (авто, водители, компании, штрафы) — общие: они живут в общей части системы и наполняются данными, которые приходят из внешнего сервиса автоштрафов. А вот привязки авто, кастомные статусы и уведомления привязаны к конкретной компании. Ключевая идея всей модели — каждая внешняя сущность сервиса автоштрафов имеет собственный внешний ID (уникальный идентификатор во внешнем сервисе). Именно по нему система узнаёт «тот же самый» объект при повторной синхронизации и не создаёт дубликаты.Автомобиль сервиса автоштрафов
Автомобиль, известный сервису автоштрафов, — именно по нему подтягиваются штрафы.Флаг «Активен» по умолчанию включён. Он управляет тем, тянутся ли штрафы по конкретной машине. Поле «Дата активации» хранит момент, с которого авто включено в синхронизацию, и может быть пустым.
Водитель сервиса автоштрафов
Водитель-нарушитель, которого сервис связывает со штрафом. Записи не дублируются — совпадение определяется по внешнему ID.
Все поля, кроме идентификатора, могут быть пустыми — сервис не всегда присылает полный набор данных о водителе.
Компания сервиса автоштрафов
Компания-нарушитель, то есть владелец автомобиля со стороны сервиса автоштрафов. Не путать с компанией-арендодателем внутри системы. Дедупликация — по внешнему ID.Кастомный статус штрафа
Пользовательский статус, который компания заводит для себя, чтобы вручную помечать штрафы (например «Передан клиенту», «Оспаривается», «Закрыт»).Штраф
Центральная модель модуля. Хранит штраф ПДД со всеми реквизитами оплаты, документами и связями. Штрафы не дублируются — совпадение по внешнему ID. Основные данные
Адрес и время нарушения
Статус оплаты
Реквизиты оплаты
Документы
Связи
Все четыре связи (авто, водитель, компания, кастомный статус) необязательны. Если связанный объект будет удалён, ссылка в штрафе просто обнуляется — сам штраф при этом сохраняется.
Привязка авто компании к сервису автоштрафов
Связывает конкретную единицу инвентаря компании-арендодателя с автомобилем сервиса автоштрафов. Это мост между внутренним автопарком и справочником сервиса автоштрафов.Привязка уникальна по сочетанию компания + автомобиль сервиса автоштрафов + ID единицы инвентаря. Одну и ту же машину нельзя привязать к одному и тому же авто сервиса автоштрафов дважды внутри одной компании.
Уведомление о штрафе
Запись о том, что клиенту было отправлено WhatsApp-уведомление о штрафе. Служит одновременно и историей отправок, и защитой от повторов.Лог синхронизации
Журнал операций обмена данными с сервисом автоштрафов: выгрузка штрафов, приём уведомлений, авторизация.
Статус по умолчанию — «В процессе», что позволяет завести запись в начале операции и дополнить её итогами по завершении.
Логика и побочные эффекты
Сохранение PDF протокола в облачном хранилище
При сохранении штрафа, если у него задана ссылка на PDF протокола, система скачивает файл по этой ссылке и кладёт его в поле «PDF протокола» в облачное хранилище. Имя файла берётся из последней части ссылки (то, что идёт после последнего слэша). Скачивание выполняется только когда в этом есть смысл — в одном из трёх случаев:- ссылка на протокол появилась впервые;
- ссылка сменилась на другую;
- файла ещё нет в хранилище (например, предыдущая попытка скачивания не удалась — тогда следующее сохранение попробует снова).
В обычном случае (файл уже лежит, ссылка та же) внешнего обращения не происходит вовсе. Поэтому прикладные правки штрафа — отметка «просмотрен», смена кастомного статуса — файл заново не качают и не перезаписывают.
Неудачная загрузка не затирает уже сохранённый протокол: если внешний сервис недоступен или ответил ошибкой, в поле остаётся прежний файл, а повторная попытка произойдёт при следующем сохранении, только если файла нет.
Автоматическая отправка WhatsApp при появлении уведомления
Создание записи «Уведомление о штрафе» само по себе запускает отправку. Как только запись впервые создаётся (не при последующих изменениях), происходит две вещи:- Отправка сообщения в WhatsApp клиенту на указанный номер — фоновой задачей, поставленной в очередь после того, как запись фактически сохранилась. Текст сообщения — двуязычный (казахский и русский) — содержит госномер автомобиля, дату нарушения, сумму штрафа и орган, зафиксировавший нарушение. К сообщению прикладывается PDF протокола под именем «penalty.pdf». Имя клиента и название компании подставляются из поля «Доп. данные».
- Создание системного уведомления внутри платформы (веб, push и Telegram) о новом штрафе по автомобилю — с номером авто, датой нарушения и суммой.
Отправка в WhatsApp не задерживает сохранение записи: запрос к внешнему сервису выполняется уже после записи, в фоне. Если сервис недоступен, задача повторяется до трёх раз с интервалом 5 минут, а не теряется молча.
Если у штрафа не заполнен связанный автомобиль, отправка не выполняется — уведомление молча пропускается, потому что в тексте сообщения госномер обязателен. Если протокол ещё не скачан, сообщение тоже не отправляется, но факт пропуска попадает в журнал предупреждением.
Токен доступа к WhatsApp выбирается по режиму работы системы: в отладочном режиме используется тестовый токен, в боевом — рабочий.
Как это используется
- Автомобиль сервиса автоштрафов, Водитель сервиса автоштрафов, Компания сервиса автоштрафов — наполняются автоматически из данных внешнего сервиса при синхронизации; связываются со штрафами по внешним идентификаторам.
- Штраф — основной объект, который видит оператор: по нему видно нарушение, реквизиты оплаты, документы и связи. Просмотр и управление вынесены в админку.
- Привязка авто компании к сервису автоштрафов — определяет, какие машины компании отслеживаются в сервисе автоштрафов; через неё штраф сопоставляется с конкретной единицей инвентаря и активной арендой.
- Уведомление о штрафе — фиксирует факт рассылки и не даёт задвоить сообщение клиенту; создание записи и есть команда «отправить».
- Лог синхронизации — источник для диагностики: показывает, когда и с каким результатом проходил обмен с сервисом автоштрафов.
- Кастомный статус штрафа — инструмент ручной пометки штрафов внутри компании.
Особенности поведения
- Если у штрафа не заполнен автомобиль, ни сообщение в WhatsApp, ни системное уведомление не отправляются — запись уведомления создаётся, но клиент ничего не получает.
- Протокол скачивается только при появлении или смене ссылки либо когда файла ещё нет; неудачная попытка не затирает уже сохранённый файл.
- Сообщение в WhatsApp уходит фоновой задачей и повторяется до трёх раз с интервалом 5 минут при недоступности сервиса; если протокол ещё не скачан, сообщение не отправляется, а в журнал пишется предупреждение.
- Уведомление уникально по паре «телефон + штраф», поэтому повторно отправить тот же штраф на тот же номер нельзя; но один и тот же штраф можно разослать на разные номера, создав несколько записей.
- Дата нарушения подставляется в текст системного уведомления без проверки на пустоту, поэтому штраф без даты нарушения приведёт к ошибке при отправке.
- При удалении связанного объекта ссылки штрафа на авто, водителя, компанию и кастомный статус обнуляются (сам штраф сохраняется), а привязки авто и уведомления удаляются вместе с компанией-арендодателем.
Связанные страницы
Глоссарий: Модель данных
Полный перечень полей всех сущностей сервиса автоштрафов.
Сервис автоштрафов (штрафы и синхронизация авто)
Обзор модуля и навигация по всем его страницам.
Синхронизация автомобилей
Выгрузка списка авто, сверка активных и неактивных, удаление осиротевших машин.
API компании: авто и штрафы
Адреса арендодателя: привязка своих машин к сервису автоштрафов и просмотр штрафов только по ним.
Уведомления о штрафах
Сопоставление штрафа с арендой и отправка клиенту двуязычного WhatsApp-сообщения с PDF.