CREATE TABLE TBREGRA_FAMILIA_CFOP (
	ID INTEGER NOT NULL,
	ESTABELECIMENTO_ID INTEGER NOT NULL,
	FAMILIA_ID INTEGER NOT NULL,
	CFOP_ORIGEM VARCHAR(5) NOT NULL,
	CFOP_DESTINO VARCHAR(5) NOT NULL,
	OPERACAO_CODIGO VARCHAR(3) NOT NULL);
	
	
ALTER TABLE TBREGRA_FAMILIA_CFOP
ADD CONSTRAINT PK_TBREGRA_FAMILIA_CFOP
PRIMARY KEY (ID);
	
CREATE SEQUENCE GTBREGRA_FAMILIA_CFOP;
	
CREATE TRIGGER TBREGRA_FAMILIA_CFOP_B01I FOR TBREGRA_FAMILIA_CFOP
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
	IF (NEW.ID IS NULL) THEN
		NEW.ID = GEN_ID(GTBREGRA_FAMILIA_CFOP,1);
END;

CREATE OR ALTER TRIGGER TBREGRA_FAMILIA_CFOP_B02I FOR TBREGRA_FAMILIA_CFOP
ACTIVE BEFORE INSERT POSITION 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

    IF ( NEW.ID > 0) THEN
    BEGIN
        HISTORICO = 'REGRA INCLUIDA: ESTAB. '||NEW.ESTABELECIMENTO_ID||' DE '||NEW.CFOP_ORIGEM||' PARA '||NEW.CFOP_DESTINO||' OPER '||NEW.OPERACAO_CODIGO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBFAMILIA', NEW.FAMILIA_ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TBREGRA_FAMILIA_CFOP_B01U FOR TBREGRA_FAMILIA_CFOP
ACTIVE BEFORE UPDATE POSITION 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

    IF( OLD.CFOP_ORIGEM     <> NEW.CFOP_ORIGEM  OR
        OLD.CFOP_DESTINO    <> NEW.CFOP_DESTINO OR
        OLD.OPERACAO_CODIGO <> NEW.OPERACAO_CODIGO) THEN
    BEGIN
       HISTORICO = 'REGRA ALTERADA: ESTAB. '||OLD.ESTABELECIMENTO_ID||' DE '||OLD.CFOP_ORIGEM||' PARA '||OLD.CFOP_DESTINO||' OPER '||OLD.OPERACAO_CODIGO||'->'||' ESTAB. '||NEW.ESTABELECIMENTO_ID||' DE '||NEW.CFOP_ORIGEM||' PARA '||NEW.CFOP_DESTINO||' OPER '||NEW.OPERACAO_CODIGO;
    END

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBFAMILIA', NEW.FAMILIA_ID, FN_ELIPSES(HISTORICO,500));
    END

END;


CREATE OR ALTER TRIGGER TBREGRA_FAMILIA_CFOP_B01D FOR TBREGRA_FAMILIA_CFOP
ACTIVE BEFORE DELETE POSITION 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

    IF ( OLD.ID > 0) THEN
    BEGIN
        HISTORICO = 'REGRA EXCLUIDA: ESTAB. '||OLD.ESTABELECIMENTO_ID||' DE '||OLD.CFOP_ORIGEM||' PARA '||OLD.CFOP_DESTINO||' OPER '||OLD.OPERACAO_CODIGO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBFAMILIA', OLD.FAMILIA_ID, HISTORICO);
    END
END;


-- TRIGGER PARA VALIDAÇÃO DE REGRA FAMÍLIA -> CFOP (TBNFS_ITEM)

CREATE OR ALTER trigger tbnfs_item_b05i for tbnfs_item
active before insert position 5
AS
DECLARE VARIABLE FAMILIA_ID INTEGER;
DECLARE VARIABLE ID_REGRA INTEGER;
DECLARE VARIABLE CFOP_DESTINO VARCHAR(5);

BEGIN

    /* BUSCA FAMILIA DO PRODUTO */
    SELECT T.FAMILIA_CODIGO FROM TBPRODUTO T WHERE T.CODIGO = NEW.PRODUTO_CODIGO INTO :FAMILIA_ID;

    IF(:FAMILIA_ID > 0) THEN
    BEGIN
        /* BUSCA PARÂMETROS DA REGRA FAMÍLIA -> CFOP */

        SELECT FIRST 1 T.ID, T.CFOP_DESTINO FROM TBREGRA_FAMILIA_CFOP T
            WHERE   T.ESTABELECIMENTO_ID = NEW.ESTABELECIMENTO_CODIGO
                AND T.FAMILIA_ID         = :FAMILIA_ID
                AND T.CFOP_ORIGEM        = NEW.CFOP_CODIGO
                AND T.OPERACAO_CODIGO           = NEW.OPERACAO_CODIGO INTO :ID_REGRA, :CFOP_DESTINO;

            IF(:ID_REGRA > 0) THEN
            BEGIN
                /* DEFINE NOVO VALOR DO CFOP DE ACORDO COM A REGRA ENCONTRADA */
                NEW.CFOP_CODIGO = :CFOP_DESTINO;
                NEW.FISCAL_CFOP_CODIGO = :CFOP_DESTINO;
            END
    END

END;

COMMENT ON TRIGGER TBNFS_ITEM_B05I IS 'REGRA PARA VALIDAÇÃO DE CFOP''S DE ACORDO COM A FAMÍLIA DO PRODUTO';


-- TRIGGER PARA VALIDAÇÃO DE REGRA FAMÍLIA -> CFOP (TBNFE_ITEM)

CREATE TRIGGER TBNFE_ITEM_B05I FOR TBNFE_ITEM
ACTIVE BEFORE INSERT POSITION 5
AS
DECLARE VARIABLE FAMILIA_ID INTEGER;
DECLARE VARIABLE ID_REGRA INTEGER;
DECLARE VARIABLE CFOP_DESTINO VARCHAR(5);

BEGIN

    /* BUSCA FAMILIA DO PRODUTO */
    SELECT T.FAMILIA_CODIGO FROM TBPRODUTO T WHERE T.CODIGO = NEW.PRODUTO_CODIGO INTO :FAMILIA_ID;

    IF(:FAMILIA_ID > 0) THEN
    BEGIN
        /* BUSCA PARÂMETROS DA REGRA FAMÍLIA -> CFOP */

        SELECT FIRST 1 T.ID, T.CFOP_DESTINO FROM TBREGRA_FAMILIA_CFOP T
            WHERE   T.ESTABELECIMENTO_ID = NEW.ESTABELECIMENTO_CODIGO
                AND T.FAMILIA_ID         = :FAMILIA_ID
                AND T.CFOP_ORIGEM        = NEW.CFOP_CODIGO
                AND T.OPERACAO_CODIGO    = NEW.OPERACAO_CODIGO INTO :ID_REGRA, :CFOP_DESTINO;

            IF(:ID_REGRA > 0) THEN
            BEGIN
                /* DEFINE NOVO VALOR DO CFOP DE ACORDO COM A REGRA ENCONTRADA */
                NEW.CFOP_CODIGO = :CFOP_DESTINO;
                NEW.FISCAL_CFOP_CODIGO = :CFOP_DESTINO;
            END
    END

END;

COMMENT ON TRIGGER TBNFE_ITEM_B05I IS 'REGRA PARA VALIDAÇÃO DE CFOP''S DE ACORDO COM A FAMÍLIA DO PRODUTO';
