125 lines
7.5 KiB
SQL
Executable File
125 lines
7.5 KiB
SQL
Executable File
-- ========= 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 программы';
|