refactor: simplify order status model — remove DELIVERY_FEE_ADJUSTMENT and PAYMENT_VERIFICATION

- Add deliveryFeeLocked field to Order model
- Remove DELIVERY_FEE_ADJUSTMENT and PAYMENT_VERIFICATION statuses (11→8)
- 3 order paths: delivery+online (locked→unlocked→paid), pickup+online (unlocked→paid), pickup+on_pickup (direct to in_progress)
- Update checkout to use PENDING_PAYMENT + deliveryFeeLocked
- Update payment flow to stay in PENDING_PAYMENT until admin confirms
- Update admin UI to use deliveryFeeLocked instead of status check
- Update client payment UI with new deliveryFeeLocked logic
This commit is contained in:
Kirill
2026-05-15 21:55:14 +05:00
parent 2db6258b33
commit f855568687
18 changed files with 1170 additions and 135 deletions
@@ -0,0 +1,72 @@
# Дизайн: Упрощение статусной модели заказов (A+B)
**Дата:** 2026-05-15
**Статус:** Утверждено
## Проблема
Текущая модель заказов содержит 11 статусов, из которых два (`DELIVERY_FEE_ADJUSTMENT`, `PAYMENT_VERIFICATION`) являются промежуточными и могут быть заменены флагами/логикой.
## Решение
Убрать 2 статуса, добавить флаг `deliveryFeeLocked`. Итого: 9 → 8 статусов (было 11).
### Удалённые статусы
| Было | Чем заменяется |
|---|---|
| `DELIVERY_FEE_ADJUSTMENT` | Флаг `deliveryFeeLocked: Boolean` на заказе |
| `PAYMENT_VERIFICATION` | Заказ остаётся в `PENDING_PAYMENT` до ручного подтверждения |
### Новая статусная модель
```
DRAFT ──→ PENDING_PAYMENT ──→ PAID ──→ IN_PROGRESS ──┬─→ SHIPPED ──────────┐
│ │
└─→ READY_FOR_PICKUP ──┤
DONE
CANCELLED ←── (из любого статуса, кроме DONE и CANCELLED)
```
### Логика `deliveryFeeLocked`
| Значение | Админ | Клиент |
|---|---|---|
| `false` | Может менять `deliveryFeeCents` | Видит "ожидает утверждения доставки", оплата недоступна |
| `true` | Не может менять доставку | Видит кнопку оплаты |
### Переходы (admin)
| Из | В |
|---|---|
| `DRAFT` | `PENDING_PAYMENT`, `CANCELLED` |
| `PENDING_PAYMENT` | `PAID`, `CANCELLED` |
| `PAID` | `IN_PROGRESS`, `CANCELLED` |
| `IN_PROGRESS` (delivery) | `SHIPPED`, `CANCELLED` |
| `IN_PROGRESS` (pickup) | `READY_FOR_PICKUP`, `CANCELLED` |
| `SHIPPED` | *(нет)* |
| `READY_FOR_PICKUP` | *(нет)* |
| `DONE` | *(нет)* |
| `CANCELLED` | *(нет)* |
### Миграция данных
Все заказы в статусе `DELIVERY_FEE_ADJUSTMENT``PENDING_PAYMENT` + `deliveryFeeLocked: false`.
Все заказы в статусе `PAYMENT_VERIFICATION``PENDING_PAYMENT`.
### Изменяемые файлы
1. `server/prisma/schema.prisma` — добавить `deliveryFeeLocked Boolean @default(false)`
2. `shared/constants/order-status.js` — убрать 2 статуса
3. `shared/constants/order-status.d.ts` — убрать 2 статуса
4. `server/src/lib/order-status.js` — обновить `canTransitionAdminOrderStatus`
5. `client/src/shared/constants/order.ts` — обновить `getAdminNextOrderStatuses`
6. `client/src/shared/lib/order-status-labels.ts` — убрать подписи
7. `server/src/routes/user-orders.js` — убрать `DELIVERY_FEE_ADJUSTMENT`
8. `server/src/routes/user-payments.js` — убрать `PAYMENT_VERIFICATION`
9. `server/src/routes/api/admin-orders.js` — добавить эндпоинт `deliveryFeeLocked`, убрать проверки
10. `client/src/pages/admin-orders/ui/AdminOrdersPage.tsx` — обновить UI
11. `client/src/features/order-payment/ui/OrderPaymentSection.tsx` — обновить UI
12. `server/src/lib/__tests__/order-status.test.js` — обновить тесты