217 lines
6.2 KiB
TypeScript
217 lines
6.2 KiB
TypeScript
|
|
/**
|
|||
|
|
* 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',
|
|||
|
|
},
|
|||
|
|
];
|