From 34f8f506c03e3e29cc06b6f4ee8274d4ef2523aa Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 27 Aug 2026 13:31:40 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20=D1=81=D1=80=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B6=D0=B8=D0=B7=D0=BD=D0=B8=20=D0=BE=D1=86=D0=B5=D0=BD=D0=BA?= =?UTF-8?q?=D0=B8=2024=D1=87=20=E2=86=92=20720=D1=87=20(30=20=D1=81=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D0=BA)=20=E2=80=94=20=D0=BE=D1=82=D1=87=D1=91?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B8=D1=81=D1=87=D0=B5=D0=B7=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=20=D1=80=D0=B0=D0=BD=D1=8C=D1=88=D0=B5,=20=D1=87=D0=B5=D0=BC?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=B8=20=D1=83=D1=81=D0=BF=D0=B5=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=D0=BE=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 27.08, пилот «Практика». У пользователя ВСЕ 75 оценок оказались недоступны, включая позавчерашние: список показывал их со статусом «устарел», а открытие отдавало «Ссылка устарела, отчёт удалён или у вас нет к нему доступа». Выглядело как пропажа данных — на деле строки целы, истёк expires_at = created_at + 24ч. Совпадение двух вещей и создало впечатление аварии: сутки не работал вход (упало право CONNECT на базу auth), и ровно за это время истекли последние живые отчёты. Люди зашли и увидели, что не открывается ничего. Обоснование «оценка живёт сессию клиента, не архив» писалось под анонимный B2C. «Практика» — пилот-юрлицо: менеджер возвращается к оценке через день-два, когда клиент перезванивает. Суточный срок для такого сценария означает, что работа исчезает раньше, чем её успевают использовать. Настройка одна на оба контура, и это осознанно НЕ маскируется: юридический мотив 152-ФЗ относится к анонимному B2C, разделение сроков по контурам — отдельная задача. Здесь поднят общий срок, а не сделан вид, что контуры уже разведены. --- tradein-mvp/backend/app/core/config.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/app/core/config.py b/tradein-mvp/backend/app/core/config.py index f3588104..f6dfcae6 100644 --- a/tradein-mvp/backend/app/core/config.py +++ b/tradein-mvp/backend/app/core/config.py @@ -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 раньше вообще не было срока хранения — лид (телефон +