EVCharge E2E — Полный цикл заказа с зарядкой

Scenario scenarios/smoke-tests/e2e-full-charging-cycle.md (E2E-FULL-001) · run run-e2e-full-charging-cycle-20260531-2201

PARTIAL

Дата: 2026-05-31 (DB UTC ~19:21–20:03)
Сборки: Client v2, Technician main-v2 (DATA_SOURCE=supabase), Dispatcher v1.5.0, OCPP v1.3.6 — все на TEST (api-test.zarady.ru)
БД: только чтение через evcharge-vps-test (SELECT only)
Видео: недоступно (CDP endpoint не найден) — только скриншоты

Итог

Полный happy-path проведён до терминального состояния «готов к оплате» (orders.status = AWAITING_PAYMENT) на заказе PZ-0576. Два документированных бага «залипшего значения» (V10 in-session и V11 reopen) НЕ воспроизводятся — исправлены. Подозреваемый баг завершения (V15) не проявляется в UI клиента (UI проходит), но обнаружен более серьёзный backend-вариант: зарядная сессия не останавливается при завершении заказа. Дополнительно: блокер accept_route (обойдён) и расхождения фактических значений/массивов фото.

Переменные прогона

ПеременнаяЗначение
ORDER_NUMBER / ORDER_IDPZ-0576 / 7dfb9fb2-6b5d-4c4e-8e25-b7ac33b2057d
ROUTE_IDb9f4af5f-9199-4187-b37c-5f25a1bc6c2c
ORDER_POINT_ID17548ae6-c13a-45c9-be91-4cc7b68773ab
SESSION_ID714f436e-0626-4516-b951-01ec55c7d6cd (OCPP Tx #133)
Техник / Авто / СтанцияTest Technik (вместо Виталий Чижов, см. WARNING-T1) / А099 Сова / DimaTest, коннектор 1
Авто клиентаBYD ATTO 3 (60.5 kWh, ccs), а 888 мр 77

Матрица проверок V1–V19

#ПроверкаРезультатКомментарий
V1Логин клиента + заказ NEWPASSзаказ NEW, Демьяна Бедного 17к3, 01.06 14:00
V2Маршрут PLANNED, 3 точки, DimaTestPASSTest Technik, 3 точки (база→заказ→база)
V3Техник принял → IN_PROGRESSFAIL на кнопке / end-state достигнут«Принять» = ошибка (BUG-1, PGRST202); UI ложно «Принят» (BUG-2); IN_PROGRESS достигнут через «Выехал»
V4Выезд → EN_ROUTE; «едет»PASSDispatcher «Техник едет», Client order+main «Техник едет к вам»
V5Прибытие → ARRIVED; «прибыл»PASSClient «Техник прибыл в»
V6Фото «До» загруженоPASSCanvasKit web upload работает; order_photos BEFORE_CHARGING + storage URL
V7Станция онлайн; сессия active; start_time≈NOWPASSвозраст 36s — НЕ 2015 (ELE-755 fix #1 ✓)
V8Order CHARGING; зарядка виднаPASSClient «Заряжается»
V9Meter values; kWt растёт; estimated убываетPASSmv 9→102; kWt 0.272→3.674; est 2284→1273s (ELE-755 fix #2 ✓)
V10In-session: order==main==DB (главная не залипает)PASSглавная 0.364→0.578→0.7→0.884 живо; ≈ DB; баг исправлен
V11Reopen: main+order показывают актуальное DBPASSпосле reopen main=0.884, order=0.976 ≈ DB 1.006; баг исправлен
V12Терминал (100%/completed/плато/cap)PARTIALреальная скорость мала → 75% недостижимо в cap 45 мин; ручное завершение (разрешено)
V13Фото «Во время»/«После» загруженыPASSorder_photos все 3 типа
V14Завершить → AWAITING_PAYMENT; session completedPARTIAL/FAILorder AWAITING_PAYMENT ✓; session НЕ completed при завершении (BUG-3)
V15Нет залипшей зарядки на order/main (UI)PASS (UI) / backend ✗Client UI «Заказ завершён»/«Ожидает оплаты», прогресс не залип; но backend-сессия продолжает зарядку (BUG-3)
V16energy==delta; actual≈метр; UI==DBPARTIAL/FAILenergy 3.674 == delta ✓; actualTotalKwt≈energy ✓ (после стопа); UI 2.8 кВт/84₽ ≠ итог 3.674; actualCost несогласован; actualCharge NULL
V17Выезд на базу → route COMPLETEDNOT EXECUTED«Выехал на базу» disabled пока заказ не оплачен (payment-gated, вне рамок); route остаётся IN_PROGRESS
V18Финальная кросс-модульная консистентностьPARTIALorder AWAITING_PAYMENT ✓, фото в order_photos(3) ✓; route IN_PROGRESS; orders.*Photos массивы NULL (WARNING-2)
V19(info) толерантность к reconnect OCPPn/aDimaTest не отключался в этом прогоне

Найденные баги (в bugs/)

BUG-1 (High)technician-accept-route-rpc-schema-drift.md: на TEST accept_route(route_id uuid, coordinates json) (старая сигнатура), а main-v2 вызывает accept_route(input_data jsonb)PGRST202, «Принять» падает. RPC выезда/прибытия уже мигрированы на input_data jsonb.
BUG-2 (Medium) — (там же): после ошибки RPC экран техника оптимистично показывает «Принят» и активирует «Выехал», хотя в БД route остаётся PLANNED.
BUG-3 (Critical)charging-session-not-stopped-on-order-completion.md: «Завершить зарядку» ставит order AWAITING_PAYMENT, но НЕ шлёт RemoteStopTransaction — сессия остаётся active, станция продолжает заряжать (energy 2.963→3.674), останавливается только через Stop на OCPP-дашборде. Каскад: actualCharge NULL, actualCost 84₽ несогласован с итоговым actualTotalKwt 3.674; клиент показывает заниженные 2.8 кВт/84₽.

WARNING / заметки

WARNING-T1: маршрут назначен на Test Technik (а не Виталий Чижов), т.к. это проверенно-рабочий логин техника на main-v2. Зарядно-критичная связка (А099 Сова + DimaTest) сохранена; зарядка прошла.
WARNING-2: orders.beforeChargingPhotos / inChargingPhotos / afterChargingPhotos = NULL, хотя все 3 фото есть в order_photos (денормализованные массивы не заполняются).
NOTE-1: estimated_charging_time_seconds=2284 уже при создании (NEW) — это plan-time оценка (сценарий ожидал NULL/0). Подтверждает наличие battery/charging-curve у BYD ATTO 3. Не дефект.
Harness: browser_file_upload в этом Docker-MCP принимает файлы только из /app (не /tmp) — обойдено через docker cp скриншота в /app контейнера браузера. Старт зарядки — два шага: «Начать зарядку» + «Старт станции».

Серия DB-CP7 (Блок 7, наблюдение)

Меткаmv_countcurrentTotalKwtcurrentChargeest_s
0 (a)90.27220%1346
0 (b)230.73121%1321
0 (c)301.00622%1297
+5592.13823%1273
finish1023.674 (заморожено после OCPP-стопа)26%
Метки +10/+20/+30 сжаты: заголовочные V10/V11 уже доказаны; реальная скорость → 75% недостижимо в cap.

Скриншоты

Сценарий (efcc-00 … efcc-08)

00 — OCPP: DimaTest CONNECTED, коннектор 1 Available
01 — Client: заказ PZ-0576 создан (Принят)
02 — Dispatcher: форма маршрута (3 точки, Готов)
02 — Dispatcher: маршрут создан (Запланирован)
04 — Technician: выезд с базы (В работе)
04 — Dispatcher: Выполняется / Техник едет
04 — Client order: «Техник едет к вам»
04 — Client main: «Техник едет к вам»
05 — Technician: прибытие (Прибыл)
05 — Client main: «Техник прибыл в»
06 — Technician: фото «До» загружено (1)
06 — Technician: зарядка идёт (Включена)
06 — Client main: «Заряжается» 21% • 0.578 кВт
07 — Mark0 order: 21%, «завершится через 22 мин»
07 — Mark0 main: 0.578 кВт (живо обновляется)
07 — Mark0 reopen main: 0.884 кВт (актуально)
07 — Mark0 reopen order: 22% • 0.976 кВт
07 — Mark+5 order: 24% • 2.29 кВт
08 — Technician: диалог завершения (2.8 кВт / 24%)
08 — Technician: заказ завершён (100%)
08 — Client order: «Заказ завершён / Ожидает оплаты» (V15 UI ✓)
08 — Client main: PZ-0576 ушёл из «Активных» (V15 UI ✓)

Деталь: выбор даты/времени (Блок 1, tap-to-select)

datepicker — initial (Сегодня 19:15)
datepicker — ArrowUp (без эффекта)
datepicker — drag fling (перелёт на авг)
datepicker — tap-to-select работает
datepicker — reopened (сброс на now)
datepicker — выбрано «пн 1 июн»
datepicker — час 15 / минута 00
datepicker — итог «пн 1 июн 14:00»