fix(tradein): срок жизни оценки 24ч → 720ч (30 суток) — отчёты исчезали раньше, чем ими успевали воспользоваться
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m50s

27.08, пилот «Практика». У пользователя ВСЕ 75 оценок оказались
недоступны, включая позавчерашние: список показывал их со статусом
«устарел», а открытие отдавало «Ссылка устарела, отчёт удалён или у вас нет
к нему доступа». Выглядело как пропажа данных — на деле строки целы, истёк
expires_at = created_at + 24ч.

Совпадение двух вещей и создало впечатление аварии: сутки не работал вход
(упало право CONNECT на базу auth), и ровно за это время истекли последние
живые отчёты. Люди зашли и увидели, что не открывается ничего.

Обоснование «оценка живёт сессию клиента, не архив» писалось под анонимный
B2C. «Практика» — пилот-юрлицо: менеджер возвращается к оценке через
день-два, когда клиент перезванивает. Суточный срок для такого сценария
означает, что работа исчезает раньше, чем её успевают использовать.

Настройка одна на оба контура, и это осознанно НЕ маскируется: юридический
мотив 152-ФЗ относится к анонимному B2C, разделение сроков по контурам —
отдельная задача. Здесь поднят общий срок, а не сделан вид, что контуры уже
разведены.
This commit is contained in:
bot-backend 2026-08-27 13:31:40 +03:00
parent 51c779c092
commit 34f8f506c0

View file

@ -971,7 +971,24 @@ class Settings(BaseSettings):
# "сессию" клиента, не архив); юридически обоснованный срок хранения адреса
# физлица для анонимного B2C — решение не инженера, см. итоговый комментарий
# к задаче. ENV: TRADE_IN_ESTIMATE_RETENTION_HOURS.
trade_in_estimate_retention_hours: int = 24
#
# 27.08 — поднято 24 → 720 (30 суток) по решению владельца. Прод-факт:
# у пилота «Практика» ВСЕ 75 оценок оказались недоступны, включая
# позавчерашние, и это выглядело как пропажа данных. Строки были целы —
# истёк `expires_at`, и карточка отдавала «Ссылка устарела».
#
# Обоснование «оценка живёт сессию клиента, не архив» писалось под
# анонимный B2C. «Практика» — пилот-юрлицо: менеджер возвращается к
# оценке через день-два, когда клиент перезванивает. Для такого сценария
# суточный срок означает, что работа исчезает раньше, чем её успевают
# использовать.
#
# NB: настройка ОДНА на оба контура. Юридический мотив 152-ФЗ (хранение
# адреса физлица) относится к анонимному B2C, и для него 30 суток —
# решение не инженерное. Разделение сроков по контурам — отдельная
# задача; здесь сознательно поднят общий срок, а не сделан вид, что
# контуры уже разведены.
trade_in_estimate_retention_hours: int = 720
# trade_in_leads.expires_at TTL (дни от момента создания, migration 231).
# У trade_in_leads раньше вообще не было срока хранения — лид (телефон +