Appearance
UAT Checklist — MyHoreca Pay
Практический чеклист приёмки перед передачей бухгалтеру и перед beta/UAT.
Связанные документы: Production Readiness Report · Release Checklist · Current Architecture State · Roadmap
Окружения для live UAT:
| Контур | UI | API | Назначение |
|---|---|---|---|
| Test / staging | https://pay.ru.tuna.am | https://apipay.ru.tuna.am | Beta/UAT, test iiko |
| MVP production profile | https://paym.ru.tuna.am | same-origin /api | Боевой Syrve/iiko профиль (MHPAY-35 epic) |
| Production | https://pay.myhoreca.id | https://pay.myhoreca.id/api | Целевой prod handoff |
Важно: статусы в этом документе по умолчанию Not run. Не меняйте на
Passed, пока оператор не выполнил сценарий на целевом контуре и не приложил evidence.
Production acceptance — paym.ru.tuna.am (MHPAY-39)
Чеклист приёмки после redeploy на MVP production profile. Выполняется оператором/ops на живом контуре; эта итерация подготовила сценарии и сверила их с runtime contracts в репозитории — live evidence ещё не собрана.
Репозиторный baseline: зарегистрированные Pay-host capabilities always-on. Новые postings всегда создаются в ApprovalRequired; removed env/config gates и deprecated DB capability columns не управляют runtime. См. environment-variables.
Сводная таблица PAYM:
| ID | Сценарий | Status | Owner | Date |
|---|---|---|---|---|
| PAYM-01 | API перезапущен после redeploy | Not run | ||
| PAYM-02 | Always-on runtime registration | Not run | ||
| PAYM-03 | Deprecated DB capability fields ignored | Not run | ||
| PAYM-04 | RBAC/scope + mandatory approval | Not run | ||
| PAYM-05 | Live probe (REST session) | Not run | ||
| PAYM-06 | Справочники: live names / fallback | Not run | ||
| PAYM-07 | Баннеры vs operational flags API | Not run | ||
| PAYM-08 | Posting preflight / dry-run | Not run |
Как использовать
- Назначьте исполнителя (оператор / бухгалтер / QA).
- Для каждого сценария заполните Status, Evidence, Notes.
- Блокирующие дефекты — в Plane с ссылкой на сценарий (например
UAT-07). - Перед handoff бухгалтеру все критичные сценарии должны быть
Passedили явноBlockedс согласованным workaround.
Сводная таблица
| ID | Сценарий | Status | Owner | Date |
|---|---|---|---|---|
| UAT-01 | Login | Not run | ||
| UAT-02 | Expired token | Not run | ||
| UAT-03 | Upload supported bank file | Not run | ||
| UAT-04 | Unsupported file | Not run | ||
| UAT-05 | Quality report | Not run | ||
| UAT-06 | Duplicate review | Not run | ||
| UAT-07 | Counterparty matching | Not run | ||
| UAT-08 | Rule creation | Not run | ||
| UAT-09 | Allocation preview | Not run | ||
| UAT-10 | Allocation confirmation | Not run | ||
| UAT-11 | Syrve dry-run / posting gate | Not run | ||
| UAT-12 | Audit log | Not run | ||
| UAT-13 | Review queue | Not run | ||
| UAT-14 | Permissions / roles | Not run | ||
| PAYM-01 | paym: API restart after redeploy | Not run | ||
| PAYM-02 | paym: always-on runtime | Not run | ||
| PAYM-03 | paym: deprecated DB capabilities ignored | Not run | ||
| PAYM-04 | paym: RBAC/scope + approval | Not run | ||
| PAYM-05 | paym: connection probe | Not run | ||
| PAYM-06 | paym: Syrve references | Not run | ||
| PAYM-07 | paym: operational banners | Not run | ||
| PAYM-08 | paym: posting preflight/dry-run | Not run |
PAYM-01 — API перезапущен после redeploy
| Поле | Значение |
|---|---|
| Цель | Убедиться, что на paym.ru.tuna.am работает свежий API после merge/redeploy, а не закэшированный старый процесс. |
| Preconditions | Доступ ops к deployment; известен ожидаемый git tag / image / commit deploy. |
| Steps | 1. Зафиксировать deploy commit/tag. 2. GET https://paym.ru.tuna.am/api/health — Healthy. 3. Повторить после intentional restart контейнера/процесса API. 4. Проверить, что timestamp/версия в логах или health detail соответствует redeploy (без secrets в evidence). |
| Expected result | Health отвечает 200; после restart сервис поднимается с тем же конфигом; UI /login загружается. |
| Evidence | Deploy commit hash; скрин health 200; ops note о времени restart. |
| Status | Not run |
| Notes / defects | Requires live operator evidence on paym. |
PAYM-02 — Always-on Syrve/iiko runtime
| Поле | Значение |
|---|---|
| Цель | Подтвердить, что зарегистрированные Pay-host reads/sync/write capabilities доступны без env/config enablement flags. |
| Preconditions | Свежий deploy API и bridged connection. |
| Steps | 1. Убедиться, что removed gate keys отсутствуют в deployment profile. 2. Выполнить probe, document sync и posting dry-run. 3. Если operational-flags ещё доступен, считать его deprecated compatibility response, а не control surface. |
| Expected result | Reads/sync/preflight доступны; removed configuration gates не влияют на результат; старые capability fields не управляют поведением. |
| Evidence | Deploy config key audit без secrets; sanitized probe/sync/dry-run responses. |
| Status | Not run |
| Notes / defects | Unit: SyrveRuntimeGateTests. Requires live paym evidence. |
PAYM-03 — Deprecated DB capability fields ignored
| Поле | Значение |
|---|---|
| Цель | Legacy capability columns в PlatformSettings/OrganizationQuota не включают и не отключают Syrve/iiko runtime. |
| Preconditions | Право platform.settings.view; доступ к /settings или API. |
| Steps | 1. GET /api/platform/settings и org quota. 2. Зафиксировать legacy capability values. 3. Выполнить document sync и payment dry-run независимо от этих значений. |
| Expected result | Legacy columns могут возвращаться для compatibility, но не меняют runtime capability; supported settings продолжают разрешаться обычным способом. |
| Evidence | Sanitized settings/quota JSON + результаты sync/dry-run. |
| Status | Not run |
| Notes / defects | Unit: PlatformSettingsTests. См. operational-settings-resolution. |
PAYM-04 — RBAC/scope и обязательное approval
| Поле | Значение |
|---|---|
| Цель | Подтвердить, что always-on capability не обходит authorization и ручное решение оператора. |
| Preconditions | Выбраны organization/Outlet/connection и пользователи с разрешённым/запрещённым scope. |
| Steps | 1. Попытка queue вне scope должна вернуть 403. 2. Разрешённый queue создаёт posting в ApprovalRequired. 3. До approve worker не выполняет RPC. 4. Approve требует соответствующего permission и оставляет audit. |
| Expected result | Scope enforced; новый posting никогда не становится runnable без manual approve; deprecated quota capability fields игнорируются. |
| Evidence | Sanitized posting/audit JSON и 403 response. |
| Status | Not run |
| Notes / defects | Unit: OrganizationQuotaSettingsTests. Seeder default: true для default org. |
PAYM-05 — Live probe подключения (REST session)
| Поле | Значение |
|---|---|
| Цель | Проверка подключения к боевому Syrve/iiko через REST session, без fake success. |
| Preconditions | Production SyrveConnection с bridge; credentials в secret provider. |
| Steps | 1. UI /syrve/connections → «Проверить» или POST /api/syrve/connections/{id}/test. 2. Альтернатива для нового подключения: POST /api/syrve/connections/probe. 3. GET /api/syrve/connections/{id}/health — lastCheckStatus=connected, заполнены serverVersion / serverEdition. |
| Expected result | SyrveConnectionCheckResult success; REST session verify; errors describe credentials/HTTP/RPC/server applicability, not removed runtime gates. |
| Evidence | connectionId; sanitized health JSON; скрин UI статуса (без пароля). |
| Status | Not run |
| Notes / defects | Unit: SyrveConnectionProbeTests. Requires live paym evidence. |
PAYM-06 — Справочники: live names и явный fallback
| Поле | Значение |
|---|---|
| Цель | Счета и ДДС показывают читаемые имена/коды; fallback отличим от live-каталога. |
| Preconditions | PAYM-05 passed; default bridged connection. |
| Steps | 1. /syrve/references → вкладки счетов и ДДС. 2. GET /api/syrve/references/accounts — имена не равны голому GUID при наличии XML name/code. 3. GET /api/syrve/references/cash-flow-articles — live rows из persisted entities; fallback rows помечены как не live-каталог в UI. |
| Expected result | Читаемые name/code; нет stale subtitle «stub»; fallback явно подписан. |
| Evidence | Скрин references; sanitized JSON (первые 3 строки). |
| Status | Not run |
| Notes / defects | Unit: SyrvePaymentReferenceReaderTests (MHPAY-42). Live ДДС требует runtime + bridge + persisted entities. |
PAYM-07 — Баннеры проведения оплат vs runtime
| Поле | Значение |
|---|---|
| Цель | UI operational banners соответствуют API, а не захардкоженному тексту. |
| Preconditions | Авторизованный пользователь с syrve.connections.view. |
| Steps | 1. Открыть /syrve/connections и detail подключения. 2. Проверить health diagnostics для bridge/credentials/HTTP/RPC. 3. Если operational-flags ещё вызывается, убедиться, что UI не предлагает переключать capability. |
| Expected result | Нет баннеров с инструкцией включить removed gates; actionable warnings относятся к connection/preflight failures. |
| Evidence | Скрин UI; sanitized health response. |
| Status | Not run |
| Notes / defects | MHPAY-37; Playwright: syrve-connections-probe.spec.ts. |
PAYM-08 — Posting preflight / dry-run
| Поле | Значение |
|---|---|
| Цель | Write-path защищён gates; preflight и dry-run работают без live write (или с controlled test posting по решению владельца). |
| Preconditions | Подтверждённая allocation + posting в статусе, допускающем dry-run; PAYM-02..04 согласованы. |
| Steps | 1. GET /api/syrve/postings/{id}/preflight — проверить method/server applicability/credentials/transport. 2. POST /api/syrve/postings/{id}/dry-run — проверить business/idempotency/anomaly controls. 3. Убедиться, что posting остаётся ApprovalRequired до ручного approve. |
| Expected result | Dry-run не вызывает iiko write; коды ошибок из api.md; mandatory approval соблюдён. |
| Evidence | postingId; sanitized preflight + dry-run JSON; env snapshot (без secrets). |
| Status | Not run |
| Notes / defects | Не выполнять live production write без явного Go владельца. FAIL_RECONCILE из test report 2026-06-19 остаётся блокером для unrestricted prod write. |
Sign-off (paym production profile)
| Role | Name | Date | Signature / link |
|---|---|---|---|
| Operations | |||
| Engineering | |||
| Product owner |
PAYM gate: PAYM-01..08 Passed или согласованный Blocked перед расширением production write на paym.
UAT-01 — Login
| Поле | Значение |
|---|---|
| Цель | Убедиться, что оператор может войти и видит рабочее пространство с корректными правами. |
| Preconditions | Активный пользователь с известным email/паролем; API и UI доступны на целевом контуре. |
| Test data | Учётная запись оператора (не коммитить пароль в репозиторий). |
| Steps | 1. Открыть /login. 2. Ввести email и пароль. 3. Нажать «Войти». 4. Проверить редирект на dashboard. 5. Открыть меню пользователя / профиль — роли и организации отображаются. |
| Expected result | Успешный вход; GET /api/auth/me возвращает профиль, scoped roles, permissions; нет 500/401 на защищённых страницах. |
| Evidence | Скриншот dashboard; export HAR или curl GET /api/auth/me (без токена в публичном архиве). |
| Status | Not run |
| Notes / defects | Mocked coverage: frontend/tests/smoke.spec.ts. Live: Requires live UAT evidence. |
UAT-02 — Expired token
| Поле | Значение |
|---|---|
| Цель | Проверить поведение при истёкшем JWT: безопасный logout/redirect, без «тихого» доступа к данным. |
| Preconditions | Пользователь был залогинен; access token истёк (дождаться TTL или подставить просроченный token в localStorage в devtools — только на test). |
| Test data | Сессия с истёкшим токеном. |
| Steps | 1. Войти. 2. Имитировать expiry (ожидание или manual token invalidation). 3. Выполнить действие, требующее API (например открыть /bank-statements). 4. Наблюдать redirect на login или refresh flow. |
| Expected result | Нет отображения чужих/устаревших данных; пользователь перенаправлен на login с понятным сообщением; повторный login восстанавливает работу. |
| Evidence | Скриншот login после expiry; network tab с 401. |
| Status | Not run |
| Notes / defects | Mocked: Playwright expired-token flow в current-state.md. Live: Requires live UAT evidence. |
UAT-03 — Upload supported bank file
| Поле | Значение |
|---|---|
| Цель | Импорт поддерживаемого банковского файла в выбранную организацию/точку. |
| Preconditions | Право perm:bank_statements.upload; выбраны organizationId и locationId. |
| Test data | Санитизированная фикстура frontend/scripts/samples/sample-bank-statement.csv или pilot-файл банка (не коммитить PII в репозиторий). |
| Steps | 1. /bank-statements → загрузка файла. 2. Дождаться 202 Accepted от POST /api/bank-statements/import. 3. Открыть созданный импорт. 4. Проверить список транзакций. |
| Expected result | Status Parsed или SuccessWithWarnings; транзакции видны; detected bank/format заполнены; ошибки парсинга — с operatorTitle/message (если есть). |
| Evidence | importId; скриншот upload result; фрагмент quality/import detail. |
| Status | Not run |
| Notes / defects | Unit/import tests на sanitized fixtures. Real bank pilot: Pending operator run. |
UAT-04 — Unsupported file
| Поле | Значение |
|---|---|
| Цель | Неподдерживаемый файл обрабатывается безопасно с понятным сообщением оператору. |
| Preconditions | Право upload. |
| Test data | .txt, .pdf или произвольный CSV без заголовков банка. |
| Steps | 1. Загрузить неподдерживаемый файл. 2. Проверить ответ API и UI. 3. Открыть импорт (если создан) → quality/error. |
| Expected result | Failed или UnsupportedFormat; operator-facing error (не stack trace); нет частичного «мусорного» импорта без статуса. |
| Evidence | Скриншот ошибки; BankStatementImportUploadResultDto / quality report errors. |
| Status | Not run |
| Notes / defects | Requires live UAT evidence. |
UAT-05 — Quality report
| Поле | Значение |
|---|---|
| Цель | Оператор понимает качество парсинга: confidence, warnings, balance, skipped rows. |
| Preconditions | Импорт с quality report (UAT-03 или импорт с предупреждениями). |
| Test data | Импорт из UAT-03. |
| Steps | 1. Открыть /bank-statements/{id} → вкладка Quality. 2. Сверить detection/parse confidence, warning/error списки. 3. Проверить whatToCheck / nextAction у issues. |
| Expected result | Все поля report соответствуют API GET .../quality-report; предупреждения на русском/понятны; balance mismatch (если есть) явно отмечен. |
| Evidence | Скриншот quality tab; JSON report (sanitized). |
| Status | Not run |
| Notes / defects | Requires live UAT evidence. |
UAT-06 — Duplicate review
| Поле | Значение |
|---|---|
| Цель | Оператор может подтвердить или отклонить duplicate candidate с audit trail. |
| Preconditions | Импорт с duplicate candidates (GET .../duplicates не пуст). |
| Test data | Повторный импорт того же файла или fixture с duplicate-like rows (см. unit tests). |
| Steps | 1. Вкладка Duplicates на import detail. 2. Прочитать reason и matched signals. 3. Confirm или Dismiss. 4. Проверить обновление статуса кандидата. |
| Expected result | BankDuplicateCandidateMutationResultDto; кандидат исчезает из open queue или меняет status; действие логируется (см. UAT-12). |
| Evidence | Скриншот до/после; candidateId. |
| Status | Not run |
| Notes / defects | Mocked E2E: mhpay-e2e-smoke.spec.ts. Live: Pending operator run. |
UAT-07 — Counterparty matching
| Поле | Значение |
|---|---|
| Цель | Ручное сопоставление банковской транзакции с контрагентом Syrve/iiko. |
| Preconditions | Unmatched или low-confidence match; право perm:counterparty.match. |
| Test data | Транзакция из UAT-03 с Unmatched или LowConfidence. |
| Steps | 1. /name-matching?status=Unmatched. 2. Выбрать строку → manual match. 3. Выбрать контрагента Syrve. 4. Сохранить. |
| Expected result | POST /api/counterparty-matches → status ManualMatched; explainability fields (reason, signals) заполнены. |
| Evidence | Скриншот matching; matchId. |
| Status | Not run |
| Notes / defects | Requires live UAT evidence (нужен live/stub Syrve references). |
UAT-08 — Rule creation
| Поле | Значение |
|---|---|
| Цель | Из ручного match создаётся правило для будущих авто-сопоставлений. |
| Preconditions | UAT-07 выполнен или есть bankTransactionId. |
| Test data | Pattern из counterparty raw name. |
| Steps | 1. Создать rule через UI/API POST /api/counterparties/rules. 2. Повторить импорт с похожим контрагентом (опционально). 3. Проверить AutoMatched на новом импорте. |
| Expected result | CreateCounterpartyRuleResult; при дубликате rule — alreadyExists: true без дублирования записи. |
| Evidence | ruleId; скриншот rules list. |
| Status | Not run |
| Notes / defects | Requires live UAT evidence для проверки на втором импорте. |
UAT-09 — Allocation preview
| Поле | Значение |
|---|---|
| Цель | Preview распределения показывает строки, warnings, partial/over/stale без записи в БД. |
| Preconditions | Matched bank transaction; кандидаты документов (sync или mock). |
| Test data | bankTransactionId с match; document lines для preview. |
| Steps | 1. /payment-allocations/preview?bankTransactionId=. 2. Выбрать кандидатов. 3. POST /api/payment-allocations/preview. 4. Проверить warnings {code,message} и line context. |
| Expected result | Typed warnings; totals сходятся; нет allocationId до confirm. |
| Evidence | Скриншот preview; request/response (sanitized). |
| Status | Not run |
| Notes / defects | Mocked E2E covers flow. Live Syrve docs: Pending operator run. |
UAT-10 — Allocation confirmation
| Поле | Значение |
|---|---|
| Цель | Подтверждение allocation создаёт запись с idempotency и audit. |
| Preconditions | UAT-09 preview успешен. |
| Test data | Тот же preview payload + idempotencyKey. |
| Steps | 1. Confirm allocation. 2. Открыть detail /payment-allocations/{id}. 3. Повторить confirm с тем же idempotencyKey. |
| Expected result | Первая confirm — новая allocation; повтор — возврат существующей (no double write); audit log содержит Allocate. |
| Evidence | allocationId; audit entry id. |
| Status | Not run |
| Notes / defects | Requires live UAT evidence. |
UAT-11 — Syrve dry-run / posting gate
| Поле | Значение |
|---|---|
| Цель | Write-path защищён: dry-run, mandatory approval, scoped/business/transport checks. |
| Preconditions | Подтверждённая allocation; Syrve connection в Test; owner-approved test scope. |
| Test data | Test connection only; always-on capability не является разрешением на production write. |
| Steps | 1. Открыть allocation detail и проверить rowVersion, строки и blockers. 2. POST /api/syrve/postings/preview/{allocationId} или detail preview в UI. 3. Queue posting и убедиться в ApprovalRequired. 4. Проверить write target, GET .../preflight, POST .../dry-run, GET .../attempts, GET .../evidence. 5. До approve убедиться в отсутствии external write. |
| Expected result | Dry-run без live write; approve обязателен для каждого нового posting; attempts/evidence не раскрывают raw payloads/secrets. |
| Evidence | postingId; скрин allocation/posting detail; sanitized preflight/dry-run/attempts/evidence response; env snapshot (без secrets). |
| Status | Not run |
| Notes / defects | Live test report 2026-06-19: PASS_WRITE / FAIL_RECONCILE на test iiko only. Not verified in this iteration на staging tuna. |
UAT-12 — Audit log
| Поле | Значение |
|---|---|
| Цель | Критичные действия (match, allocate, posting, notification read) видны в audit log. |
| Preconditions | Выполнены UAT-07, UAT-10 или UAT-11. |
| Test data | entityId из предыдущих шагов. |
| Steps | 1. /audit-log. 2. Найти записи Match / Allocate / Sync. 3. Сверить user, timestamp, message. |
| Expected result | PagedResult<AuditLogEntryDto>; записи соответствуют действиям оператора. |
| Evidence | Скриншот audit; audit entry ids. |
| Status | Not run |
| Notes / defects | Requires live UAT evidence. |
UAT-13 — Review queue
| Поле | Значение |
|---|---|
| Цель | /review-queue агрегирует «требует внимания» и ведёт в правильные workspace. |
| Preconditions | В системе есть хотя бы один open item (failed import, unmatched, failed posting, etc.) или пустая очередь для negative test. |
| Test data | Данные из предыдущих UAT или seed. |
| Steps | 1. Открыть /review-queue. 2. Проверить счётчики блоков. 3. Перейти по ссылке фильтра (например unmatched → /name-matching?status=Unmatched). |
| Expected result | Счётчики совпадают с API; ссылки применяют query filters; при нулевых счётчиках — «Очередь пуста». |
| Evidence | Скриншот queue; список counts. |
| Status | Not run |
| Notes / defects | См. current-state.md — Review Queue. Requires live UAT evidence. |
UAT-14 — Permissions / roles
| Поле | Значение |
|---|---|
| Цель | Scoped RBAC: пользователь без права не выполняет mutation; viewer не upload/match/post. |
| Preconditions | Две учётки: operator (scoped) и viewer/restricted; см. permission-matrix. |
| Test data | Users с разными role assignments на одну org/location. |
| Steps | 1. Login as viewer → попытка upload (ожидать 403). 2. Login as operator → upload OK. 3. Проверить GET /api/auth/me permissions. 4. Optional: cross-location access denied. |
| Expected result | 403 с ApiError code; UI показывает понятный отказ; mega-admin bypass только для platform roles. |
| Evidence | Скриншоты 403; permission list. |
| Status | Not run |
| Notes / defects | Unit: ScopedRbacTests. Tenant audit gaps: см. current-state known gaps. Requires live UAT evidence. |
Sign-off (UAT)
| Role | Name | Date | Signature / link |
|---|---|---|---|
| Operator lead | |||
| Accountant | |||
| QA | |||
| Product owner |
UAT gate: все сценарии UAT-01..14 в статусе Passed или согласованный Blocked + defect ticket.