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