баг-фикс завершён

This commit is contained in:
Zuev
2026-07-19 20:16:12 +03:00
parent bc0e1ab1b4
commit ee876f1acd
43 changed files with 1228 additions and 258 deletions

View File

@@ -254,12 +254,14 @@ ON CONFLICT (name) DO NOTHING;
CREATE TABLE IF NOT EXISTS student_groups (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
group_size BIGINT NOT NULL,
group_size BIGINT NOT NULL
CONSTRAINT chk_student_groups_group_size_positive CHECK (group_size > 0),
education_form_id BIGINT NOT NULL REFERENCES education_forms(id),
department_id BIGINT NOT NULL REFERENCES departments(id),
specialty_id BIGINT NOT NULL REFERENCES specialties(id),
specialty_profile_id BIGINT NOT NULL REFERENCES specialty_profiles(id),
year_start_study BIGINT NOT NULL,
year_start_study BIGINT NOT NULL
CONSTRAINT chk_student_groups_year_start_positive CHECK (year_start_study > 0),
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
active_from DATE,
@@ -289,7 +291,8 @@ CREATE TABLE IF NOT EXISTS subgroups (
id BIGSERIAL PRIMARY KEY,
group_id BIGINT NOT NULL REFERENCES student_groups(id) ON DELETE CASCADE,
name VARCHAR(100) NOT NULL,
student_capacity INT,
student_capacity INT NOT NULL
CONSTRAINT chk_subgroups_student_capacity_positive CHECK (student_capacity > 0),
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
active_from DATE,
active_to DATE,
@@ -299,6 +302,76 @@ CREATE TABLE IF NOT EXISTS subgroups (
UNIQUE(group_id, name)
);
CREATE OR REPLACE FUNCTION validate_student_group_subgroup_capacity()
RETURNS TRIGGER AS $$
DECLARE
active_capacity BIGINT;
BEGIN
SELECT COALESCE(SUM(student_capacity), 0)
INTO active_capacity
FROM subgroups
WHERE group_id = NEW.id
AND status <> 'ARCHIVED';
IF active_capacity > NEW.group_size THEN
RAISE EXCEPTION 'Сумма численностей активных подгрупп не может превышать численность группы'
USING ERRCODE = '23514',
CONSTRAINT = 'chk_student_group_subgroup_capacity';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER validate_student_group_subgroup_capacity
BEFORE UPDATE OF group_size ON student_groups
FOR EACH ROW
EXECUTE FUNCTION validate_student_group_subgroup_capacity();
CREATE OR REPLACE FUNCTION validate_subgroup_student_capacity()
RETURNS TRIGGER AS $$
DECLARE
group_capacity BIGINT;
allocated_capacity BIGINT;
BEGIN
SELECT group_size
INTO group_capacity
FROM student_groups
WHERE id = NEW.group_id
FOR UPDATE;
IF group_capacity IS NULL OR NEW.status = 'ARCHIVED' THEN
RETURN NEW;
END IF;
IF TG_OP = 'INSERT' THEN
SELECT COALESCE(SUM(student_capacity), 0)
INTO allocated_capacity
FROM subgroups
WHERE group_id = NEW.group_id
AND status <> 'ARCHIVED';
ELSE
SELECT COALESCE(SUM(student_capacity), 0)
INTO allocated_capacity
FROM subgroups
WHERE group_id = NEW.group_id
AND status <> 'ARCHIVED'
AND id <> OLD.id;
END IF;
IF allocated_capacity + NEW.student_capacity > group_capacity THEN
RAISE EXCEPTION 'Сумма численностей активных подгрупп не может превышать численность группы'
USING ERRCODE = '23514',
CONSTRAINT = 'chk_student_group_subgroup_capacity';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER validate_subgroup_student_capacity
BEFORE INSERT OR UPDATE OF group_id, student_capacity, status ON subgroups
FOR EACH ROW
EXECUTE FUNCTION validate_subgroup_student_capacity();
INSERT INTO subgroups (group_id, name, student_capacity)
SELECT
sg.id,