Files
portal/app/resources/js/composables/mockTenants.ts
T
Дмитрий da65cf4bf7 phase2(admin): AdminLayout + AdminTenantsView - админка SaaS (12/13 концептов)
- AdminLayout: отдельный sidebar теало-нуар с под-брендом ADMIN (red error
  10px JBM uppercase) + 4 nav (Тенанты 142 / Биллинг / Инциденты 3 / Система) +
  topbar с crumb «Админка → currentPage» + admin-user-chip с error-color avatar.
- AdminTenantsView (/admin/tenants): page-head + 5-stats + Экспорт +
  search/Статус/Тариф фильтры + v-data-table 7 колонок (Тенант с двухстрочным
  name+inn / Статус-chip 4 цвета / Тариф / Баланс ₽ с error-color при <0 /
  Желаем×факт / MRR с «—» / Активность).
- mockTenants.ts соответствует schema v8.7 §3: 4 статуса × 5 тарифов, 7 mock
  с разнообразием (active/trial/overdue/suspended) + AdminStats (142/128/9/5/
  1 248 600 ₽).
- AdminPlaceholderView универсальный для Биллинг/Инциденты/Система с
  описаниями ссылающимися на schema v8.7 (incidents_log §9 / system_settings §10).
- AppShell расширен meta.layout='admin'. Router: /admin redirect на /tenants +
  4 admin-route'а с lazy-imports. Web.php fallback покрывает /admin/*.
- cspell-words.txt: Екб.

Vitest +11 (всего 129/129 за 10.02s):
- заголовок + 5 stats (regex nbsp в 1 248 600 ₽) + 7 columns + 7 rows +
  Окна Москва ИНН + overdue −1 200 + trial 4 дня + suspended + search filter
  «Натяжные» → 1 row + Экспорт/Статус/Тариф кнопки.

Регресс: lint+type+format OK; vitest 129/129; vite build (admin views
в lazy-chunks; main 104.99 KB); story:build 21/28 за 30.32s; Pest 48/48 за 4.89s.

CLAUDE.md v1.30->v1.31, реестр Открытых_вопросов v1.39->v1.40.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:23:28 +03:00

142 lines
3.8 KiB
TypeScript

/**
* Mock-данные для AdminTenantsView. На API: GET /api/admin/tenants
* (только super_admin role; tenant-isolation НЕ применяется — admin видит всех).
*
* Соответствует schema v8.7 §3 (tenants table) + ТЗ §22 (админка SaaS).
*/
export type TenantStatus = 'active' | 'trial' | 'overdue' | 'suspended';
export type TenantTariff = 'Trial' | 'Start' | 'Команда' | 'Pro' | 'Enterprise';
export interface AdminTenant {
id: number;
code: string; // 'TNT-0042'
name: string; // 'Окна Москва ООО'
inn: string;
status: TenantStatus;
statusText: string; // 'Активен' / 'Trial · 4 дня' / 'Просрочка 3 дня' / 'Приостановлен'
tariff: TenantTariff;
balanceRub: number; // signed
todayDesired: number;
todayActual: number;
mrrRub: number | null;
activitySince: string; // '28 мин назад'
}
export const MOCK_TENANTS: AdminTenant[] = [
{
id: 42,
code: 'TNT-0042',
name: 'Окна Москва ООО',
inn: '7724444444',
status: 'active',
statusText: 'Активен',
tariff: 'Команда',
balanceRub: 14250,
todayDesired: 12,
todayActual: 11,
mrrRub: 990,
activitySince: '28 мин назад',
},
{
id: 51,
code: 'TNT-0051',
name: 'Натяжные потолки СПб',
inn: '7805123456',
status: 'active',
statusText: 'Активен',
tariff: 'Команда',
balanceRub: 38100,
todayDesired: 8,
todayActual: 14,
mrrRub: 990,
activitySince: '14 мин назад',
},
{
id: 67,
code: 'TNT-0067',
name: 'Кухни на заказ Екб',
inn: '6671987654',
status: 'active',
statusText: 'Активен',
tariff: 'Pro',
balanceRub: 112800,
todayDesired: 5,
todayActual: 6,
mrrRub: 2990,
activitySince: '1 ч назад',
},
{
id: 88,
code: 'TNT-0088',
name: 'Ремонт под ключ',
inn: '5024333222',
status: 'trial',
statusText: 'Trial · 4 дня',
tariff: 'Trial',
balanceRub: 450,
todayDesired: 3,
todayActual: 0,
mrrRub: null,
activitySince: '3 ч назад',
},
{
id: 92,
code: 'TNT-0092',
name: 'Двери Премиум',
inn: '7732111000',
status: 'overdue',
statusText: 'Просрочка 3 дня',
tariff: 'Команда',
balanceRub: -1200,
todayDesired: 0,
todayActual: 0,
mrrRub: 990,
activitySince: '2 дня назад',
},
{
id: 105,
code: 'TNT-0105',
name: 'Оконные системы РФ',
inn: '7707654321',
status: 'suspended',
statusText: 'Приостановлен',
tariff: 'Start',
balanceRub: 0,
todayDesired: 0,
todayActual: 0,
mrrRub: null,
activitySince: '7 дней назад',
},
{
id: 117,
code: 'TNT-0117',
name: 'Кухонная мебель Спб',
inn: '7813222333',
status: 'active',
statusText: 'Активен',
tariff: 'Enterprise',
balanceRub: 486200,
todayDesired: 28,
todayActual: 31,
mrrRub: 9990,
activitySince: '8 мин назад',
},
];
export interface AdminStats {
total: number;
active: number;
trial: number;
overdue: number;
monthlyRevenueRub: number;
}
export const MOCK_STATS: AdminStats = {
total: 142,
active: 128,
trial: 9,
overdue: 5,
monthlyRevenueRub: 1248600,
};