fix(tradein): confidence «средняя» → amber + FIXME для compsTier

CONF_LABELS.medium красился var(--success) (зелёный, читается как «высокая»)
→ var(--warn) (amber). compsTier substring-парсит прозу confidence_explanation;
структурного tier-поля в AggregatedEstimate нет — оставлен fallback + FIXME-маркер
(#695 follow-up) для будущего backend-поля.

Refs #742
This commit is contained in:
bot-frontend 2026-05-30 18:40:57 +03:00
parent 34a13d71c3
commit 0e76183efa
2 changed files with 6 additions and 1 deletions

View file

@ -53,7 +53,7 @@ const SOURCE_LABELS: Record<string, string> = {
const CONF_LABELS: Record<string, { txt: string; color: string }> = {
high: { txt: "высокая", color: "var(--success)" },
medium: { txt: "средняя", color: "var(--success)" },
medium: { txt: "средняя", color: "var(--warn)" },
low: { txt: "низкая", color: "var(--danger)" },
};

View file

@ -47,6 +47,11 @@ const CONTACT_EMAIL = (process.env.NEXT_PUBLIC_TRADEIN_CONTACT_EMAIL ?? "").trim
* Null ничего не показываем (graceful).
*/
function compsTier(explanation: string | null): string | null {
// FIXME: backend should expose structured comps_tier (#695 follow-up).
// AggregatedEstimate не отдаёт структурного tier-поля для anchor-уровня
// (только AnalogLot.tier для отдельных rosreestr-сделок), поэтому уровень
// приходится извлекать substring-эвристикой из прозы confidence_explanation.
// Хрупко к переформулировке бэкенда — оставлено как fallback до появления поля.
if (!explanation) return null;
const t = explanation.toLowerCase();
if (t.includes("тот же дом") || t.includes("того же дома") || t.includes("этом же доме"))