Files
portal/app/resources/js/composables/mockAdmin.ts
T

217 lines
6.2 KiB
TypeScript
Raw Normal View History

/**
* Mock-данные для admin-views (Биллинг / Инциденты / Система).
*
* На MVP — frontend-only с предсказуемым набором данных. Backend подключение
* через отдельные endpoints `/api/admin/*` — отдельный коммит.
*/
// === BILLING ===
export interface AdminBillingTenantRow {
id: number;
name: string;
inn: string;
tariff: 'start' | 'basic' | 'pro' | 'enterprise';
balance_rub: number;
monthly_topups_rub: number;
monthly_charges_rub: number;
mrr_rub: number;
last_payment_at: string | null;
status: 'active' | 'overdue' | 'suspended';
}
export interface AdminBillingSummary {
total_mrr_rub: number;
monthly_revenue_rub: number;
overdue_count: number;
refunds_count_30d: number;
avg_balance_rub: number;
}
export const ADMIN_BILLING_SUMMARY: AdminBillingSummary = {
total_mrr_rub: 1_248_600,
monthly_revenue_rub: 1_318_400,
overdue_count: 5,
refunds_count_30d: 3,
avg_balance_rub: 12_840,
};
export const ADMIN_BILLING_TENANTS: AdminBillingTenantRow[] = [
{
id: 1,
name: 'ООО «Окна Москва»',
inn: '7707083893',
tariff: 'pro',
balance_rub: 14_250,
monthly_topups_rub: 30_000,
monthly_charges_rub: 25_400,
mrr_rub: 4_990,
last_payment_at: '2026-05-04T10:23:00Z',
status: 'active',
},
{
id: 2,
name: 'ИП Сидоров А.А.',
inn: '500102310123',
tariff: 'basic',
balance_rub: -1_200,
monthly_topups_rub: 5_000,
monthly_charges_rub: 6_200,
mrr_rub: 990,
last_payment_at: '2026-04-28T14:10:00Z',
status: 'overdue',
},
{
id: 3,
name: 'ООО «Натяжные потолки СПб»',
inn: '7806012345',
tariff: 'pro',
balance_rub: 8_900,
monthly_topups_rub: 20_000,
monthly_charges_rub: 18_400,
mrr_rub: 4_990,
last_payment_at: '2026-05-02T09:00:00Z',
status: 'active',
},
{
id: 4,
name: 'ООО «BigCorp Холдинг»',
inn: '7710140020',
tariff: 'enterprise',
balance_rub: 89_000,
monthly_topups_rub: 100_000,
monthly_charges_rub: 76_400,
mrr_rub: 14_990,
last_payment_at: '2026-05-01T08:00:00Z',
status: 'active',
},
{
id: 5,
name: 'ИП Петров В.В.',
inn: '770212098765',
tariff: 'start',
balance_rub: 0,
monthly_topups_rub: 0,
monthly_charges_rub: 0,
mrr_rub: 0,
last_payment_at: null,
status: 'suspended',
},
];
// === INCIDENTS ===
export interface AdminIncidentRow {
id: number;
incident_id: string;
title: string;
severity: 'critical' | 'high' | 'medium' | 'low';
category: 'pdn_breach' | 'service_outage' | 'security' | 'billing' | 'data_loss';
status: 'open' | 'investigating' | 'resolved' | 'closed';
detected_at: string;
affected_tenants: number;
rkn_notified: boolean;
rkn_deadline_at: string | null;
}
export const ADMIN_INCIDENTS: AdminIncidentRow[] = [
{
id: 1,
incident_id: 'INC-2026-0507-0034',
title: 'API timeout: рост 502 ошибок на webhook-приёме',
severity: 'high',
category: 'service_outage',
status: 'investigating',
detected_at: '2026-05-09T12:34:00Z',
affected_tenants: 12,
rkn_notified: false,
rkn_deadline_at: null,
},
{
id: 2,
incident_id: 'INC-2026-0506-0028',
title: 'Утечка ПДн через логи (REQ-3F8A2)',
severity: 'critical',
category: 'pdn_breach',
status: 'open',
detected_at: '2026-05-08T18:00:00Z',
affected_tenants: 1,
rkn_notified: false,
rkn_deadline_at: '2026-05-09T18:00:00Z',
},
{
id: 3,
incident_id: 'INC-2026-0501-0019',
title: 'YooKassa: задержка вебхуков об оплате',
severity: 'medium',
category: 'billing',
status: 'resolved',
detected_at: '2026-05-01T10:15:00Z',
affected_tenants: 5,
rkn_notified: false,
rkn_deadline_at: null,
},
];
// === SYSTEM SETTINGS ===
export interface AdminSystemSetting {
key: string;
value: string;
type: 'int' | 'string' | 'bool' | 'json';
description: string;
updated_at: string;
}
export const ADMIN_SYSTEM_SETTINGS: AdminSystemSetting[] = [
{
key: 'webhook_rate_limit_rps',
value: '100',
type: 'int',
description: 'Лимит запросов в секунду на токен Webhook (ТЗ §10).',
updated_at: '2026-05-01T00:00:00Z',
},
{
key: 'api_rate_limit_per_minute',
value: '60',
type: 'int',
description: 'Лимит запросов API на ключ в минуту.',
updated_at: '2026-05-01T00:00:00Z',
},
{
key: 'login_max_attempts',
value: '5',
type: 'int',
description: 'Макс. неудачных попыток входа в окне 15 минут (ТЗ §22.4.4).',
updated_at: '2026-05-09T00:00:00Z',
},
{
key: 'password_min_length',
value: '10',
type: 'int',
description: 'Минимальная длина пароля (ТЗ §22.4.1).',
updated_at: '2026-05-01T00:00:00Z',
},
{
key: 'webhook_log_retention_days',
value: '90',
type: 'int',
description: 'Сколько дней хранить raw_payload Webhook.',
updated_at: '2026-05-01T00:00:00Z',
},
{
key: 'maintenance_mode',
value: 'false',
type: 'bool',
description: 'Глобальный maintenance — webhook-приём и UI отключаются.',
updated_at: '2026-05-01T00:00:00Z',
},
{
key: 'fallback_supplier_id',
value: '1',
type: 'int',
description: 'Резервный supplier_id для проектов без активного supplier (ProcessWebhookJob).',
updated_at: '2026-05-08T00:00:00Z',
},
];