
SET SQL DIALECT 3; 

/* CREATE DATABASE '/var/lib/firebird/3.0/data/PRUEBA.FDB' PAGE_SIZE 4096 DEFAULT CHARACTER SET NONE; */


/*  Generators or sequences */
CREATE GENERATOR GEN_IDLOG;

COMMIT WORK;

/* Table: DEPARTAMENTO, Owner: SYSDBA */
CREATE TABLE DEPARTAMENTO (NOMBRE CHAR(50) NOT NULL,
        GERENCIA CHAR(100) NOT NULL,
CONSTRAINT PK_DEPARTAMENTO PRIMARY KEY (NOMBRE));

/* Table: GERENCIA, Owner: SYSDBA */
CREATE TABLE GERENCIA (NOMBRE CHAR(100) NOT NULL,
CONSTRAINT PK_GERENCIA PRIMARY KEY (NOMBRE));

/* Table: GERENCIA_AUX, Owner: SYSDBA */
CREATE TABLE GERENCIA_AUX (NOMBRE CHAR(100) NOT NULL,
        CANTIDAD INTEGER NOT NULL,
CONSTRAINT PK_GERENCIA_AUX PRIMARY KEY (NOMBRE));

/* Table: LOG, Owner: SYSDBA */
CREATE TABLE "LOG" (ID INTEGER NOT NULL,
        USUARIO CHAR(32) NOT NULL,
        FECHA_HORA TIMESTAMP NOT NULL,
        TABLA VARCHAR(100) NOT NULL,
        OPERACION CHAR(1) NOT NULL,
        DESCRIPCION VARCHAR(100) NOT NULL,
CONSTRAINT PK_LOG PRIMARY KEY (ID));

ALTER TABLE DEPARTAMENTO ADD CONSTRAINT FK_DEPARTAMENTO_GERENCIA FOREIGN KEY (GERENCIA) REFERENCES GERENCIA (NOMBRE);

/* View: V_GERENCIA, Owner: SYSDBA */
CREATE VIEW V_GERENCIA (NOMBRE, CANTIDAD) AS
SELECT G.NOMBRE,GA.CANTIDAD
FROM GERENCIA G INNER JOIN GERENCIA_AUX GA 
     ON G.NOMBRE = GA.NOMBRE;

/*  Exceptions */
CREATE EXCEPTION EX_ERROR 'Operacion no permitida';
SET TERM ^ ;

/* Triggers only will work for SQL triggers */
CREATE TRIGGER TRG_BIDEPARTAMENTO FOR DEPARTAMENTO 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
	/* NO PUEDO AGREGAR DEPTO SI LA GERENCIA YA TIENE 3 DEPTOS  */ 
	IF ( (SELECT CANTIDAD FROM GERENCIA_AUX WHERE NOMBRE = NEW.GERENCIA) >= 3 ) THEN 
        EXCEPTION EX_ERROR 'Gerencia ' || NEW.GERENCIA || ' no acepta mas departamentos';
END ^

CREATE TRIGGER TRG_AIDEPARTAMENTO FOR DEPARTAMENTO 
ACTIVE AFTER INSERT POSITION 0 
AS 
BEGIN 
	/* SI AGREGUE DEPTO DEBO CONTARLO EN GERENCIA_AUX */ 
	UPDATE GERENCIA_AUX SET CANTIDAD = CANTIDAD + 1 WHERE NOMBRE = NEW.GERENCIA;
END ^

CREATE TRIGGER TRG_BUDEPARTAMENTO FOR DEPARTAMENTO 
ACTIVE BEFORE UPDATE POSITION 0 
AS 
BEGIN 
	/* NO PERMITO CAMBIO EN DEPTO */
	EXCEPTION EX_ERROR 'No se permiten cambios en Depto'; 
END ^

CREATE TRIGGER TRG_ADDEPARTAMENTO FOR DEPARTAMENTO 
ACTIVE AFTER DELETE POSITION 0 
AS 
BEGIN 
	/* SI BORRE DEPTO DEBO RESTAR UNO DE GERENCIA_AUX */ 
	UPDATE GERENCIA_AUX SET CANTIDAD = CANTIDAD - 1 WHERE NOMBRE = OLD.GERENCIA;
END ^

CREATE TRIGGER TRG_BIGERENCIA FOR GERENCIA 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
	/* TODOS LOS NOMBRES DE GERENCIA DEBEN ESTAR EN MAYUSCULAS */ 
	NEW.NOMBRE = UPPER(NEW.NOMBRE);
	--IF ( NEW.NOMBRE = 'SISTEMAS' ) THEN EXCEPTION EX_ERROR 'No se puede dar de alta a gerencia ' || new.NOMBRE;
END ^

CREATE TRIGGER TRG_AIGERENCIA FOR GERENCIA 
ACTIVE AFTER INSERT POSITION 0 
AS 
BEGIN 
	/* LOGEO EL INSERT HECHO EN TABLA GERENCIA, VER TABLA LOG */ 
	INSERT INTO LOG(TABLA,OPERACION,DESCRIPCION) VALUES('GERENCIA','I','DI DE ALTA GERENCIA: ' || NEW.NOMBRE);
	INSERT INTO GERENCIA_AUX(NOMBRE,CANTIDAD) VALUES(NEW.NOMBRE,0);
END ^

CREATE TRIGGER TRG_BUGERENCIA FOR GERENCIA 
ACTIVE BEFORE UPDATE POSITION 0 
AS 
BEGIN 
	/* NO PERMITO CAMBIOS EN ESTA TABLA */
	EXCEPTION EX_ERROR 'No se permiten cambios en Gerencia';
END ^

CREATE TRIGGER TRG_ADGERENCIA FOR GERENCIA 
ACTIVE AFTER DELETE POSITION 0 
AS 
BEGIN 
	/* SI BORRE EN GERENCIA, TAMBIEN BORRO EN GERENCIA_AUX */
	DELETE FROM GERENCIA_AUX WHERE NOMBRE = OLD.NOMBRE; 
END ^

CREATE TRIGGER TRG_BILOG FOR "LOG" 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
	/* enter trigger code here */ 
	NEW.ID = GEN_ID(GEN_IDLOG,1); -- SUMA UNO A GEN_IDLOG Y DEVUELVE SU VALOR
	NEW.USUARIO = USER;
	NEW.FECHA_HORA = CURRENT_TIMESTAMP;
END ^


SET TERM ; ^
COMMIT WORK;
