/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GTBUNIDADEMEDIDA_REGRA;

CREATE TABLE TBUNIDADEMEDIDA_REGRA (
    ID                     INTEGER NOT NULL,
    UNIDADEMEDIDA_ORIGEM   INTEGER,
    UNIDADEMEDIDA_DESTINO  INTEGER,
    VALOR_DESTINO          NUMERIC(18,8),
    FATOR                  NUMERIC(18,8)
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBUNIDADEMEDIDA_REGRA ADD CONSTRAINT PK_TBREGRA_UNIDADEMEDIDA PRIMARY KEY (ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBUNIDADEMEDIDA_REGRA_B01D */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_REGRA_B01D FOR TBUNIDADEMEDIDA_REGRA
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);

DECLARE VARIABLE OLD_UNIDADEMEDIDA VARCHAR(500);
BEGIN
    
    HISTORICO = '';

    OLD_UNIDADEMEDIDA = COALESCE((SELECT FIRST 1 A.SIGLA||' - '||A.DESCRICAO FROM TBUNIDADEMEDIDA A WHERE A.ID = OLD.UNIDADEMEDIDA_ORIGEM), '');

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'UNIDADE ALTERNATIVA: '||OLD_UNIDADEMEDIDA||'  EXCLUIDA';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA', OLD.UNIDADEMEDIDA_ORIGEM, HISTORICO);
    END
END
^


/* Trigger: TTBUNIDADEMEDIDA_REGRA_B01I */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_REGRA_B01I FOR TBUNIDADEMEDIDA_REGRA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
    IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GTBUNIDADEMEDIDA_REGRA, 1);
END
^


/* Trigger: TTBUNIDADEMEDIDA_REGRA_B01U */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_REGRA_B01U FOR TBUNIDADEMEDIDA_REGRA
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE OLD_UNIDADEMEDIDA_1 VARCHAR(500);
DECLARE VARIABLE NEW_UNIDADEMEDIDA_1 VARCHAR(500);
DECLARE VARIABLE OLD_UNIDADEMEDIDA_2 VARCHAR(500);
DECLARE VARIABLE NEW_UNIDADEMEDIDA_2 VARCHAR(500);
BEGIN
    
    HISTORICO = '';

    OLD_UNIDADEMEDIDA_1 = COALESCE((SELECT FIRST 1 A.SIGLA||' - '||A.DESCRICAO FROM TBUNIDADEMEDIDA A WHERE A.ID = OLD.UNIDADEMEDIDA_ORIGEM), '');
    NEW_UNIDADEMEDIDA_1 = COALESCE((SELECT FIRST 1 A.SIGLA||' - '||A.DESCRICAO FROM TBUNIDADEMEDIDA A WHERE A.ID = NEW.UNIDADEMEDIDA_ORIGEM), '');
    OLD_UNIDADEMEDIDA_2 = COALESCE((SELECT FIRST 1 B.SIGLA||' - '||B.DESCRICAO FROM TBUNIDADEMEDIDA B WHERE B.ID = OLD.UNIDADEMEDIDA_DESTINO), '');
    NEW_UNIDADEMEDIDA_2 = COALESCE((SELECT FIRST 1 B.SIGLA||' - '||B.DESCRICAO FROM TBUNIDADEMEDIDA B WHERE B.ID = NEW.UNIDADEMEDIDA_DESTINO), '');

    IF (OLD.UNIDADEMEDIDA_ORIGEM <> NEW.UNIDADEMEDIDA_ORIGEM) THEN
    BEGIN
        HISTORICO = HISTORICO||' UM.ORIGEM:'||OLD_UNIDADEMEDIDA_1||'->'||NEW_UNIDADEMEDIDA_1;
    END

    IF (OLD.UNIDADEMEDIDA_DESTINO <> NEW.UNIDADEMEDIDA_DESTINO) THEN
    BEGIN
        HISTORICO = HISTORICO||' UM.DESTINO:'||OLD_UNIDADEMEDIDA_2||'->'||NEW_UNIDADEMEDIDA_2;
    END

    IF (OLD.VALOR_DESTINO <> NEW.VALOR_DESTINO) THEN
    BEGIN
        HISTORICO = HISTORICO||' VALOR DEST.:'||OLD.VALOR_DESTINO||'->'||NEW.VALOR_DESTINO;
    END

    IF (OLD.FATOR <> NEW.FATOR) THEN
    BEGIN
        HISTORICO = HISTORICO||' FATOR:'||OLD.FATOR||'->'||NEW.FATOR;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'UNIDADE ALTERNATIVA: '||NEW_UNIDADEMEDIDA_2||' ALTERADA:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA', OLD.UNIDADEMEDIDA_ORIGEM, FN_ELIPSE(HISTORICO, 500));
    END
END
^


/* Trigger: TTBUNIDADEMEDIDA_REGRA_B02I */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_REGRA_B02I FOR TBUNIDADEMEDIDA_REGRA
ACTIVE BEFORE INSERT POSITION 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);

DECLARE VARIABLE NEW_UNIDADEMEDIDA VARCHAR(500);
BEGIN
    
    HISTORICO = '';

    NEW_UNIDADEMEDIDA = COALESCE((SELECT FIRST 1 A.SIGLA||' - '||A.DESCRICAO FROM TBUNIDADEMEDIDA A WHERE A.ID = NEW.UNIDADEMEDIDA_ORIGEM), '');

    IF (NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'UNIDADE ALTERNATIVA: '||NEW_UNIDADEMEDIDA||' INCLUIDA';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA', NEW.UNIDADEMEDIDA_ORIGEM, HISTORICO);
    END
END
^

SET TERM ; ^



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN TBUNIDADEMEDIDA_REGRA.UNIDADEMEDIDA_ORIGEM IS 
'Unidade de Medida de Origem';

COMMENT ON COLUMN TBUNIDADEMEDIDA_REGRA.UNIDADEMEDIDA_DESTINO IS 
'Unidade de Medida de Destino';

COMMENT ON COLUMN TBUNIDADEMEDIDA_REGRA.VALOR_DESTINO IS 
'Valor uitlizado para calcular o fator da conversão';

COMMENT ON COLUMN TBUNIDADEMEDIDA_REGRA.FATOR IS 
'Fator que será utilizado no calculo da conversão';