Files
mkd/backend/migrate_training_module.sql
2026-02-04 00:17:04 +05:00

125 lines
7.5 KiB
SQL
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ========= HR: ИНСТРУКТАЖИ И КУРСЫ (БЛОК ОБУЧЕНИЯ) =========
-- Тип обучения
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_type') THEN
CREATE TYPE training_type AS ENUM (
'instruction', -- Инструктаж
'course', -- Курс
'certification', -- Сертификация
'exam', -- Экзамен
'other' -- Другое
);
END IF;
END$$;
-- Категория обучения
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_category') THEN
CREATE TYPE training_category AS ENUM (
'safety', -- Техника безопасности
'fire_safety', -- Пожарная безопасность
'electrical', -- Электротехническая безопасность
'first_aid', -- Первая помощь
'professional', -- Профессиональное обучение
'compliance', -- Соответствие требованиям
'other' -- Другое
);
END IF;
END$$;
-- Статус прохождения обучения
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_status') THEN
CREATE TYPE training_status AS ENUM (
'not_started', -- Не начато
'in_progress', -- В процессе
'completed', -- Завершено
'failed', -- Не пройдено
'expired', -- Просрочено
'cancelled' -- Отменено
);
END IF;
END$$;
-- Таблица программ обучения (инструктажи и курсы)
CREATE TABLE IF NOT EXISTS training_programs (
id VARCHAR(50) PRIMARY KEY,
title TEXT NOT NULL, -- Название программы
description TEXT, -- Описание
type training_type NOT NULL, -- Тип обучения
category training_category NOT NULL, -- Категория
duration_hours NUMERIC(5, 2), -- Длительность в часах
validity_months INTEGER, -- Срок действия в месяцах (NULL = бессрочно)
is_required BOOLEAN DEFAULT false, -- Обязательное обучение
required_for_positions TEXT[], -- Должности, для которых обязательно
instructor_name TEXT, -- Инструктор/преподаватель
materials_url TEXT, -- Ссылка на материалы
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_training_programs_type ON training_programs(type);
CREATE INDEX IF NOT EXISTS idx_training_programs_category ON training_programs(category);
CREATE INDEX IF NOT EXISTS idx_training_programs_required ON training_programs(is_required);
-- Таблица прохождения обучения сотрудниками
CREATE TABLE IF NOT EXISTS employee_training (
id BIGSERIAL PRIMARY KEY,
employee_id VARCHAR(50) NOT NULL REFERENCES employees(id) ON DELETE CASCADE,
program_id VARCHAR(50) NOT NULL REFERENCES training_programs(id) ON DELETE CASCADE,
status training_status NOT NULL DEFAULT 'not_started',
-- Даты
start_date DATE, -- Дата начала
completion_date DATE, -- Дата завершения
expiry_date DATE, -- Дата окончания срока действия
-- Результаты
score NUMERIC(5, 2), -- Оценка/балл (если есть)
passed BOOLEAN, -- Сдано/не сдано
certificate_number TEXT, -- Номер сертификата
certificate_url TEXT, -- Ссылка на сертификат
-- Дополнительная информация
notes TEXT, -- Заметки
instructor_name TEXT, -- Кто проводил (может отличаться от программы)
location TEXT, -- Место проведения
-- Служебные поля
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- Уникальность: один сотрудник может проходить программу только один раз
-- (но можно пересдавать, если статус 'failed' или 'expired')
UNIQUE(employee_id, program_id)
);
CREATE INDEX IF NOT EXISTS idx_employee_training_employee ON employee_training(employee_id);
CREATE INDEX IF NOT EXISTS idx_employee_training_program ON employee_training(program_id);
CREATE INDEX IF NOT EXISTS idx_employee_training_status ON employee_training(status);
CREATE INDEX IF NOT EXISTS idx_employee_training_expiry ON employee_training(expiry_date);
-- Таблица истории прохождения (для отслеживания пересдач и обновлений)
CREATE TABLE IF NOT EXISTS employee_training_history (
id BIGSERIAL PRIMARY KEY,
employee_training_id BIGINT NOT NULL REFERENCES employee_training(id) ON DELETE CASCADE,
status training_status NOT NULL,
completion_date DATE,
score NUMERIC(5, 2),
passed BOOLEAN,
certificate_number TEXT,
notes TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_training_history_training ON employee_training_history(employee_training_id);
CREATE INDEX IF NOT EXISTS idx_training_history_date ON employee_training_history(created_at DESC);
-- Комментарии к таблицам
COMMENT ON TABLE training_programs IS 'Программы обучения: инструктажи, курсы, сертификации';
COMMENT ON TABLE employee_training IS 'Прохождение обучения сотрудниками';
COMMENT ON TABLE employee_training_history IS 'История прохождения обучения (для отслеживания пересдач)';
COMMENT ON COLUMN training_programs.validity_months IS 'Срок действия обучения в месяцах. NULL = бессрочно';
COMMENT ON COLUMN training_programs.required_for_positions IS 'Массив должностей, для которых обучение обязательно';
COMMENT ON COLUMN employee_training.expiry_date IS 'Дата окончания срока действия. Рассчитывается автоматически на основе validity_months программы';