fix(tradein/payments): отказ банка на Init не блокирует покупателя на 30 минут — мёртвая попытка уходит из предиката живого платежа #3361
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3361
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3323-payment-init-fail-409"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #3323 п.2 [medium] (НЕ auto-close — в сборнике другие пункты). Чинится ДО включения
payments_enabled.Дефект
Init-fail оставлял строку
NEWсpayment_url=NULL; она попадает в предикат uidx 279,_find_live_paymentеё не видит (фильтрpayment_url IS NOT NULL), повторный INSERT ловит конфликт → ложный 409 «retry shortly» до истечения окна.Фикс — вариант (а) без нового статуса
Строка после Init-fail переводится в терминальный
DEADLINE_EXPIREDтем же UPDATE, что уже пишетerror_code/error_message. Это существующая конвенция «попытка мертва, пара освобождена» (_ABANDONABLE_STATUSES→ :300), а не вторая параллельная;INIT_FAILEDпотребовал бы правки CHECK в миграции 233 ради ярлыка, при том что причина лежит вerror_*.Предикат 279 (цитата):
WHERE estimate_id IS NOT NULL AND status IN ('NEW','FORM_SHOWED','PREAUTHORIZING','AUTHORIZING','AUTHORIZED','3DS_CHECKING','3DS_CHECKED','CHECKING','CHECKED','PROCESSING','CONFIRMING')—DEADLINE_EXPIREDвне него, миграций нет.Читатели статусов:
REJECTED|AUTH_FAIL|DEADLINE_EXPIREDтолько вpayments.py+ тестах (фронт/админка не читают); вебхук защищает лишьCONFIRMEDот отката — терминальный статус не блокирует последующийCONFIRMED.Тесты
142 passed, 1 skipped(-k payment). Новые: поведенческийtest_bank_refusal_on_init_does_not_lock_the_buyer_out+test_init_failed_status_is_outside_the_live_predicate(сверяет константу с ТЕКСТОМ миграций 279 и 233). Регресс успешного Init держат существующиеtest_repeat_checkout_reuses_live_link/test_parallel_checkout_does_not_create_second_payment. Фальсификация (откат толькоSET status = :status):AssertionError: мёртвая строка осталась в предикате 279 — assert 'NEW' not in frozenset({...}).