76 lines
4.1 KiB
Markdown
76 lines
4.1 KiB
Markdown
# 1C Delivery UI Design Spec
|
||
|
||
## Overview
|
||
|
||
The frontend is a delivery workspace centered on logisticians, drivers, admins, and the public client delivery page. Orders are imported from 1C; the web app does not create orders. Delivery automation starts only when the full client order set is ready.
|
||
|
||
## Key Principles
|
||
|
||
1. **1C is the source of truth for order creation and production progress.** The web app never creates new orders; it receives them via import.
|
||
2. **Supabase is the source of truth for delivery workflow state.** Invitations, slots, delivery-set groupings, and operator actions all live in Supabase.
|
||
3. **Delivery sets, not individual orders, are the primary unit.** A client delivery set groups all orders for the same client and becomes actionable when every order in the set is accepted by QC (`source_accept_at` present, `source_ship_at` absent).
|
||
4. **The legacy SMS field is informational only.** It must not start the new delivery scenario.
|
||
5. **The client is not an authenticated user.** The client uses a public invitation link.
|
||
|
||
## Screen Flow
|
||
|
||
### Operator Login
|
||
|
||
- Email + OTP login via Supabase Auth.
|
||
- Unknown email shows: "Email не найден в системе. Обратитесь к администратору."
|
||
- After sending OTP, the UI tells the user to check inbox and Spam.
|
||
- Roles: `logistician`, `driver`, `admin` (and legacy `manager`, `production_lead`).
|
||
|
||
### Logistician Workspace
|
||
|
||
The logistician lands on the logistics section of the dashboard. The primary widget is the **LogisticsReadinessBoard** showing delivery sets grouped into buckets:
|
||
|
||
| Bucket | Russian Label | Meaning |
|
||
|--------|--------------|---------|
|
||
| `approaching` | На подходе | Some orders in the set have not yet been accepted by QC |
|
||
| `ready_to_launch` | Готово к запуску | All orders accepted, delivery can be started |
|
||
| `awaiting_client` | Ожидает клиента | Invitation sent, waiting for client choice |
|
||
| `manual_work` | Нужна ручная работа | Transferred to logistician, paid storage, or problem |
|
||
| `agreed` | Согласовано | Client confirmed the delivery slot |
|
||
| `completed` | Завершено | All orders in the set delivered |
|
||
|
||
Clicking a set opens the **DeliverySetDetailPanel** showing:
|
||
|
||
- Set name, city, order count, linked bill texts
|
||
- Per-order source fields: 1C order number, production steps (saw, glue, H-glue, curve, accept, ship)
|
||
- Slot state if available
|
||
- Manual action placeholders (future: start invitation, assign driver)
|
||
|
||
### Driver Workspace
|
||
|
||
The driver sees assigned deliveries with:
|
||
|
||
- Address, client name, phone, city
|
||
- Delivery time slot (date + half-day)
|
||
- Delivery set reference (1C number, set name)
|
||
- Quick status transitions: Загружен → В пути → Доставлен / Проблема доставки
|
||
|
||
### Client Delivery Page
|
||
|
||
Public page at `/delivery/:token`. States:
|
||
|
||
- **awaiting_choice / opened / reminder_sent**: Shows DeliverySlotsPicker with date + half-day slots, then DeliveryChoiceFlow buttons.
|
||
- **transferred_to_logistics**: "С вами свяжется логист"
|
||
- **paid_storage**: "Платное хранение"
|
||
- **agreed**: "Доставка уже согласована"
|
||
- **delivered**: "Заказ уже доставлен"
|
||
|
||
## Data Model Key Fields
|
||
|
||
### `public.orders` source fields (imported from 1C)
|
||
|
||
- `source_order_number`, `source_order_date`, `source_customer_name`, `source_customer_phone`, `source_customer_email`, `source_customer_city`, `source_total_sum`, `source_paid_at`, `source_gateway`, `source_associated_bills_text`, `source_production_at`, `source_saw_at`, `source_glue_at`, `source_h_glue_at`, `source_curve_at`, `source_accept_at`, `source_ship_at`, `source_payload jsonb`
|
||
|
||
### `public.orders` delivery-set fields (computed/derived)
|
||
|
||
- `delivery_set_key`, `delivery_set_name`, `delivery_set_status`, `delivery_set_ready_at`, `delivery_ready_reason`, `source_sms_legacy_at`
|
||
|
||
### Readiness Rule
|
||
|
||
A single imported order is ready when `source_accept_at IS NOT NULL AND source_ship_at IS NULL`.
|
||
A client delivery set is ready only when all linked imported orders are ready. |