Задание: iOS. сделать апп на телефон для логистической компании (Дистанционная работа)
Ниже — **сжатое ТЗ (до ~5000 символов)**, без воды, но достаточно конкретное для старта разработки.
---
## ТЗ: Мобильное приложение для водителей логистической компании (v1.2)
**Платформы:** iOS / Android
**Языки:** мультиязычность (RU/EN + расширение)
**Авторизация:** SMS-код (OTP)
**Рейсы:** 1 адрес → 1 адрес, назначаются диспетчером через TMS
**Оплаты:** НЕ входят в scope
**Интеграция:** своя TMS через API
### 1) Назначение
Приложение для водителей: получение рейсов, GPS-трекинг, контроль отклонений, работа с документами и POD (доказательство доставки), чат с диспетчером, печать накладной.
---
### 2) Основной функционал
#### 2.1 Смена (рабочее время)
* Водитель вручную включает/выключает: **«Начать смену / Завершить смену»**
* Трекинг работает **только во время смены**
* Если водитель “под грузом” (статус из TMS), приложение требует активную смену.
#### 2.2 Рейсы
* Экран «Рейсы»: Активные / Завершенные / Проблемные
* Карточка рейса: №, адрес A→B, статус, метка “под грузом”
* Экран рейса: карта/маршрут, статусы, документы, POD, чат, печать.
#### 2.3 Статусы доставки
Статусы: **В пути → Прибыл → Разгрузка → Доставлено / Отказ/Проблема**
* **«Прибыл» ставится автоматически по геозоне** (фиксируется событие въезда).
* «Доставлено» доступно только при выполненном POD.
#### 2.4 GPS-трекинг и контроль
* Отправка координат: **каждую 1 минуту**
* Фиксировать: координаты, скорость, остановки, отклонение от маршрута, вход/выход из геозон
* Отклонение от маршрута: **> 5 км** → событие + уведомление водителю/диспетчеру (не чаще 1 раза в 5 минут).
* Если GPS отключён при “под грузом”: предупреждение + событие, запрос включить GPS (через настройки).
* Если нет интернета: запись в локальную очередь, отправка при восстановлении.
#### 2.5 Геозоны
* Геозоны приходят из TMS: координаты + радиус.
* События: `GEOFENCE_ENTER/EXIT`, автоматическая установка «Прибыл».
#### 2.6 Документы
Типы: **ТТН / CMR / накладные / акты / чеки / фото товара**
* Загрузка фото из **камеры и галереи**
* **Обязательная проверка качества фото** (размытость/читаемость). При провале — просить переснять.
* Документы привязываются к рейсу, отображается статус отправки (в очереди/отправлено/ошибка).
#### 2.7 POD (Proof of Delivery)
Для «Доставлено» обязательно:
* **3 фото**
* **подпись получателя**
* **геолокация (POD proof)**
* timestamp
Опционально: печать (фото), QR/штрихкод.
#### 2.8 Чат и коммуникации
* Чат по рейсу (текст/фото)
* Шаблоны: «Опаздываю», «Не могу найти точку», «Проблема», «Нужна помощь»
* Кнопка звонка диспетчеру
* Офлайн: сообщения в очередь.
#### 2.9 Уведомления (push)
* назначен/изменён рейс
* сообщение диспетчера
* отклонение >5 км
* GPS выключен при “под грузом”
* требуется POD/документы
#### 2.10 Печать (Bluetooth)
* Подключение к Bluetooth-принтеру
* Печать **накладной** (PDF приходит с сервера)
---
### 3) Офлайн-режим
* Все события/статусы/фото/чат сохраняются локально и синхронизируются при сети.
* Очередь должна быть устойчивой к перезапуску приложения.
---
### 4) API (минимальный набор)
* `/auth/otp/request`, `/auth/otp/verify`, `/auth/token/refresh`
* `GET /driver/trips`, `GET /trips/{id}`, `GET /trips/{id}/route`, `GET /trips/{id}/geofences`
* `POST /trips/{id}/status`, `POST /trips/{id}/tracking`, `POST /trips/{id}/events`
* `POST /trips/{id}/documents` (multipart), `POST /trips/{id}/pod` (multipart)
* `GET/POST /trips/{id}/chat`
* `GET /trips/{id}/waybill/pdf`
---
### 5) Критерии приемки
* Вход по SMS
* Смена ON/OFF вручную
* Рейсы приходят из TMS
* Трекинг раз/мин и события отклонений/геозон
* «Прибыл» автоматически по геозоне
* Документы с проверкой качества
* POD: 3 фото + подпись + гео
* Чат + push уведомления
* Офлайн-очередь + синхронизация
* Печать накладной по Bluetooth