import React, { useState } from 'react'; import { Building2, Search, ChevronRight, } from 'lucide-react'; import { useKccStore } from '../store/kccStore'; import { StatusBadge } from '../components/StatusBadge'; import { MoneyDisplay } from '../components/MoneyDisplay'; import { PlatformStatus } from '../contracts'; export const OrganizationsPage: React.FC = () => { const organizations = useKccStore((state) => state.organizations); const openInspector = useKccStore((state) => state.openInspector); const [search, setSearch] = useState(''); const [statusFilter, setStatusFilter] = useState<'all' | PlatformStatus>('all'); const filtered = organizations.filter((org) => { const matchSearch = !search || org.displayName.toLowerCase().includes(search.toLowerCase()) || org.inn.includes(search) || org.domain.toLowerCase().includes(search.toLowerCase()); const matchStatus = statusFilter === 'all' || org.platformStatus === statusFilter; return matchSearch && matchStatus; }); return (
{/* Header */}

Организации платформы

Реестр организаций, управление статусами, тарифами и 360°-анализ тенантов

Всего: {organizations.length} (найдено:{' '} {filtered.length})
{/* Filter and Search Bar */}
{/* Search */}
setSearch(e.target.value)} placeholder="Поиск по названию, ИНН или домену..." className="w-full bg-krona-surface border border-krona-border rounded-lg pl-9 pr-3 py-2.5 min-h-[44px] text-xs text-krona-primary placeholder-krona-tertiary focus:outline-hidden focus:border-krona-gold transition-colors" />
{/* Status Filters */}
{[ { id: 'all', label: 'Все' }, { id: 'active', label: 'Активные' }, { id: 'trial', label: 'Пробные' }, { id: 'grace', label: 'Льготные' }, { id: 'suspended', label: 'Приостановленные' }, ].map((tab) => ( ))}
{/* ========================================================================= */} {/* 1. MOBILE CARD VIEW (< lg) */} {/* ========================================================================= */}
{filtered.map((org) => (
openInspector('organization', org.tenantId)} className="rounded-xl border border-krona-border bg-krona-surface p-4 space-y-3 shadow-sm hover:border-krona-gold/40 transition-colors cursor-pointer" > {/* Header: Title + Badge */}

{org.displayName}

ИНН {org.inn} • {org.domain}
{/* Metrics Row */}
Пользователи
{org.userCount} / {org.branchCount} т.
Модули
{org.installedModulesCount}
MRR
{/* Bottom: Tariff + Inspector Action */}
Тариф: {org.tariffPlan}
))} {filtered.length === 0 && (
Организации не найдены по заданным критериям фильтрации
)}
{/* ========================================================================= */} {/* 2. DESKTOP & TABLET TABLE VIEW (hidden on mobile, visible >= lg) */} {/* ========================================================================= */}
{filtered.map((org) => ( openInspector('organization', org.tenantId)} className="hover:bg-krona-hover cursor-pointer transition-colors group" > ))} {filtered.length === 0 && ( )}
Организация / ИНН Статус Тарифный план Польз. / Точки Модули MRR Доход Задолженность Активность Действие
{org.displayName}
ИНН {org.inn} • {org.domain}
{org.tariffPlan} {org.userCount} / {org.branchCount} {org.installedModulesCount} 0 ? 'text-status-danger-text font-bold' : 'text-krona-tertiary'} /> {new Date(org.lastActiveAt).toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit', })}
Организации не найдены по заданным критериям фильтрации
); };