Initial commit
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/**
|
||||
* ============================================
|
||||
* AegisOne Engineering — Подключение к БД
|
||||
* ============================================
|
||||
*
|
||||
* Поддерживает MySQL и PostgreSQL.
|
||||
* Переключатель: DB_TYPE ('mysql' или 'pgsql')
|
||||
*/
|
||||
|
||||
/** Тип БД: 'mysql' или 'pgsql' */
|
||||
define('DB_TYPE', 'pgsql');
|
||||
|
||||
/** Хост БД */
|
||||
define('DB_HOST', 'localhost');
|
||||
|
||||
/** Порт БД (5432 для PostgreSQL, 3306 для MySQL) */
|
||||
define('DB_PORT', '5432');
|
||||
|
||||
/** Имя базы данных */
|
||||
define('DB_NAME', 'aegisone');
|
||||
|
||||
/** Пользователь БД */
|
||||
define('DB_USER', 'aegisone');
|
||||
|
||||
/** Пароль пользователя БД */
|
||||
define('DB_PASS', 'aegisone_pass');
|
||||
|
||||
/** Кодировка соединения */
|
||||
define('DB_CHARSET', 'utf8');
|
||||
@@ -0,0 +1,433 @@
|
||||
-- AegisOne Engineering — Full Database Schema
|
||||
-- Run once on MySQL 5.7+ / MariaDB 10.3+
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`login` varchar(50) NOT NULL UNIQUE,
|
||||
`password_hash` varchar(255) NOT NULL,
|
||||
`role` enum('owner','engineer','technician') NOT NULL DEFAULT 'technician',
|
||||
`full_name` varchar(255) NOT NULL,
|
||||
`phone` varchar(50) DEFAULT '',
|
||||
`email` varchar(255) DEFAULT '',
|
||||
`is_active` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `login_attempts` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`ip_address` varchar(45) NOT NULL,
|
||||
`login` varchar(50) NOT NULL DEFAULT '',
|
||||
`attempt_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_ip` (`ip_address`),
|
||||
INDEX `idx_time` (`attempt_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `audit_log` (
|
||||
`id` bigint UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`user_id` int UNSIGNED DEFAULT NULL,
|
||||
`action` varchar(255) NOT NULL,
|
||||
`details` text DEFAULT NULL,
|
||||
`ip_address` varchar(45) DEFAULT '',
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_user` (`user_id`),
|
||||
INDEX `idx_action` (`action`),
|
||||
INDEX `idx_created` (`created_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `objects` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`address` varchar(500) DEFAULT '',
|
||||
`object_type` varchar(100) DEFAULT '',
|
||||
`area_sqm` decimal(10,2) DEFAULT 0,
|
||||
`employees_count` int DEFAULT 0,
|
||||
`contact_person` varchar(255) DEFAULT '',
|
||||
`contact_phone` varchar(50) DEFAULT '',
|
||||
`status` enum('active','inactive','audit','prospective') NOT NULL DEFAULT 'active',
|
||||
`notes` text DEFAULT NULL,
|
||||
`risk_score` decimal(5,2) DEFAULT 0,
|
||||
`complexity_index` decimal(5,2) DEFAULT 0,
|
||||
`infrastructure_load` decimal(5,2) DEFAULT 0,
|
||||
`service_history` decimal(5,2) DEFAULT 0,
|
||||
`object_index` decimal(5,2) DEFAULT 0,
|
||||
`sla_price_monthly` decimal(12,2) DEFAULT 0,
|
||||
`region_factor` decimal(3,2) DEFAULT 1.00,
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `object_assignments` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED NOT NULL,
|
||||
`user_id` int UNSIGNED NOT NULL,
|
||||
`role` enum('engineer','technician') NOT NULL,
|
||||
`assigned_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`unassigned_at` datetime DEFAULT NULL,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_user` (`user_id`),
|
||||
UNIQUE KEY `uq_active` (`object_id`,`user_id`,`unassigned_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `tasks` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED NOT NULL,
|
||||
`assigned_to` int UNSIGNED DEFAULT NULL,
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`title` varchar(500) NOT NULL,
|
||||
`description` text DEFAULT NULL,
|
||||
`priority` enum('P1','P2','P3','P4') NOT NULL DEFAULT 'P3',
|
||||
`status` enum('open','in_progress','completed','cancelled') NOT NULL DEFAULT 'open',
|
||||
`deadline` datetime DEFAULT NULL,
|
||||
`sla_remaining_hours` decimal(6,1) DEFAULT 0,
|
||||
`response_time_minutes` int DEFAULT 0,
|
||||
`resolution_time_minutes` int DEFAULT 0,
|
||||
`sla_compliant` tinyint(1) DEFAULT NULL,
|
||||
`checklist_data` text DEFAULT NULL,
|
||||
`result_notes` text DEFAULT NULL,
|
||||
`closed_at` datetime DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_assigned` (`assigned_to`),
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_priority` (`priority`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `task_comments` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`task_id` int UNSIGNED NOT NULL,
|
||||
`user_id` int UNSIGNED DEFAULT NULL,
|
||||
`comment` text NOT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_task` (`task_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `task_photos` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`task_id` int UNSIGNED DEFAULT NULL,
|
||||
`report_id` int UNSIGNED DEFAULT NULL,
|
||||
`file_path` varchar(500) NOT NULL,
|
||||
`description` varchar(500) DEFAULT '',
|
||||
`type` enum('before','after','evidence','other') DEFAULT 'other',
|
||||
`uploaded_by` int UNSIGNED DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_task` (`task_id`),
|
||||
INDEX `idx_report` (`report_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `reports` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED NOT NULL,
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`report_type` enum('inspection','service','emergency','audit','monthly') NOT NULL DEFAULT 'service',
|
||||
`title` varchar(500) DEFAULT '',
|
||||
`description` text DEFAULT NULL,
|
||||
`findings` text DEFAULT NULL,
|
||||
`recommendations` text DEFAULT NULL,
|
||||
`work_done` text DEFAULT NULL,
|
||||
`cause_classification` varchar(100) DEFAULT NULL,
|
||||
`result_status` enum('fixed','partial','revisit','ok') DEFAULT 'ok',
|
||||
`status` enum('draft','final','cancelled') NOT NULL DEFAULT 'draft',
|
||||
`client_confirmed` tinyint(1) DEFAULT 0,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_author` (`created_by`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `questionnaire_sessions` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED DEFAULT NULL,
|
||||
`client_name` varchar(255) DEFAULT '',
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`status` enum('draft','completed','cancelled') NOT NULL DEFAULT 'draft',
|
||||
`current_step` tinyint UNSIGNED NOT NULL DEFAULT 1,
|
||||
`risk_score` decimal(5,2) DEFAULT 0,
|
||||
`complexity_index` decimal(5,2) DEFAULT 0,
|
||||
`infrastructure_load` decimal(5,2) DEFAULT 0,
|
||||
`service_history` decimal(5,2) DEFAULT 0,
|
||||
`object_index` decimal(5,2) DEFAULT 0,
|
||||
`sla_price_monthly` decimal(12,2) DEFAULT 0,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_author` (`created_by`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `questionnaire_answers` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`session_id` int UNSIGNED NOT NULL,
|
||||
`step` tinyint UNSIGNED NOT NULL,
|
||||
`question_key` varchar(100) NOT NULL,
|
||||
`answer_value` text DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_session` (`session_id`),
|
||||
INDEX `idx_step` (`step`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `object_passports` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`session_id` int UNSIGNED DEFAULT NULL,
|
||||
`object_id` int UNSIGNED DEFAULT NULL,
|
||||
`object_index` decimal(5,2) DEFAULT 0,
|
||||
`risk_score` decimal(5,2) DEFAULT 0,
|
||||
`complexity_index` decimal(5,2) DEFAULT 0,
|
||||
`sla_price_monthly` decimal(12,2) DEFAULT 0,
|
||||
`passport_data` json DEFAULT NULL,
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_session` (`session_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `sla_contracts` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED NOT NULL,
|
||||
`client_name` varchar(255) DEFAULT '',
|
||||
`start_date` date NOT NULL,
|
||||
`end_date` date DEFAULT NULL,
|
||||
`sla_price_monthly` decimal(12,2) NOT NULL DEFAULT 0,
|
||||
`penalty_rate` decimal(5,2) DEFAULT 0,
|
||||
`response_time_p1` int DEFAULT 4,
|
||||
`response_time_p2` int DEFAULT 8,
|
||||
`response_time_p3` int DEFAULT 24,
|
||||
`service_level` enum('start','business','enterprise') NOT NULL DEFAULT 'business',
|
||||
`status` enum('active','expired','cancelled','negotiation') NOT NULL DEFAULT 'negotiation',
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `incidents` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`object_id` int UNSIGNED NOT NULL,
|
||||
`reported_by` int UNSIGNED DEFAULT NULL,
|
||||
`assigned_to` int UNSIGNED DEFAULT NULL,
|
||||
`title` varchar(500) NOT NULL,
|
||||
`description` text DEFAULT NULL,
|
||||
`severity` enum('P1','P2','P3') NOT NULL DEFAULT 'P3',
|
||||
`status` enum('open','in_progress','resolved','closed') NOT NULL DEFAULT 'open',
|
||||
`resolution` text DEFAULT NULL,
|
||||
`cause` varchar(500) DEFAULT '',
|
||||
`resolution_time_minutes` int DEFAULT 0,
|
||||
`sla_breached` tinyint(1) DEFAULT 0,
|
||||
`resolved_at` datetime DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_object` (`object_id`),
|
||||
INDEX `idx_severity` (`severity`),
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_assigned` (`assigned_to`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `engineer_kpi` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`engineer_id` int UNSIGNED NOT NULL,
|
||||
`period_start` date NOT NULL,
|
||||
`period_end` date NOT NULL,
|
||||
`sla_compliance` decimal(5,2) DEFAULT 0,
|
||||
`response_time_score` decimal(5,2) DEFAULT 0,
|
||||
`resolution_time_score` decimal(5,2) DEFAULT 0,
|
||||
`diagnosis_accuracy` decimal(5,2) DEFAULT 0,
|
||||
`reopen_rate` decimal(5,2) DEFAULT 0,
|
||||
`risk_coverage_score` decimal(5,2) DEFAULT 0,
|
||||
`documentation_quality` decimal(5,2) DEFAULT 0,
|
||||
`engineer_score` decimal(5,2) DEFAULT 0,
|
||||
`grade` varchar(20) DEFAULT '',
|
||||
`components_json` json DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_engineer` (`engineer_id`),
|
||||
INDEX `idx_period` (`period_start`,`period_end`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `shs_records` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`recorded_by` int UNSIGNED DEFAULT NULL,
|
||||
`period_start` date NOT NULL,
|
||||
`period_end` date NOT NULL,
|
||||
`sla_stability` decimal(5,2) DEFAULT 0,
|
||||
`revenue_stability` decimal(5,2) DEFAULT 0,
|
||||
`retention` decimal(5,2) DEFAULT 0,
|
||||
`engineer_performance` decimal(5,2) DEFAULT 0,
|
||||
`incident_stability` decimal(5,2) DEFAULT 0,
|
||||
`sales_flow` decimal(5,2) DEFAULT 0,
|
||||
`operational_efficiency` decimal(5,2) DEFAULT 0,
|
||||
`shs_score` decimal(5,2) DEFAULT 0,
|
||||
`shs_status` varchar(20) DEFAULT '',
|
||||
`components_json` json DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX `idx_period` (`period_start`,`period_end`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `blog_posts` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`title` varchar(500) NOT NULL,
|
||||
`slug` varchar(500) NOT NULL UNIQUE,
|
||||
`content` longtext NOT NULL,
|
||||
`excerpt` varchar(1000) DEFAULT '',
|
||||
`category` enum('risk-engineering','sla-service','incident-cases','infrastructure-deep-dive','compliance-mchs','economics-security','case-studies') NOT NULL DEFAULT 'risk-engineering',
|
||||
`author_id` int UNSIGNED DEFAULT NULL,
|
||||
`status` enum('draft','published','archived') NOT NULL DEFAULT 'draft',
|
||||
`published_at` datetime DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_slug` (`slug`),
|
||||
INDEX `idx_category` (`category`),
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_published` (`published_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Seed: default owner (login: owner, password: AegisOne2024!)
|
||||
INSERT INTO `users` (`login`, `password_hash`, `role`, `full_name`, `is_active`)
|
||||
VALUES ('owner', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'owner', 'System Owner', 1)
|
||||
ON DUPLICATE KEY UPDATE `id`=`id`;
|
||||
|
||||
-- =====================================================================
|
||||
-- formula_coefficients — редактируемые коэффициенты формул
|
||||
-- =====================================================================
|
||||
CREATE TABLE IF NOT EXISTS `formula_coefficients` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`key` varchar(100) NOT NULL UNIQUE,
|
||||
`value` decimal(10,4) NOT NULL DEFAULT 0,
|
||||
`description` varchar(500) DEFAULT '',
|
||||
`formula_ref` varchar(255) DEFAULT '',
|
||||
`is_active` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`updated_by` int UNSIGNED DEFAULT NULL,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_key` (`key`),
|
||||
INDEX `idx_active` (`is_active`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Seed: коэффициенты формул (значения по умолчанию из functions.php)
|
||||
INSERT INTO `formula_coefficients` (`key`, `value`, `description`, `formula_ref`) VALUES
|
||||
-- Risk Score
|
||||
('risk_score.no_archive', 25, 'Нет архива видеонаблюдения', 'calc_risk_score()'),
|
||||
('risk_score.no_power_backup', 20, 'Нет резервного питания', 'calc_risk_score()'),
|
||||
('risk_score.no_regulations', 15, 'Нет регламента обслуживания', 'calc_risk_score()'),
|
||||
('risk_score.system_failures', 20, 'Частые сбои систем', 'calc_risk_score()'),
|
||||
('risk_score.no_documentation', 10, 'Нет документации', 'calc_risk_score()'),
|
||||
('risk_score.bound_low', 20, 'Граница низкого риска', 'risk_label()'),
|
||||
('risk_score.bound_medium', 50, 'Граница среднего риска', 'risk_label()'),
|
||||
('risk_score.bound_high', 75, 'Граница высокого риска', 'risk_label()'),
|
||||
-- Risk Multiplier
|
||||
('risk_multiplier.low', 1.0, 'Множитель низкого риска (0-20)', 'risk_multiplier()'),
|
||||
('risk_multiplier.medium', 1.3, 'Множитель среднего риска (21-50)', 'risk_multiplier()'),
|
||||
('risk_multiplier.high', 1.6, 'Множитель высокого риска (51-75)', 'risk_multiplier()'),
|
||||
('risk_multiplier.critical', 2.0, 'Множитель критического риска (76-100)', 'risk_multiplier()'),
|
||||
-- Complexity
|
||||
('complexity.video_0_20', 10, 'Видеонаблюдение до 20 камер', 'calc_complexity()'),
|
||||
('complexity.video_20_100', 20, 'Видеонаблюдение 20-100 камер', 'calc_complexity()'),
|
||||
('complexity.video_100plus', 35, 'Видеонаблюдение 100+ камер', 'calc_complexity()'),
|
||||
('complexity.access_0_5', 10, 'СКУД до 5 точек', 'calc_complexity()'),
|
||||
('complexity.access_5_20', 20, 'СКУД 5-20 точек', 'calc_complexity()'),
|
||||
('complexity.access_20plus', 30, 'СКУД 20+ точек', 'calc_complexity()'),
|
||||
('complexity.fire_simple', 15, 'Пожарная сигнализация простая', 'calc_complexity()'),
|
||||
('complexity.fire_medium', 25, 'Пожарная сигнализация средняя', 'calc_complexity()'),
|
||||
('complexity.fire_complex', 40, 'Пожарная сигнализация сложная (>5000 м²)', 'calc_complexity()'),
|
||||
('complexity.it', 10, 'IT-инфраструктура', 'calc_complexity()'),
|
||||
-- Infrastructure Load
|
||||
('infra.server_none', 15, 'Нет сервера', 'calc_infrastructure_load()'),
|
||||
('infra.server_weak', 10, 'Слабый сервер', 'calc_infrastructure_load()'),
|
||||
('infra.network_unstable', 20, 'Нестабильная сеть', 'calc_infrastructure_load()'),
|
||||
('infra.network_partial', 10, 'Частичная сеть', 'calc_infrastructure_load()'),
|
||||
('infra.power_none', 20, 'Нет UPS', 'calc_infrastructure_load()'),
|
||||
('infra.power_weak', 10, 'Слабый UPS', 'calc_infrastructure_load()'),
|
||||
-- Service History
|
||||
('history.none', 30, 'Нет обслуживания', 'calc_service_history()'),
|
||||
('history.irregular', 20, 'Нерегулярное обслуживание', 'calc_service_history()'),
|
||||
('history.formal', 10, 'Формальный подрядчик', 'calc_service_history()'),
|
||||
('history.sla', 0, 'Есть SLA', 'calc_service_history()'),
|
||||
-- Object Index
|
||||
('object_index.risk_weight', 0.4, 'Вес Risk Score', 'calc_object_index()'),
|
||||
('object_index.complexity_weight', 0.3, 'Вес Complexity', 'calc_object_index()'),
|
||||
('object_index.infra_weight', 0.2, 'Вес Infra Load', 'calc_object_index()'),
|
||||
('object_index.history_weight', 0.1, 'Вес Service History', 'calc_object_index()'),
|
||||
-- SLA Price
|
||||
('sla_price.base_cost', 15000, 'Базовая стоимость инженера', 'calc_sla_price()'),
|
||||
('sla_price.region_default', 1.0, 'Региональный коэффициент по умолчанию', 'calc_sla_price()'),
|
||||
-- Engineer Score
|
||||
('engineer.score.sla_weight', 0.25, 'Вес SLA Compliance', 'calc_engineer_score()'),
|
||||
('engineer.score.response_weight', 0.20, 'Вес Response Time', 'calc_engineer_score()'),
|
||||
('engineer.score.resolution_weight', 0.20, 'Вес Resolution Time', 'calc_engineer_score()'),
|
||||
('engineer.score.diagnosis_weight', 0.15, 'Вес Diagnosis Accuracy', 'calc_engineer_score()'),
|
||||
('engineer.score.reopen_weight', 0.10, 'Вес Reopen Rate', 'calc_engineer_score()'),
|
||||
('engineer.score.risk_coverage_weight', 0.10, 'Вес Risk Coverage', 'calc_engineer_score()'),
|
||||
('engineer.grade.senior', 90, 'Граница Senior', 'engineer_grade()'),
|
||||
('engineer.grade.strong', 80, 'Граница Strong', 'engineer_grade()'),
|
||||
('engineer.grade.middle', 70, 'Граница Middle', 'engineer_grade()'),
|
||||
-- ECS (Engineer Control Score)
|
||||
('ecs.sla_weight', 0.30, 'Вес SLA Control', 'calc_engineer_control_score()'),
|
||||
('ecs.task_dist_weight', 0.25, 'Вес Task Distribution', 'calc_engineer_control_score()'),
|
||||
('ecs.incident_red_weight', 0.20, 'Вес Incident Reduction', 'calc_engineer_control_score()'),
|
||||
('ecs.team_perf_weight', 0.15, 'Вес Team Performance', 'calc_engineer_control_score()'),
|
||||
('ecs.response_coord_weight', 0.10, 'Вес Response Coordination', 'calc_engineer_control_score()'),
|
||||
-- SHS (System Health Score)
|
||||
('shs.sla_stability_weight', 0.22, 'Вес SLA Stability', 'calc_shs()'),
|
||||
('shs.revenue_stability_weight', 0.18, 'Вес Revenue Stability', 'calc_shs()'),
|
||||
('shs.retention_weight', 0.18, 'Вес Retention', 'calc_shs()'),
|
||||
('shs.engineer_perf_weight', 0.15, 'Вес Engineer Performance', 'calc_shs()'),
|
||||
('shs.incident_stability_weight', 0.12, 'Вес Incident Stability', 'calc_shs()'),
|
||||
('shs.sales_flow_weight', 0.10, 'Вес Sales Flow', 'calc_shs()'),
|
||||
('shs.operational_eff_weight', 0.05, 'Вес Operational Efficiency', 'calc_shs()'),
|
||||
('shs.zone_growth', 85, 'Граница зоны Growth', 'shs_status(), shs_zone()'),
|
||||
('shs.zone_stable', 70, 'Граница зоны Stable', 'shs_status(), shs_zone()'),
|
||||
('shs.zone_risk', 50, 'Граница зоны Risk', 'shs_status(), shs_zone()'),
|
||||
('shs.delta_warning', 5, 'Порог предупреждения ΔSHS', 'shs_delta()'),
|
||||
('shs.delta_critical', 10, 'Порог критического ΔSHS', 'shs_delta()'),
|
||||
-- CEO SHS
|
||||
('ceo_shs.mrr_weight', 0.25, 'Вес MRR Growth', 'calc_ceo_shs()'),
|
||||
('ceo_shs.sla_weight', 0.20, 'Вес SLA Compliance', 'calc_ceo_shs()'),
|
||||
('ceo_shs.retention_weight', 0.20, 'Вес Retention', 'calc_ceo_shs()'),
|
||||
('ceo_shs.productivity_weight', 0.15, 'Вес Productivity', 'calc_ceo_shs()'),
|
||||
('ceo_shs.conversion_weight', 0.10, 'Вес Conversion', 'calc_ceo_shs()'),
|
||||
('ceo_shs.incident_weight', 0.10, 'Вес Incident Stability', 'calc_ceo_shs()'),
|
||||
-- SSI (SLA Stability Index)
|
||||
('ssi.breach_severity_p1', 1.0, 'Severity P1', 'calc_breach_severity()'),
|
||||
('ssi.breach_severity_p2', 0.5, 'Severity P2', 'calc_breach_severity()'),
|
||||
('ssi.breach_severity_p3', 0.2, 'Severity P3', 'calc_breach_severity()'),
|
||||
-- ISI (Incident Stability Index)
|
||||
('isi.severity_p1', 1.0, 'Severity P1', 'calc_incident_stability_index()'),
|
||||
('isi.severity_p2', 0.5, 'Severity P2', 'calc_incident_stability_index()'),
|
||||
('isi.severity_p3', 0.2, 'Severity P3', 'calc_incident_stability_index()'),
|
||||
-- Automation Rules
|
||||
('rules.shs_threshold', 70, 'Порог SHS', 'check_automation_rules()'),
|
||||
('rules.sla_threshold', 90, 'Порог SLA Compliance', 'check_automation_rules()'),
|
||||
('rules.retention_threshold', 90, 'Порог Retention', 'check_automation_rules()'),
|
||||
-- Bonus
|
||||
('bonus.score_90plus', 90, 'Граница премии 90+', 'calc_bonus_percent()'),
|
||||
('bonus.score_80_89', 80, 'Граница премии 80-89', 'calc_bonus_percent()'),
|
||||
('bonus.premium_90plus', 20, 'Премия при Score >= 90 (%)', 'calc_bonus_percent()'),
|
||||
('bonus.premium_80_89', 10, 'Премия при Score 80-89 (%)', 'calc_bonus_percent()'),
|
||||
('bonus.premium_below_80', 0, 'Премия при Score < 80 (%)', 'calc_bonus_percent()'),
|
||||
-- Retention
|
||||
('retention.key_client_penalty', 0.1, 'Штраф за потерю ключевого клиента', 'calc_retention_key_client()')
|
||||
ON DUPLICATE KEY UPDATE `id`=`id`;
|
||||
|
||||
-- =====================================================================
|
||||
-- cases — примеры из практики (карусель на главной)
|
||||
-- =====================================================================
|
||||
CREATE TABLE IF NOT EXISTS `cases` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`title` varchar(500) NOT NULL,
|
||||
`text` text NOT NULL,
|
||||
`effect` text NOT NULL,
|
||||
`sort_order` int UNSIGNED NOT NULL DEFAULT 0,
|
||||
`is_active` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_sort` (`sort_order`),
|
||||
INDEX `idx_active` (`is_active`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
INSERT INTO `cases` (`title`, `text`, `effect`, `sort_order`) VALUES
|
||||
('Склад крупной торговой сети', 'Выявлено: слепые зоны в зонах разгрузки, недостаточное разрешение камер в зонах погрузки/разгрузки. Одна камера не исправна, у двух не настроена запись.', 'предотвращение убытков на сумму более 5 млн рублей в год.', 1),
|
||||
('Производство пищевых продуктов', 'Неправильная настройка СКУД позволяла несанкционированный доступ в производственные помещения, создавая риск нарушения норм СанПин.', 'снижение риска порчи продукции и утечки конфиденциальной информации.', 2),
|
||||
('Банковский офис', 'Недостатки в системе ОПС приводили к невозможности срабатывания или задержкам в реагировании при ЧП.', 'сокращение рисков утраты имущества и ценностей, повышение уровня безопасности.', 3),
|
||||
('Торгово-развлекательный центр', 'Метод «Тайный покупатель» выявил: охрана не реагирует на срабатывание металлодетекторов, оставляет посты без присмотра. Камеры на парковке не охватывают часть машиномест.', 'снижение риска краж, повышение дисциплины службы охраны.', 4),
|
||||
('Гостиница', 'СКУД не синхронизирована с системой бронирования — доступ в занятые номера. ОПС в части номеров отключена. Видеокамеры имеют мёртвые зоны.', 'устранение репутационных рисков и риска хищения личных вещей гостей.', 5),
|
||||
('Логистический центр', 'Отсутствие видеоконтроля на участках приёмки и отгрузки приводило к систематическим хищениям. СКУД на въезде не фиксирует данные транспортных средств.', 'сокращение потерь товара на 15%.', 6)
|
||||
ON DUPLICATE KEY UPDATE `id`=`id`;
|
||||
@@ -0,0 +1,170 @@
|
||||
-- ============================================
|
||||
-- AegisOne Engineering — Combined Migration 2026-05-16
|
||||
-- ============================================
|
||||
-- 1. Blog categories: English → Russian
|
||||
-- 2. SLA: response_time_hours, contract_number, description
|
||||
-- 3. Customers table + links to objects & contracts
|
||||
-- 4. Dynamic questionnaire items
|
||||
|
||||
-- ============================================
|
||||
-- 1. Blog ENUM update
|
||||
-- ============================================
|
||||
ALTER TABLE `blog_posts` MODIFY `category` ENUM(
|
||||
'audit', 'sla', 'incident', 'supervision',
|
||||
'documentation', 'risk', 'cases'
|
||||
) NOT NULL DEFAULT 'audit';
|
||||
|
||||
UPDATE `blog_posts` SET category = 'audit' WHERE category = 'risk-engineering';
|
||||
UPDATE `blog_posts` SET category = 'sla' WHERE category = 'sla-service';
|
||||
UPDATE `blog_posts` SET category = 'incident' WHERE category = 'incident-cases';
|
||||
UPDATE `blog_posts` SET category = 'supervision' WHERE category = 'infrastructure-deep-dive';
|
||||
UPDATE `blog_posts` SET category = 'documentation' WHERE category = 'compliance-mchs';
|
||||
UPDATE `blog_posts` SET category = 'risk' WHERE category = 'economics-security';
|
||||
UPDATE `blog_posts` SET category = 'cases' WHERE category = 'case-studies';
|
||||
|
||||
-- ============================================
|
||||
-- 2. SLA fields
|
||||
-- ============================================
|
||||
ALTER TABLE `sla_contracts`
|
||||
ADD COLUMN IF NOT EXISTS `response_time_hours` decimal(5,1) DEFAULT NULL AFTER `response_time_p3`,
|
||||
ADD COLUMN IF NOT EXISTS `contract_number` varchar(50) DEFAULT '' AFTER `id`,
|
||||
ADD COLUMN IF NOT EXISTS `description` text DEFAULT NULL AFTER `contract_number`;
|
||||
|
||||
-- ============================================
|
||||
-- 3. Customers table
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `customers` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`inn` varchar(12) DEFAULT '',
|
||||
`kpp` varchar(9) DEFAULT '',
|
||||
`legal_address` varchar(500) DEFAULT '',
|
||||
`contact_person` varchar(255) DEFAULT '',
|
||||
`contact_phone` varchar(50) DEFAULT '',
|
||||
`contact_email` varchar(255) DEFAULT '',
|
||||
`status` enum('active','inactive','prospect') NOT NULL DEFAULT 'active',
|
||||
`notes` text DEFAULT NULL,
|
||||
`created_by` int UNSIGNED DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_inn` (`inn`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Add customer_id to objects (skip if column exists)
|
||||
SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='objects' AND COLUMN_NAME='customer_id');
|
||||
SET @sql = IF(@col_exists=0,
|
||||
'ALTER TABLE `objects` ADD COLUMN `customer_id` int UNSIGNED DEFAULT NULL AFTER `id`, ADD INDEX `idx_customer` (`customer_id`)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- Add FK objects→customers (skip if exists)
|
||||
SET @fk_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='objects' AND CONSTRAINT_NAME='fk_object_customer');
|
||||
SET @sql = IF(@fk_exists=0,
|
||||
'ALTER TABLE `objects` ADD CONSTRAINT `fk_object_customer` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE CASCADE',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- Add customer_id to sla_contracts (skip if column exists)
|
||||
SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='sla_contracts' AND COLUMN_NAME='customer_id');
|
||||
SET @sql = IF(@col_exists=0,
|
||||
'ALTER TABLE `sla_contracts` ADD COLUMN `customer_id` int UNSIGNED DEFAULT NULL AFTER `id`, ADD INDEX `idx_customer` (`customer_id`)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- Add FK sla_contracts→customers (skip if exists)
|
||||
SET @fk_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='sla_contracts' AND CONSTRAINT_NAME='fk_sla_customer');
|
||||
SET @sql = IF(@fk_exists=0,
|
||||
'ALTER TABLE `sla_contracts` ADD CONSTRAINT `fk_sla_customer` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE CASCADE',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- Migrate existing client_name from sla_contracts to customers
|
||||
INSERT IGNORE INTO `customers` (`name`, `status`, `created_at`)
|
||||
SELECT DISTINCT client_name, 'active', NOW()
|
||||
FROM `sla_contracts`
|
||||
WHERE client_name != '' AND client_name IS NOT NULL;
|
||||
|
||||
-- Link sla_contracts to customers
|
||||
UPDATE `sla_contracts` sc
|
||||
JOIN `customers` c ON c.name = sc.client_name
|
||||
SET sc.customer_id = c.id
|
||||
WHERE sc.client_name != '' AND sc.client_name IS NOT NULL AND sc.customer_id IS NULL;
|
||||
|
||||
-- ============================================
|
||||
-- 4. Dynamic questionnaire items
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `questionnaire_items` (
|
||||
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`step` int UNSIGNED NOT NULL DEFAULT 1,
|
||||
`section` varchar(100) NOT NULL DEFAULT '',
|
||||
`question_key` varchar(100) NOT NULL,
|
||||
`label` varchar(255) NOT NULL,
|
||||
`type` enum('text','number','select','radio','checkbox','textarea') NOT NULL DEFAULT 'text',
|
||||
`options` text DEFAULT NULL COMMENT 'JSON array of options for select/radio',
|
||||
`required` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`sort_order` int UNSIGNED NOT NULL DEFAULT 0,
|
||||
`is_active` tinyint(1) NOT NULL DEFAULT 1,
|
||||
`help_text` varchar(500) DEFAULT '',
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX `idx_step` (`step`),
|
||||
INDEX `idx_key` (`question_key`),
|
||||
INDEX `idx_sort` (`sort_order`),
|
||||
UNIQUE KEY `uq_key` (`question_key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
INSERT INTO `questionnaire_items` (`step`, `section`, `question_key`, `label`, `type`, `options`, `required`, `sort_order`, `help_text`) VALUES
|
||||
(1, 'Коммерческий профиль объекта', 'object_name', 'Название организации / объекта', 'text', NULL, 1, 1, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'object_type', 'Тип объекта', 'select', '["","Гостиница","Склад","Производство","ТЦ","Офис","БЦ","Медицина","Образование","Другое"]', 0, 2, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'address', 'Адрес объекта', 'text', NULL, 0, 3, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'area', 'Площадь (м²)', 'number', NULL, 0, 4, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'employees', 'Количество сотрудников', 'number', NULL, 0, 5, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'contact_person', 'Контактное лицо', 'text', NULL, 0, 6, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'contact_phone', 'Телефон', 'text', NULL, 0, 7, ''),
|
||||
(1, 'Коммерческий профиль объекта', 'region_factor', 'Региональный коэффициент', 'select', '{"1.0":"Краснодар (1.0)","1.1":"Краснодарский край (1.1)","1.3":"РФ (1.3)","1.6":"РФ удалённые (1.6)","1.8":"Москва (1.8)"}', 0, 8, ''),
|
||||
(2, 'Видеонаблюдение', 'has_video', 'Есть система видеонаблюдения?', 'radio', '{"1":"Да","0":"Нет"}', 0, 1, ''),
|
||||
(2, 'Видеонаблюдение', 'camera_count', 'Количество камер', 'number', NULL, 0, 2, ''),
|
||||
(2, 'Видеонаблюдение', 'video_type', 'Тип системы', 'select', '["","ip","analog","mixed"]', 0, 3, ''),
|
||||
(2, 'Видеонаблюдение', 'archive_depth', 'Глубина архива', 'select', '{"7":"7 дней","14":"14 дней","30":"30+ дней"}', 0, 4, ''),
|
||||
(2, 'СКУД', 'has_acs', 'Есть система СКУД?', 'radio', '{"1":"Да","0":"Нет"}', 0, 5, ''),
|
||||
(2, 'СКУД', 'access_points', 'Точек доступа', 'number', NULL, 0, 6, ''),
|
||||
(2, 'СКУД', 'acs_vendor', 'Производитель СКУД', 'text', NULL, 0, 7, ''),
|
||||
(2, 'Пожарная сигнализация', 'has_fire', 'Есть пожарная сигнализация?', 'radio', '{"1":"Да","0":"Нет"}', 0, 8, ''),
|
||||
(2, 'Пожарная сигнализация', 'fire_type', 'Сложность системы', 'select', '{"simple":"Простая","medium":"Средняя","complex":"Сложная (>5000 м²)"}', 0, 9, ''),
|
||||
(2, 'Инфраструктура', 'server_state', 'Состояние сервера', 'select', '{"ok":"Нормальный","weak":"Слабый","none":"Нет"}', 0, 10, ''),
|
||||
(2, 'Инфраструктура', 'network_state', 'Состояние сети', 'select', '{"stable":"Стабильная","partial":"Частично","unstable":"Нестабильная"}', 0, 11, ''),
|
||||
(2, 'Инфраструктура', 'power_state', 'Электропитание (UPS)', 'select', '{"ok":"Нормальное","weak":"Слабый UPS","none":"Нет UPS"}', 0, 12, ''),
|
||||
(3, 'Эксплуатационная модель', 'service_state', 'Как обслуживается объект сейчас?', 'select', '{"none":"Не обслуживается","irregular":"Нерегулярно","formal":"Формальный подрядчик","sla":"Есть SLA"}', 0, 1, ''),
|
||||
(3, 'Эксплуатационная модель', 'has_regulations', 'Есть ли регламент?', 'checkbox', NULL, 0, 2, ''),
|
||||
(3, 'Эксплуатационная модель', 'problems', 'Отметьте частые проблемы', 'checkbox', '["Не работают камеры","Пропадает архив","Зависает СКУД","Ошибки пожарки","Нет реакции подрядчика","Нет понимания состояния систем"]', 0, 3, ''),
|
||||
(3, 'Эксплуатационная модель', 'resolution_time', 'Среднее время устранения', 'select', '{"2h":"До 2 часов","24h":"До суток","days":"Несколько дней"}', 0, 4, ''),
|
||||
(3, 'Эксплуатационная модель', 'controller', 'Кто контролирует систему?', 'select', '{"engineer":"Штатный инженер","contractor":"Подрядчик","nobody":"Никто"}', 0, 5, ''),
|
||||
(4, 'Risk Assessment', 'no_archive', 'Нет архива видеонаблюдения (+25)', 'checkbox', NULL, 0, 1, ''),
|
||||
(4, 'Risk Assessment', 'no_power', 'Нет резервного питания (+20)', 'checkbox', NULL, 0, 2, ''),
|
||||
(4, 'Risk Assessment', 'no_regulations', 'Нет регламента обслуживания (+15)', 'checkbox', NULL, 0, 3, ''),
|
||||
(4, 'Risk Assessment', 'frequent_failures', 'Частые сбои систем (+20)', 'checkbox', NULL, 0, 4, ''),
|
||||
(4, 'Risk Assessment', 'no_documentation', 'Нет документации (+10)', 'checkbox', NULL, 0, 5, ''),
|
||||
(4, 'Risk Assessment', 'consequences', 'Потенциальные последствия', 'checkbox', '["loss_of_evidence","shutdown","fines","no_investigation","access_fail"]', 0, 6, ''),
|
||||
(4, 'Risk Assessment', 'confidence', 'Уровень уверенности в системе', 'select', '{"high":"Высокая","medium":"Средняя","low":"Низкая"}', 0, 7, ''),
|
||||
(5, 'Расчёт SLA', 'sla_level', 'Предпочтительный уровень обслуживания', 'select', '{"start":"Базовый (Start SLA)","business":"Стандарт (Business SLA)","enterprise":"Расширенный (Enterprise SLA)"}', 0, 1, ''),
|
||||
(5, 'Расчёт SLA', 'visit_frequency', 'Интенсивность обслуживания', 'select', '{"1":"1 выезд / мес","2":"2 выезда / мес","incident":"По инцидентам"}', 0, 2, ''),
|
||||
(5, 'Расчёт SLA', 'reaction_time', 'Требуемое время реакции', 'select', '{"24":"24 часа","4":"4 часа","2":"2 часа"}', 0, 3, ''),
|
||||
(5, 'Расчёт SLA', 'extra_247', '24/7 поддержка', 'checkbox', NULL, 0, 4, ''),
|
||||
(5, 'Расчёт SLA', 'extra_emergency', 'Аварийные выезды', 'checkbox', NULL, 0, 5, ''),
|
||||
(5, 'Расчёт SLA', 'extra_audit', 'Аудит', 'checkbox', NULL, 0, 6, ''),
|
||||
(5, 'Расчёт SLA', 'extra_docs', 'Документация', 'checkbox', NULL, 0, 7, ''),
|
||||
(5, 'Расчёт SLA', 'extra_contractors', 'Контроль подрядчиков', 'checkbox', NULL, 0, 8, '')
|
||||
ON DUPLICATE KEY UPDATE `id`=`id`;
|
||||
Reference in New Issue
Block a user