О дашборде
Детальная картина по конкретному трейдеру: его счета, конверсия по счёту, забитость / headroom, текущий процессинг payout-ов и динамика. Все данные — ClickHouse `hermes`, обновление каждый запрос (cache off для свежести).
Трейдери (верхняя таблиця)
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; fromto → нічна зміна (≥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. Може бути від'ємним, якщо операційний баланс <0.
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. Клік по заголовку — звичайне сортування.
Модалка Trader UPIs (по кліку)
Список усіх UPI цього трейдера з вікнами CR/Auto: 1 час · 24 часа · 7 дней (rolling від now()).
UPI в наливі — підсвічений зеленою рамкою.
UPI-номер з 📋 — клік копіює у clipboard (toast "Скопійовано").
Pending — payin зі статусом pending зараз для цього UPI (count · ₹).
Клік по рядку UPI → drill-down з усіма payins за вибрану дату (Settings → Date).
Тимлід фільтр
Каркас з 4 опціями (All / Олег / Никита / Ваня). Маппінг тимлід→менеджери ще не налаштований у backend — фільтр поки тільки додає &teamlead= у запит, що ігнорується. Після уточнення маппінгу — заробить без правок UI.
Trader Accounts (old)
Трейдер / Менеджер — ім'я трейдера + 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. Прогресс-бар показывает % заполнения; зелёный <50%, жёлтый 50–80%, красный >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 — индикатор риска вылета. См. блок ниже.
Фильтры
Affiliate / Manager / Status / Group / Trader / Bank Account / Date — стандартные срезы.
Тільки в наливі — тумблер. При включении остаются только счета с for_client_payin=1 AND is_paused=0 AND work_state='work' на момент запроса. KPI пересчитываются в этом scope.
Статуси трейдерів (providers.status)
- Active — за останні 7 днів був ≥1 payin або payout. ▸ Можна ставити рахунки на payin; доступ до аутів є.
- Locked — авто (не завантажені банк-виписки) або вручну (саппорт/менеджер, незакриті питання). ▸ Не можна ставити рахунки на payin; payout можна.
- Suspicious — антискам, незакриті питання по PAYIN/PAYOUT. ▸ Не можна payin, немає доступу до виплат.
- Audit — на перевірці у фінансистів. ▸ Не можна payin, немає виплат; доступ у кабінет лишається.
- Paused — не було payin/payout 7 днів. (повернути: перевірити запити PAYIN+PAYOUT, selected / звернення мерчантів)
- Lost — немає активності 21 день. (повернути: перевірити запити PAYIN+PAYOUT)
- 60DaysLost — немає активності 60 днів. ▸ Без аудиту в роботу не повернути.
- Archive — співпрацю завершено, борг відсутній.
- Scammer — трейдер винен гроші. ▸ Scammer і Archive — не може зайти в кабінет (помилка при логіні).
Restricted —
усі трейдери зі
providers.status='restricted' (як у settings-provider), незалежно від причини — і ручне обмеження, і авто-обмеження по балансу (
is_restricted_by_balance_threshold) мають
status='restricted', тож показуються. Sticky-блок і бейдж у таблиці —
лише 3 статуси Suspicious / Restricted / Locked (Audit та ін. не показуємо).
«Запрет на IN» (restrict_toggle_for_payin) — це НЕ статус, як бейдж прибрано: трейдер
active + запрет на IN →
без бейджа.
⚠ Sticky-блок Suspicious / Restricted / Locked (П.2)
Закріплена панель угорі — завжди видима. Показує трейдерів у статусах suspicious / restricted / locked / scammer у межах поточного фільтра. Рамка червоніє, коли такі є. Клік по чипу → UPI цього трейдера. Рядки таких трейдерів у таблиці підсвічені (red/yellow). Звірка очима — supportzones.
Джерело статусу — CH-репліка providers.status. Можливий незначний дрейф від prod (supportzones); якщо критично — синхронізацію CH прискорити або перейти на prod-PG.
Нові метрики верхньої панелі
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.
Live Processing
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 по всем.
KPI Row
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П — см. блок «Нові метрики верхньої панелі».