# Аудит заказов, оплаты и админки заказов

**Дата:** 2026-05-28
**Scope:** `orders/payments/admin-orders`

## Summary

- P0: не найдено в первой итерации.
- P1: исправлены SSE/queryKey для админской деталки, authorType админского чата, summary внимания и guard оплаты до подтверждения доставки.
- P2: добавлены focused tests для найденных дефектов.
- P3: рефакторинги оставлены в backlog.

## Findings

### P1-001: SSE инвалидирует несуществующий queryKey админской деталки

**Статус:** fixed
**Код:** `client/src/app/providers/SseProvider.tsx`
**Тест:** `client/src/app/providers/__tests__/SseProvider.test.tsx`
**Симптом:** события `message:new`, `order:statusChanged`, `order:updated` инвалидируют `['admin', 'orders', orderId]`, но деталка использует `['admin', 'orders', 'detail', selectedId]`.
**Решение:** добавить инвалидацию `['admin', 'orders', 'detail', orderId]`, списка и summary для order events.

### P1-002: Админский чат передает инвертированный authorType в ChatMessageBubble

**Статус:** fixed
**Код:** `client/src/features/order-detail/ui/OrderDetailContent.tsx`
**Тест:** `client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx`
**Симптом:** для `m.authorType === 'admin'` компонент получает `authorType="user"`.
**Решение:** передавать фактический `authorType`: admin-message как `admin`, user-message как `user`.

### P1-003: Admin summary считает все PENDING_PAYMENT как attention

**Статус:** fixed
**Код:** `server/src/routes/api/admin-orders.js`
**Тест:** `server/src/routes/api/__tests__/admin-orders.test.js`
**Симптом:** `attentionCount` считает все `PENDING_PAYMENT`, включая заказы, где цена уже подтверждена.
**Решение:** считать только `PENDING_PAYMENT + delivery + deliveryFeeLocked=false`.

### P1-004: Admin может перевести delivery-заказ в PAID до подтверждения цены

**Статус:** fixed
**Код:** `server/src/routes/api/admin-orders.js`
**Тест:** `server/src/routes/api/__tests__/admin-orders.test.js`
**Симптом:** статусный guard разрешает `PENDING_PAYMENT -> PAID` без проверки `deliveryFeeLocked`.
**Решение:** для `next === 'PAID'` отклонять delivery-заказы с `deliveryFeeLocked === false` кодом 409.

## Refactor Backlog

- Проверить, нужен ли `client/src/shared/constants/order.ts::canTransitionOrderStatus`; если нужен, сделать deliveryType обязательным аргументом.
- После стабилизации route-тестов рассмотреть вынос части логики `admin-orders.js` в маленькие pure helpers.

## Verification

- `server npm test` — pass
- `server npm run lint` — pass, warnings only
- `server npm run format:check` — pass
- `client npm run lint` — pass, warnings only
- `client npm run format:check` — pass
- `client focused vitest` — pass
- `client npm run build` — pass, Vite chunk-size warning only
