{
 "_meta": {
  "generated_by": "local/tools/build_metrics.py",
  "generated_at": "2026-09-21",
  "sources": [
   "local/platform/data/_canon.json (metrics-legend halleg, 15 метрик, 27.07.2026)",
   "local/platform/data/_raw_descriptions.json (описания из кода 11 отчётов)"
  ],
  "statuses": {
   "canonical": "есть в metrics-legend, определение каноническое",
   "conflict": "несовместимые определения, нужен арбитр",
   "needs_review": "нет в каноне, определение взято из кода отчёта как есть, не верифицировано"
  },
  "caveats": [
   "Реестр стартовый: состав и определения будут перебираться аналитиками.",
   "name.uk/name.ru у неканонических метрик пустые, пока не заполнены.",
   "Идентификаторы наши (snake_case), совпадение с параметрами halleg не обязательство.",
   "Отклонения (deviations) выписаны по разбору local/discovery/metrics-conflicts.md и примечаниям канона; статус open = не решено."
  ]
 },
 "metrics": [
  {
   "id": "payin_volume",
   "name": {
    "en": "PayIn Volume",
    "uk": "Обсяг PayIn",
    "ru": "Объём PayIn"
   },
   "group": "Обсяги",
   "status": "canonical",
   "canonical": true,
   "definition": "Сума успішних вхідних платежів за період.",
   "formula": "SUM(transactions.amount) WHERE operation = 'payin', період за IST",
   "unit": "INR (₹), ціле число",
   "synonyms": [
    "Налив",
    "vol",
    "pi",
    "amt",
    "Amount IN",
    "Demand",
    "Volume",
    "PayIn M",
    "PayIn",
    "Δ PayIn %",
    "Total PayIn",
    "Обсяг PayIn",
    "Сумарний PayIn, INR",
    "Volume INR",
    "Сума PayIn MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Volume",
     "description": "Сумарний payin volume за період (з BAA.dayPayinAmount).",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-tier",
     "label": "PayIn M",
     "description": "PayIn за місяць (млн INR). При наведенні — повне число",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "PayIn",
     "description": "Сума вхідних за тиждень (operation=payin), INR. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ PayIn %",
     "description": "Зміна PayIn до попереднього тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Amount IN",
     "description": "SUM(amount) WHERE type='payin' AND completed. Джерело: payments.amount · провайдер через bank_accounts.provider_pid",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Total PayIn",
     "description": "SUM(amount) WHERE payin AND completed. Джерело: payments.amount · partner_pid",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Amount IN",
     "description": "SUM(amount) payin completed. Джерело: payments.amount",
     "pattern": "cols"
    },
    {
     "report": "trader-kpi",
     "label": "PayIn Volume",
     "description": "сума PayIn-транзакцій за період",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Обсяг PayIn",
     "description": "Сумма успешных payin транзакций (из таблицы Transaction). Включаются только провайдеры с общим объёмом > 5,000. SQL-query ▾ SELECT SUM(tran.amount) AS payin_volume FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON ba.id = tran.\"bankAccount\" WHERE tran.operation = 'payin' AND ba.\"accountProvider\" IN ( -- Только провайдеры с total payin > 5000 SELECT pid FROM vol_daily GROUP BY pid HAVING SUM(volume) > 5000 )",
     "pattern": "lg-item"
    },
    {
     "report": "trader-operational",
     "label": "PayIn Volume",
     "description": "Сумма успешных payin транзакций (₹) за этот час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "PayIn Volume",
     "description": "Сумма успешных payin транзакций (₹). Из таблицы Transaction, operation=payin. Учитываются только провайдеры с объёмом > 5,000.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Обсяг PayIn",
     "description": "Сумма успешных payin транзакций из таблицы Transaction. SQL-query ▾ SELECT SUM(tran.amount) AS payin_volume FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON tran.\"bankAccount\" = ba.id JOIN \"AccountProvider\" ap ON ba.\"accountProvider\" = ap.id WHERE tran.operation = 'payin' AND (tran.\"createdAt\" AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Kolkata')::date = :dt AND ap.name != 'Operation provider'",
     "pattern": "lg-item"
    },
    {
     "report": "trader-scoreboard",
     "label": "Volume",
     "description": "Total payin volume for the period (INR, with thousands separators).",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "PayIn Volume",
     "description": "Сумма входящих платежей за неделю (₹). Источник: Transaction, operation='payin'. Учитывается все, кроме операторов-провайдеров. Чем выше — тем больше денег обработано.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Сумарний PayIn, INR",
     "description": "Загальна сума INR по успішних PayIn всіх активних трейдерів за обраний період. «Активний» = хоча б один payin у періоді.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Volume INR",
     "description": "Сума INR по успішних PayIn трейдера за обраний період. Колонка %Δ — зміна відносно попереднього аналогічного по тривалості періоду.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Сума PayIn MTD",
     "description": "SUM(transactions.amount) WHERE operation=payin AND date >= mtd_start_ist. 1:1 з прод-розрахунками.",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [
    {
     "report": "trader-operational",
     "text": "Только провайдеры с объёмом > 5 000 ₹: канон говорит, что это особенность Trader KPI, но фильтр стоит в Operational.",
     "status": "open"
    },
    {
     "report": "trader-weekly",
     "text": "Исключены операторы-провайдеры. В каноне такого фильтра нет.",
     "status": "open"
    },
    {
     "report": "trader-merchant-slu",
     "text": "Источник payments, канон требует transactions.",
     "status": "open"
    }
   ],
   "notes": [
    "Джерело — transactions, НЕ payments. У звіті Trader KPI діє додатковий фільтр «провайдер з total payin > 5 000 ₹ за період» — це особливість KPI-звіту, не частина канону."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Всі звіти дашборда; фінанси (lab): «налив», payin_inr\n    Джерело — transactions, НЕ payments. У звіті Trader KPI діє додатковий фільтр «провайдер з total payin > 5 000 ₹ за період» — це особливість KPI-звіту, не частина канону."
  },
  {
   "id": "payout_volume",
   "name": {
    "en": "PayOut Volume",
    "uk": "Обсяг PayOut",
    "ru": "Объём PayOut"
   },
   "group": "Обсяги",
   "status": "canonical",
   "canonical": true,
   "definition": "Сума виплат клієнтам за період.",
   "formula": "ABS(SUM(transactions.amount)) WHERE operation = 'payout' AND currency = 'INR',\nскоуп P2P (провайдер без [SLU]/[Intent]), банківський рахунок ≠ TRANSIT",
   "unit": "INR (₹)",
   "synonyms": [
    "Виплати",
    "po",
    "Amount OUT",
    "paid_today",
    "PayOut",
    "Δ PayOut %",
    "Total PayOut",
    "Обсяг PayOut",
    "Сума PayOut MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "PayOut",
     "description": "Сума виплат (operation=payout), INR. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ PayOut %",
     "description": "Зміна PayOut до попереднього тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Amount OUT",
     "description": "SUM(ABS(amount)) WHERE payout AND completed. Джерело: payments.amount (для SLU ≈ 0)",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Total PayOut",
     "description": "SUM(ABS(amount)) WHERE payout AND completed. Джерело: payments.amount",
     "pattern": "cols"
    },
    {
     "report": "trader-operational",
     "label": "PayOut Volume",
     "description": "Абсолютная сумма payout транзакций (₹) за этот час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "PayOut Volume",
     "description": "Абсолютная сумма payout транзакций (₹). ABS(SUM) из таблицы Transaction, operation=payout.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Обсяг PayOut",
     "description": "Абсолютная сумма payout транзакций. SQL-query ▾ SELECT ABS(SUM(tran.amount)) AS payout_volume FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON tran.\"bankAccount\" = ba.id WHERE tran.operation = 'payout' AND (tran.\"createdAt\" AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Kolkata')::date = :dt",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "PayOut Volume",
     "description": "Сумма исходящих выплат за неделю (₹). Источник: Transaction, operation='payout' (берется абсолютное значение). Параллель к PayIn.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Сума PayOut MTD",
     "description": "Аналогічно PayIn для operation=payout. [⚠ Не перевіряли проти аудиту виплат — є ризик розходження з фінансовим звітом.]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [
    "Суми payout у базі відʼємні — завжди брати ABS. Звірено з фінансами 1:1."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Operational, Weekly, Detailed, Merchant-SLU, Churn, Affiliate-звіти; фінанси (lab): «Выплачено сегодня», «Avg ауты/день»\n    Суми payout у базі відʼємні — завжди брати ABS. Звірено з фінансами 1:1."
  },
  {
   "id": "settlement",
   "name": {
    "en": "Settlement ₹",
    "uk": "Сетлмент",
    "ru": "Сеттлмент"
   },
   "group": "Обсяги",
   "status": "canonical",
   "canonical": true,
   "definition": "Кошти, виведені трейдером за відпрацьований обсяг (окрема категорія витрат).",
   "formula": "SUM(expenses) WHERE expense_category.code = 'settlement'\n  AND currency = 'INR' AND банківський рахунок ≠ TRANSIT, скоуп P2P",
   "unit": "INR (₹)",
   "synonyms": [
    "Сетл",
    "settle",
    "Settle INR",
    "Δ Сетл %",
    "Settlement",
    "Сетл %",
    "Сетлмент",
    "Settlement MTD (PI − PO)"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "Сетл",
     "description": "Settlement (expenses category=settlement). Валюта — за перемикачем. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Сетл",
     "description": "Settlement (expenses category=settlement). Валюта — за перемикачем",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ Сетл %",
     "description": "Зміна Settlement до попереднього тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Settlement",
     "description": "−SUM(amount − fee) completed — нетто після комісії. Джерело: payments.amount, payments.fee (НЕ з settlements/expenses). Підтверджено замовником; абсолют занижений для ротованих провайдерів",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Settlement",
     "description": "−SUM(amount − fee) completed. Джерело: payments.amount, payments.fee",
     "pattern": "cols"
    },
    {
     "report": "trader-kpi",
     "label": "Сетл %",
     "description": "Доля settlement от PayIn Volume. SQL-query ▾ SELECT SUM(settlement) / NULLIF(SUM(payin_volume), 0) AS settle_pct -- settlement: из BankAccountAggregate -- payin_volume: из Transaction",
     "pattern": "lg-item"
    },
    {
     "report": "trader-operational",
     "label": "Settlement",
     "description": "Сумма settlement расходов (₹) за этот час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Settlement",
     "description": "Сумма settlement расходов (₹). Из Transaction → Expense → ExpenseCategory(Settlement).",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Сетлмент",
     "description": "Сумма settlement расходов. Источник: Transaction → Expense → ExpenseCategory, где category = 'Settlement'. SQL-query ▾ SELECT SUM(tran.total) * (-1) AS settlement FROM \"Transaction\" tran JOIN \"Expense\" e ON e.id = tran.\"expenseId\" JOIN \"ExpenseCategory\" ec ON e.\"category\" = ec.id WHERE tran.operation = 'expense' AND ec.label = 'Settlement' AND (tran.\"createdAt\" ...)::date = :dt",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Settlement",
     "description": "Сумма расходов категории Settlement за неделю. Источник: Transaction → Expense → ExpenseCategory.label='Settlement'. Это возвраты средств трейдерам.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Settle INR",
     "description": "Сума settlements з expenses.cash_out (категорія expense_categories.code='settlement') для рахунків провайдера за обраний період.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Settlement MTD (PI − PO)",
     "description": "Зараз = PayIn − PayOut. [⚠ Уточнити: бізнес-визначення Settlement у Affiliate Dept (може включати expenses категорії settlement, як на трейдер-скоринг).]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [
    {
     "report": "trader-merchant-slu",
     "text": "Считается как −SUM(amount − fee): сознательное локальное отклонение для gateway-скоупа, задокументировано в самом отчёте.",
     "status": "open"
    },
    {
     "report": "trader-affiliate",
     "text": "Settlement MTD = PayIn − PayOut. Канон прямо запрещает: Settlement ≠ PayIn − PayOut.",
     "status": "open"
    }
   ],
   "notes": [
    "Settlement ≠ PayIn − PayOut. НЕ рахувати через payments.amount − fee — так робить лише Merchant-SLU для gateway-скоупу (свідоме локальне відхилення, задокументоване там)."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "11 звітів дашборда; фінанси (lab): Settle Rate MTD, блоки М1/М2, Л0–Л2\n    Settlement ≠ PayIn − PayOut. НЕ рахувати через payments.amount − fee — так робить лише Merchant-SLU для gateway-скоупу (свідоме локальне відхилення, задокументоване там)."
  },
  {
   "id": "settle_payin_pct",
   "name": {
    "en": "Settle/PayIn, %",
    "uk": "Settle Rate",
    "ru": "Сеттл/PayIn, %"
   },
   "group": "Обсяги",
   "status": "canonical",
   "canonical": true,
   "definition": "Частка засеттленого від наливу за період; головний KPI розвантаження балансу.",
   "formula": "Settlement_INR / PayIn_INR × 100%   (обидва — скоуп P2P, INR-сторони, FX скорочується)",
   "unit": "%",
   "synonyms": [
    "Сетл/PayIn %",
    "Stl/PI%",
    "S/PI %",
    "Settle KPI",
    "Settle,%",
    "Settle %",
    "Сетл/PayIn, %"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Settle,%",
     "description": "Settlement = ABS(SUM(BAA.settlement)/SUM(BAA.dayPayinAmount))×100. 100=≥65.5 · 75=≥23.1 · 50=≥8.3 · 25=≥2.3 · 0=≤0. Вага 15%.",
     "pattern": "cols"
    },
    {
     "report": "trader-kpi",
     "label": "Settle %",
     "description": "частка settlement від PayIn Volume",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Settle/PayIn, %",
     "description": "Доля settlement от PayIn Volume. Показывает какой % входящего потока уходит на расчёты.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Settle/PayIn, %",
     "description": "Доля settlement от PayIn Volume за этот час.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Сетл/PayIn, %",
     "description": "Доля settlement от PayIn Volume. Показывает, сколько средств возвращается трейдерам. SQL-query ▾ SELECT SUM(settlement) / NULLIF(SUM(payin_volume), 0) AS settle_payin_pct -- settlement: из Expense (category='Settlement') -- payin_volume: из Transaction (operation='payin')",
     "pattern": "lg-item"
    },
    {
     "report": "trader-scoreboard",
     "label": "Settle,%",
     "description": "Settlement: ABS(SUM(BAA.settlement)/SUM(BAA.dayPayinAmount))*100. 100pts >=64.0%, 75pts >=22.7%, 50pts >=8.1%, 25pts >=2.6%, 0pts <=0. Weight 15%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "Settle/PayIn, %",
     "description": "Доля settlement от PayIn Volume. Формула: SUM(settlement) / SUM(payin_volume). Показывает, какой процент входящего потока возвращается трейдерам.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [
    "Пороги: 🟢 ≥ 20% on-track · 🟡 18–20% soft lag · 🔴 < 18% severe lag (алерт CFO). Target ≥ 20%."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "KPI, Operational, Weekly, Scoreboard (вага 15% у Score); фінанси (lab): Settle Rate MTD/today"
  },
  {
   "id": "cr",
   "name": {
    "en": "CR, %",
    "uk": "Conversion Rate (PayIn)",
    "ru": "CR, %"
   },
   "group": "Конверсія і автоматизація",
   "status": "canonical",
   "canonical": true,
   "definition": "Частка успішних payin-заявок серед заявок із фінальним статусом.",
   "formula": "success / (success + reject + cancel + expire + fail) × 100\nsuccess = status IN ('completed', 'successed_by_partner')",
   "unit": "%",
   "synonyms": [
    "Конверсія",
    "Total CR",
    "cr_fin",
    "cr_payin",
    "CR,%",
    "CR %",
    "Δ CR %",
    "CR",
    "CR, % (Conversion Rate)",
    "Середній CR",
    "CR%"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "CR,%",
     "description": "Conversion Rate = success/total×100. 100=≥52.8% · 75=≥50.9% · 50=≥49.3% · 25=≥46.4% · 0=<46.4%. Вага 18%.",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "CR %",
     "description": "Конверсія: успішні ÷ всі payin-транзакції (status completed/successed_by_partner) — як у Trader Operational. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "CR %",
     "description": "Конверсія: успішні ÷ всі payin-транзакції (як у Operational)",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ CR %",
     "description": "Зміна CR% до попереднього тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Total CR",
     "description": "COUNT(status='completed') / COUNT(*). Джерело: payments.status · type='payin'",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "CR",
     "description": "Success / Requests. Джерело: payments.status",
     "pattern": "cols"
    },
    {
     "report": "trader-operational",
     "label": "CR, %",
     "description": "Конверсия — доля успешных заявок (successed_by_partner) от общего числа ClientPayin за день.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "CR, %",
     "description": "Конверсия — доля успешных заявок (successed_by_partner) от общего числа ClientPayin за час.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "CR, % (Conversion Rate)",
     "description": "Конверсия — доля успешных заявок от общего числа. Успешная заявка: status IN ('completed','successed_by_partner') — новый статус 'completed' замінив 'successed_by_partner' у червні 2026. SQL-query ▾ SELECT SUM(CASE WHEN cp.status IN ('completed','successed_by_partner') THEN 1 END)::float / NULLIF(COUNT(cp.id), 0) AS cr_pct FROM \"ClientPayin\" cp JOIN \"BankAccount\" ba ON cp.\"bankAccount\" = ba.id JOIN \"AccountProvider\" ap ON ba.\"accountProvider\" = ap.id WHERE (cp.\"createdAt\" ...)::date = :dt",
     "pattern": "lg-item"
    },
    {
     "report": "trader-scoreboard",
     "label": "CR,%",
     "description": "Conversion Rate: success/total*100 (total = final statuses). 100pts >=66.5%, 75pts >=64.2%, 50pts >=62.1%, 25pts >=58.7%, 0pts <58.7%. Weight 18%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "CR, %",
     "description": "Conversion Rate — доля успешных payin-заявок от общего числа за неделю. Формула: COUNT(status='successed_by_partner') / COUNT(*). Чем выше — тем эффективнее обработка.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Середній CR",
     "description": "Conversion Rate: Σ payin_success / Σ payin_total по активних трейдерах за період. Чим вище — тим ефективніша обробка.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "CR%",
     "description": "Conversion Rate провайдера: payin_success / payin_total. Δ% відносно попереднього періоду.",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-operational",
     "text": "Числитель только successed_by_partner, знаменатель все ClientPayin включая pending. Канон: оба успешных статуса, знаменатель только финальные.",
     "status": "open"
    },
    {
     "report": "trader-merchant-slu",
     "text": "Числитель только completed, знаменатель COUNT(*). Канон: оба успешных статуса, знаменатель только финальные.",
     "status": "open"
    },
    {
     "report": "trader-weekly",
     "text": "Знаменатель включает pending, занижает CR в течение дня.",
     "status": "open"
    }
   ],
   "notes": [
    "Канон = знаменник лише з фінальними статусами (так рахують фінанси і eye-of-god). Історичні відхилення дашборда, які приводяться до канону: знаменник COUNT(*) включно з pending (занижує CR протягом дня); чисельник тільки 'successed_by_partner' (Operational) або тільки 'completed' (Merchant-SLU) — канонічний чисельник включає ОБИДВА статуси."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "9 звітів дашборда; фінанси (lab): cr_payin_7d; eye-of-god: CR (success+reject у знаменнику)\n    Канон = знаменник лише з фінальними статусами (так рахують фінанси і eye-of-god). Історичні відхилення дашборда, які приводяться до канону: знаменник COUNT(*) включно з pending (занижує CR протягом дня); чисельник тільки 'successed_by_partner' (Operational) або тільки 'completed' (Merchant-SLU) — канонічний чисельник включає ОБИДВА статуси."
  },
  {
   "id": "auto_pct",
   "name": {
    "en": "% Auto",
    "uk": "Auto-approval rate (In / Out)",
    "ru": "% Авто"
   },
   "group": "Конверсія і автоматизація",
   "status": "canonical",
   "canonical": true,
   "definition": "Частка платежів, оброблених без ручного втручання. Це ДВІ різні метрики.",
   "formula": "% Auto In: COUNT(успішний payin WHERE edited_by_support = false) / COUNT(успішний payin) × 100\n% Auto Out: COUNT(успішний payout WHERE checking_by = '1f122b62-3961-66aa-9d47-b390dada47a9')\n/ COUNT(успішний payout) × 100\nUUID = системний акаунт SYSTEM_APPROVE_SMS_PUSH_MESSAGES (авто-апрув без антискам-перевірки)",
   "unit": "%",
   "synonyms": [
    "% Авто",
    "Auto%",
    "% Auto In",
    "% Auto Out",
    "AutoPayin",
    "Auto,%",
    "% AutoPayin",
    "Середній % автоматичних"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Auto,%",
     "description": "Auto success = auto/success×100. 100=≥93.1 · 75=≥78.2 · 50=≥58.6 · 25=≥33.4 · 0=<33.4. Вага 7%.",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "% AutoPayin",
     "description": "COUNT(completed AND edited_by_support=false) / COUNT(completed). Джерело: payments.edited_by_support",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "% Auto",
     "description": "completed∧¬edited_by_support / completed. Джерело: payments.edited_by_support",
     "pattern": "cols"
    },
    {
     "report": "trader-operational",
     "label": "% Auto",
     "description": "Доля автоматически обработанных заявок (editedBySupport=false) от успешных за час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "% Auto",
     "description": "Доля автоматически обработанных заявок (editedBySupport=false) от успешных ClientPayin.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "% Авто",
     "description": "Доля автоматически обработанных заявок — без ручного вмешательства поддержки (editedBySupport = false). SQL-query ▾ SELECT SUM(CASE WHEN cp.status IN ('completed','successed_by_partner') AND cp.\"editedBySupport\" = false THEN 1 END)::float / NULLIF(SUM(CASE WHEN cp.status IN ('completed','successed_by_partner') THEN 1 END), 0) AS auto_pct FROM \"ClientPayin\" cp ...",
     "pattern": "lg-item"
    },
    {
     "report": "trader-scoreboard",
     "label": "Auto,%",
     "description": "Auto success: auto/success*100. 100pts >=97.8%, 75pts >=95.5%, 50pts >=89.8%, 25pts >=67.7%, 0pts <67.7%. Weight 7%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "% Auto",
     "description": "Доля автоматически обработанных payin-заявок (без участия support). Формула: COUNT(status='successed' AND editedBySupport=false) / COUNT(status='successed'). Чем выше — тем меньше ручной работы.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Середній % автоматичних",
     "description": "Частка успішних PayIn-ів, де SLA IN < 5 хв («автоматичні»). Рахується по топ-95% найшвидших трейдерів. Σ sharepayin / Σ cntpayin.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [
    "Для PayOut НЕ використовувати edited_by_support — воно там ≈100% і нічого не вимірює; маркер авто-payout — саме UUID у checking_by."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Operational, Weekly, Detailed, Merchant-SLU, Scoreboard; у фінансів відсутня — канон задає дашборд\n    Для PayOut НЕ використовувати edited_by_support — воно там ≈100% і нічого не вимірює; маркер авто-payout — саме UUID у checking_by."
  },
  {
   "id": "statement_pct",
   "name": {
    "en": "Statement, %",
    "uk": "Покриття виписками",
    "ru": "Выписка, %"
   },
   "group": "Конверсія і автоматизація",
   "status": "canonical",
   "canonical": true,
   "definition": "Частка активних рахунків, повністю покритих банківською випискою за вікно.",
   "formula": "COUNT(DISTINCT BA з BankAccountFile, що повністю покриває вікно)\n/ COUNT(DISTINCT BA з ≥1 payin у вікні) × 100\nпокриття: file.beginDateTime ≥ period_start AND file.endDateTime ≤ NOW()\nвікно: rolling 30 днів",
   "unit": "%",
   "synonyms": [
    "Виписка %",
    "Stmt%",
    "Statement coverage",
    "Stmt,%",
    "Виписка, %",
    "% завантаження виписок"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Stmt,%",
     "description": "Statement coverage. 100=≥80 · 75=≥59.1 · 50=≥34.8 · 25=≥14.7 · 0=<14.7. Вага 10%.",
     "pattern": "cols"
    },
    {
     "report": "trader-operational",
     "label": "Statement, %",
     "description": "Доля банковских счетов, для которых загружена выписка (BankAccountFile) за период активности.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Виписка, %",
     "description": "Доля аккаунтов с банковской выпиской. Volume-weighted: крупный трейдер с 2000 аккаунтов правильно доминирует над мелким с 1 аккаунтом. Без двойного AVG. SQL-query ▾ SELECT SUM(has_statement)::float / NULLIF(SUM(total_accounts), 0) AS statement_pct FROM ( SELECT dt, tid, SUM(has_stmt) AS has_statement, COUNT(DISTINCT account_number) AS total_accounts FROM ( SELECT DATE(cp.\"createdAt\" + '5h30m') AS dt, ba.\"accountProvider\" AS tid, ba.\"account\" AS account_number, MAX(CASE WHEN baf.id IS NOT NULL THEN 1 ELSE 0 END) AS has_stmt FROM \"ClientPayin\" cp JOIN \"BankAccount\" ba ON ... LEFT JOIN LATERAL ( SELECT f.id FROM \"BankAccountFile\" f WHERE f.\"bankAccount\" = ba.id AND cp.\"createdAt\" BETWEEN f.\"beginDateTime\" AND f.\"endDateTime\" LIMIT 1 ) baf ON TRUE GROUP BY dt, tid, account_number ) raw GROUP BY dt, tid ) agg",
     "pattern": "lg-item"
    },
    {
     "report": "trader-scoreboard",
     "label": "Stmt,%",
     "description": "Statement coverage. 100pts =100%, 75pts >=93.8%, 50pts >=85.7%, 25pts >=71.0%, 0pts <71.0%/blank. Weight 10%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "Statement, %",
     "description": "Доля банковских счетов, имеющих привязанные выписки (BankAccountFile). Volume-weighted: SUM(has_statement) / COUNT(DISTINCT ba.account). Считается на уровне ba.id с дедупликацией по account number.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "% завантаження виписок",
     "description": "Частка банківських рахунків, для яких завантажено банківську виписку (hermes.bank_statements — дзеркало Keystone BankAccountFile), що покриває час PayIn. Volume-weighted, за тією ж формулою що й Statement% у Trader Operational (finance-exact): рахунок за день «має виписку», якщо хоча б один його PayIn потрапляє в інтервал виписки [period_from, period_to]. Формула: Σ has_stmt (по ba.pid за день) / Σ uniqExact(ba.account) (за день). Тільки P2P, усі статуси PayIn.",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-weekly",
     "text": "Volume-weighted, канон считает по счетам.",
     "status": "open"
    }
   ],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Operational, Weekly, Scoreboard (вага 10% у Score); у фінансів відсутня — канон задає дашборд"
  },
  {
   "id": "active_traders",
   "name": {
    "en": "Active Traders",
    "uk": "Активні трейдери",
    "ru": "Активные трейдеры"
   },
   "group": "Трейдери й рахунки",
   "status": "canonical",
   "canonical": true,
   "definition": "Два РІЗНІ поняття — не змішувати:",
   "formula": "Active Traders (period) — канон дашборда: COUNT(DISTINCT provider) з ≥1 payin-транзакцією за період\n(provider через bank_accounts.provider_pid)\nTraders Online (now) — канон фінансів: status='active' AND імʼя містить [P2P] без [SLU]/[Intent]\nAND Transaction за останню годину AND payout_ratio_7d > 0 AND balance > 0",
   "unit": "кількість (int)",
   "synonyms": [
    "Трейдери",
    "tr/tru",
    "active_traders",
    "Активных трейдеров (lab)",
    "Трейдерів",
    "Активні",
    "Активних",
    "Активних трейдерів",
    "Δ Актив.",
    "Active (this / last week)",
    "Active Traders Unique",
    "Унікальні активні трейдери",
    "Active (traders)",
    "Активні трейдери",
    "Кількість активних трейдерів",
    "Активних трейдерів MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Трейдерів",
     "description": "COUNT провайдерів під афіліатами менеджера.",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-tier",
     "label": "Активні",
     "description": "Трейдери зі статусом active",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Активних",
     "description": "Унікальні трейдери з ≥1 PayIn за тиждень. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Активних трейдерів",
     "description": "Унікальні трейдери з ≥1 PayIn за тиждень (uniqExact provider)",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ Актив.",
     "description": "Зміна активних до попереднього тижня",
     "pattern": "colfn"
    },
    {
     "report": "churn",
     "label": "Active (this / last week)",
     "description": "К-сть трейдерів з payin у вікні цього / минулого тижня.",
     "pattern": "lg-item"
    },
    {
     "report": "trader-kpi",
     "label": "Active Traders Unique",
     "description": "унікальні трейдери з PayIn > 0 за період",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Унікальні активні трейдери",
     "description": "Количество уникальных трейдеров (провайдеров), у которых сумма payin > 0 за выбранный период. Каждый трейдер считается один раз. SQL-query ▾ SELECT COUNT(*) FROM ( SELECT ba.\"accountProvider\" AS pid FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON ... WHERE tran.operation = 'payin' GROUP BY ba.\"accountProvider\" HAVING SUM(tran.amount) > 0 ) sub",
     "pattern": "lg-item"
    },
    {
     "report": "trader-operational",
     "label": "Active Traders",
     "description": "Количество уникальных трейдеров с PayIn > 0 в этот час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Active (traders)",
     "description": "фактична кількість unique трейдерів які мали хоча б 1 транзакцію у цю годину.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Active Traders",
     "description": "Количество уникальных трейдеров с PayIn > 0 за день. Считается из Transaction по accountProvider.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Активні трейдери",
     "description": "Количество уникальных провайдеров, у которых суммарный payin > 0. Группируется по провайдеру, фильтруется по SUM > 0 (не по каждой транзакции отдельно). SQL-query ▾ SELECT COUNT(*) AS active_traders FROM ( SELECT ba.\"accountProvider\" AS pid FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON tran.\"bankAccount\" = ba.id WHERE tran.operation = 'payin' AND (tran.\"createdAt\" ...)::date = :dt GROUP BY ba.\"accountProvider\" HAVING SUM(tran.amount) > 0 ) sub",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Active Traders",
     "description": "Количество уникальных трейдеров с PayIn-активностью в эту неделю.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Кількість активних трейдерів",
     "description": "Кількість P2P-провайдерів, у яких payin_total > 0 в обраний період.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Активних трейдерів MTD",
     "description": "COUNT DISTINCT trader_id з PayIn>0 в поточному календарному місяці (IST). Готова логіка з ch.fetch_dashboard_kpi.",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [
    {
     "report": "trader-operational",
     "text": "За день, а не за период фильтра. Совместимо с каноном (период = день).",
     "status": "open"
    }
   ],
   "notes": [
    "Порівнювати «активних за місяць» дашборда з «онлайн зараз» фінансів — некоректно: це різні метрики з різними назвами."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "(period): всі звіти дашборда. (now): lab «Активных трейдеров», Detailed «1П/2П/3П»\n    Порівнювати «активних за місяць» дашборда з «онлайн зараз» фінансів — некоректно: це різні метрики з різними назвами."
  },
  {
   "id": "active_accounts",
   "name": {
    "en": "Active Accounts",
    "uk": "Активні рахунки (BA)",
    "ru": "Активные счета"
   },
   "group": "Трейдери й рахунки",
   "status": "canonical",
   "canonical": true,
   "definition": "Аналогічно — два поняття:",
   "formula": "Active Accounts (period) — канон дашборда: COUNT(DISTINCT bank_account) з ≥1 успішним payin за період\nAccounts in naliv (now) — канон фінансів: рахунки з forClientPayin = TRUE прямо зараз",
   "unit": "кількість (int)",
   "synonyms": [
    "Рахунки",
    "Accts",
    "BA",
    "ba_count",
    "Активні рахунки",
    "Кількість використаних рахунків"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Active Accounts",
     "description": "Количество уникальных банковских счетов с активностью в этот час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Active Accounts",
     "description": "Сумма уникальных банковских счетов с активностью по каждому часу и трейдеру за день.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Активні рахунки",
     "description": "Сумма уникальных банковских аккаунтов по каждому часу и трейдеру. Один аккаунт, активный в 5 часах, считается 5 раз (аналог Power BI SUM(active_accounts)). SQL-query ▾ SELECT SUM(accts) AS active_accounts FROM ( SELECT dt, hr, ap.id AS tid, COUNT(DISTINCT ba.id) AS accts FROM \"ClientPayin\" cp JOIN \"BankAccount\" ba ON cp.\"bankAccount\" = ba.id JOIN \"AccountProvider\" ap ON ba.\"accountProvider\" = ap.id WHERE (cp.\"createdAt\" ...)::date = :dt GROUP BY dt, hr, ap.id ) sub",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Active Accounts",
     "description": "Количество уникальных банковских счетов (BankAccount), с которых были payin-операции за неделю.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Кількість використаних рахунків",
     "description": "Кількість унікальних банківських рахунків (bank_accounts.account), з яких прийнято хоча б один успішний PayIn за обраний період (глобально по всій вибірці).",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "BA",
     "description": "Кількість унікальних банківських рахунків (bank_accounts.account) трейдера з успішними PayIn за обраний період.",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-operational",
     "text": "Сумма почасовых уникальных счетов за день, один счёт считается многократно. Канон: COUNT(DISTINCT) за период.",
     "status": "open"
    }
   ],
   "notes": [
    "Active Accounts ≠ Active Traders: один трейдер має 10+ рахунків."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "(period): Operational, Weekly, Detailed. (now): lab active_traders-вкладка, Detailed «Налив»\n    Active Accounts ≠ Active Traders: один трейдер має 10+ рахунків."
  },
  {
   "id": "new_traders",
   "name": {
    "en": "New Traders / Launched",
    "uk": "Нові трейдери",
    "ru": "Новые трейдеры"
   },
   "group": "Трейдери й рахунки",
   "status": "canonical",
   "canonical": true,
   "definition": "Провайдери, чий найперший payin за всю історію потрапив у період.",
   "formula": "MIN(перша payin-транзакція) OVER (PARTITION BY provider) ∈ [period_start, period_end)",
   "unit": "кількість (int)",
   "synonyms": [
    "nt",
    "Запущено трейдерів",
    "new_traders",
    "launched",
    "Запущено",
    "Δ Запущ.",
    "New",
    "New Traders",
    "Нові трейдери",
    "Нових трейдерів",
    "Запущено трейдерів MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "Запущено",
     "description": "Трейдери з 1-м PayIn цього тижня (активація). Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Запущено",
     "description": "Трейдери з 1-м PayIn цього тижня (активація)",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ Запущ.",
     "description": "Зміна запущених",
     "pattern": "colfn"
    },
    {
     "report": "churn",
     "label": "New",
     "description": "Активний цього тижня, не активний минулого, і раніше payin не було (новий).",
     "pattern": "lg-item"
    },
    {
     "report": "trader-kpi",
     "label": "New Traders",
     "description": "трейдери з першою PayIn-транзакцією у цьому періоді",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Нові трейдери",
     "description": "Трейдеры, у которых первая payin транзакция попадает в выбранный период. SQL-query ▾ SELECT COUNT(*) AS new_traders FROM ( SELECT ba.\"accountProvider\" AS pid, MIN((tran.\"createdAt\" AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Kolkata')::date) AS first_tr FROM \"Transaction\" tran JOIN \"BankAccount\" ba ON ... WHERE tran.operation = 'payin' GROUP BY 1 ) ftx WHERE first_tr >= :period_start",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Нових трейдерів",
     "description": "Кількість провайдерів, у яких перша транзакція в системі (min(transactions.source_created_at) за payin) потрапляє в обраний період.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Запущено трейдерів MTD",
     "description": "Нові кабінети з >=1 PayIn в період. [⚠ Логіка прозора, але ціль 80% ще не зафіксована як SLA.]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [
    "name.ru - наш перевод, в источнике его нет."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "KPI, Weekly, Churn, Affiliate-звіти; у фінансів близьке — is_developing (перша активність < 3 тижнів) — це ІНШЕ операційне поняття"
  },
  {
   "id": "avg_payin_trader",
   "name": {
    "en": "Avg PayIn/Trader",
    "uk": "Сер. PayIn на трейдера",
    "ru": "Ср. PayIn/трейдер"
   },
   "group": "Трейдери й рахунки",
   "status": "canonical",
   "canonical": true,
   "definition": "Середній налив на активного трейдера за період.",
   "formula": "PayIn_Volume / Active_Traders(period)   — чисельник і знаменник з канонів вище",
   "unit": "INR (₹)",
   "synonyms": [
    "Сер/тр",
    "Avg/Tr",
    "avg_payin_trader",
    "AVG PayIn/Trader",
    "AVG PayIn per Trader",
    "Сер. PayIn/трейдер",
    "Avg PayIn / трейдера"
   ],
   "reports": [
    {
     "report": "trader-kpi",
     "label": "AVG PayIn/Trader",
     "description": "обсяг PayIn / сума денних активних трейдерів",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "AVG PayIn per Trader",
     "description": "Средний объём PayIn на одного трейдера. Общий объём / сумма ежедневных трейдеров. SQL-query ▾ SELECT SUM(payin_volume) / SUM(day_traders) AS avg_payin -- day_traders: ежедневный DISTINCTCOUNT -- НЕ среднее, а именно SUM",
     "pattern": "lg-item"
    },
    {
     "report": "trader-operational",
     "label": "Avg PayIn/Trader",
     "description": "Средний PayIn Volume на одного активного трейдера за час.",
     "pattern": "title"
    },
    {
     "report": "trader-operational",
     "label": "Avg PayIn/Trader",
     "description": "Средний PayIn Volume на одного активного трейдера за день.",
     "pattern": "showM"
    },
    {
     "report": "trader-operational",
     "label": "Сер. PayIn/трейдер",
     "description": "Средний объём PayIn на одного активного трейдера. SQL-query ▾ SELECT SUM(payin_volume) / NULLIF(active_traders, 0) AS avg_payin_trader -- payin_volume: SUM из Transaction -- active_traders: COUNT(DISTINCT provider) -- GROUP BY provider HAVING SUM(amount) > 0",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Avg PayIn/Trader",
     "description": "Средний PayIn Volume на одного активного трейдера за неделю. Формула: SUM(payin) / COUNT(DISTINCT active_traders).",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Avg PayIn / трейдера",
     "description": "SUM(PayIn MTD) / COUNT(active traders MTD).",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [
    {
     "report": "trader-kpi",
     "text": "Знаменатель средняя дневная численность активных, а не активные за период. Канон называет это отдельной метрикой (daily-avg).",
     "status": "open"
    }
   ],
   "notes": [
    "У Trader KPI знаменник — середньоденна кількість активних (avg daily), а не за весь період. Це окрема метрика «Avg PayIn/Trader (daily-avg)» — при порівнянні звітів звертати увагу, яка з двох використана."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "9 звітів дашборда; у фінансів відсутня — канон задає дашборд\n    У Trader KPI знаменник — середньоденна кількість активних (avg daily), а не за весь період. Це окрема метрика «Avg PayIn/Trader (daily-avg)» — при порівнянні звітів звертати увагу, яка з двох використана."
  },
  {
   "id": "deposit",
   "name": {
    "en": "Deposit",
    "uk": "Депозит",
    "ru": "Депозит"
   },
   "group": "Трейдери й рахунки",
   "status": "canonical",
   "canonical": true,
   "definition": "Забезпечення трейдера. Два поняття:",
   "formula": "Deposit (snapshot) — канон фінансів: deposit_USDT × FX_mid   — миттєва оцінка в INR; входить у формулу Threshold/Capacity\nDeposit (cumulative) — канон дашборда (Trader KPI): кумулятивний залишок депозитних рахунків (title LIKE '%deposit%') на кінець дня,\nнаростаючим підсумком; виключено провайдерів 'archive' і назви '%Payable%'",
   "unit": "USDT ($) базово, INR (₹) у відображенні",
   "synonyms": [
    "dep",
    "депо",
    "depo_usdt/depo_inr",
    "Σ Unique Deposit ($)",
    "Deposit Volume"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "Σ Unique Deposit ($)",
     "description": "Депозит = баланс депозит-акаунта ( bank_accounts.account_balance по deposit_bank_account_pid ), USDT . Це константа на трейдера → не сумується по днях, агрегат = сума по унікальних трейдерах.",
     "pattern": "lg-item"
    },
    {
     "report": "trader-kpi",
     "label": "Deposit",
     "description": "кумулятивний депозит на останній день періоду (без archive/Payable)",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Deposit Volume",
     "description": "Кумулятивный депозит на последний день периода. Исключаются архивные трейдеры и аккаунты 'Payable'. SQL-query ▾ SELECT SUM(dc.cum_dep) AS deposit FROM period_last_dt pld JOIN dep_cumulative dc ON dc.dt = pld.last_dt JOIN \"AccountProvider\" ap ON ap.id = dc.pid WHERE ap.status != 'archive' AND ap.name NOT LIKE '%Payable%'",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Deposit",
     "description": "Загальна сума депозитів трейдера ALL-TIME (bank_accounts.title LIKE '%deposit%'). Net flow по expenses.cash_in − cash_out для deposit-рахунків. Не залежить від обраного періоду.",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-kpi",
     "text": "Кумулятив на конец периода (канон дашборда). В Weekly KPI ALL-TIME без привязки к периоду. Это два разных понятия из канона, подпись должна говорить какое.",
     "status": "open"
    },
    {
     "report": "trader-weekly",
     "text": "ALL-TIME net flow по deposit-счетам, не зависит от периода.",
     "status": "open"
    }
   ],
   "notes": [
    "Це знімок/кумулятив, НЕ потік за період — не можна сумувати по днях.",
    "name.ru - наш перевод, в источнике его нет."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "KPI, Weekly, Detailed, Churn, THC; lab: depo_usdt/depo_inr\n    Це знімок/кумулятив, НЕ потік за період — не можна сумувати по днях."
  },
  {
   "id": "payin_speed",
   "name": {
    "en": "PayIn Speed",
    "uk": "Швидкість зарахування",
    "ru": "Скорость зачисления"
   },
   "group": "Швидкість і ємність",
   "status": "canonical",
   "canonical": true,
   "definition": "Час від створення payin-заявки до зарахування транзакції.",
   "formula": "Канонічний інтервал: ClientPayin.created_at → Transaction.created_at, тільки успішні, без Appeal\nАгрегати (назва метрики ЗОБОВʼЯЗАНА містити агрегат): P90    — Scoreboard (вага 18% у Score)\nmedian — Weekly\navg    — Merchant-SLU (там інтервал source_created_at → source_updated_at — gateway-варіант)",
   "unit": "хвилини",
   "synonyms": [
    "PI Speed",
    "SLA IN",
    "PayIn P90",
    "AVG speed",
    "PI P90",
    "AVG Total Time",
    "PayIn Speed (median, min)",
    "PayIn Speed (average, min)",
    "PayIn Speed (P90, min)",
    "Середній SLA IN"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "PI P90",
     "description": "PayIn P90 (хв). Менше = краще. 100=≤1.67 · 75=≤2.80 · 50=≤4.74 · 25=≤8.24 · 0=>8.24. Вага 18%.",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "AVG speed",
     "description": "avg(updatedAt − createdAt), success payin, БЕЗ апілів (PAYIN AVG чистий). Джерело: payments.source_updated_at − source_created_at · виключено payin з appeals. Методика @la_grange_FC. Для ротованих провайдерів абсолют плаває через атрибуцію (Finaxis)",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "AVG Total Time",
     "description": "avg(updatedAt − createdAt), success payin (PAYIN AVG загальний, З апілами). Джерело: payments.source_updated_at − source_created_at. Методика @la_grange_FC. Росте заднім числом як апіли дорешуються — старі періоди вищі за момент вигрузки",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "AVG speed",
     "description": "avg(updatedAt − createdAt), success payin, БЕЗ апілів (чистий). Джерело: payments.source_updated_at − source_created_at. Методика @la_grange_FC",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "PI P90",
     "description": "PayIn P90 (min). Lower=better. 100pts <=0.87, 75pts <=0.97, 50pts <=1.33, 25pts <=2.78, 0pts >2.78. Weight 18%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "PayIn Speed (median, min)",
     "description": "Медианное время от создания заявки ClientPayin до её updatedAt (минут). Статусы completed + successed_by_partner. Методология согласована с ИТ (updatedAt вместо join на Transaction — транзакций может быть несколько). Чем меньше — тем быстрее работают трейдеры.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "PayIn Speed (average, min)",
     "description": "Среднее арифметическое время payin (минут). Может быть искажено выбросами — поэтому также показываем медиану.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "PayIn Speed (P90, min)",
     "description": "90-й перцентиль времени payin (минут): 90% заявок закрываются быстрее этого значения. Показывает «хвост» медленных заявок, который не виден в медиане.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Середній SLA IN",
     "description": "Зважений середній час від створення PayIn до підтвердження трейдером (cp.source_created_at → cp.source_updated_at) у MM:SS. Тільки успішні (status IN ('completed','successed_by_partner')). Включає очікування оплати клієнтом + обробку банку + підтвердження трейдером. Менше — краще.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "SLA IN",
     "description": "Середній час підтвердження PayIn (MM:SS): cp.source_created_at → cp.source_updated_at. Тільки успішні. Δ% — менше = краще (зелений ↓, червоний ↑).",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-weekly",
     "text": "Интервал created_at → updatedAt заявки. Канон: ClientPayin.created_at → Transaction.created_at.",
     "status": "open"
    },
    {
     "report": "trader-merchant-slu",
     "text": "Интервал source_created_at → source_updated_at (gateway-вариант), оговорён в каноне как допустимый для Merchant-SLU.",
     "status": "open"
    }
   ],
   "notes": [
    "name.ru - наш перевод, в источнике его нет."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Weekly, Merchant-SLU, Scoreboard; у фінансів відсутня"
  },
  {
   "id": "payout_speed",
   "name": {
    "en": "PayOut Speed",
    "uk": "Швидкість виплат",
    "ru": "Скорость выплат"
   },
   "group": "Швидкість і ємність",
   "status": "canonical",
   "canonical": true,
   "definition": "Час від призначення виплати трейдеру до її завершення.",
   "formula": "Канонічний інтервал: assigned_at → completed_at, тільки успішні payout\nАгрегати: P90    — Scoreboard (вага 20% у Score)\nmedian — Weekly, Detailed (з payment_status_history: processing → completed)\navg    — фінанси (lab): AVG(assignedAt → completedAtByProvider) за 7д",
   "unit": "хвилини",
   "synonyms": [
    "PO Speed",
    "SLA OUT",
    "AVG Trader Time",
    "Avg speed",
    "l5_speed (lab)",
    "PO P90",
    "PayOut Speed (median, min)",
    "PayOut Speed (average, min)",
    "PayOut Speed (P90, min)",
    "Середній SLA OUT"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "PO P90",
     "description": "PayOut P90 (хв). Менше = краще. 100=≤22.3 · 75=≤31.1 · 50=≤42.4 · 25=≤58.7 · 0=>58.7. Вага 20%.",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "PO P90",
     "description": "PayOut P90 (min). Lower=better. 100pts <=14.7, 75pts <=20.6, 50pts <=29.1, 25pts <=43.9, 0pts >43.9. Weight 20%.",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "PayOut Speed (median, min)",
     "description": "Медианное время от assignedAt до updatedAt в ClientPayout (минут). Статусы completed + successed_by_partner. Чем меньше — тем быстрее выплаты.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "PayOut Speed (average, min)",
     "description": "Среднее арифметическое время payout (минут). Может быть искажено выбросами.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "PayOut Speed (P90, min)",
     "description": "90-й перцентиль времени payout (минут): 90% выплат проходят быстрее этого значения. Показывает «хвост» медленных выплат.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "Середній SLA OUT",
     "description": "Зважений середній час від створення PayOut до прийняття трейдером (cp.source_created_at → cp.assigned_at) у MM:SS. Cap 4 години (нічні черги виключаються). Менше — краще.",
     "pattern": "dict"
    },
    {
     "report": "trader-weekly",
     "label": "SLA OUT",
     "description": "Середній час прийняття PayOut (MM:SS): cp.source_created_at → cp.assigned_at. Cap 4 години. Δ% — менше = краще.",
     "pattern": "dict"
    }
   ],
   "deviations": [
    {
     "report": "trader-weekly",
     "text": "assignedAt → updatedAt. Канон: assigned_at → completed_at.",
     "status": "open"
    }
   ],
   "notes": [
    "CH-поле time_to_complete_payout зламане (константа 60) — не використовувати. Порівнювати P90 дашборда з AVG фінансів — некоректно.",
    "name.ru - наш перевод, в источнике его нет."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Weekly, Detailed, Merchant-SLU, Scoreboard; lab: «Скорость (мин)» у М3/Л5\n    CH-поле time_to_complete_payout зламане (константа 60) — не використовувати. Порівнювати P90 дашборда з AVG фінансів — некоректно."
  },
  {
   "id": "capacity",
   "name": {
    "en": "Capacity / Threshold",
    "uk": "Ємність / Поріг",
    "ru": "Ёмкость / Порог"
   },
   "group": "Швидкість і ємність",
   "status": "canonical",
   "canonical": true,
   "definition": "Скільки трейдер ще може прийняти payin прямо зараз. Формули звірені 1:1 між дашбордом і фінансами.",
   "formula": "Threshold  = deposit_USDT × FX_mid × (max_fill_pct / 100) × (1 + payin_fee_pct / 100)\n             max_fill_pct = zeroPriorityWhenBalanceToDepositThreshold (≈80%)\nHeadroom   = MAX(Threshold − Balance, 0)        Balance = canonical earnings balance (CH)\neff_limit  = MAX_daily_payin_30d (якщо ×1.10 ≥ заявлений ліміт BA — береться заявлений)\nBA_remain  = Σ MAX(eff_limit − payin_today_BA, 0) по рахунках forClientPayin = TRUE\nCapacity   = MIN(BA_remain, Headroom)\n% залитості = Σ Balance / Σ Threshold × 100%    «залитий»: Capacity ≤ 50 000 ₹",
   "unit": "INR (₹)",
   "synonyms": [
    "Ёмкость",
    "Порог",
    "capacity_inr",
    "Cap."
   ],
   "reports": [],
   "deviations": [],
   "notes": [
    "name.ru - наш перевод, в источнике его нет."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-07-27",
   "source": "metrics-legend halleg (канон, 2026-07-27)",
   "present_in_canon": "Detailed (картка «Capacity P2P»), Capacity-звіт; lab: Capacity INR, % залитости, cap_history"
  },
  {
   "id": "score_scoreboard",
   "name": {
    "en": "Score (Scoreboard)",
    "uk": "Score (Scoreboard)",
    "ru": "Score (Scoreboard)"
   },
   "group": "Скоринг",
   "status": "conflict",
   "canonical": false,
   "definition": "Взвешенный балл 0-100 трейдера по 8 метрикам.",
   "formula": "PO_P90*20% + PI_P90*18% + CR*18% + Settlement*15% + Statement*10% + Auto*7% + AvgVol*7% + Cost*5%",
   "unit": "баллы 0-100",
   "synonyms": [
    "Score",
    "Скоринг",
    "Avg Score (трейдерів)",
    "Avg Score за тиждень"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Score",
     "description": "Загальний бал 0–100 = зваж. сума 8 метрик: PO_P90×20% + PI_P90×18% + CR×18% + Settle×15% + Stmt×10% + Auto×7% + AvgVol×7% + Cost×5%.",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate",
     "label": "Скоринг",
     "description": "Середній Total score трейдерів групи (Scoreboard, rolling 30d). Δ немає — snapshot без історії.",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "Score",
     "description": "Final weighted score (0-100). PO_P90*20% + PI_P90*18% + CR*18% + Settlement*15% + Statement*10% + Auto*7% + AvgVol*7% + Cost*5%.",
     "pattern": "showM"
    },
    {
     "report": "trader-affiliate",
     "label": "Avg Score (трейдерів)",
     "description": "Середнє по scoring.compute_score (8 метрик з калібровкою — pop/pip/cr/sr/st/fw/av/cost). 1:1 з Trader Scoreboard.",
     "pattern": "coverage-legend"
    },
    {
     "report": "trader-affiliate",
     "label": "Avg Score за тиждень",
     "description": "Avg score треба перераховувати щотижня. [⚠ Зараз scoring рахується по rolling 30d — треба зробити snapshot.]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [
    "В каноне metrics-legend Score отсутствует. Две несовместимые формулы в Scoreboard и Weekly KPI/Tier: объединять нельзя, пока аналитики не решат, какая верна. Файл TIER_CALCULATION.md запрошен у CTO (вопрос 18)."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описания в коде отчётов halleg"
  },
  {
   "id": "score_tier",
   "name": {
    "en": "Score (Tier / Weekly KPI)",
    "uk": "Score (Tier / Weekly KPI)",
    "ru": "Score (Tier / Weekly KPI)"
   },
   "group": "Скоринг",
   "status": "conflict",
   "canonical": false,
   "definition": "Взвешенный балл 0-100 по формуле TIER_CALCULATION.md (Power BI Main Dashboard).",
   "formula": "Volume×0.3 + Succ×0.2 + Active×0.1 + Tenure×0.1 + Velo IN×0.1 + Velo OUT×0.1 + Stab×0.1",
   "unit": "баллы 0-100",
   "synonyms": [
    "Score",
    "Avg Score"
   ],
   "reports": [
    {
     "report": "trader-affiliate-tier",
     "label": "Score",
     "description": "Сума 4 складових (без sub-aff буфера)",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-tier",
     "label": "Avg Score",
     "description": "Середній Trader Scoreboard (rolling-30d)",
     "pattern": "cols"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Score",
     "description": "Середній Trading Score трейдерів афіліата (rolling-30d snapshot)",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Avg Score",
     "description": "Середній Trading Score (rolling-30d snapshot)",
     "pattern": "colfn"
    },
    {
     "report": "trader-weekly",
     "label": "Score",
     "description": "Зважений бал 0–100 за canonical формулою TIER_CALCULATION.md (Power BI Main Dashboard, 1:1 з Affiliate-pc): Volume×0.3 + Succ×0.2 + Active×0.1 + Tenure×0.1 + Velo IN×0.1 + Velo OUT×0.1 + Stab×0.1. Деталі порогів — у Methodology.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [
    "В каноне metrics-legend Score отсутствует. Две несовместимые формулы в Scoreboard и Weekly KPI/Tier: объединять нельзя, пока аналитики не решат, какая верна. Файл TIER_CALCULATION.md запрошен у CTO (вопрос 18)."
   ],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описания в коде отчётов halleg"
  },
  {
   "id": "zone",
   "name": {
    "en": "Zone",
    "uk": "",
    "ru": ""
   },
   "group": "Скоринг",
   "status": "needs_review",
   "canonical": false,
   "definition": "High (≥53), Mid (29–52), Low (≤29). Зони відкалібровані на ~25/50/25 рози розподілу.",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Zone",
     "description": "High (≥53), Mid (29–52), Low (≤29). Зони відкалібровані на ~25/50/25 рози розподілу.",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "Zone",
     "description": "High (Score >=60): top ~25%. Mid (35 < Score < 60): ~50%. Low (Score <=35): bottom ~25%. Cutoffs swept to land at ~25/50/25 on live distribution.",
     "pattern": "showM"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "avg_payin_day",
   "name": {
    "en": "Avg PayIn / Day",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "SUM(BAA.dayPayinAmount)/COUNT(DISTINCT date з dayPayinAmount>0). 100=≥302K · 75=≥176K · 50=≥106K · 25=≥42K · 0=<42K. Вага 7%.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Avg Vol/Day",
    "Сер/день",
    "Avg Daily PayIn",
    "Avg/день"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Avg Vol/Day",
     "description": "SUM(BAA.dayPayinAmount)/COUNT(DISTINCT date з dayPayinAmount>0). 100=≥302K · 75=≥176K · 50=≥106K · 25=≥42K · 0=<42K. Вага 7%.",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Сер/день",
     "description": "Amount IN / активні дні (де ≥20 completed). Джерело: підтверджено замовником — не календарні дні",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Avg Daily PayIn",
     "description": "Total PayIn / календарних днів періоду. Джерело: розрахунок",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Avg/день",
     "description": "Amount IN / календарних днів. Джерело: розрахунок",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "Avg Vol/Day",
     "description": "SUM(BAA.dayPayinAmount) / COUNT(DISTINCT date FILTER dayPayinAmount>0). 100pts >=232K, 75pts >=146K, 50pts >=96K, 25pts >=52K, 0pts <52K. Weight 7%.",
     "pattern": "showM"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "active_days",
   "name": {
    "en": "Active Days",
    "uk": "",
    "ru": ""
   },
   "group": "Скоринг",
   "status": "needs_review",
   "canonical": false,
   "definition": "Кількість активних торгових днів у 30-денному вікні (з dayPayinAmount > 0).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Days"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Days",
     "description": "Кількість активних торгових днів у 30-денному вікні (з dayPayinAmount > 0).",
     "pattern": "cols"
    },
    {
     "report": "trader-scoreboard",
     "label": "Days",
     "description": "Active trading days in the period (payin_volume > 0).",
     "pattern": "showM"
    },
    {
     "report": "trader-weekly",
     "label": "Active Days",
     "description": "Кількість унікальних дат (IST) з хоча б одним PayIn за обраний період.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "churn_7d",
   "name": {
    "en": "Churn 7D",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "churned / active_last_week × 100% — методологія цього ж борду (7d vs 14d), щоб вкладка сходилася з дашбордом.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Churn",
    "Churned (відтік)",
    "Трейдерів що «випали»",
    "Churned MTD (кількість + rate)"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Churn",
     "description": "churned / active_last_week × 100% — методологія цього ж борду (7d vs 14d), щоб вкладка сходилася з дашбордом.",
     "pattern": "cols"
    },
    {
     "report": "churn",
     "label": "Churned (відтік)",
     "description": "Трейдер, активний минулого тижня й не активний цього. Це тижневий event , не «всього неактивних». формула Churned This Week = active(Last [t−14,t−7)) AND NOT active(This [t−7,t)) active = ≥1 payin (будь-який статус)",
     "pattern": "lg-item"
    },
    {
     "report": "trader-kpi",
     "label": "Churn 7D",
     "description": "були активні (спроба PayIn) у попередньому періоді, неактивні в поточному",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Churn 7D",
     "description": "Кількість трейдерів, які були активні в попередньому періоді, але НЕ активні в поточному (set-difference по періодах). Вимірює «відтік» по тижнях/днях/місяцях. Активність = факт спроби PayIn у таблиці payments (будь-який статус, не лише успішні) — вирівняно зі звітом /churn. Universe = трейдери з provider.type='p2p' , без Operation provider та %QA_Test%. Періоди — календарні (ISO-тижні Пн-Нд), тому значення близькі до /churn, але не ідентичні (там ковзні 7-денні вікна).",
     "pattern": "lg-item"
    },
    {
     "report": "trader-weekly",
     "label": "Трейдерів що «випали»",
     "description": "Трейдери, у яких в попередньому аналогічному за тривалістю періоді була активність (payin_total_p > 0), але в поточному — немає (payin_total = 0). Показує відтік активних.",
     "pattern": "dict"
    },
    {
     "report": "trader-affiliate",
     "label": "Churned MTD (кількість + rate)",
     "description": "Логіка churn ще не реалізована. Треба: трейдер вважається churned, якщо мав активність N днів тому але не сьогодні. [❌ Уточнити N (30д? 14д?) і причини: пішов сам / 90-day Ownership / видалено менеджером.]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "tier",
   "name": {
    "en": "Tier",
    "uk": "",
    "ru": ""
   },
   "group": "Скоринг",
   "status": "needs_review",
   "canonical": false,
   "definition": "A≥80 · B 60-79 · C 38-59 · C-watch<38",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-affiliate-tier",
     "label": "Tier",
     "description": "A≥80 · B 60-79 · C 38-59 · C-watch<38",
     "pattern": "cols"
    },
    {
     "report": "trader-weekly",
     "label": "Tier",
     "description": "Категорія трейдера по Score (canonical Power BI пороги): Platinum ≥ 80, Gold ≥ 65, Silver ≥ 45, Bronze ≥ 30, інакше Inactive. Score — зважена сума 7 sub-score'ів (див. Methodology).",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Tier_Board"
  },
  {
   "id": "sub_affiliates",
   "name": {
    "en": "Sub-affiliates",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "Буфер (не в Tier)",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Sub-aff"
   ],
   "reports": [
    {
     "report": "trader-affiliate-tier",
     "label": "Sub-aff",
     "description": "Буфер (не в Tier)",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Tier_Board"
  },
  {
   "id": "new_cabinets",
   "name": {
    "en": "New Cabinets",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "Нові кабінети, створені цього тижня. Δ — до пред. тижня",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Нові каб.",
    "Нові кабінети",
    "Δ Нові каб.",
    "Нових кабінетів MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "Нові каб.",
     "description": "Нові кабінети, створені цього тижня. Δ — до пред. тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Нові кабінети",
     "description": "Нові provider-кабінети, створені цього тижня",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate-weekly",
     "label": "Δ Нові каб.",
     "description": "Зміна нових кабінетів",
     "pattern": "colfn"
    },
    {
     "report": "trader-affiliate",
     "label": "Нових кабінетів MTD",
     "description": "COUNT trader_id з ap.source_created_at в поточному місяці. [⚠ Уточнити: чи \"новий кабінет\" = новий trader_id, чи запис у CRM (зараз CRM не підключений).]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Weekly_Report"
  },
  {
   "id": "sub_affiliates_l2",
   "name": {
    "en": "Sub-affiliates L2",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "ПРОТОТИП (гіпотеза): к-сть L2 суб-афіліатів — на 1 позицію глибше за майстра в ланцюгу. Питання 6 ТЗ",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Sub-aff L2"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "Sub-aff L2",
     "description": "ПРОТОТИП (гіпотеза): к-сть L2 суб-афіліатів — на 1 позицію глибше за майстра в ланцюгу. Питання 6 ТЗ",
     "pattern": "colfn"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Weekly_Report"
  },
  {
   "id": "sub_affiliates_l3",
   "name": {
    "en": "Sub-affiliates L3",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "ПРОТОТИП (гіпотеза): к-сть L3 суб-афіліатів — на 2 позиції глибше за майстра",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Sub-aff L3"
   ],
   "reports": [
    {
     "report": "trader-affiliate-weekly",
     "label": "Sub-aff L3",
     "description": "ПРОТОТИП (гіпотеза): к-сть L3 суб-афіліатів — на 2 позиції глибше за майстра",
     "pattern": "colfn"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Weekly_Report"
  },
  {
   "id": "arpu",
   "name": {
    "en": "ARPU / Avg Check",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "SUM(amount WHERE completed) / COUNT(completed). Джерело: payments.amount",
   "formula": "",
   "unit": "",
   "synonyms": [
    "ARPU"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "ARPU / Avg Check",
     "description": "SUM(amount WHERE completed) / COUNT(completed). Джерело: payments.amount",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "ARPU",
     "description": "Total PayIn / Success. Джерело: payments.amount",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "ARPU",
     "description": "Amount IN / Success. Джерело: payments.amount",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "turnover_gi",
   "name": {
    "en": "Turnover G-I",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "Amount IN + Settlement(додатний) + Amount OUT — сукупний рух коштів. Джерело: SUM(amount payin) + SUM(amount − fee) + SUM(ABS(amount payout)), completed. Приклад Finaxis: 168 244 736 + 156 230 292 + 0 = 324 475 028. Settlement береться за модулем (у колонці Settlement він зі знаком −)",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Оборот G-I"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Оборот G-I",
     "description": "Amount IN + Settlement(додатний) + Amount OUT — сукупний рух коштів. Джерело: SUM(amount payin) + SUM(amount − fee) + SUM(ABS(amount payout)), completed. Приклад Finaxis: 168 244 736 + 156 230 292 + 0 = 324 475 028. Settlement береться за модулем (у колонці Settlement він зі знаком −)",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "days_20plus",
   "name": {
    "en": "Days 20+",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "К-сть діб IST де COUNT(completed) ≥ 20. Джерело: payments агрегація (провайдер × день)",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Днів 20+"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Днів 20+",
     "description": "К-сть діб IST де COUNT(completed) ≥ 20. Джерело: payments агрегація (провайдер × день)",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "payin_requests",
   "name": {
    "en": "PayIn Requests",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "COUNT(*) payin-заявок. Джерело: payments · partner_pid",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Total Requests",
    "Requests"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Total Requests",
     "description": "COUNT(*) payin-заявок. Джерело: payments · partner_pid",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Requests",
     "description": "COUNT(*) payin для пари. Джерело: payments · partner_pid × провайдер(bank_account)",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "payin_success",
   "name": {
    "en": "PayIn Success",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "COUNT(completed) payin. Джерело: payments.status",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Success"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Success",
     "description": "COUNT(completed) payin. Джерело: payments.status",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Success",
     "description": "COUNT(completed). Джерело: payments.status",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "payin_reject",
   "name": {
    "en": "PayIn Reject",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "COUNT(rejected) payin. Джерело: payments.status",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Reject"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Reject",
     "description": "COUNT(rejected) payin. Джерело: payments.status",
     "pattern": "cols"
    },
    {
     "report": "trader-merchant-slu",
     "label": "Reject",
     "description": "COUNT(rejected). Джерело: payments.status",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "first_payers_pct",
   "name": {
    "en": "% First Payers",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "1 − % Second — частка нових платників (унікальні рахунки). Джерело: senderAccount = payments.counterparty_account. secondsend=1, якщо max(completed_count) по (мерч × рахунок) ≥ 3. За скриптом @la_grange_FC (SenderAccountPayinAggregate реалізовано в Hermes)",
   "formula": "",
   "unit": "",
   "synonyms": [
    "% First"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "% First",
     "description": "1 − % Second — частка нових платників (унікальні рахунки). Джерело: senderAccount = payments.counterparty_account. secondsend=1, якщо max(completed_count) по (мерч × рахунок) ≥ 3. За скриптом @la_grange_FC (SenderAccountPayinAggregate реалізовано в Hermes)",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "repeat_payers_pct",
   "name": {
    "en": "% Repeat Payers",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "distinct(рахунок з secondsend=1) / distinct(рахунок) у періоді. Джерело: payments.counterparty_account · secondsend = max(completed per partner) ≥ 3. per_sender/eligible_send за скриптом @la_grange_FC — пряма реалізація ops-борд-логіки в Hermes",
   "formula": "",
   "unit": "",
   "synonyms": [
    "% Second+"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "% Second+",
     "description": "distinct(рахунок з secondsend=1) / distinct(рахунок) у періоді. Джерело: payments.counterparty_account · secondsend = max(completed per partner) ≥ 3. per_sender/eligible_send за скриптом @la_grange_FC — пряма реалізація ops-борд-логіки в Hermes",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "avg_payout_day",
   "name": {
    "en": "Avg PayOut / Day",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "Total PayOut / календарних днів. Джерело: розрахунок",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Avg Daily PayOut"
   ],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "Avg Daily PayOut",
     "description": "Total PayOut / календарних днів. Джерело: розрахунок",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "payout_arpu",
   "name": {
    "en": "PayOut ARPU",
    "uk": "",
    "ru": ""
   },
   "group": "Мерчанти / шлюзи",
   "status": "needs_review",
   "canonical": false,
   "definition": "Total PayOut / COUNT(payout completed). Джерело: payments.amount",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-merchant-slu",
     "label": "PayOut ARPU",
     "description": "Total PayOut / COUNT(payout completed). Джерело: payments.amount",
     "pattern": "cols"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Merchant_SLU"
  },
  {
   "id": "churn_7d_pct",
   "name": {
    "en": "Churn 7D %",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "churned / active_last_week — знаменник = база минулого тижня.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Churn rate"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "Churn rate",
     "description": "churned / active_last_week — знаменник = база минулого тижня.",
     "pattern": "lg-item"
    },
    {
     "report": "trader-kpi",
     "label": "Churn 7D %",
     "description": "частка відтоку: Churn 7D / активних у попередньому періоді. Нормалізує відтік до розміру бази",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Churn 7D %",
     "description": "Частка відтоку: Churn 7D / кількість активних у попередньому періоді × 100 . Нормалізує відтік до розміру бази: абсолютний Churn 7D природно росте разом із базою трейдерів, тому +50% у штуках може означати незмінний або навіть нижчий ВІДСОТОК відтоку. Чисельник і знаменник — з одного universe (PayIn-спроби в payments, provider.type='p2p'). Зміна в таблиці — у процентних пунктах (pp). Зростання = погіршення (червоний).",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "reactivated",
   "name": {
    "en": "Reactivated",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Активний цього тижня, не активний минулого, але був активний раніше (повернувся).",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "churn",
     "label": "Reactivated",
     "description": "Активний цього тижня, не активний минулого, але був активний раніше (повернувся).",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "net_retention",
   "name": {
    "en": "Net Retention",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "New + Reactivated − Churned — чистий приріст активної бази за тиждень.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Net retention"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "Net retention",
     "description": "New + Reactivated − Churned — чистий приріст активної бази за тиждень.",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "run_rate",
   "name": {
    "en": "Run-rate",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Денна швидкість метрики = Σ(за останні 7 активних днів) / 7 . Нормалізує тих, хто активний не всі 7 днів.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Run-rate (Amount/7)"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "Run-rate (Amount/7)",
     "description": "Денна швидкість метрики = Σ(за останні 7 активних днів) / 7 . Нормалізує тих, хто активний не всі 7 днів.",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "payin_per_day",
   "name": {
    "en": "PayIn / Day",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Run-rate обігу payin. Джерело — transactions (operation=payin), INR .",
   "formula": "",
   "unit": "",
   "synonyms": [
    "PayIn / день (₹)"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "PayIn / день (₹)",
     "description": "Run-rate обігу payin. Джерело — transactions (operation=payin), INR .",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "payout_per_day",
   "name": {
    "en": "PayOut / Day",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Run-rate обігу payout ( abs(amount) ), INR .",
   "formula": "",
   "unit": "",
   "synonyms": [
    "PayOut / день (₹)"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "PayOut / день (₹)",
     "description": "Run-rate обігу payout ( abs(amount) ), INR .",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "settle_per_day",
   "name": {
    "en": "Settle / Day",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Run-rate сетлу. Джерело — settlements.amount_usdt , USDT .",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Settle / день ($)"
   ],
   "reports": [
    {
     "report": "churn",
     "label": "Settle / день ($)",
     "description": "Run-rate сетлу. Джерело — settlements.amount_usdt , USDT .",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Retention__Churn"
  },
  {
   "id": "upi_enabled",
   "name": {
    "en": "UPI Enabled",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "приймає payin",
   "formula": "",
   "unit": "",
   "synonyms": [
    "UPI увімкнені"
   ],
   "reports": [
    {
     "report": "trader-detailed",
     "label": "UPI увімкнені",
     "description": "приймає payin",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Detailed_Dashboard"
  },
  {
   "id": "max_payin_limit",
   "name": {
    "en": "Max PayIn Limit",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "макс. сума одного payin. Трейдер системно обмежений по великих payin.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Max Payin Amount Limit"
   ],
   "reports": [
    {
     "report": "trader-detailed",
     "label": "Max Payin Amount Limit",
     "description": "макс. сума одного payin. Трейдер системно обмежений по великих payin.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Detailed_Dashboard"
  },
  {
   "id": "recommended_traders_range",
   "name": {
    "en": "Recommended Traders (range)",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "скільки трейдерів-годин знадобиться у best/worst випадку (мінімальний/максимальний попит з 4 historical samples).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Діапазон"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Діапазон",
     "description": "скільки трейдерів-годин знадобиться у best/worst випадку (мінімальний/максимальний попит з 4 historical samples).",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "demand_multiplier",
   "name": {
    "en": "Demand Multiplier",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "у скільки разів виросте PayIn",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Demand multiplier"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Demand multiplier",
     "description": "у скільки разів виросте PayIn",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "cheque_multiplier",
   "name": {
    "en": "Cheque Multiplier",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "у скільки разів виросте чек",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Cheque per provider"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Cheque per provider",
     "description": "у скільки разів виросте чек",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "payin_realized_today",
   "name": {
    "en": "PayIn Realized Today",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сума фактичного PayIn у завершених годинах сьогодні (з Transaction).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Realized so far"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Realized so far",
     "description": "Сума фактичного PayIn у завершених годинах сьогодні (з Transaction).",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Realized so far",
     "description": "Сума фактичного PayIn у завершених годинах.",
     "pattern": "label-tip"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "payin_projected_remaining",
   "name": {
    "en": "PayIn Projected Remaining",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Прогноз PayIn на залишок дня = forecast_mean для current (часткова година) + future hours.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Projected remaining"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Projected remaining",
     "description": "Прогноз PayIn на залишок дня = forecast_mean для current (часткова година) + future hours.",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Projected remaining",
     "description": "Прогноз PayIn на залишок дня.",
     "pattern": "label-tip"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "payin_forecast_day",
   "name": {
    "en": "PayIn Forecast (day)",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Очікуваний підсумок дня = realized so far + projected remaining.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Total day (mean)",
    "Total forecast (mean)",
    "Sum Forecast Demand"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Total day (mean)",
     "description": "Очікуваний підсумок дня = realized so far + projected remaining.",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Total forecast (mean)",
     "description": "Сумарний прогнозований PayIn на 24 години завтра. Σ mean forecast по кожній годині (4 historical same-weekday samples, detrended).",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Total day (mean)",
     "description": "Очікуваний підсумок дня.",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Sum Forecast Demand",
     "description": "Сумарний прогнозований PayIn за 24 години.",
     "pattern": "label-tip"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "recommended_traders",
   "name": {
    "en": "Recommended Traders",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сума recommended за всі 24 години = Σ (demand × buffer / saturated). Past hours використовують факт, future — прогноз.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Sum Recommended (24h)",
    "Sum Recommended (mean)"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Sum Recommended (24h)",
     "description": "Сума recommended за всі 24 години = Σ (demand × buffer / saturated). Past hours використовують факт, future — прогноз.",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Sum Recommended (mean)",
     "description": "Сума рекомендованих трейдерів-годин на 24 години завтра = Σ (forecast × buffer / saturated). На вибраному P зі слайдера.",
     "pattern": "label-tip"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "recommended_traders_v2",
   "name": {
    "en": "Recommended Traders v2",
    "uk": "",
    "ru": ""
   },
   "group": "Прогноз (THC)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сума P50 forecast + actual past по 24 годинах сьогодні.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Sum Recommended v2 (24h)",
    "Sum Recommended v2"
   ],
   "reports": [
    {
     "report": "trader-hourly-calculator",
     "label": "Sum Recommended v2 (24h)",
     "description": "Сума P50 forecast + actual past по 24 годинах сьогодні.",
     "pattern": "label-tip"
    },
    {
     "report": "trader-hourly-calculator",
     "label": "Sum Recommended v2",
     "description": "Сума P50 forecast active count за 24 години завтра.",
     "pattern": "label-tip"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Hourly_Calculator"
  },
  {
   "id": "avg_active_traders",
   "name": {
    "en": "Avg Active Traders (daily)",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "середня кількість активних трейдерів на день",
   "formula": "",
   "unit": "",
   "synonyms": [
    "AVG Active Traders",
    "Сер. активні трейдери"
   ],
   "reports": [
    {
     "report": "trader-kpi",
     "label": "AVG Active Traders",
     "description": "середня кількість активних трейдерів на день",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Сер. активні трейдери",
     "description": "Среднее количество активных трейдеров в день. Сумма ежедневных уникальных трейдеров / количество дней. SQL-query ▾ SELECT AVG(day_traders) AS avg_active FROM ( SELECT dt, COUNT(DISTINCT pid) AS day_traders FROM vol_daily WHERE operation = 'payin' AND volume > 0 GROUP BY dt ) daily_active",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_KPI_Dashboard"
  },
  {
   "id": "vol_dep_ratio",
   "name": {
    "en": "Vol/Dep Ratio",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "(PayIn за день) / (депозит активних × 93)",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-kpi",
     "label": "Vol/Dep Ratio",
     "description": "(PayIn за день) / (депозит активних × 93)",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Vol/Dep Ratio",
     "description": "Коэффициент эффективности капитала. Дневной PayIn / (депозит × 93). SQL-query ▾ SELECT (SUM(payin_volume) / active_days) / (dep_active_traders * 93) AS vol_dep -- active_days: дни с payin > 0 -- dep_active_traders: cumulative_dep -- на LASTDATE для трейдеров -- активных в последний день периода",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_KPI_Dashboard"
  },
  {
   "id": "churn_formal",
   "name": {
    "en": "Churn Formal",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "присвоєно формальний статус відтоку (Archive/Scammer/Lost/60DaysLost) у цьому періоді",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-kpi",
     "label": "Churn Formal",
     "description": "присвоєно формальний статус відтоку (Archive/Scammer/Lost/60DaysLost) у цьому періоді",
     "pattern": "title"
    },
    {
     "report": "trader-kpi",
     "label": "Churn Formal",
     "description": "Кількість трейдерів, чий статус на кінець періоду — термінальний ( Archive, Scammer, Lost, 60DaysLost ), а на кінець попереднього періоду був робочим (методологія E — «дельта станів на межах періодів», зафіксована 2026-08-21). Стани відновлюються з журналу змін статусів account_provider_events . Чому журнал, а не снепшот: стара логіка читала поточний статус і status_updated_at — при переведенні lost → archive подія «переїжджала» на нову дату і статус, історія переписувалась заднім числом, а реанімовані трейдери зникали з минулих періодів. За журналом минулі значення метрики більше не змінюються. Властивості: та сама модель «порівняння двох фотографій», що і в Churn 7D; клацання статусами всередині періоду (адмін-флапінг) невидимі; трейдер, реактивований і згодом знову втрачений, чесно рахується вдруге; переходи «термінальний → термінальний» подіями не є. Статус у розкладці = статус на кінець періоду. Тільки реальні трейдери — лише ті, хто колись мав спробу PayIn у payments в межах universe provider.type='p2p' (без Operation provider / %QA_Test%). Audit виключено — тимчасовий робочий статус.",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_KPI_Dashboard"
  },
  {
   "id": "churn_formal_pct",
   "name": {
    "en": "Churn Formal %",
    "uk": "",
    "ru": ""
   },
   "group": "Відтік",
   "status": "needs_review",
   "canonical": false,
   "definition": "Частка формального відтоку: Churn Formal / кількість активних трейдерів у попередньому періоді × 100 . Знаменник той самий, що у Churn 7D % (активні = ≥1 спроба PayIn за попередній період) — обидві частки порівнянні між собою. При базі, що росте, абсолютний Churn Formal зростає механічно; відсоток показує реальну інтенсивність відтоку.",
   "formula": "",
   "unit": "",
   "synonyms": [],
   "reports": [
    {
     "report": "trader-kpi",
     "label": "Churn Formal %",
     "description": "Частка формального відтоку: Churn Formal / кількість активних трейдерів у попередньому періоді × 100 . Знаменник той самий, що у Churn 7D % (активні = ≥1 спроба PayIn за попередній період) — обидві частки порівнянні між собою. При базі, що росте, абсолютний Churn Formal зростає механічно; відсоток показує реальну інтенсивність відтоку.",
     "pattern": "lg-item"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_KPI_Dashboard"
  },
  {
   "id": "payout_pending_count",
   "name": {
    "en": "PayOut Pending #",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Количество payout-заявок в статусе pending в момент HH:mm. ГЛОБАЛЬНАЯ метрика — pending payout не имеет accountProvider, поэтому фильтры по трейдеру не применяются. Учитывается только Pmt Method.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Out Pending #"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Out Pending #",
     "description": "Количество payout-заявок в статусе pending в момент HH:mm. ГЛОБАЛЬНАЯ метрика — pending payout не имеет accountProvider, поэтому фильтры по трейдеру не применяются. Учитывается только Pmt Method.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "payout_pending_amount",
   "name": {
    "en": "PayOut Pending ₹",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сумма payoutAmount payout-заявок в статусе pending в момент HH:mm. Учитывается только Pmt Method.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Out Pending ₹"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Out Pending ₹",
     "description": "Сумма payoutAmount payout-заявок в статусе pending в момент HH:mm. Учитывается только Pmt Method.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "payin_unassigned_count",
   "name": {
    "en": "Unassigned PayIn #",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Количество ClientPayin созданных в этом получасе с bankAccount IS NULL — заявки не получившие счёт. Учитывается ТОЛЬКО фильтр Pmt Method.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Unassigned (#)"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Unassigned (#)",
     "description": "Количество ClientPayin созданных в этом получасе с bankAccount IS NULL — заявки не получившие счёт. Учитывается ТОЛЬКО фильтр Pmt Method.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "payin_unassigned_amount",
   "name": {
    "en": "Unassigned PayIn ₹",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сумма ClientPayin созданных в этом получасе с bankAccount IS NULL. Учитывается ТОЛЬКО фильтр Pmt Method.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Unassigned (₹)"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Unassigned (₹)",
     "description": "Сумма ClientPayin созданных в этом получасе с bankAccount IS NULL. Учитывается ТОЛЬКО фильтр Pmt Method.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "traders_on_shift_plan",
   "name": {
    "en": "Traders on Shift (plan)",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "кількість трейдерів формально на зміні у цю годину (з AccountProvider.workingHoursFrom..To). Сирий розклад без врахування фактичної явки.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Plan (traders)"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Plan (traders)",
     "description": "кількість трейдерів формально на зміні у цю годину (з AccountProvider.workingHoursFrom..To). Сирий розклад без врахування фактичної явки.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "avg_accounts_per_trader_hour",
   "name": {
    "en": "Avg Accounts / Trader / Hour",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "середня кількість bank-account-ів задіяних на одного активного трейдера в цю годину.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Avg accounts/hr"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Avg accounts/hr",
     "description": "середня кількість bank-account-ів задіяних на одного активного трейдера в цю годину.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "status_general",
   "name": {
    "en": "Status General",
    "uk": "",
    "ru": ""
   },
   "group": "Операційні (Hourly)",
   "status": "needs_review",
   "canonical": false,
   "definition": "глобальний стан ВСІХ P2P трейдерів за цю годину, незалежно від фільтра. DEFICIT = система в цілому недоукомплектована (навіть якщо твоя команда у нормі). Розраховано з Trader Hourly Calculator v1.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Status General (v1)"
   ],
   "reports": [
    {
     "report": "trader-operational",
     "label": "Status General (v1)",
     "description": "глобальний стан ВСІХ P2P трейдерів за цю годину, незалежно від фільтра. DEFICIT = система в цілому недоукомплектована (навіть якщо твоя команда у нормі). Розраховано з Trader Hourly Calculator v1.",
     "pattern": "title"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Trader_Operational_Dashboard"
  },
  {
   "id": "n_transactions",
   "name": {
    "en": "N Transactions",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "Количество транзакций для расчета медианы/среднего.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "N transactions"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "N transactions",
     "description": "Количество транзакций для расчета медианы/среднего.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "tier_count",
   "name": {
    "en": "Tier: Count",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "Кількість трейдерів у даному Tier за поточний період.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Tier — Count"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Tier — Count",
     "description": "Кількість трейдерів у даному Tier за поточний період.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "tier_volume",
   "name": {
    "en": "Tier: Volume",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "Сумарний Volume (PayIn) трейдерів цього Tier за поточний період.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Tier — Volume, INR"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Tier — Volume, INR",
     "description": "Сумарний Volume (PayIn) трейдерів цього Tier за поточний період.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "velocity_in",
   "name": {
    "en": "Velocity IN",
    "uk": "",
    "ru": ""
   },
   "group": "Скоринг",
   "status": "needs_review",
   "canonical": false,
   "definition": "Velocity IN — медіана часу між послідовними успішними PayIn (хвилини). P95-trimmed (найповільніші 5% виключені).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Velo IN"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Velo IN",
     "description": "Velocity IN — медіана часу між послідовними успішними PayIn (хвилини). P95-trimmed (найповільніші 5% виключені).",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "velocity_out",
   "name": {
    "en": "Velocity OUT",
    "uk": "",
    "ru": ""
   },
   "group": "Скоринг",
   "status": "needs_review",
   "canonical": false,
   "definition": "Velocity OUT — медіана часу між послідовними успішними PayOut (хвилини). P95-trimmed.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Velo OUT"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Velo OUT",
     "description": "Velocity OUT — медіана часу між послідовними успішними PayOut (хвилини). P95-trimmed.",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "last_payin_date",
   "name": {
    "en": "Last PayIn",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "Дата останнього успішного PayIn провайдера (з усієї історії, не лише в межах періоду).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Last payin"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Last payin",
     "description": "Дата останнього успішного PayIn провайдера (з усієї історії, не лише в межах періоду).",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "days_since_payin",
   "name": {
    "en": "Days Since PayIn",
    "uk": "",
    "ru": ""
   },
   "group": "Прочее",
   "status": "needs_review",
   "canonical": false,
   "definition": "Кількість днів від останнього payin до сьогодні (IST).",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Days since"
   ],
   "reports": [
    {
     "report": "trader-weekly",
     "label": "Days since",
     "description": "Кількість днів від останнього payin до сьогодні (IST).",
     "pattern": "dict"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Weekly_KPI_Dashboard"
  },
  {
   "id": "affiliates_total",
   "name": {
    "en": "Affiliates Total",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "COUNT DISTINCT affiliate name з prefix mapping (affiliate_map.py) — тестовано в affiliate-pc.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Всього афіліатів"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Всього афіліатів",
     "description": "COUNT DISTINCT affiliate name з prefix mapping (affiliate_map.py) — тестовано в affiliate-pc.",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "new_affiliates",
   "name": {
    "en": "New Affiliates",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "Немає таблиці \"affiliate signed at\" у Hermes. Треба підключити CRM або створити таблицю affiliate_onboarding. [❌ Уточнити джерело.]",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Нових афіліатів MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Нових афіліатів MTD",
     "description": "Немає таблиці \"affiliate signed at\" у Hermes. Треба підключити CRM або створити таблицю affiliate_onboarding. [❌ Уточнити джерело.]",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  },
  {
   "id": "launched_affiliates",
   "name": {
    "en": "Launched Affiliates",
    "uk": "",
    "ru": ""
   },
   "group": "Афіліати",
   "status": "needs_review",
   "canonical": false,
   "definition": "Залежить від \"нових афіліатів MTD\" + \"1й трейдер ≤7д від handoff\" — handoff date невідомий, треба CRM.",
   "formula": "",
   "unit": "",
   "synonyms": [
    "Запущено афіліатів MTD"
   ],
   "reports": [
    {
     "report": "trader-affiliate",
     "label": "Запущено афіліатів MTD",
     "description": "Залежить від \"нових афіліатів MTD\" + \"1й трейдер ≤7д від handoff\" — handoff date невідомий, треба CRM.",
     "pattern": "coverage-legend"
    }
   ],
   "deviations": [],
   "notes": [],
   "owner": null,
   "verified_by": null,
   "updated_at": "2026-09-21",
   "source": "описание в коде Affiliate_Dashboard"
  }
 ],
 "legend_notes": {
  "trader-affiliate": [
   {
    "label": "Трейдер",
    "text": "Ім\\'я провайдера (AccountProvider) у платіжній системі.",
    "pattern": "cols"
   },
   {
    "label": "Менеджер",
    "text": "Афф-менеджер з реєстру афіліатів (Google-таблиця). Рядок «Не заведено в CRM» — афіліати, яких у реєстрі немає взагалі. Це та сама група, яку Affiliate Weekly і Tier називають «— Без менеджера»: набір один, підпис на цьому борді інший (рішення замовника 2026-09-04).",
    "pattern": "cols"
   },
   {
    "label": "Active / Risk / Dormant breakdown",
    "text": "Active = PayIn>0 за 7д. Risk = signals score>=51. Dormant = 14д без відповіді. [⚠ Логіка статусу афіліата ще не зафіксована — треба уточнити з менеджментом.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "PayIn / PayOut / Settlement per Tier",
    "text": "Розрахунок прямий — SUM по афіліатах кожного tier. [⚠ Чекає визначення правила tier афіліата.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Avg Score per Tier",
    "text": "Avg trader score per tier — формула прозора, але tier афіліата залежить від п.вище.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Гістограма Tier × метрика",
    "text": "Дані з попередніх рядків. Графік готовий, чекає правил.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Топ-5 по PayIn MTD",
    "text": "ORDER BY PayIn DESC LIMIT 5 — тривіально.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Сумарні KPI зверху (6 карток)",
    "text": "Все агреговано з афіліатів. [⚠ Залежить від визначення статусів і churn.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Активність трейдерів (3 картки)",
    "text": "Нові каб./Запущено/Реактивовано — частково готово. [⚠ Реактивовано (трейдер після 30+ днів без PayIn повернувся) — не реалізовано, треба SQL з window function.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Таблиця афіліатів (12 колонок)",
    "text": "Колонки Назва/Tier/Статус/Трейдерів/Score/PayIn/PayOut/Settlement/Churn/Нових/Запущ./Реакт. Колонку Менеджер прибрано (2026-06-23). [⚠ Все залежить від визначень вище.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Control KPIs: CRM/Ownership/Freshness",
    "text": "Метрики CRM-якості (% заповнених карток, % з прив'язаним owner, % з контактом ≤7д). Джерела даних — CRM, який не підключено. [❌ Уточнити чи буде Hermes мати ці поля, чи окрема CRM-БД.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Менеджер кожного афіліата",
    "text": "Зараз manager беремо з provider_groups (Hermes). [❓ Уточнити: це правильна одиниця \"affiliate manager\" чи треба окрему модель?]",
    "pattern": "coverage-legend"
   },
   {
    "label": "PayIn / PayOut / Settlement тренди (6 графіків)",
    "text": "Тижневі агрегати — ch.fetch_weekly_dynamics готовий. [✓ Settlement потребує уточнення формули.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Кількість трейдерів за тиждень",
    "text": "COUNT DISTINCT trader_id з активністю в кожен тиждень.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Фільтр афіліата для тренду",
    "text": "UI готовий, передає aff_id в SQL.",
    "pattern": "coverage-legend"
   },
   {
    "label": "KPI: ліди / first contacts / qualified / handoffs",
    "text": "Воронка залучення — потрібна CRM-інтеграція. Зараз немає таблиці leads. [❌ Уточнити джерело (Bitrix? власна БД?).]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Воронка 8 стадій",
    "text": "Стадії: Ліди → First Contact → Відповів → Qualified → Offer → Negotiating → Handoff → 1й трейдер. [❌ Уточнити точні визначення кожного переходу + датасет.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Тижнева матриця результативності",
    "text": "Залежить від воронки. [❌ Уточнити метрики (CR на кожному кроці, avg днів до handoff).]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Channel Attribution",
    "text": "Звідки приходить лід (Telegram/Referral/Форуми/Cold). [❌ Треба поле channel у CRM.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Win/Loss причини",
    "text": "Категоризація відмов. [❌ Треба структуроване поле у CRM.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Фільтр Manager (multi-select)",
    "text": "Cb-drop pattern як в інших звітах. Дані з provider_groups через aff prefix mapping.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Фільтр Affiliate (multi-select)",
    "text": "Cb-drop. Дані з affiliate_map.AFFILIATE_PREFIXES.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Фільтр Tier (multi-select)",
    "text": "UI готовий. [⚠ Залежить від правил tier афіліата.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Фільтр Status (multi-select)",
    "text": "UI готовий. [⚠ Залежить від правил статусу афіліата.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Період From → To (date range)",
    "text": "Як на Weekly KPI / Trader Operational — input type=date, default MTD start → today (IST). Передається date_from/date_to в API.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Login redirect + JWT cookie",
    "text": "Уже працює для всіх інших звітів — підключаємо той самий хендлер.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Audit log (page_view + filters)",
    "text": "log_audit() викликається в /trader-affiliate.",
    "pattern": "coverage-legend"
   },
   {
    "label": "Permissions per user (allowed_affiliates, managers)",
    "text": "Той самий механізм — get_user_permissions. [✓ Треба додати \"trader-affiliate\" у REPORT_LABELS і дати дозвіл потрібним користувачам у /admin.]",
    "pattern": "coverage-legend"
   },
   {
    "label": "Top-nav з іншими звітами",
    "text": "/api/me?report=trader-affiliate повертає reports list — UI підвантажує.",
    "pattern": "coverage-legend"
   }
  ],
  "trader-affiliate-tier": [
   {
    "label": "Афіліат",
    "text": "Назва афіліата (single-attribution)",
    "pattern": "cols"
   },
   {
    "label": "Менеджер",
    "text": "Менеджер з API Андрія (reports.halleg) — єдине джерело для всіх звітів",
    "pattern": "cols"
   },
   {
    "label": "Напрям",
    "text": "▲/▬/▼ — прогноз run-rate + Δ міс-до-міс + WoW. New: внутрішньомісячна динаміка; «—» якщо даних замало",
    "pattern": "cols"
   },
   {
    "label": "Причина",
    "text": "Найбільший драйвер зміни Score vs минулий місяць (▲/▼ PayIn / Трейдери / Avg Score). Блокер перекриває.",
    "pattern": "cols"
   },
   {
    "label": "Scale★",
    "text": "50-99→+5 100-149→+8 150+→+10",
    "pattern": "cols"
   },
   {
    "label": "Прогноз",
    "text": "Score/Tier. Для New — прогнозний тир за поточним Score («71 → Tier B»)",
    "pattern": "cols"
   },
   {
    "label": "Днів до клас.",
    "text": "Для New: зворотний відлік до класифікації (з 30 днів)",
    "pattern": "cols"
   },
   {
    "label": "Потенціал↑",
    "text": "Балів до наступного тиру",
    "pattern": "cols"
   },
   {
    "label": "Ризик↓",
    "text": "Запас балів до нижнього тиру",
    "pattern": "cols"
   },
   {
    "label": "Стан",
    "text": "Блокери та lifecycle",
    "pattern": "cols"
   }
  ],
  "churn": [
   {
    "label": "Базові поняття",
    "text": "Трейдер = AccountProvider (провайдер), атрибуція через bank_accounts.provider_pid . «Активний у вікні W» = є ≥1 payin -запис будь-якого статусу (факт спроби, не лише успіх) — саме так рахує Power BI. Вікна — півінтервали [start, end) від «сьогодні» (або дати To ): This [t−7,t) , Last [t−14,t−7) . Сьогодні (t) — відкритий край (snapshot). Affiliate — за префіксом імені трейдера ( G[P2P]→Griffin ), та сама схема, що в Trader Operational / Weekly KPI / PBI. Manager = provider_groups.name . Виключено службовий Operation provider .",
    "pattern": "lg-item"
   },
   {
    "label": "Фільтри",
    "text": "Affiliate / Manager / Status / Group / Type / Trader — мультивибір, як у Weekly KPI; перераховують усі вкладки. Type=P2P за замовчуванням. From–To : To = дата «станом на» (snapshot churn на цю дату), From розширює діапазон динаміки. Update — примусове оновлення з бази. Скинути фільтр (кнопка в кожному дропдауні) очищає лише його; Reset — усі фільтри до дефолту (P2P, сьогодні).",
    "pattern": "lg-item"
   },
   {
    "label": "WoW (Δ) — чип динаміки",
    "text": "У матрицях (статуси, втрати) під числом — зміна тиждень-до-тижня: ▲ зелена = ріст, ▼ червона = спад vs попередній тиждень. Для лічильників — у % , для churn rate — у pp (процентних пунктах).",
    "pattern": "lg-item"
   },
   {
    "label": "Churn у динаміці",
    "text": "Потижневий перерахунок churn-event по ковзному вікну 7 календарних днів (графік: rate % + к-сть churned).",
    "pattern": "lg-item"
   },
   {
    "label": "Матриця статус × тиждень",
    "text": "Поточний providers.status churned-трейдерів по тижнях (active / paused / scammer / lost…). Клітинка = к-сть + WoW Δ% . Перемикач Кількість / % : «%» = частка статусу від churned тижня. Показує, яка частина «відтоку» — не реальна втрата.",
    "pattern": "lg-item"
   },
   {
    "label": "Неактивні трейдери (Statistics)",
    "text": "Список тих, хто churned станом на вибрану дату за поточним типом churn (7d / 14 / Formal — перемикач нижче): менеджер · трейдер · афіліат · статус · останній PayIn · днів мовчить . Кількість рядків = останній стовпець графіка «Churn в динаміці» (той самий розрахунок). Formal — методологія E: трейдери, чий статус на кінець поточного періоду термінальний (archive/scammer/lost/60DaysLost, audit виключено), а на кінець попереднього був робочим; стани відновлено з журналу змін статусів, тому минулі періоди не переписуються; рахуються лише трейдери, що колись мали PayIn. Клік на рядок — матриця активності по тижнях. Детальна матриця втрат — у вкладці Losses .",
    "pattern": "lg-item"
   },
   {
    "label": "Losses — когорта",
    "text": "Трейдери, що за минулий тиждень перетекли з active у не-active (= churned-this-week). «Скільки недобираємо через відтік».",
    "pattern": "lg-item"
   },
   {
    "label": "Тижнева / місячна проєкція",
    "text": "Cohort-total денний = Σ run-rate усіх трейдерів когорти. Проєкція: ×7 (тиждень) / ×30.44 (місяць, серед. днів/міс). Валова (gross) оцінка до реактивації — реальна (net) втрата нижча на величину false-churn; для фінзвіту брати confirmed-поріг. Deposit — стан, не проєктується.",
    "pattern": "lg-item"
   },
   {
    "label": "Матриця втрат × тижні",
    "text": "Рядок = трейдер, колонки = 8 тижнів, клітинка = метрика за тиждень + WoW Δ% . Рядок «Разом» — сума по когорті за кожен тиждень. Перемикач PayIn / PayOut / Settle.",
    "pattern": "lg-item"
   },
   {
    "label": "Reactivation — неактивні трейдери",
    "text": "Список нетермінальних трейдерів (мали PayIn за ~2 міс), відсортований за днями мовчання = днів від останньої PayIn- спроби ( payments , будь-який статус — як у Power BI). Повзунок «Вікно неактивності» 3–15 днів задає поріг N — показуються трейдери з днів мовчить ≥ N . Клік на рядок — матриця активності по тижнях (гроші з transactions ) + остання спроба PayIn. Чипи статусу фільтрують список.",
    "pattern": "lg-item"
   },
   {
    "label": "Джерело даних / паритет",
    "text": "ClickHouse hermes (readonly, CDC). Churn-membership = payin- спроби (як PBI); гроші (Losses/Reactivation) = фактичний обіг (success). Звіряється з Power BI-еталоном. Дедуплікація довідників через FINAL .",
    "pattern": "lg-item"
   }
  ],
  "trader-detailed": [
   {
    "label": "Остання РУЧНА зміна Payout access",
    "text": "хто з команди (логін) і коли (IST). Джерело: supportzones «Logs → Show logs» (hermes.account_provider_events, field_changed=payoutAccess). Історія ведеться з 31.01.2026 — глибше даних не існує. «—» = ручних змін не було.",
    "pattern": "title"
   },
   {
    "label": "Остання БУДЬ-ЯКА зміна Payout access",
    "text": "включно з автоматичними: hook при зміні статусу, cron, system. Показує актора і час IST. «—» = змін не було.",
    "pattern": "title"
   },
   {
    "label": "Трейдери (верхняя таблиця)",
    "text": "1 рядок = 1 трейдер (агрегат по всіх його UPI). Клік по рядку → модалка з його UPI (з window toggle 1ч/24ч/7д). Trader / Manager + status-бейдж — біля імені показується бейдж лише для 3 статусів providers.status : suspicious / restricted (червоні), locked (жовтий). active та решта (audit/paused/…) — без бейджа . Restricted = усі status='restricted' (будь-яка причина, вкл. балансову), як у settings-provider. Це збігається зі sticky-блоком і supportzones. «Запрет на IN» (restrict_toggle) як бейдж прибрано — операційний налив видно в колонках Налив / Вкл.payin. Зміна — 🟢 зараз на зміні, 🔘 поза зміною. Робочі години — з providers.working_hours_from/to в IST. Логіка: пуста from/to → 24/7; from to → нічна зміна (≥from OR Вкл. payin (П.11) — перше справжнє включення будь-якого UPI трейдера за обрану дату ( bank_account_events.forClientPayin=true , IST). «—» якщо не включався в цю дату. Червоним ⚠ — запізнення відносно початку зміни. Налив — кількість UPI в наливі / усього UPI у трейдера. Balance / Limit — як у supportzones Account Providers . Balance = операційний баланс трейдера = canonical earnings_balance (Σ INR-транзакцій по його рахунках − Σ balance_movements провайдера; той самий, що в Capacity). Limit = providers.custom_limit_to_warn_about_overflow (ліміт переповнення; для трейдерів без кастом-ліміту — депозит INR як fallback, позначка ~ ). Приклад: Agent Team 230k / 600k. НЕ provider_balance і НЕ Σ account_balance_limit (старе значення давало 14.6M / 46.8млрд). % Ліміт — Balance / Limit (як supportzones, напр. 38.2%). Sub — депозит INR. Може бути від'ємним, якщо операційний баланс CR — success/total payins сьогодні. %Auto In = payin без ручної правки саппорту ( edited_by_support=0 ) / success. %Auto Out = payout, апрувнутий системою по SMS-push без перевірки антискам-відділом ( payments.checking_by = '1f122b62-3961-66aa-9d47-b390dada47a9' — UUID системного чекера SMS-push) / усі success payout. На рівні трейдера. ARPU (П.6) — середній чек payout = Σ payout success ₹ / кількість success payout за день. Сер. час — медіана часу payout у руках трейдера (processing→completed) з payment_status_history (поле time_to_complete_payout зламане в CH = const 60). PayIn ₹ — Σ успішних payin сьогодні. Аномалія (П.9): у нормі — В наливе (UPI увімкнені, приймає payin). Аномалії: OFF/SHIFT — на зміні але всі UPI вимкнені; OFF-HOURS — UPI в наливі поза зміною. Тумблер Тільки аномалії змін залишає тільки аномалії. Сортування за замовч. (П.8) — проблемні статуси (suspicious / restricted / locked / scammer) угорі, вторинно — за обсягом payin. Клік по заголовку — звичайне сортування.",
    "pattern": "lg-item"
   },
   {
    "label": "Модалка Trader UPIs (по кліку)",
    "text": "Список усіх UPI цього трейдера з вікнами CR/Auto: 1 час · 24 часа · 7 дней (rolling від now() ). UPI в наливі — підсвічений зеленою рамкою. UPI-номер з 📋 — клік копіює у clipboard (toast \"Скопійовано\"). Pending — payin зі статусом pending зараз для цього UPI (count · ₹). Клік по рядку UPI → drill-down з усіма payins за вибрану дату (Settings → Date).",
    "pattern": "lg-item"
   },
   {
    "label": "Тимлід фільтр",
    "text": "Каркас з 4 опціями (All / Олег / Никита / Ваня). Маппінг тимлід→менеджери ще не налаштований у backend — фільтр поки тільки додає &teamlead= у запит, що ігнорується. Після уточнення маппінгу — заробить без правок UI.",
    "pattern": "lg-item"
   },
   {
    "label": "Trader Accounts (old)",
    "text": "Трейдер / Менеджер — ім'я трейдера + manager. Поряд з ім'ям — статус-pill: active (зелений), suspicious/paused/audit (жовтий), locked/restricted/scammer (червоний), інші (сірий). Джерело — providers.status . Налив — счёт принимает payin прямо сейчас : for_client_payin=1 AND is_paused=0 AND work_state='work' . Если нет — pill показывает реальный статус (OFF / PAUSED / BLOCK / ARCHIVE). Баланс / Ліміт — account_balance и account_balance_limit из bank_accounts. Прогресс-бар показывает % заполнения; зелёный 80%. depo X · Y% (под Balance / Cap) — страховой депозит трейдера в INR и % его provider_balance относительно депозита . Формула: deposit_inr = bank_accounts.account_balance (USDT по providers.deposit_bank_account_pid) × exchange_rates.rate (live, rate_type='account_provider', operation='BUY') ; %бал = providers.provider_balance / deposit_inr . Если depo=0 → \"—\" (deposit_bank_account_pid не задан или баланс депо нулевой). Значение >100% — баланс уже превышает весь депозит (тревога). Free Balance ₹ = cap − balance. Сколько ещё влезет на сам счёт до стелі. Today In / Daily Cap — daily_incoming_trx_amount и incoming_amount_limit_day . Прогрес-бар поряд показує заповнення дневного ліміту. CR today — success / total payins сегодня (по этому счёту). % Авто In = success AND edited_by_support=0 / success для PayIn (по этому счёту). Высокий = саппорт почти не правил руками. % Авто Out = success AND edited_by_support=0 / success для PayOut. На уровне трейдера (payout-заявка не привязана к bank_account), одно значение на все строки одного трейдера. Avg ticket — средний чек успешного payin за сегодня. Hist CR — last_transactions_conversion — конверсия по последним N транзакциям (готовая метрика из bank_accounts). Risk — индикатор риска вылета. См. блок ниже.",
    "pattern": "lg-item"
   },
   {
    "label": "Фильтры",
    "text": "Affiliate / Manager / Status / Group / Trader / Bank Account / Date — стандартные срезы. Тільки в наливі — тумблер. При включении остаются только счета с for_client_payin=1 AND is_paused=0 AND work_state='work' на момент запроса. KPI пересчитываются в этом scope.",
    "pattern": "lg-item"
   },
   {
    "label": "⚠ Sticky-блок Suspicious / Restricted / Locked (П.2)",
    "text": "Закріплена панель угорі — завжди видима . Показує трейдерів у статусах suspicious / restricted / locked / scammer у межах поточного фільтра. Рамка червоніє, коли такі є. Клік по чипу → UPI цього трейдера. Рядки таких трейдерів у таблиці підсвічені (red/yellow). Звірка очима — supportzones. Джерело статусу — CH-репліка providers.status . Можливий незначний дрейф від prod (supportzones); якщо критично — синхронізацію CH прискорити або перейти на prod-PG.",
    "pattern": "lg-item"
   },
   {
    "label": "Нові метрики верхньої панелі",
    "text": "Capacity P2P · сейчас (П.7) — вільна ємність приймання payin INR по всьому P2P у моменті, 1:1 CH-репліка lab liquidity-management → daily.capacity_aggr (фінансова специфікація). Не залежить від фільтрів групи/статусу. Per trader: Threshold = depo_usdt × FX_mid × (max_fill/100) × (1+fee/100) ; Balance = earnings_balance (CH: Σ транзакцій INR − Σ balance_movements провайдера); Capacity = MIN(ba_remaining, MAX(Threshold − Balance, 0)) . Картка: Σcapacity + fill % (Σbalance/Σthreshold) + к-ть трейдерів. Дрібні розбіжності з lab — лаг CDC-реплікації. Balance 100k+ ₹ (П.12) — трейдери з op_balance ≥ 100 000 INR (операційний баланс = supportzones = earnings_balance, не provider_balance). У поточному статус-фільтрі. Значення = Σ op_balance / кількість таких трейдерів; sub — скільки їх і Σ. 1П / 2П / 3П (П.10) — 1П = на зміні зараз (по working_hours, мають працювати); 2П = з них реально в наливі (on_shift AND in_naliv); 3П = в наливі взагалі (незалежно від зміни). Приклад: 1П-10 / 2П-5 / 3П-8 (8 = 5 у свою зміну + 3 поза зміною). ARPU payout (П.6) = Σ payout success ₹ / кількість success payout. AVG Trader Time = медіана часу payout (processing→completed) з payment_status_history по active P2P.",
    "pattern": "lg-item"
   },
   {
    "label": "Live Processing",
    "text": "PayOut-ы в статусе processing — назначены трейдеру, ждут завершения. Группировка по трейдерам : одна строка = один трейдер с несколькими висящими payout-ами. # — сколько payout-ов сейчас \"в руках\" этого трейдера. Σ Сума ₹ — суммарная сумма этих payout-ов. Найдовше очікування = max(now()−assigned_at) среди его payout-ов. Жёлтый >10м, красный >30м. Сортировка по умолчанию — Oldest wait DESC: вверху самый \"горящий\" трейдер. Сер. швидкість = медиана времени выполнения payout (processing→completed из payment_status_history ) за сегодня. Сравнение «как обычно платит» vs «сколько висит сейчас» — триггер пойти и поговорить с трейдером. Клик по строке → раскрывается список конкретных транзакций (method · amount · assigned · created · wait · source_id). В шапке секции — общий пульс: сколько трейдеров платят, Σ ₹, самый старый wait, общий avg speed по всем.",
    "pattern": "lg-item"
   },
   {
    "label": "KPI Row",
    "text": "PayIn ₹ — успешные payins за день (сумма + req/ok/%Auto). CR — success / total payins. PayOut ₹ — успешные payouts за день + %Auto Out. ARPU payout + AVG Trader Time — см. блок «Нові метрики». Processing #/₹ — сколько сейчас \"в руках\" трейдера (+ avg wait с момента назначения). Settle ₹ — settlement за день (expenses code='settlement'). Capacity P2P · сейчас , Balance 100k+ , 1П / 2П / 3П — см. блок «Нові метрики верхньої панелі».",
    "pattern": "lg-item"
   }
  ],
  "trader-kpi": [
   {
    "label": "Вкладка Weekly",
    "text": "KPI-карточки — 12 метрик за текущую неделю с сравнением с предыдущей (% изменения). Churn-карточки показывают абсолют и % долю вместе: Churn 7D · Churn 7D %, Churn Formal · Churn Formal %. Графики — Active Traders Unique & PayIn Volume (комбо), AVG Active Traders, New Traders, Settle % & Deposit, Vol/Dep Ratio, Churn 7D & Churn Formal. Прогноз — на последнем баре пунктирный блок показывает прогноз до конца периода (Hourly Profile Scaling). Tooltip: Fact + Forecast = Total. Таблица — понедельное сравнение всех метрик с % изменения, включая Churn 7D и Churn Formal.",
    "pattern": "lg-item"
   },
   {
    "label": "Вкладка Daily",
    "text": "Аналогично Weekly, но в разрезе дней. Последние 30 дней с графиками, прогнозом и таблицей Day-over-Day.",
    "pattern": "lg-item"
   },
   {
    "label": "Вкладка Monthly",
    "text": "Аналогично Weekly, но в разрезе месяцев. Прогноз до конца текущего месяца.",
    "pattern": "lg-item"
   },
   {
    "label": "Фильтры",
    "text": "Affiliate / Manager / Payment Method / Status / Group / Trader — все графики и таблицы пересчитываются при изменении. Group = P2P — по умолчанию. Оновити — принудительное обновление из базы (очистка кеша). Скинути — сброс всех фильтров.",
    "pattern": "lg-item"
   },
   {
    "label": "Прогнозирование (Forecast)",
    "text": "Метод: Hourly Profile Scaling. Берутся последние 4 недели того же дня недели, строится профиль почасового накопления. Текущий факт / % прошедшего времени = прогноз. SQL-query ▾ -- Профиль по часам (тот же день недели) SELECT hr, SUM(vol) OVER (ORDER BY hr) / SUM(vol) OVER () AS cum_pct FROM ( SELECT EXTRACT(hour FROM ...) AS hr, SUM(tran.amount) AS vol FROM \"Transaction\" tran WHERE EXTRACT(isodow FROM ...) = EXTRACT(isodow FROM now()) AND ... >= now() - '28 days' GROUP BY 1 ) -- Прогноз = actual / cum_pct",
    "pattern": "lg-item"
   },
   {
    "label": "Matrix (внизу кожної вкладки)",
    "text": "Розбивка однієї метрики по вимірах: рядки — Affiliate / Manager / Trader (перемикач), колонки — періоди вкладки (тижні / дні / місяці). Кнопки метрик: Volume, Traders, AVG Tr, AVG/Tr, Deposit, Settle%, V/D, New, Churn 7D, Churn Fm. Рядок Total рахується з сирих компонентів (для ratio-метрик — не сумою клітинок). Для виміру Trader показуються топ-200 рядків за сумою. Фільтри й діапазон дат застосовуються. CSV — повні числа без скорочень.",
    "pattern": "lg-item"
   },
   {
    "label": "Тип периода",
    "text": "Daily: сегодня vs вчера. Weekly: ISO Пн-Вс vs предыдущая. Monthly: месяц vs предыдущий.",
    "pattern": "lg-item"
   },
   {
    "label": "Источник данных",
    "text": "PostgreSQL (DigitalOcean). SQL идентичен Power BI Trader_Detailed M-query. Грейн: Provider × Day. IST (UTC+5:30). Кеш: 1 час, авто-обновление 30 мин.",
    "pattern": "lg-item"
   },
   {
    "label": "Статуси трейдерів — Active / Paused / Restricted / Suspicious",
    "text": "Active — трейдер повністю активний, може робити PayIn і PayOut. Paused — виставляється автоматично якщо трейдер не користується кабінетом 1 тиждень (немає PayIn тощо). Перевести в Active можуть лише співробітники з КС. Paused / Active — Paused (paused), Active (active) Restricted — виставляється автоматично, коли трейдер виконує PayOut і накопичується багато PayOut, не перевірених антискамом. В Active переводить антискам після перевірки. Трейдер не може ввімкнути акаунти на PayIn. Restricted / Обмежений (restricted) Suspicious — виставляється і знімається антискамом: використовується при проблемах з перевіркою доказів від трейдера по PayOut, або багато реджектів PayIn підряд, іноді автоматично (якщо трейдер при PayOut прикріпив поганий скрін). Трейдеру недоступні функції PayOut і PayIn, не може ввімкнути акаунти. Suspicious / Підозрілий (suspicious) Locked — статус можуть виставляти Support, менеджери, антискам — у кожного відділу свої причини. Locked / Заблокований (locked)",
    "pattern": "lg-item"
   },
   {
    "label": "Статуси трейдерів — формальний відтік (Churn Formal)",
    "text": "Archive — ставиться фінами коли немає жодної активності в кабінеті трейдера на стадії інтеграції (новий кабінет, депозит не внесено, трейдер АФК — кабінет архівують), або після аудиту при завершенні співпраці, або після тривалої неактивності після списання балансу. Archive / Архів (archive) Scammer — ставить антискам після перевірок трейдера та виявлення доказів скаму. Scammer / Шахрай (scammer) Lost — статус ставиться автоматично якщо трейдер не користується кабінетом 2 тижні і немає активності. Або якщо затягується процес аудиту і щоб трейдер не світився в портфелі менеджера — Саша ставить вручну. Lost / Втрачений (lost) 60DaysLost — трейдер неактивний довго. Фіни орієнтуються на цей статус щоб списати баланс і перевести дашборд в архів. 60DaysLost / Втрачений 60 днів (60DaysLost) Audit — ставиться і знімається фінвідділом. Трейдер не може працювати до завершення аудиту і переведення в Active. Audit / Аудит (audit) У метриці Churn Formal враховуються термінальні статуси Archive, Scammer, Lost, 60DaysLost — за методологією E: подія є, коли статус на кінець періоду термінальний, а на кінець попереднього був робочим (стани — з журналу змін статусів, минуле не переписується). Audit не враховується — це тимчасовий робочий статус, а не остаточний відтік.",
    "pattern": "lg-item"
   }
  ],
  "trader-operational": [
   {
    "label": "Вкладка Daily",
    "text": "KPI-карточки — 10 ключевых метрик за сегодня с сравнением со вчерашним днём (% изменения). График — выбранная метрика по дням. Выходные дни выделены оранжевым. Переключение метрики — кнопками над графиком. TOP-5 — пять лидеров по выбранной метрике в разрезе Affiliate / Manager / Trader. Пересчитываются при смене метрики. Матрица — сводная таблица: строки = Affiliate / Manager / Trader (переключатель), столбцы = даты. Сортировка по Total. Переключение разреза — кнопками Affiliate / Manager / Trader. Day-over-Day — таблица с ежедневным сравнением всех метрик. Зелёные/красные стрелки показывают рост/падение относительно предыдущего дня.",
    "pattern": "lg-item"
   },
   {
    "label": "Вкладка Hourly",
    "text": "Почасовая статистика за выбранный день. Выберите дату в выпадающем списке. KPI-карточки — суммарные/средние значения за день. График — выбранная метрика по часам. Показывает только часы с данными (будущие часы скрыты). Таблица — все метрики по каждому часу.",
    "pattern": "lg-item"
   },
   {
    "label": "Вкладка Shifts",
    "text": "Контроль смен: кто вышел на смену, кто нет, кто работает вне своей смены. Смены (Plan) — плановое время работы из workingHoursFrom/To . S1: 06:00–14:00 IST, S2: 13:00–22:00, S3: 20:00–07:00. 24/7 = 00:00–24:00. Активность (Fact) — трейдер активен в час H, если PayIn > 0 или PayOut > 0 за этот час по IST. Цвета ячеек: ■ Active in shift, ■ Planned (впереди), ■ Missed (пропуск), ■ Active outside (вне смены). Coverage % = Active / Plan × 100%. Зелёный ≥80%, жёлтый ≥50%, красный Hours in/out — часы активности в смену / вне смены. PayIn in/out — объём PayIn в смену / вне смены. Клик на имя — детали: смена, менеджер, 24-часовая разбивка, итоги дня.",
    "pattern": "lg-item"
   },
   {
    "label": "Фильтры",
    "text": "Affiliate / Manager / Group / Status / Trader — фильтрация данных. Все графики, KPI, матрица и таблицы пересчитываются при изменении фильтра. Group = P2P — установлен по умолчанию. Hour to Hour (H2H) — для честного сравнения дней. При включении каждый день показывает данные только до текущего часа IST. Пример: сейчас 14:00 — вчерашний день показывает данные за 00:00–14:00, а не за весь день.",
    "pattern": "lg-item"
   },
   {
    "label": "Выбор метрики",
    "text": "Кнопки над графиком (PayIn Volume, CR%, Active Traders и т.д.) переключают: • График по дням / часам • TOP-5 панели • Матрицу (значения в ячейках) Все 10 метрик доступны для анализа в каждом разрезе.",
    "pattern": "lg-item"
   },
   {
    "label": "Out Pending (только Hourly)",
    "text": "Сколько payout-заявок было в статусе 'pending' в момент HH:mm — реконструкция через таблицу History. Снапшот в моменте, как если бы бот делал запрос в это время. Для каждого получаса отдельно. ВНИМАНИЕ: pending payout не имеет accountProvider (ещё не назначен трейдеру), поэтому метрика ГЛОБАЛЬНАЯ и уважает только фильтр Pmt Method. Остальные фильтры (Affiliate/Manager/Status/Group/Trader) на эту колонку не влияют. SQL-query ▾ -- 1) Найти в History моменты выхода из статуса 'pending' WITH payout_pending_end AS ( SELECT \"recordId\" AS payout_id, MIN(\"createdAt\") AS pending_end FROM \"History\" WHERE \"table\" = 'ClientPayout' AND \"logJson\"->'data'->'status'->>'old' = 'pending' GROUP BY \"recordId\" ) -- 2) Для каждого payout: pending_start=createdAt, pending_end -- 3) Для каждого получаса T: -- был pending в момент T ⇔ -- pending_start T)",
    "pattern": "lg-item"
   },
   {
    "label": "Unassigned (только Hourly)",
    "text": "ClientPayin созданные в этом получасе с bankAccount IS NULL — заявки которые не получили счёт. Колонки: # (количество) и ₹ (сумма). Уважает ТОЛЬКО фильтр Pmt Method — остальные фильтры (Affiliate/Manager/Group/Status/Trader) недоступны, потому что без bankAccount нет связи с трейдером. SQL-query ▾ SELECT COUNT(*) AS unassigned_count, COALESCE(SUM(amount), 0) AS unassigned_amount FROM \"ClientPayin\" WHERE \"bankAccount\" IS NULL AND (\"prevPendingClientPayinId\" IS NULL OR \"prevPendingClientPayinId\" = '') -- + фильтр по получасу createdAt -- + фильтр paymentMethodType (если выбран)",
    "pattern": "lg-item"
   },
   {
    "label": "Hour-to-Hour (H2H)",
    "text": "Фильтр для честного сравнения дней. При включении каждый день показывает данные только до текущего часа IST. Если сейчас 14:00 — все дни показывают 00:00–14:00. SQL-query ▾ -- Добавляется ко всем запросам: WHERE hr",
    "pattern": "lg-item"
   },
   {
    "label": "Матрица",
    "text": "Сводная таблица: строки = Affiliate / Manager / Trader, столбцы = даты, значения = выбранная метрика. Сортировка по Total убыванию. Total для процентных метрик (CR, Auto, Settle/PayIn) — средневзвешенное, не простая сумма.",
    "pattern": "lg-item"
   },
   {
    "label": "TOP-5",
    "text": "Пять лидеров по выбранной метрике в разрезе Affiliate / Manager / Trader. Пересчитывается при смене метрики. Для процентных метрик используется взвешенный расчёт.",
    "pattern": "lg-item"
   },
   {
    "label": "Источник данных",
    "text": "ClickHouse hermes. Грейн: date × hour × trader. Период: по умолчанию последние 30 дней, доступно до 90 дней истории. Часовой пояс: IST (UTC+5:30). Данные обновляются каждые 30 минут.",
    "pattern": "lg-item"
   }
  ],
  "trader-scoreboard": [
   {
    "label": "Trader",
    "text": "Unique name/alias of the trader (AccountProvider).",
    "pattern": "showM"
   }
  ],
  "trader-weekly": [
   {
    "label": "Trader",
    "text": "Назва P2P провайдера (з префіксом групи: G[P2P], D[P2P], L[P2P] тощо). Зірочка ★ — новий трейдер (перша транзакція у поточному періоді).",
    "pattern": "dict"
   },
   {
    "label": "Manager",
    "text": "Менеджер групи провайдерів (provider_groups.name).",
    "pattern": "dict"
   },
   {
    "label": "Status",
    "text": "Поточний статус провайдера: active / archive / audit / paused / scammer / locked / lost / 60DaysLost / suspicious.",
    "pattern": "dict"
   }
  ]
 }
}