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


CREATE GENERATOR GTBGRUPO_PRODUTO;

CREATE TABLE TBGRUPO_PRODUTO (
    ID                       INTEGER NOT NULL,
    DESCRICAO                VARCHAR(150) DEFAULT '',
    STATUS                   CHAR(1) DEFAULT '1',
    FAMILIA_ID               INTEGER,
    TIPOPRODUTO_ID           INTEGER,
    LOCALIZACAO_ID           INTEGER,
    GRADE_ID                 INTEGER,
    UNIDADEMEDIDA_SIGLA      VARCHAR(10),
    NCM_CODIGO               VARCHAR(10) DEFAULT '',
    HABILITA_COMPRA          CHAR(1) DEFAULT '0',
    HABILITA_VENDA           CHAR(1) DEFAULT '0',
    RENDIMENTO               NUMERIC(15,4),
    LARGURA                  NUMERIC(15,4),
    COMPOSICAO               VARCHAR(20),
    TOLERANCIA               NUMERIC(10,2) DEFAULT -2,
    PESOLIQUIDO              NUMERIC(10,5) DEFAULT 0,
    SEGURANCA                NUMERIC(15,4) DEFAULT 0,
    CUSTOUNITARIO_MEDIO      NUMERIC(10,5) DEFAULT 0,
    DESCRICAO_ETIQUETA       VARCHAR(100),
    CUBAGEM_ALTURA           NUMERIC(15,4),
    CUBAGEM_LARGURA          NUMERIC(15,4),
    CUBAGEM_COMPRIMENTO      NUMERIC(15,4),
    CONTROLE_BENEFICIAMENTO  CHAR(1) DEFAULT '0',
    INVENTARIO               CHAR(1) DEFAULT '0',
    PROGRAMAR_SEM_ESTOQUE    CHAR(1) DEFAULT '0',
    GERAR_OC                 CHAR(1) DEFAULT '0',
    FEEF                     CHAR(1) DEFAULT '0'
);




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

ALTER TABLE TBGRUPO_PRODUTO ADD CONSTRAINT PK_TBGRUPO_PRODUTO PRIMARY KEY (ID);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX ITBGRUPO_PRODUTO_01 ON TBGRUPO_PRODUTO (FAMILIA_ID);
CREATE INDEX ITBGRUPO_PRODUTO_02 ON TBGRUPO_PRODUTO (TIPOPRODUTO_ID);
CREATE INDEX ITBGRUPO_PRODUTO_03 ON TBGRUPO_PRODUTO (LOCALIZACAO_ID);
CREATE INDEX ITBGRUPO_PRODUTO_04 ON TBGRUPO_PRODUTO (GRADE_ID);
CREATE INDEX ITBGRUPO_PRODUTO_05 ON TBGRUPO_PRODUTO (UNIDADEMEDIDA_SIGLA);
CREATE INDEX ITBGRUPO_PRODUTO_06 ON TBGRUPO_PRODUTO (STATUS);


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



SET TERM ^ ;



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



/* Trigger: TTBGRUPO_PRODUTO_B01D */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B01D FOR TBGRUPO_PRODUTO
ACTIVE BEFORE DELETE POSITION 4
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    
    HISTORICO = '';

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO EXCLUIDO';
    END

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


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


/* Trigger: TTBGRUPO_PRODUTO_B01IU */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B01IU FOR TBGRUPO_PRODUTO
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
DECLARE VARIABLE FAMILIA_ID INTEGER;
BEGIN

    :FAMILIA_ID = FN_DESCRICAO('TBGRUPO_PRODUTO', NEW.ID, 'FAMILIA_ID');

    /* CHECA A CUBAGEM */
    IF (FN_PARAMETRO('TBFAMILIA.EXIGE_CUBAGEM', :FAMILIA_ID) = 1) THEN -- 0 = NAO / 1 = SIM
    BEGIN
        
        IF (COALESCE(NEW.CUBAGEM_ALTURA, 0) = 0 OR COALESCE(NEW.CUBAGEM_LARGURA, 0) = 0 OR COALESCE(NEW.CUBAGEM_COMPRIMENTO, 0) = 0) THEN
        BEGIN
            EXCEPTION "..." 'PRODUTO EXIGE CUBAGEM. INFORME ALTURA, LARGURA E COMPRIMENTO.' || FN_LINE(4);
        END

    END
    ELSE
    BEGIN
        NEW.CUBAGEM_ALTURA      = 0;
        NEW.CUBAGEM_LARGURA     = 0;
        NEW.CUBAGEM_COMPRIMENTO = 0;
    END


    /* CHECA O PESO */
    IF (FN_PARAMETRO('TBFAMILIA.EXIGE_PESO', :FAMILIA_ID) = 1) THEN -- 0 = NAO / 1 = SIM
    BEGIN
        
        IF (COALESCE(NEW.PESOLIQUIDO, 0) = 0) THEN
        BEGIN
            EXCEPTION "..."  'PRODUTO EXIGE PESO. INFORME O PESO EM GRAMAS.' || FN_LINE(4);
        END

    END

END
^


/* Trigger: TTBGRUPO_PRODUTO_B01U */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B01U FOR TBGRUPO_PRODUTO
ACTIVE BEFORE UPDATE POSITION 4
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE OLD_FAMILIA VARCHAR(500);
DECLARE VARIABLE NEW_FAMILIA VARCHAR(500);
DECLARE VARIABLE OLD_TIPOPRODUTO VARCHAR(500);
DECLARE VARIABLE NEW_TIPOPRODUTO VARCHAR(500);
DECLARE VARIABLE OLD_LOCALIZACAO VARCHAR(500);
DECLARE VARIABLE NEW_LOCALIZACAO VARCHAR(500);
DECLARE VARIABLE OLD_GRADE VARCHAR(500);
DECLARE VARIABLE NEW_GRADE VARCHAR(500);
DECLARE VARIABLE OLD_UNIDADEMEDIDA VARCHAR(500);
DECLARE VARIABLE NEW_UNIDADEMEDIDA VARCHAR(500);
BEGIN

    HISTORICO = '';

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

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

    IF (OLD.FAMILIA_ID <> NEW.FAMILIA_ID) THEN
    BEGIN
        OLD_FAMILIA = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.DESCRICAO FROM TBFAMILIA A WHERE A.CODIGO = OLD.FAMILIA_ID), '');
        NEW_FAMILIA = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.DESCRICAO FROM TBFAMILIA A WHERE A.CODIGO = OLD.FAMILIA_ID), '');

        HISTORICO = HISTORICO||' FAMILIA:'||OLD_FAMILIA||'->'||NEW_FAMILIA;
    END

    IF (OLD.TIPOPRODUTO_ID <> NEW.TIPOPRODUTO_ID) THEN
    BEGIN
        OLD_TIPOPRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(B.CODIGO, 4, '0')||' - '||B.DESCRICAO FROM TBTIPOPRODUTO B WHERE B.CODIGO = OLD.TIPOPRODUTO_ID), '');
        NEW_TIPOPRODUTO = COALESCE((SELECT FIRST 1 FN_LPAD(B.CODIGO, 4, '0')||' - '||B.DESCRICAO FROM TBTIPOPRODUTO B WHERE B.CODIGO = NEW.TIPOPRODUTO_ID), '');

        HISTORICO = HISTORICO||' TIPO DE PRODUTO:'||OLD_TIPOPRODUTO||'->'||NEW_TIPOPRODUTO;
    END

    IF (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) THEN
    BEGIN
        OLD_LOCALIZACAO = COALESCE((SELECT FIRST 1 FN_LPAD(C.CODIGO, 4, '0')||' - '||C.DESCRICAO FROM TBLOCALIZACAO C WHERE C.CODIGO = OLD.LOCALIZACAO_ID), '');
        NEW_LOCALIZACAO = COALESCE((SELECT FIRST 1 FN_LPAD(C.CODIGO, 4, '0')||' - '||C.DESCRICAO FROM TBLOCALIZACAO C WHERE C.CODIGO = NEW.LOCALIZACAO_ID), '');

        HISTORICO = HISTORICO||' LOCALIZACAO:'||OLD_LOCALIZACAO||'->'||NEW_LOCALIZACAO;
    END

    IF (OLD.GRADE_ID <> NEW.GRADE_ID) THEN
    BEGIN
        OLD_GRADE = COALESCE((SELECT FIRST 1 FN_LPAD(D.CODIGO, 4, '0')||' - '||D.DESCRICAO FROM TBGRADE D WHERE D.CODIGO = OLD.GRADE_ID), '');
        NEW_GRADE = COALESCE((SELECT FIRST 1 FN_LPAD(D.CODIGO, 4, '0')||' - '||D.DESCRICAO FROM TBGRADE D WHERE D.CODIGO = NEW.GRADE_ID), '');

        HISTORICO = HISTORICO||' GRADE:'||OLD_GRADE||'->'||NEW_GRADE;
    END

    IF (OLD.UNIDADEMEDIDA_SIGLA <> NEW.UNIDADEMEDIDA_SIGLA) THEN
    BEGIN
        OLD_UNIDADEMEDIDA = COALESCE((SELECT FIRST 1 E.SIGLA||' - '||E.DESCRICAO FROM TBUNIDADEMEDIDA E WHERE E.SIGLA = OLD.UNIDADEMEDIDA_SIGLA), '');
        NEW_UNIDADEMEDIDA = COALESCE((SELECT FIRST 1 E.SIGLA||' - '||E.DESCRICAO FROM TBUNIDADEMEDIDA E WHERE E.SIGLA = NEW.UNIDADEMEDIDA_SIGLA), '');

        HISTORICO = HISTORICO||' UM:'||OLD_UNIDADEMEDIDA||'->'||NEW_UNIDADEMEDIDA;
    END

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

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

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

    IF (OLD.RENDIMENTO <> NEW.RENDIMENTO) THEN
    BEGIN
        HISTORICO = HISTORICO||' RENDIMENTO:'||FN_FORMAT_NUMBER2(OLD.RENDIMENTO, 4)||'->'||FN_FORMAT_NUMBER2(NEW.RENDIMENTO, 4);
    END

    IF (OLD.LARGURA <> NEW.LARGURA) THEN
    BEGIN
        HISTORICO = HISTORICO||' LARGURA:'||FN_FORMAT_NUMBER2(OLD.LARGURA, 4)||'->'||FN_FORMAT_NUMBER2(NEW.LARGURA, 4);
    END
    
    IF (OLD.COMPOSICAO <> NEW.COMPOSICAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' COMPOSICAO:'||OLD.COMPOSICAO||'->'||NEW.COMPOSICAO;
    END

    IF (OLD.TOLERANCIA <> NEW.TOLERANCIA) THEN
    BEGIN
        HISTORICO = HISTORICO||' % TOLERANCIA:'||FN_FORMAT_NUMBER2(OLD.TOLERANCIA, 2)||'%'||'->'||FN_FORMAT_NUMBER2(NEW.TOLERANCIA, 2)||'%';
    END

    IF (OLD.PESOLIQUIDO <> NEW.PESOLIQUIDO) THEN
    BEGIN
        HISTORICO = HISTORICO||' PESO:'||FN_FORMAT_NUMBER2(OLD.PESOLIQUIDO, 5)||'g'||'->'||FN_FORMAT_NUMBER2(NEW.PESOLIQUIDO, 5)||'g';
    END

    IF (OLD.SEGURANCA <> NEW.SEGURANCA) THEN
    BEGIN
        HISTORICO = HISTORICO||'% SEGURANCA:'||FN_FORMAT_NUMBER2(OLD.SEGURANCA, 4)||'%'||'->'||FN_FORMAT_NUMBER2(NEW.SEGURANCA, 4)||'%';
    END

    IF (OLD.CUSTOUNITARIO_MEDIO <> NEW.CUSTOUNITARIO_MEDIO) THEN
    BEGIN
        HISTORICO = HISTORICO||' CUSTO MEDIO:'||FN_FORMAT_NUMBER2(OLD.CUSTOUNITARIO_MEDIO, 5)||'->'||FN_FORMAT_NUMBER2(NEW.CUSTOUNITARIO_MEDIO, 5);
    END

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

    IF (OLD.CUBAGEM_ALTURA <> NEW.CUBAGEM_ALTURA) THEN
    BEGIN
        HISTORICO = HISTORICO||' CUBAGEM ALTURA:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_ALTURA, 4)||'mm'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_ALTURA, 4)||'mm';
    END

    IF (OLD.CUBAGEM_LARGURA <> NEW.CUBAGEM_LARGURA) THEN
    BEGIN
        HISTORICO = HISTORICO||' CUBAGEM LARGURA:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_LARGURA, 4)||'MM'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_LARGURA, 4)||'MM';
    END

    IF (OLD.CUBAGEM_COMPRIMENTO <> NEW.CUBAGEM_COMPRIMENTO) THEN
    BEGIN
        HISTORICO = HISTORICO||' CUBAGEM COMPRIMENTO:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_COMPRIMENTO, 4)||'MM'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_COMPRIMENTO, 4)||'MM';
    END

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

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

    IF (OLD.PROGRAMAR_SEM_ESTOQUE <> NEW.PROGRAMAR_SEM_ESTOQUE) THEN
    BEGIN
        HISTORICO = HISTORICO||' PROG. SEM ESTOQUE:'||OLD.PROGRAMAR_SEM_ESTOQUE||'->'||NEW.PROGRAMAR_SEM_ESTOQUE;
    END

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

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

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'REGISTRO ALTERADO:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBGRUPO_PRODUTO', OLD.ID, FN_ELIPSE(HISTORICO, 500));
    END
END
^


/* Trigger: TTBGRUPO_PRODUTO_B02D */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B02D FOR TBGRUPO_PRODUTO
ACTIVE BEFORE DELETE POSITION 3
AS
BEGIN
    DELETE FROM TBGRUPO_PRODUTO_OPCONTABIL A WHERE A.GRUPO_PRODUTO_ID = OLD.ID;
END
^


/* Trigger: TTBGRUPO_PRODUTO_B02I */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B02I FOR TBGRUPO_PRODUTO
ACTIVE BEFORE INSERT POSITION 4
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO INCLUIDO';
    END

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


/* Trigger: TTBGRUPO_PRODUTO_B02IU */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B02IU FOR TBGRUPO_PRODUTO
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
AS
BEGIN
    IF (POSITION('(TERC)', NEW.DESCRICAO) > 0) THEN
    BEGIN
        NEW.INVENTARIO = '0';
    END
END
^


/* Trigger: TTBGRUPO_PRODUTO_B02U */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B02U FOR TBGRUPO_PRODUTO
ACTIVE BEFORE UPDATE POSITION 3
AS
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE HISTORICO VARCHAR(5000);
BEGIN

    /* ALTERA OS PRODUTOS VINCULADOS AO GRUPO */
    UPDATE TBPRODUTO P
        SET P.STATUS = NEW.STATUS, 
            P.FAMILIA_CODIGO = NEW.FAMILIA_ID, 
            P.FAMILIA_ALTERNATIVA = NEW.FAMILIA_ID, 
            P.TIPOPRODUTO_CODIGO = NEW.TIPOPRODUTO_ID, 
            P.LOCALIZACAO_CODIGO = NEW.LOCALIZACAO_ID, 
            P.GRADE_CODIGO = NEW.GRADE_ID, 
            P.UNIDADEMEDIDA_SIGLA = NEW.UNIDADEMEDIDA_SIGLA, 
            P.NCM_CODIGO = NEW.NCM_CODIGO, 
            P.HABILITA_COMPRA = NEW.HABILITA_COMPRA, 
            P.HABILITA_VENDA = NEW.HABILITA_VENDA, 
            P.TOLERANCIA = NEW.TOLERANCIA, 
            P.SEGURANCA = NEW.SEGURANCA, 
            P.DESCRICAO_ETIQUETA = NEW.DESCRICAO_ETIQUETA, 
            P.INVENTARIO = NEW.INVENTARIO, 
            P.PROGRAMAR_SEM_ESTOQUE = NEW.PROGRAMAR_SEM_ESTOQUE, 
            P.GERAR_OC = NEW.GERAR_OC, 
            P.FEEF = NEW.FEEF
        WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

    FOR
        SELECT
            P.CODIGO
        FROM TBPRODUTO P
        WHERE P.GRUPO_PRODUTO_ID = OLD.ID
    INTO
        :PRODUTO_ID
    DO
    BEGIN

        UPDATE TBPRODUTO_CONTABIL C
            SET C.CUSTOUNITARIO_MEDIO = NEW.CUSTOUNITARIO_MEDIO
            WHERE C.PRODUTO_CODIGO = :PRODUTO_ID;

        UPDATE TBPRODUTO_FICHA F
            SET F.CUBAGEM_ALTURA = NEW.CUBAGEM_ALTURA,
                F.CUBAGEM_LARGURA = NEW.CUBAGEM_LARGURA,
                F.CUBAGEM_COMPRIMENTO = NEW.CUBAGEM_COMPRIMENTO,
                F.CONTROLE_BENEFICIAMENTO = NEW.CONTROLE_BENEFICIAMENTO,
                F.RENDIMENTO = NEW.RENDIMENTO,
                F.COMPOSICAO = NEW.COMPOSICAO,
                F.PESOLIQUIDO = NEW.PESOLIQUIDO,
                F.LARGURA = NEW.LARGURA
            WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;

        /* SALVA UM HISTORICO NAS TABELAS QUE CONTEM PRODUTOS VINCULADOS AO GRUPO. OBS.: O HISTORICO DOS VALORES QUE FORAM ALTERADOS É PELAS PROPRIAS TRIGGERS DAS TABELAS */
        :HISTORICO = 'PRODUTO ALTERADO VIA VINCULO COM GRUPO DE PRODUTO. GRUPO DE PRODUTO: '||FN_LPAD(OLD.ID, 6, '0')||' - '||NEW.DESCRICAO;

        EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO', :PRODUTO_ID, FN_ELIPSE(:HISTORICO, 500));
        EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_CONTABIL', :PRODUTO_ID, FN_ELIPSE(:HISTORICO, 500));
        EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_FICHA', :PRODUTO_ID, FN_ELIPSE(:HISTORICO, 500));
    END

END
^


/* Trigger: TTBGRUPO_PRODUTO_B03D */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B03D FOR TBGRUPO_PRODUTO
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE P1 INTEGER;
DECLARE VARIABLE P2 INTEGER;
BEGIN

FOR
    SELECT
        (SELECT FIRST 1 A.MODELO_ID       FROM TBMODELO_CONSUMO_COR A WHERE A.PRODUTO_ID = OLD.ID),
        (SELECT FIRST 1 B.MODELO_CODIGO   FROM TBMODELO_CONSUMO B WHERE B.CONSUMO_PRODUTO_CODIGO = OLD.ID)
    FROM RDB$DATABASE
    INTO
        :P1,
        :P2
    DO
    BEGIN
        IF (:P1 > 0) THEN EXCEPTION "..." 'EXCLUSAO NAO PERMITIDA. PRODUTO JA USADO EM FICHA TECNICA DE MODELOS! MOD.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        IF (:P2 > 0) THEN EXCEPTION "..." 'EXCLUSAO NAO PERMITIDA. PRODUTO JA USADO EM FICHA TECNICA DE MODELOS! MOD.'||:P2||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
    END

END
^


/* Trigger: TTBGRUPO_PRODUTO_B03I */
CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B03I FOR TBGRUPO_PRODUTO
ACTIVE BEFORE INSERT POSITION 2
AS
BEGIN
    IF (COALESCE(NEW.SEGURANCA, 0) = 0) THEN
    BEGIN
        NEW.SEGURANCA = FN_PARAMETRO('TBFAMILIA.ESTOQUE_SEGURANCA', NEW.FAMILIA_ID);
    END
END
^

SET TERM ; ^



/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B01D IS 
'Histórico';

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B01I IS 
'Generator';

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B01IU IS 
'Realiza checagem da CUBAGEM e PESO';

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B01U IS 
'Histórico';

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B02D IS 
'Excluir registros das tabelas filhas';

COMMENT ON TRIGGER TTBGRUPO_PRODUTO_B02I IS 
'Histórico';



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

COMMENT ON COLUMN TBGRUPO_PRODUTO.STATUS IS 
'0 - INATIVO;
1 - ATIVO;';

COMMENT ON COLUMN TBGRUPO_PRODUTO.NCM_CODIGO IS 
'Código da Nomeclatura Comum do MERCOSUL';

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

ALTER TABLE TBMODELO_CONSUMO 
	ADD INC_GRUPO_PRODUTO CHAR(1) CHARACTER SET UTF8 DEFAULT '0' COLLATE UTF8,
	ADD GRUPO_PRODUTO_ID INTEGER DEFAULT 0;

COMMENT ON COLUMN TBMODELO_CONSUMO.INC_GRUPO_PRODUTO IS
'0 - Inclusão Individual;
1 - Inclusão Multipla por Grupo de Produto;';

ALTER TABLE TBMODELO_CONSUMO_COR
    ADD INC_GRUPO_PRODUTO CHAR(1) CHARACTER SET UTF8 DEFAULT '0' COLLATE UTF8,
	ADD GRUPO_PRODUTO_ID INTEGER DEFAULT 0;

COMMENT ON COLUMN TBMODELO_CONSUMO_COR.INC_GRUPO_PRODUTO IS
'0 - Inclusão Individual;
1 - Inclusão Multipla por Grupo de Produto;';


UPDATE TBMODELO_CONSUMO SET ID = GEN_ID(GTBMODELO_CONSUMO, 1) WHERE ID IS NULL;
UPDATE TBMODELO_CONSUMO_COR SET ID = GEN_ID(GTBMODELO_CONSUMO_COR, 1) WHERE ID IS NULL;


CREATE INDEX ITBMODELO_CONSUMO_16
ON TBMODELO_CONSUMO (ID);

CREATE INDEX ITBMODELO_CONSUMO_COR_34
ON TBMODELO_CONSUMO_COR (ID);

/**************************************************************************/

CREATE SEQUENCE GEN_AGRUPAMENTO_ID;

ALTER TRIGGER TTBMODELO_CONSUMO_COR_B3IU INACTIVE;


ALTER TABLE TBMODELO_CONSUMO
    ADD AGRUPAMENTO_ID INTEGER;

COMMENT ON COLUMN TBMODELO_CONSUMO.AGRUPAMENTO_ID IS
'ID de Agrupamento dos itens';

ALTER TABLE TBMODELO_CONSUMO_COR
    ADD AGRUPAMENTO_ID INTEGER;

COMMENT ON COLUMN TBMODELO_CONSUMO_COR.AGRUPAMENTO_ID IS
'ID de Agrupamento dos itens';


UPDATE TBMODELO_CONSUMO SET AGRUPAMENTO_ID = GEN_ID(GEN_AGRUPAMENTO_ID, 1) WHERE AGRUPAMENTO_ID IS NULL;
UPDATE TBMODELO_CONSUMO_COR SET AGRUPAMENTO_ID = GEN_ID(GEN_AGRUPAMENTO_ID, 1) WHERE AGRUPAMENTO_ID IS NULL;


CREATE INDEX ITBMODELO_CONSUMO_17
ON TBMODELO_CONSUMO (AGRUPAMENTO_ID);

CREATE INDEX ITBMODELO_CONSUMO_COR_35
ON TBMODELO_CONSUMO_COR (AGRUPAMENTO_ID);


SET TERM ^ ;

CREATE OR ALTER trigger ttbmodelo_consumo_b06i for tbmodelo_consumo
active before insert position 9
AS
BEGIN
    IF (NEW.AGRUPAMENTO_ID IS NULL) THEN
    BEGIN
        NEW.AGRUPAMENTO_ID = GEN_ID(GEN_AGRUPAMENTO_ID, 1);
    END

    IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GTBMODELO_CONSUMO, 1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbmodelo_consumo_cor_b06i for tbmodelo_consumo_cor
active before insert position 9
AS
BEGIN
    IF (NEW.AGRUPAMENTO_ID IS NULL) THEN
    BEGIN
        NEW.AGRUPAMENTO_ID = GEN_ID(GEN_AGRUPAMENTO_ID, 1);
    END

    IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GTBMODELO_CONSUMO_COR, 1);
END
^

SET TERM ; ^

ALTER TRIGGER TTBMODELO_CONSUMO_COR_B3IU ACTIVE;

/*********************************************************************************/

CREATE INDEX ITBPRODUTO_24
ON TBPRODUTO (STATUS);

CREATE INDEX ITBPRODUTO_25
ON TBPRODUTO (UNIDADEMEDIDA_SIGLA);

CREATE INDEX ITBPRODUTO_26
ON TBPRODUTO (TIPO_INC);

CREATE INDEX ITBPRODUTO_27
ON TBPRODUTO (GRUPO_PRODUTO_ID);


CREATE INDEX ITBMODELO_CONSUMO_08
ON TBMODELO_CONSUMO (MODELO_CODIGO);

CREATE INDEX ITBMODELO_CONSUMO_09
ON TBMODELO_CONSUMO (TAM);

CREATE INDEX ITBMODELO_CONSUMO_10
ON TBMODELO_CONSUMO (SETOR_CODIGO);

CREATE INDEX ITBMODELO_CONSUMO_11
ON TBMODELO_CONSUMO (TAM_ORIGEM);

CREATE INDEX ITBMODELO_CONSUMO_12
ON TBMODELO_CONSUMO (TAM_DESTINO);

CREATE INDEX ITBMODELO_CONSUMO_13
ON TBMODELO_CONSUMO (INC_GRUPO_PRODUTO);

CREATE INDEX ITBMODELO_CONSUMO_14
ON TBMODELO_CONSUMO (GRUPO_PRODUTO_ID);

CREATE INDEX ITBMODELO_CONSUMO_15
ON TBMODELO_CONSUMO (MATRIZ_ID);


CREATE INDEX ITBMODELO_CONSUMO_COR_31
ON TBMODELO_CONSUMO_COR (INC_GRUPO_PRODUTO);

CREATE INDEX ITBMODELO_CONSUMO_COR_32
ON TBMODELO_CONSUMO_COR (GRUPO_PRODUTO_ID);

CREATE INDEX ITBMODELO_CONSUMO_COR_33
ON TBMODELO_CONSUMO_COR (MATRIZ_ID);


CREATE INDEX ITBGRADE_02
ON TBGRADE (DESCRICAO);