From 56385cab2bf2e61948fc0f15ae32997ad0ea16d6 Mon Sep 17 00:00:00 2001 From: JRGIL12 <108557695+JRGIL12@users.noreply.github.com> Date: Wed, 11 Dec 2024 03:09:58 -0400 Subject: [PATCH 1/4] Add triggers and functions to enforce contract constraints based on producer type --- commands.sql | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/commands.sql b/commands.sql index 13f9ebd..7e8e377 100644 --- a/commands.sql +++ b/commands.sql @@ -408,16 +408,17 @@ EXECUTE FUNCTION check_nacionalidad_productor_contrato(); CREATE OR REPLACE FUNCTION check_ContratoActivo() RETURNS TRIGGER AS $$ BEGIN - IF EXISTS ( - SELECT 1 - FROM CONTRATO - WHERE idSubastadora = NEW.idSubastadora - AND idProductora = NEW.idProductora - AND (cancelado IS NULL OR fechaemision > CURRENT_DATE - INTERVAL '1 year') - ) THEN - RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + IF NEW.tipoProductor <> 'Cg' THEN + IF EXISTS ( + SELECT 1 + FROM CONTRATO + WHERE idSubastadora = NEW.idSubastadora + AND idProductora = NEW.idProductora + AND (cancelado IS NULL OR fechaemision > CURRENT_DATE - INTERVAL '1 year') + ) THEN + RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + END IF; END IF; - RETURN NEW; END; $$ LANGUAGE plpgsql; @@ -428,6 +429,28 @@ FOR EACH ROW EXECUTE FUNCTION check_ContratoActivo(); +CREATE OR REPLACE FUNCTION check_ProductorCg() RETURNS TRIGGER AS $$ +BEGIN + IF NEW.tipoProductor = 'Cg' THEN + IF EXISTS ( + SELECT 1 + FROM CONTRATO + WHERE idProductora = NEW.idProductora + AND (tipoProductor <> 'Cg') + ) THEN + RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER check_ProductorCg +BEFORE INSERT OR UPDATE ON CONTRATO +FOR EACH ROW +EXECUTE FUNCTION check_ProductorCg(); + + -- Insertar datos de prueba en la tabla CONTRATO INSERT INTO CONTRATO (idSubastadora, idProductora, nContrato, fechaemision, porcentajeProduccion, tipoProductor, idrenovS, idrenovP, ren_nContrato, cancelado) VALUES (1, 1, 1001, '2023-01-01', 0.60, 'Ca', NULL, NULL, NULL, NULL), From fb0d54d8f515f916d97c58f519e2965c0fbf99b0 Mon Sep 17 00:00:00 2001 From: JRGIL12 <108557695+JRGIL12@users.noreply.github.com> Date: Wed, 11 Dec 2024 03:09:58 -0400 Subject: [PATCH 2/4] Add constraint to ensure idCatalogoProductora matches idContratoProductora in CANTIDAD_OFRECIDA table --- commands.sql | 41 ++++++++++++++++++++++++++++++++--------- validationNoCargada | 3 +++ 2 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 validationNoCargada diff --git a/commands.sql b/commands.sql index 13f9ebd..7e8e377 100644 --- a/commands.sql +++ b/commands.sql @@ -408,16 +408,17 @@ EXECUTE FUNCTION check_nacionalidad_productor_contrato(); CREATE OR REPLACE FUNCTION check_ContratoActivo() RETURNS TRIGGER AS $$ BEGIN - IF EXISTS ( - SELECT 1 - FROM CONTRATO - WHERE idSubastadora = NEW.idSubastadora - AND idProductora = NEW.idProductora - AND (cancelado IS NULL OR fechaemision > CURRENT_DATE - INTERVAL '1 year') - ) THEN - RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + IF NEW.tipoProductor <> 'Cg' THEN + IF EXISTS ( + SELECT 1 + FROM CONTRATO + WHERE idSubastadora = NEW.idSubastadora + AND idProductora = NEW.idProductora + AND (cancelado IS NULL OR fechaemision > CURRENT_DATE - INTERVAL '1 year') + ) THEN + RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + END IF; END IF; - RETURN NEW; END; $$ LANGUAGE plpgsql; @@ -428,6 +429,28 @@ FOR EACH ROW EXECUTE FUNCTION check_ContratoActivo(); +CREATE OR REPLACE FUNCTION check_ProductorCg() RETURNS TRIGGER AS $$ +BEGIN + IF NEW.tipoProductor = 'Cg' THEN + IF EXISTS ( + SELECT 1 + FROM CONTRATO + WHERE idProductora = NEW.idProductora + AND (tipoProductor <> 'Cg') + ) THEN + RAISE EXCEPTION 'Ya existe un contrato activo con la misma subastadora y productora'; + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER check_ProductorCg +BEFORE INSERT OR UPDATE ON CONTRATO +FOR EACH ROW +EXECUTE FUNCTION check_ProductorCg(); + + -- Insertar datos de prueba en la tabla CONTRATO INSERT INTO CONTRATO (idSubastadora, idProductora, nContrato, fechaemision, porcentajeProduccion, tipoProductor, idrenovS, idrenovP, ren_nContrato, cancelado) VALUES (1, 1, 1001, '2023-01-01', 0.60, 'Ca', NULL, NULL, NULL, NULL), diff --git a/validationNoCargada b/validationNoCargada new file mode 100644 index 0000000..3519e6e --- /dev/null +++ b/validationNoCargada @@ -0,0 +1,3 @@ +ALTER TABLE CANTIDAD_OFRECIDA +ADD CONSTRAINT chk_idCatalogoProductora_equals_idContratoProductora +CHECK (idCatalogoProductora = idContratoProductora); \ No newline at end of file From 85423606301b5cbd6e3844c21621ffe2c03be876 Mon Sep 17 00:00:00 2001 From: JRGIL12 <108557695+JRGIL12@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:12:51 -0400 Subject: [PATCH 3/4] Add check constraint to ensure idCatalogoProductora equals idContratoProductora in CANTIDAD_OFRECIDA table --- commands.sql | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/commands.sql b/commands.sql index 7e8e377..7d6fe3e 100644 --- a/commands.sql +++ b/commands.sql @@ -479,12 +479,15 @@ REFERENCES CONTRATO (idSubastadora, idProductora, nContrato), ADD CONSTRAINT fk_CatalogoProductor_CantidadOfrecida FOREIGN KEY (idCatalogoProductora, idCatalogoCorte, idVnb) REFERENCES CATALOGOPRODUCTOR (idProductora, idCorte, vbn); +ALTER TABLE CANTIDAD_OFRECIDA +ADD CONSTRAINT chk_idCatalogoProductora_equals_idContratoProductora +CHECK (idCatalogoProductora = idContratoProductora); -- Insertar datos de prueba en la tabla CANTIDAD_OFRECIDA INSERT INTO CANTIDAD_OFRECIDA (idContratoSubastadora, idContratoProductora, idNContrato, idCatalogoProductora,idCatalogoCorte, idVnb, cantidad) VALUES (1, 1, 1001, 1, 1, 1, 100), -(2, 2, 1002, 1, 1, 1,200), -(3, 3, 1003, 1, 1, 1,300); +(2, 2, 1002, 2, 2, 2,200), +(3, 3, 1003, 3, 3, 3 ,300); -- Verificar los datos insertados SELECT * FROM CANTIDAD_OFRECIDA; @@ -622,8 +625,8 @@ ADD CONSTRAINT fk_idFactura_lote FOREIGN KEY (idFactura) REFERENCES FACTURA (fac -- Insertar datos de prueba en la tabla LOTE INSERT INTO LOTE (idCantidadContratoSubastadora, idCantidadContratoProductora, idCantidad_NContrato, idCantidadCatalogoProductora, idCantidadCorte, idCantidadvnb, NumLote, bi, cantidad, precioInicial, precioFinal, idFactura) VALUES (1, 1, 1001, 1, 1, 1, 1, 1, 50, 10.00, 15.00, 1), -(2, 2, 1002, 1, 1, 1, 2, 2, 100, 20.00, 25.00, 2), -(3, 3, 1003, 1, 1, 1, 3, 3, 150, 30.00, 35.00, 3); +(2, 2, 1002, 2, 2, 2, 2, 2, 100, 20.00, 25.00, 2), +(3, 3, 1003, 3, 3, 3, 3, 3, 150, 30.00, 35.00, 3); -- Verificar los datos insertados SELECT * FROM LOTE; From 52e0bfebbd3533ccc04eeb66155fd4ce9872fe2a Mon Sep 17 00:00:00 2001 From: JRGIL12 <108557695+JRGIL12@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:23:31 -0400 Subject: [PATCH 4/4] Remove check constraint for idCatalogoProductora and idContratoProductora in CANTIDAD_OFRECIDA table --- validationNoCargada | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 validationNoCargada diff --git a/validationNoCargada b/validationNoCargada deleted file mode 100644 index 3519e6e..0000000 --- a/validationNoCargada +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE CANTIDAD_OFRECIDA -ADD CONSTRAINT chk_idCatalogoProductora_equals_idContratoProductora -CHECK (idCatalogoProductora = idContratoProductora); \ No newline at end of file