Initial commit MKD fixes

This commit is contained in:
Arsen
2026-02-04 00:17:04 +05:00
commit de94ad707b
312 changed files with 138754 additions and 0 deletions

View 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 программы';