supersam/docs/superpowers/specs/2026-04-13-1c-delivery-ui-d...

76 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.