Initial commit MKD fixes
This commit is contained in:
124
backend/migrate_training_module.sql
Executable file
124
backend/migrate_training_module.sql
Executable file
@@ -0,0 +1,124 @@
|
||||
-- ========= 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 программы';
|
||||
Reference in New Issue
Block a user