5631d85238
- V.1–V.3: saveTestDraft, fork при попытках; миграция 003 staff_id - V.4–V.6: REST /api/tests, activate, PATCH, start attempt - A: HR_DATABASE_URL + Werkzeug/bcrypt, JWT staffId, HR_AUTH - D.1: multipart /api/tests/import/document - Frontend: login, список тестов, экран версий/черновика/попытки - ТЗ: V.10 назначения vs активная версия; журнал приёма Made-with: Cursor
131 lines
4.3 KiB
SQL
131 lines
4.3 KiB
SQL
-- Initial database schema for clinic tests application
|
|
-- Version: 1.0
|
|
|
|
-- Enable UUID extension
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
-- Departments table
|
|
CREATE TABLE IF NOT EXISTS departments (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
name VARCHAR(255) NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- User roles enum
|
|
CREATE TYPE user_role AS ENUM ('hr', 'manager', 'employee');
|
|
|
|
-- Users table
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
login VARCHAR(100) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
full_name VARCHAR(255) NOT NULL,
|
|
role user_role NOT NULL DEFAULT 'employee',
|
|
department_id UUID REFERENCES departments(id),
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create index for login lookup
|
|
CREATE INDEX IF NOT EXISTS idx_users_login ON users(login);
|
|
CREATE INDEX IF NOT EXISTS idx_users_department ON users(department_id);
|
|
|
|
-- Tests table
|
|
CREATE TABLE IF NOT EXISTS tests (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
passing_threshold INTEGER DEFAULT 70,
|
|
time_limit INTEGER,
|
|
allow_back BOOLEAN DEFAULT true,
|
|
is_active BOOLEAN DEFAULT true,
|
|
is_versioned BOOLEAN DEFAULT false,
|
|
created_by UUID REFERENCES users(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Test versions table
|
|
CREATE TABLE IF NOT EXISTS test_versions (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
test_id UUID REFERENCES tests(id) ON DELETE CASCADE,
|
|
version INTEGER NOT NULL DEFAULT 1,
|
|
is_active BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(test_id, version)
|
|
);
|
|
|
|
-- Questions table
|
|
CREATE TABLE IF NOT EXISTS questions (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE,
|
|
text TEXT NOT NULL,
|
|
question_order INTEGER NOT NULL,
|
|
has_multiple_answers BOOLEAN DEFAULT false
|
|
);
|
|
|
|
-- Answer options table
|
|
CREATE TABLE IF NOT EXISTS answer_options (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
|
|
text TEXT NOT NULL,
|
|
is_correct BOOLEAN DEFAULT false,
|
|
option_order INTEGER NOT NULL
|
|
);
|
|
|
|
-- Test assignments table
|
|
CREATE TABLE IF NOT EXISTS test_assignments (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE,
|
|
assigned_by UUID REFERENCES users(id),
|
|
deadline DATE,
|
|
max_attempts INTEGER DEFAULT 1,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Assignment targets table
|
|
CREATE TYPE target_type AS ENUM ('department', 'user');
|
|
|
|
CREATE TABLE IF NOT EXISTS test_assignment_targets (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
assignment_id UUID REFERENCES test_assignments(id) ON DELETE CASCADE,
|
|
target_type target_type NOT NULL,
|
|
target_id UUID NOT NULL
|
|
);
|
|
|
|
-- Test attempts table
|
|
CREATE TYPE attempt_status AS ENUM ('in_progress', 'completed', 'expired');
|
|
|
|
CREATE TABLE IF NOT EXISTS test_attempts (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE,
|
|
user_id UUID REFERENCES users(id),
|
|
attempt_number INTEGER NOT NULL DEFAULT 1,
|
|
status attempt_status DEFAULT 'in_progress',
|
|
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
completed_at TIMESTAMP,
|
|
correct_count INTEGER DEFAULT 0,
|
|
total_questions INTEGER DEFAULT 0,
|
|
passed BOOLEAN DEFAULT false,
|
|
UNIQUE(test_version_id, user_id, attempt_number)
|
|
);
|
|
|
|
-- User answers table
|
|
CREATE TABLE IF NOT EXISTS user_answers (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
attempt_id UUID REFERENCES test_attempts(id) ON DELETE CASCADE,
|
|
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
|
|
selected_options UUID[] DEFAULT '{}'
|
|
);
|
|
|
|
-- Settings table
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
key VARCHAR(100) PRIMARY KEY,
|
|
value TEXT
|
|
);
|
|
|
|
-- Insert default admin user (password: admin123)
|
|
-- This will be done via application code to properly hash the password
|