Skip to content

UAT Checklist — MyHoreca Pay ​

Практический чеклист приёмки перед передачей бухгалтеру и перед beta/UAT.

Связанные документы: Production Readiness Report · Release Checklist · Current Architecture State · Roadmap

Окружения для live UAT:

КонтурUIAPIНазначение
Test / staginghttps://pay.ru.tuna.amhttps://apipay.ru.tuna.amBeta/UAT, test iiko
MVP production profilehttps://paym.ru.tuna.amsame-origin /apiБоевой Syrve/iiko профиль (MHPAY-35 epic)
Productionhttps://pay.myhoreca.idhttps://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СценарийStatusOwnerDate
PAYM-01API перезапущен после redeployNot run
PAYM-02Always-on runtime registrationNot run
PAYM-03Deprecated DB capability fields ignoredNot run
PAYM-04RBAC/scope + mandatory approvalNot run
PAYM-05Live probe (REST session)Not run
PAYM-06Справочники: live names / fallbackNot run
PAYM-07Баннеры vs operational flags APINot run
PAYM-08Posting preflight / dry-runNot run

Как использовать ​

  1. Назначьте исполнителя (оператор / бухгалтер / QA).
  2. Для каждого сценария заполните Status, Evidence, Notes.
  3. Блокирующие дефекты — в Plane с ссылкой на сценарий (например UAT-07).
  4. Перед handoff бухгалтеру все критичные сценарии должны быть Passed или явно Blocked с согласованным workaround.

Сводная таблица ​

IDСценарийStatusOwnerDate
UAT-01LoginNot run
UAT-02Expired tokenNot run
UAT-03Upload supported bank fileNot run
UAT-04Unsupported fileNot run
UAT-05Quality reportNot run
UAT-06Duplicate reviewNot run
UAT-07Counterparty matchingNot run
UAT-08Rule creationNot run
UAT-09Allocation previewNot run
UAT-10Allocation confirmationNot run
UAT-11Syrve dry-run / posting gateNot run
UAT-12Audit logNot run
UAT-13Review queueNot run
UAT-14Permissions / rolesNot run
PAYM-01paym: API restart after redeployNot run
PAYM-02paym: always-on runtimeNot run
PAYM-03paym: deprecated DB capabilities ignoredNot run
PAYM-04paym: RBAC/scope + approvalNot run
PAYM-05paym: connection probeNot run
PAYM-06paym: Syrve referencesNot run
PAYM-07paym: operational bannersNot run
PAYM-08paym: posting preflight/dry-runNot run

PAYM-01 — API перезапущен после redeploy ​

ПолеЗначение
ЦельУбедиться, что на paym.ru.tuna.am работает свежий API после merge/redeploy, а не закэшированный старый процесс.
PreconditionsДоступ ops к deployment; известен ожидаемый git tag / image / commit deploy.
Steps1. Зафиксировать 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 resultHealth отвечает 200; после restart сервис поднимается с тем же конфигом; UI /login загружается.
EvidenceDeploy commit hash; скрин health 200; ops note о времени restart.
StatusNot run
Notes / defectsRequires 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.
Steps1. Убедиться, что removed gate keys отсутствуют в deployment profile. 2. Выполнить probe, document sync и posting dry-run. 3. Если operational-flags ещё доступен, считать его deprecated compatibility response, а не control surface.
Expected resultReads/sync/preflight доступны; removed configuration gates не влияют на результат; старые capability fields не управляют поведением.
EvidenceDeploy config key audit без secrets; sanitized probe/sync/dry-run responses.
StatusNot run
Notes / defectsUnit: 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.
Steps1. GET /api/platform/settings и org quota. 2. Зафиксировать legacy capability values. 3. Выполнить document sync и payment dry-run независимо от этих значений.
Expected resultLegacy columns могут возвращаться для compatibility, но не меняют runtime capability; supported settings продолжают разрешаться обычным способом.
EvidenceSanitized settings/quota JSON + результаты sync/dry-run.
StatusNot run
Notes / defectsUnit: PlatformSettingsTests. См. operational-settings-resolution.

PAYM-04 — RBAC/scope и обязательное approval ​

ПолеЗначение
ЦельПодтвердить, что always-on capability не обходит authorization и ручное решение оператора.
PreconditionsВыбраны organization/Outlet/connection и пользователи с разрешённым/запрещённым scope.
Steps1. Попытка queue вне scope должна вернуть 403. 2. Разрешённый queue создаёт posting в ApprovalRequired. 3. До approve worker не выполняет RPC. 4. Approve требует соответствующего permission и оставляет audit.
Expected resultScope enforced; новый posting никогда не становится runnable без manual approve; deprecated quota capability fields игнорируются.
EvidenceSanitized posting/audit JSON и 403 response.
StatusNot run
Notes / defectsUnit: OrganizationQuotaSettingsTests. Seeder default: true для default org.

PAYM-05 — Live probe подключения (REST session) ​

ПолеЗначение
ЦельПроверка подключения к боевому Syrve/iiko через REST session, без fake success.
PreconditionsProduction SyrveConnection с bridge; credentials в secret provider.
Steps1. 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 resultSyrveConnectionCheckResult success; REST session verify; errors describe credentials/HTTP/RPC/server applicability, not removed runtime gates.
EvidenceconnectionId; sanitized health JSON; скрин UI статуса (без пароля).
StatusNot run
Notes / defectsUnit: SyrveConnectionProbeTests. Requires live paym evidence.

PAYM-06 — Справочники: live names и явный fallback ​

ПолеЗначение
ЦельСчета и ДДС показывают читаемые имена/коды; fallback отличим от live-каталога.
PreconditionsPAYM-05 passed; default bridged connection.
Steps1. /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 строки).
StatusNot run
Notes / defectsUnit: SyrvePaymentReferenceReaderTests (MHPAY-42). Live ДДС требует runtime + bridge + persisted entities.

PAYM-07 — Баннеры проведения оплат vs runtime ​

ПолеЗначение
ЦельUI operational banners соответствуют API, а не захардкоженному тексту.
PreconditionsАвторизованный пользователь с syrve.connections.view.
Steps1. Открыть /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.
StatusNot run
Notes / defectsMHPAY-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 согласованы.
Steps1. 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 resultDry-run не вызывает iiko write; коды ошибок из api.md; mandatory approval соблюдён.
EvidencepostingId; sanitized preflight + dry-run JSON; env snapshot (без secrets).
StatusNot run
Notes / defectsНе выполнять live production write без явного Go владельца. FAIL_RECONCILE из test report 2026-06-19 остаётся блокером для unrestricted prod write.

Sign-off (paym production profile) ​

RoleNameDateSignature / link
Operations
Engineering
Product owner

PAYM gate: PAYM-01..08 Passed или согласованный Blocked перед расширением production write на paym.


UAT-01 — Login ​

ПолеЗначение
ЦельУбедиться, что оператор может войти и видит рабочее пространство с корректными правами.
PreconditionsАктивный пользователь с известным email/паролем; API и UI доступны на целевом контуре.
Test dataУчётная запись оператора (не коммитить пароль в репозиторий).
Steps1. Открыть /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 (без токена в публичном архиве).
StatusNot run
Notes / defectsMocked 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Сессия с истёкшим токеном.
Steps1. Войти. 2. Имитировать expiry (ожидание или manual token invalidation). 3. Выполнить действие, требующее API (например открыть /bank-statements). 4. Наблюдать redirect на login или refresh flow.
Expected resultНет отображения чужих/устаревших данных; пользователь перенаправлен на login с понятным сообщением; повторный login восстанавливает работу.
EvidenceСкриншот login после expiry; network tab с 401.
StatusNot run
Notes / defectsMocked: 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 в репозиторий).
Steps1. /bank-statements → загрузка файла. 2. Дождаться 202 Accepted от POST /api/bank-statements/import. 3. Открыть созданный импорт. 4. Проверить список транзакций.
Expected resultStatus Parsed или SuccessWithWarnings; транзакции видны; detected bank/format заполнены; ошибки парсинга — с operatorTitle/message (если есть).
EvidenceimportId; скриншот upload result; фрагмент quality/import detail.
StatusNot run
Notes / defectsUnit/import tests на sanitized fixtures. Real bank pilot: Pending operator run.

UAT-04 — Unsupported file ​

ПолеЗначение
ЦельНеподдерживаемый файл обрабатывается безопасно с понятным сообщением оператору.
PreconditionsПраво upload.
Test data.txt, .pdf или произвольный CSV без заголовков банка.
Steps1. Загрузить неподдерживаемый файл. 2. Проверить ответ API и UI. 3. Открыть импорт (если создан) → quality/error.
Expected resultFailed или UnsupportedFormat; operator-facing error (не stack trace); нет частичного «мусорного» импорта без статуса.
EvidenceСкриншот ошибки; BankStatementImportUploadResultDto / quality report errors.
StatusNot run
Notes / defectsRequires live UAT evidence.

UAT-05 — Quality report ​

ПолеЗначение
ЦельОператор понимает качество парсинга: confidence, warnings, balance, skipped rows.
PreconditionsИмпорт с quality report (UAT-03 или импорт с предупреждениями).
Test dataИмпорт из UAT-03.
Steps1. Открыть /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).
StatusNot run
Notes / defectsRequires live UAT evidence.

UAT-06 — Duplicate review ​

ПолеЗначение
ЦельОператор может подтвердить или отклонить duplicate candidate с audit trail.
PreconditionsИмпорт с duplicate candidates (GET .../duplicates не пуст).
Test dataПовторный импорт того же файла или fixture с duplicate-like rows (см. unit tests).
Steps1. Вкладка Duplicates на import detail. 2. Прочитать reason и matched signals. 3. Confirm или Dismiss. 4. Проверить обновление статуса кандидата.
Expected resultBankDuplicateCandidateMutationResultDto; кандидат исчезает из open queue или меняет status; действие логируется (см. UAT-12).
EvidenceСкриншот до/после; candidateId.
StatusNot run
Notes / defectsMocked E2E: mhpay-e2e-smoke.spec.ts. Live: Pending operator run.

UAT-07 — Counterparty matching ​

ПолеЗначение
ЦельРучное сопоставление банковской транзакции с контрагентом Syrve/iiko.
PreconditionsUnmatched или low-confidence match; право perm:counterparty.match.
Test dataТранзакция из UAT-03 с Unmatched или LowConfidence.
Steps1. /name-matching?status=Unmatched. 2. Выбрать строку → manual match. 3. Выбрать контрагента Syrve. 4. Сохранить.
Expected resultPOST /api/counterparty-matches → status ManualMatched; explainability fields (reason, signals) заполнены.
EvidenceСкриншот matching; matchId.
StatusNot run
Notes / defectsRequires live UAT evidence (нужен live/stub Syrve references).

UAT-08 — Rule creation ​

ПолеЗначение
ЦельИз ручного match создаётся правило для будущих авто-сопоставлений.
PreconditionsUAT-07 выполнен или есть bankTransactionId.
Test dataPattern из counterparty raw name.
Steps1. Создать rule через UI/API POST /api/counterparties/rules. 2. Повторить импорт с похожим контрагентом (опционально). 3. Проверить AutoMatched на новом импорте.
Expected resultCreateCounterpartyRuleResult; при дубликате rule — alreadyExists: true без дублирования записи.
EvidenceruleId; скриншот rules list.
StatusNot run
Notes / defectsRequires live UAT evidence для проверки на втором импорте.

UAT-09 — Allocation preview ​

ПолеЗначение
ЦельPreview распределения показывает строки, warnings, partial/over/stale без записи в БД.
PreconditionsMatched bank transaction; кандидаты документов (sync или mock).
Test databankTransactionId с match; document lines для preview.
Steps1. /payment-allocations/preview?bankTransactionId=. 2. Выбрать кандидатов. 3. POST /api/payment-allocations/preview. 4. Проверить warnings {code,message} и line context.
Expected resultTyped warnings; totals сходятся; нет allocationId до confirm.
EvidenceСкриншот preview; request/response (sanitized).
StatusNot run
Notes / defectsMocked E2E covers flow. Live Syrve docs: Pending operator run.

UAT-10 — Allocation confirmation ​

ПолеЗначение
ЦельПодтверждение allocation создаёт запись с idempotency и audit.
PreconditionsUAT-09 preview успешен.
Test dataТот же preview payload + idempotencyKey.
Steps1. Confirm allocation. 2. Открыть detail /payment-allocations/{id}. 3. Повторить confirm с тем же idempotencyKey.
Expected resultПервая confirm — новая allocation; повтор — возврат существующей (no double write); audit log содержит Allocate.
EvidenceallocationId; audit entry id.
StatusNot run
Notes / defectsRequires 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 dataTest connection only; always-on capability не является разрешением на production write.
Steps1. Открыть 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 resultDry-run без live write; approve обязателен для каждого нового posting; attempts/evidence не раскрывают raw payloads/secrets.
EvidencepostingId; скрин allocation/posting detail; sanitized preflight/dry-run/attempts/evidence response; env snapshot (без secrets).
StatusNot run
Notes / defectsLive 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 dataentityId из предыдущих шагов.
Steps1. /audit-log. 2. Найти записи Match / Allocate / Sync. 3. Сверить user, timestamp, message.
Expected resultPagedResult<AuditLogEntryDto>; записи соответствуют действиям оператора.
EvidenceСкриншот audit; audit entry ids.
StatusNot run
Notes / defectsRequires 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.
Steps1. Открыть /review-queue. 2. Проверить счётчики блоков. 3. Перейти по ссылке фильтра (например unmatched → /name-matching?status=Unmatched).
Expected resultСчётчики совпадают с API; ссылки применяют query filters; при нулевых счётчиках — «Очередь пуста».
EvidenceСкриншот queue; список counts.
StatusNot 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 dataUsers с разными role assignments на одну org/location.
Steps1. Login as viewer → попытка upload (ожидать 403). 2. Login as operator → upload OK. 3. Проверить GET /api/auth/me permissions. 4. Optional: cross-location access denied.
Expected result403 с ApiError code; UI показывает понятный отказ; mega-admin bypass только для platform roles.
EvidenceСкриншоты 403; permission list.
StatusNot run
Notes / defectsUnit: ScopedRbacTests. Tenant audit gaps: см. current-state known gaps. Requires live UAT evidence.

Sign-off (UAT) ​

RoleNameDateSignature / link
Operator lead
Accountant
QA
Product owner

UAT gate: все сценарии UAT-01..14 в статусе Passed или согласованный Blocked + defect ticket.