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