SET TERM ^ ;

CREATE OR ALTER trigger ttbgrupo_produto_opcont_b02iud for tbgrupo_produto_opcontabil
active before insert or update or delete position 2
AS
DECLARE VARIABLE ID_OPCONT INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE HISTORICO VARCHAR(5000);
BEGIN

    FOR
        SELECT
            P.CODIGO
        FROM TBPRODUTO P
        WHERE P.GRUPO_PRODUTO_ID = COALESCE(NEW.GRUPO_PRODUTO_ID, OLD.GRUPO_PRODUTO_ID)
    INTO
        :PRODUTO_ID
    DO
    BEGIN
        
        :HISTORICO = '';

        IF (INSERTING) THEN
        BEGIN


            :HISTORICO = :HISTORICO||'OPERACAO CONTABIL INCLUIDA VIA VINCULO COM GRUPO DE PRODUTO. GRUPO DE PRODUTO: '||FN_LPAD(NEW.GRUPO_PRODUTO_ID, 6, '0');
            
            update or INSERT INTO TBPRODUTO_OPERACAO_CONTABIL (PRODUTO_ID, OPERACAO_CODIGO, CONTA_CONTABIL, OBSERVACAO, DATAHORA, CCUSTO, GRUPO_PROD_OP_ID)
                VALUES ( :PRODUTO_ID, NEW.OPERACAO_CODIGO, NEW.CONTA_CONTABIL, NEW.OBSERVACAO, NEW.DATAHORA, NEW.CCUSTO_CODIGO, NEW.ID)
                MATCHING(CONTA_CONTABIL,OPERACAO_CODIGO,CCUSTO,PRODUTO_ID);

            ID_OPCONT = coalesce((select id from TBPRODUTO_OPERACAO_CONTABIL where CONTA_CONTABIL = new.CONTA_CONTABIL and OPERACAO_CODIGO = new.OPERACAO_CODIGO and CCUSTO = new.CCUSTO_CODIGO and PRODUTO_ID = :PRODUTO_ID),0);

            if(ID_OPCONT = 0)then
            begin
               exception "..." 'ERRO AO REPLICAR NA TABELA DE PRODUTO';
            end

            EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_OPERACAO_CONTABIL', :ID_OPCONT, FN_ELIPSE(:HISTORICO, 500));

        END

        IF (UPDATING) THEN
        BEGIN

--            :ID_OPCONT = COALESCE((SELECT A.ID FROM TBPRODUTO_OPERACAO_CONTABIL A WHERE A.GRUPO_PROD_OP_ID = OLD.ID), 0);
            :HISTORICO = :HISTORICO||'OPERACAO CONTABIL ALTERADA VIA VINCULO COM GRUPO DE PRODUTO.';
            FOR
                SELECT A.ID FROM TBPRODUTO_OPERACAO_CONTABIL A WHERE A.GRUPO_PROD_OP_ID = OLD.ID
            INTO
                :ID_OPCONT
            DO
            IF (:ID_OPCONT > 0) THEN
            BEGIN
                IF (OLD.OPERACAO_CODIGO <> NEW.OPERACAO_CODIGO) THEN
                BEGIN
                    :HISTORICO = :HISTORICO||' OP:'||OLD.OPERACAO_CODIGO||'->'||NEW.OPERACAO_CODIGO;

                    UPDATE TBPRODUTO_OPERACAO_CONTABIL O
                        SET O.OPERACAO_CODIGO = NEW.OPERACAO_CODIGO
                        WHERE O.ID = :ID_OPCONT
                        AND O.PRODUTO_ID = :PRODUTO_ID;
                END

                IF (OLD.CONTA_CONTABIL <> NEW.CONTA_CONTABIL) THEN
                BEGIN
                    :HISTORICO = :HISTORICO||' C.CONTABIL:'||OLD.CONTA_CONTABIL||'->'||NEW.CONTA_CONTABIL;

                    UPDATE TBPRODUTO_OPERACAO_CONTABIL O
                        SET O.CONTA_CONTABIL = NEW.CONTA_CONTABIL
                        WHERE O.ID = :ID_OPCONT
                        AND O.PRODUTO_ID = :PRODUTO_ID;
                END

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

                    UPDATE TBPRODUTO_OPERACAO_CONTABIL O
                        SET O.OBSERVACAO = NEW.OBSERVACAO
                        WHERE O.ID = :ID_OPCONT
                        AND O.PRODUTO_ID = :PRODUTO_ID;
                END

                IF (OLD.DATAHORA <> NEW.DATAHORA) THEN
                BEGIN
                    :HISTORICO = :HISTORICO||' DT.HORA:'||OLD.DATAHORA||'->'||NEW.DATAHORA;

                    UPDATE TBPRODUTO_OPERACAO_CONTABIL O
                        SET O.DATAHORA = NEW.DATAHORA
                        WHERE O.ID = :ID_OPCONT
                        AND O.PRODUTO_ID = :PRODUTO_ID;
                END

                IF (OLD.CCUSTO_CODIGO <> NEW.CCUSTO_CODIGO) THEN
                BEGIN
                    :HISTORICO = :HISTORICO||' C.CUSTO:'||OLD.CCUSTO_CODIGO||'->'||NEW.CCUSTO_CODIGO;

                    UPDATE TBPRODUTO_OPERACAO_CONTABIL O
                        SET O.CCUSTO = NEW.CCUSTO_CODIGO
                        WHERE O.ID = :ID_OPCONT
                        AND O.PRODUTO_ID = :PRODUTO_ID;
                END

                EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_OPERACAO_CONTABIL', :ID_OPCONT, FN_ELIPSE(:HISTORICO, 500));
            END

        END

        IF (DELETING) THEN
        BEGIN

--            :ID_OPCONT = COALESCE((SELECT FIRST 1 A.ID FROM TBPRODUTO_OPERACAO_CONTABIL A WHERE A.GRUPO_PROD_OP_ID = OLD.ID), 0);
            :HISTORICO = :HISTORICO||'OPERACAO CONTABIL EXCLUIDA VIA VINCULO COM GRUPO DE PRODUTO. GRUPO DE PRODUTO: '||FN_LPAD(OLD.GRUPO_PRODUTO_ID, 6, '0');

            FOR
                SELECT A.ID FROM TBPRODUTO_OPERACAO_CONTABIL A WHERE A.GRUPO_PROD_OP_ID = OLD.ID
            INTO
                :ID_OPCONT
            DO
            IF (:ID_OPCONT > 0) THEN
            BEGIN
                DELETE FROM TBPRODUTO_OPERACAO_CONTABIL O WHERE O.ID = :ID_OPCONT AND O.PRODUTO_ID = :PRODUTO_ID;

                EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_OPERACAO_CONTABIL', :ID_OPCONT, FN_ELIPSE(:HISTORICO, 500));
            END

        END

    END

END
^

SET TERM ; ^

