баг-фикс завершён
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user