Тема
03.04 Transaction Lifecycle And Statuses
Статус: черновик для обсуждения
1. Назначение документа
Этот документ описывает жизненный цикл deposit transaction и единый словарь статусов для MVP.
Цель документа:
- зафиксировать список статусов;
- описать, кто и когда устанавливает каждый статус;
- определить final statuses;
- определить правила automatic transitions;
- определить правила manual correction;
- определить, какие статусы отправляются merchant через webhook;
- определить, что видит hosted payment form;
- определить, что сохраняется в transaction timeline.
2. MVP Status List
В MVP используются следующие transaction statuses:
CREATEDWAITING_CUSTOMER_DATAPROCESSINGCOMPLETEDFAILEDCANCELEDREJECTED
Статус FROZEN не входит в MVP.
3. Status Groups
Non-Final Statuses
Non-final statuses:
CREATEDWAITING_CUSTOMER_DATAPROCESSING
Эти статусы означают, что transaction еще может продолжить движение по flow.
Final Statuses
Final statuses:
COMPLETEDFAILEDCANCELEDREJECTED
После final status transaction не должна автоматически менять статус.
Status может быть изменен вручную через manual transaction correction пользователем с соответствующей permission.
4. CREATED
CREATED ставится сразу после успешного создания transaction.
Условия:
- merchant authentication прошел успешно;
- все обязательные поля create deposit request переданы;
transactionIdуникален;brandIdвалиден;paymentMethodIdвалиден;- transaction record создана.
После установки CREATED система начинает routing.
Transaction выходит из CREATED, когда routing started и система определяет следующий шаг:
- перейти к
WAITING_CUSTOMER_DATA; - перейти к
REJECTED.
Отправка request в provider не должна сама по себе переводить transaction в PROCESSING. Это должно сохраняться как timeline event.
5. WAITING_CUSTOMER_DATA
WAITING_CUSTOMER_DATA ставится, когда выбранный routing path / SUB MID GROUP / SUB MID требует дополнительные customer attributes, которых merchant не передал при создании transaction.
Примеры:
- provider method требует
ip; - provider method требует
address; - provider method требует
city; - provider method требует другие canonical attributes.
Hosted payment form должна показать customer form и дособрать недостающие поля.
Transaction выходит из WAITING_CUSTOMER_DATA, когда:
- customer заполнил обязательные поля, и система продолжает provider execution;
- transaction expired и переходит в
CANCELED.
6. PROCESSING
PROCESSING ставится только когда provider сообщил meaningful intermediate status, который означает, что payment находится в обработке, но финальное подтверждение еще не получено.
В текущей бизнес-семантике PROCESSING означает, что provider сообщил: платежное действие уже находится в процессе, но еще не завершено финально.
PROCESSING не должен ставиться просто потому, что:
- система отправила request в provider;
- система получила provider payment URL;
- customer открыл hosted form;
- routing начался;
- customer открыл iframe/redirect.
Такие события должны сохраняться в transaction timeline, например:
PROVIDER_REQUEST_SENT;PROVIDER_PAYMENT_URL_RECEIVED;PROVIDER_IFRAME_OPENED;PROVIDER_REDIRECT_USED.
Главное условие для PROCESSING: provider callback/status явно сообщает processing/in-progress состояние в бизнес-смысле.
7. COMPLETED
COMPLETED ставится в результате обработки provider webhook/callback.
Также COMPLETED может быть установлен вручную через transaction correction пользователем с соответствующей permission.
COMPLETED является final status.
8. FAILED
FAILED ставится:
- в результате обработки provider webhook/callback;
- внутренней системой, если provider timeout / provider execution failed и fallback больше невозможен;
- вручную через transaction correction пользователем с соответствующей permission.
FAILED является final status.
9. CANCELED
CANCELED ставится:
- в результате обработки provider webhook/callback;
- если transaction expired на нашей стороне;
- вручную через transaction correction пользователем с соответствующей permission.
Expiration может перевести transaction в CANCELED даже если transaction уже находится в PROCESSING и provider еще не прислал final callback.
CANCELED является final status.
10. REJECTED
REJECTED ставится из-за внутренних причин processing.
Примеры:
- routing не найден;
- payment method unavailable;
- velocity rejected all routes;
- unsupported configuration;
- validation failed after transaction creation;
- все возможные routing/fallback options закончились.
REJECTED является final status.
11. Provider Callback Handling
Система обрабатывает только provider callback statuses:
FAILEDCOMPLETEDPROCESSINGCANCELED
Если provider прислал pending, система не должна учитывать этот status как отдельный transition.
Если provider прислал unknown status, система должна:
- не менять transaction status;
- сохранить событие в transaction timeline как ignored.
Если provider прислал callback после того, как transaction уже находится в final status, система должна:
- не менять transaction status;
- сохранить событие в transaction timeline как ignored.
12. Expiration
Expiration timer стартует с момента создания transaction.
Default expiration:
- 30 минут.
Expiration time должен настраиваться через environment variables.
Также expiration может зависеть от SUB MID configuration, если такая настройка используется.
Если transaction expired, она переходит в:
text
CANCELEDExpiration может применяться даже к transaction в статусе PROCESSING, если provider еще не вернул final callback.
13. Merchant Webhooks
Merchant webhooks отправляются на PROCESSING, если PROCESSING пришел от provider как meaningful intermediate status.
Merchant webhooks также отправляются на final statuses:
COMPLETEDFAILEDCANCELEDREJECTED
Webhooks не отправляются на:
CREATEDWAITING_CUSTOMER_DATA
Важно: webhook на PROCESSING можно отправлять только когда PROCESSING пришел от provider как meaningful intermediate status, а не после факта отправки request в provider.
14. Hosted Payment Form Behavior
Customer не должен видеть technical transaction statuses.
Hosted payment form использует statuses для принятия действий:
CREATED-> loading / polling;WAITING_CUSTOMER_DATA-> показать customer form для дополнительных fields;PROCESSING-> loading / ожидание final provider result;COMPLETED-> provider/merchant success behavior;FAILED-> generic error;CANCELED-> expired/canceled error;REJECTED-> method unavailable или generic error.
Customer-facing UI не должен показывать raw status names.
15. Manual Transaction Correction
Transaction correction позволяет вручную изменить transaction status на любой допустимый transaction status.
Доступные statuses для correction:
PROCESSINGCOMPLETEDFAILEDCANCELEDREJECTED
Manual correction может изменить любой status на любой другой допустимый status.
Пример:
text
COMPLETED -> FAILEDили:
text
REJECTED -> PROCESSINGТакое действие доступно только пользователю с соответствующей permission.
Correction status не ограничивается текущим статусом transaction.
Reason/comment обязателен.
Manual correction запрещена для migrated legacy transactions, которые marked as read-only.
16. Correction Webhook
При manual correction система должна всегда спросить user-а, нужно ли сделать resend callback / webhook merchant.
Если resend выбран:
- система отправляет webhook с новым status;
- webhook отправляется на все webhook URLs transaction;
- webhook payload содержит
corrected: true; - action сохраняется в transaction timeline;
- action сохраняется в audit log.
Если resend не выбран:
- status меняется;
- webhook не отправляется;
- decision сохраняется в transaction timeline;
- decision сохраняется в audit log.
17. Status History And Timeline
Отдельная status history table не требуется для MVP.
Transaction timeline достаточно, если она сохраняет всю необходимую информацию о status changes.
Для каждого status change нужно сохранять:
- previous status;
- new status;
- reason;
- source;
- actor, если status изменен вручную;
- timestamp.
18. Status Change Source
Для каждого status change нужно хранить source.
Возможные sources:
merchant_api;routing;provider_callback;expiration;manual_correction;system.
Source нужен для investigation, audit и support.
19. Automatic Transition Rules
Основные automatic transitions:
text
CREATED -> WAITING_CUSTOMER_DATA
CREATED -> REJECTED
CREATED -> PROCESSING
CREATED -> COMPLETED
CREATED -> FAILED
CREATED -> CANCELED
WAITING_CUSTOMER_DATA -> CANCELED
CREATED -> PROCESSING
WAITING_CUSTOMER_DATA -> PROCESSING
WAITING_CUSTOMER_DATA -> COMPLETED
WAITING_CUSTOMER_DATA -> FAILED
WAITING_CUSTOMER_DATA -> CANCELED
WAITING_CUSTOMER_DATA -> REJECTED
PROCESSING -> COMPLETED
PROCESSING -> FAILED
PROCESSING -> CANCELED
PROCESSING -> REJECTEDПереходы в PROCESSING возможны только по provider callback/status, который явно означает processing/in-progress.
Final statuses не меняются автоматически.
Final statuses могут быть изменены только через manual correction.
Manual correction также может изменить non-final status, если user имеет permission.
20. Timeline Requirements
Transaction timeline должна сохранять:
- transaction created;
- status changed;
- routing started;
- waiting customer data started;
- dynamic customer data submitted;
- provider request sent;
- provider payment URL received;
- provider iframe opened or redirect used;
- provider callback received;
- provider callback ignored;
- unknown provider status ignored;
- expiration triggered;
- manual correction performed;
- manual correction reason/comment saved;
- correction webhook resent;
- correction webhook skipped by user decision;
- final status reached.
21. Acceptance Criteria
Transaction lifecycle считается реализованным для MVP, если:
CREATEDставится сразу после успешного создания transaction.- Routing начинается после
CREATED. WAITING_CUSTOMER_DATAставится, если нужны дополнительные customer attributes.PROCESSINGставится только по provider callback/status, который явно означает processing/in-progress.COMPLETEDставится по provider callback или manual correction.FAILEDставится по provider callback, internal failed execution без fallback или manual correction.CANCELEDставится по provider callback, expiration или manual correction.REJECTEDставится по internal processing reasons или manual correction.- Final statuses:
COMPLETED,FAILED,CANCELED,REJECTED. - Final statuses не меняются автоматически.
- Любой transaction status можно изменить через manual correction с permission.
- Manual correction требует reason/comment.
- Manual correction всегда спрашивает user-а, нужно ли resend webhook.
- Correction webhook содержит
corrected: true. - Manual correction запрещена для migrated legacy read-only transactions.
- Merchant webhooks отправляются на
PROCESSING, если он пришел от provider как meaningful intermediate status. - Merchant webhooks отправляются на final statuses.
- Отправка request в provider сохраняется как timeline event и не меняет transaction status на
PROCESSING. - Provider
pendingstatus не используется как transition. - Unknown provider status сохраняется в timeline как ignored.
- Callback после final status сохраняется в timeline как ignored.
- Expiration стартует с момента transaction created.
- Expiration default 30 минут и настраивается через environment variables.
- Expiration может перевести промежуточные статусы transaction в
CANCELED. - Timeline содержит previous status, new status, reason, source, actor и timestamp.
- Отдельная status history table не требуется для MVP.