UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO)
    VALUES (14210, 'LOG', 'LOG', '1', '', 'REGISTRO DE CONFERÊNCIA DE PEÇAS DOS PEDIDOS')
    MATCHING (CONTROLE);

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

ALTER TABLE TBCONFERENCIA
    ADD DATAHORA_FIM TIMESTAMP,
    ADD SEQUENCIA VARCHAR(3);
	
ALTER TABLE TBCONFERENCIA_ITEM
    ADD QTD_ALOCADA NUMERIC(15,4),
    ADD QTD_DISPONIVEL NUMERIC(15,4);

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

COMMENT ON COLUMN TBCONFERENCIA.TABELA IS 
'NFE - NOTA FISCAL DE ENTRADA
NFS - NOTA FISCAL DE SAÍDA
PED - PEDIDOS';

COMMENT ON COLUMN TBCONFERENCIA.DATAHORA IS 
'Data do Inicio da Conferência na Tela 14210';

COMMENT ON COLUMN TBCONFERENCIA.STATUS IS 
'0 - CONFERÊNCIA NÃO REALIZADA;
1 - CONFERÊNCIA INICIADA;
2 - CONFERÊNCIA FINALIZADA (OK);
3 - CONFERÊNCIA FINALIZADA COM DIVERGÊNCIAS;
4 - CONFERÊNCIA FATURADA;';

COMMENT ON COLUMN TBCONFERENCIA.DATAHORA_FIM IS 
'Data do Fim da Conferência (Utlizada na 14210)';

COMMENT ON COLUMN TBCONFERENCIA.SEQUENCIA IS 
'Sequencia utilizada quando incluido conferencias de pedidos repetidos';

/**************************************************************************/
/*************************** TBCONFERENCIA ********************************/
/**************************************************************************/

DROP TRIGGER TBCONFERENCIA_BI;
DROP TRIGGER TBCONFERENCIA_B02I;

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01i for tbconferencia
active before insert position 0
AS
BEGIN
	IF (NEW.ID IS NULL) THEN
		NEW.ID = GEN_ID(GTBCONFERENCIA, 1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b02i for tbconferencia
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE DESC_STTS_NEW VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN

    HISTORICO = '';
    
    IF (NEW.ID > 0) THEN
    BEGIN
        :DESC_STTS_NEW = '';
        
        IF (NEW.STATUS = 0) THEN
        BEGIN
            :DESC_STTS_NEW = 'NAO REALIZADA';
        END ELSE IF (NEW.STATUS = 1) THEN
        BEGIN
            :DESC_STTS_NEW = 'INICIADA';
        END ELSE IF (NEW.STATUS = 2) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA OK';
        END ELSE IF (NEW.STATUS = 3) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA COM DIVERGÊNCIAS';
        END ELSE IF (NEW.STATUS = 4) THEN
        BEGIN
            :DESC_STTS_NEW = 'FATURADA';
        END

        IF (NEW.TABELA = 'PED') THEN
        BEGIN
            :DESC_STTS_NEW = 'INCLUIDA';
        END
    
        HISTORICO = HISTORICO||'CONFERENCIA '||:DESC_STTS_NEW;
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (NEW.TABELA = 'NFE') THEN
        BEGIN
            :HISTORICO_ID = '01'||NEW.TABELA_ID;
        END ELSE IF (NEW.TABELA = 'NFS') THEN
        BEGIN
            :HISTORICO_ID = '02'||NEW.TABELA_ID;
        END ELSE IF (NEW.TABELA = 'PED') THEN
        BEGIN
            :HISTORICO_ID = '03'||NEW.TABELA_ID;
        END
    
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
    END
END
^

SET TERM ; ^

DROP TRIGGER TBCONFERENCIA_B01U;

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01u for tbconferencia
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);
DECLARE VARIABLE DESC_STTS_OLD VARCHAR(500);
DECLARE VARIABLE DESC_STTS_NEW VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;

DECLARE VARIABLE OLD_USUARIO VARCHAR(500);
DECLARE VARIABLE NEW_USUARIO VARCHAR(500);
BEGIN

    :HISTORICO = '';

    OLD_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = OLD.USUARIO_ID), '');
    NEW_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = NEW.USUARIO_ID), '');

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

    IF (OLD.TABELA_ID <> NEW.TABELA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' CODIGO:'||FN_LPAD(OLD.TABELA_ID, 8, '0')||'->'||FN_LPAD(NEW.TABELA_ID, 8, '0');
    END

    IF ((OLD.DATAHORA <> NEW.DATAHORA) OR (OLD.DATAHORA IS NULL AND NEW.DATAHORA IS NOT NULL)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA INI:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA);
    END

    IF (OLD.USUARIO_ID <> NEW.USUARIO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' USUARIO:'||OLD_USUARIO||'->'||NEW_USUARIO;
    END

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        :DESC_STTS_OLD = '';
        :DESC_STTS_NEW = '';

        -- DESCRIÇÃO DE STATUS PARA ANTIGO STATUS DA CONFERÊNCIA
        IF (OLD.STATUS = 0) THEN
        BEGIN
            :DESC_STTS_OLD = 'NAO REALIZADA';
        END ELSE IF (OLD.STATUS = 1) THEN
        BEGIN
            :DESC_STTS_OLD = 'INICIADA';
        END ELSE IF (OLD.STATUS = 2) THEN
        BEGIN
            :DESC_STTS_OLD = 'FINALIZADA OK';
        END ELSE IF (OLD.STATUS = 3) THEN
        BEGIN
            :DESC_STTS_OLD = 'FINALIZADA COM DIVERGÊNCIAS';
        END ELSE IF (OLD.STATUS = 4) THEN
        BEGIN
            :DESC_STTS_OLD = 'FATURADA';
        END

        -- DESCRIÇÃO DE STATUS PARA NOVO STATUS DA CONFERÊNCIA
        IF (NEW.STATUS = 0) THEN
        BEGIN
            :DESC_STTS_NEW = 'NAO REALIZADA';
        END ELSE IF (NEW.STATUS = 1) THEN
        BEGIN
            :DESC_STTS_NEW = 'INICIADA';
        END ELSE IF (NEW.STATUS = 2) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA OK';
        END ELSE IF (NEW.STATUS = 3) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA COM DIVERGÊNCIAS';
        END ELSE IF (NEW.STATUS = 4) THEN
        BEGIN
            :DESC_STTS_NEW = 'FATURADA';
        END

        HISTORICO = HISTORICO||' STATUS:'||:DESC_STTS_OLD||'->'||:DESC_STTS_NEW;
    END

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

    IF ((OLD.DATAHORA_FIM <> NEW.DATAHORA_FIM) OR (OLD.DATAHORA_FIM IS NULL AND NEW.DATAHORA_FIM IS NOT NULL)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA FIM:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA_FIM)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA_FIM);
    END

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

    -- GRAVAR HISTORICO
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (OLD.TABELA = 'NFE') THEN
        BEGIN
          :HISTORICO_ID = '01'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'NFS') THEN
        BEGIN
          :HISTORICO_ID = '02'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'PED') THEN
        BEGIN
          :HISTORICO_ID = '03'||OLD.TABELA_ID;
        END
    
        HISTORICO = 'CONFERENCIA ALTERADA:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, FN_ELIPSE(:HISTORICO, 500));
    END
END
^

SET TERM ; ^

DROP TRIGGER TBCONFERENCIA_B01D;

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01d for tbconferencia
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN
    
    HISTORICO = '';
	
	IF (OLD.STATUS = 4) THEN
	BEGIN
		EXCEPTION "..." 'ESTA CONFERENCIA JÁ FOI FATURADA. EXCLUSAO NAO AUTORIZADA!';
	END
    
    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'CONFERENCIA EXCLUIDA';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (OLD.TABELA = 'NFE') THEN
        BEGIN
            :HISTORICO_ID = '01'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'NFS') THEN
        BEGIN
            :HISTORICO_ID = '02'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'PED') THEN
        BEGIN
            :HISTORICO_ID = '03'||OLD.TABELA_ID;
        END
    
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b02d for tbconferencia
active before delete position 1
AS
BEGIN
    DELETE FROM TBCONFERENCIA_ITEM A WHERE A.CONFERENCIA_ID = OLD.ID; /* Exclui os registros filhos */
END
^

SET TERM ; ^

/**************************************************************************/
/*************************** TBCONFERENCIA_ITEM ***************************/
/**************************************************************************/

DROP TRIGGER TBCONFERENCIA_ITEM_BI;

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01i for tbconferencia_item
active before insert position 0
AS
BEGIN
    IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GTBCONFERENCIA_ITEM, 1);
END
^

SET TERM ; ^