SET TERM ^ ;

CREATE OR ALTER trigger ttbferramentaria_b2u for tbferramentaria
active before update position 2
AS
DECLARE VARIABLE GP_ID BIGINT;
DECLARE VARIABLE UP_ID BIGINT;
DECLARE VARIABLE ESTACAO BIGINT;
DECLARE VARIABLE OPERADOR_ID BIGINT;
DECLARE VARIABLE FERRAMENTAS_ALOCADAS VARCHAR(3000);
begin
    
    IF (
        COALESCE(NEW.GP_ID      ,0) <> COALESCE(OLD.GP_ID      ,0)
     OR COALESCE(NEW.UP_ID      ,0) <> COALESCE(OLD.UP_ID      ,0)
     OR COALESCE(NEW.ESTACAO    ,0) <> COALESCE(OLD.ESTACAO    ,0)
     OR COALESCE(NEW.OPERADOR_ID,0) <> COALESCE(OLD.OPERADOR_ID,0)
     OR COALESCE(NEW.SITUACAO,0)    <> COALESCE(OLD.SITUACAO,0)
     OR COALESCE(NEW.TALAO_ID,0)    <> COALESCE(OLD.TALAO_ID,0)) THEN
    BEGIN

        /* VERIFICA OPERADOR */
        OPERADOR_ID = COALESCE((SELECT FIRST 1 O.CODIGO FROM TBOPERADOR O WHERE O.CODIGO = NEW.OPERADOR_ID AND O.STATUS = '1'),0);

        IF ( NOT (OPERADOR_ID > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA. OPERADOR DE PROCESSOS INVALIDO';
        END

        IF ( NEW.SITUACAO = 'E' ) THEN
        BEGIN
            NEW.TALAO_ID = 0;

        END

        IF ( NOT(NEW.SITUACAO = 'E') AND NOT(NEW.TALAO_ID > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'ACAO NAO PERMITIDA PARA A FERRAMENTA. TALAO INVALIDO';
        END

        /* REGISTRA ACOES NA FERRAMENTARIA */
        IF  (COALESCE(NEW.GP_ID  ,0) = 0
        AND  COALESCE(NEW.UP_ID  ,0) = 0
        AND  COALESCE(NEW.ESTACAO,0) = 0
        AND (NEW.SITUACAO = 'E' OR NEW.SITUACAO = 'R')
        )THEN
        BEGIN
            NEW.GP_ID = 0;
            NEW.UP_ID = 0;
            NEW.ESTACAO = 0;
    
            /* REGISTRA HISTORICO DE ENTRADA DA FERRAMENTA */
            INSERT INTO TBFERRAMENTARIA_HISTORICO (
                FERRAMENTA_TIPO,
                FERRAMENTA_ID,
                STATUS,
                OPERADOR_ID,
                GP_ID,
                UP_ID,
                ESTACAO,
                TALAO_ID
            ) VALUES (
                'M',
                NEW.ID,
                NEW.SITUACAO,
                NEW.OPERADOR_ID,
                NEW.GP_ID,
                NEW.UP_ID,
                NEW.ESTACAO,
                NEW.TALAO_ID
            );
        END
        ELSE

        /* REGISTRA OUTRAS ACOES */
        IF (
         /*   (COALESCE(NEW.GP_ID      ,0) <> COALESCE(OLD.GP_ID      ,0)
         OR   COALESCE(NEW.UP_ID      ,0) <> COALESCE(OLD.UP_ID      ,0)
         OR   COALESCE(NEW.ESTACAO    ,0) <> COALESCE(OLD.ESTACAO    ,0))

         AND*/ (NEW.GP_ID   > 0
           OR   NEW.UP_ID   > 0
           OR   NEW.ESTACAO > 0)

         AND  NOT (NEW.SITUACAO = '')

        )THEN
        BEGIN
            /* VERIFICA O GRUPO DE PRODUCAO */
            GP_ID = COALESCE((SELECT FIRST 1 G.ID FROM TBGP G WHERE G.ID = NEW.GP_ID AND G.STATUS = '1'),0);

            IF ( NOT (GP_ID > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. GRUPO DE PRODUCAO INVALIDO';
            END
    
            /* VERIFICA A UNIDADE PRODUTIVA */
            UP_ID = COALESCE((SELECT FIRST 1 U.ID FROM TBUP U WHERE U.ID = NEW.UP_ID AND U.STATUS = '1'),0);
    
            IF ( NOT (UP_ID > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. UNIDADE PRODUTIVA INVALIDA';
            END

            /* VERIFICA A ESTACAO DE TRABALHO */
            ESTACAO = COALESCE((SELECT FIRST 1 SU.ID FROM TBSUB_UP SU WHERE SU.UP_ID = :UP_ID AND SU.ID = NEW.ESTACAO AND SU.STATUS = '1'),0);
    
            IF ( NOT (ESTACAO > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. ESTACAO DE TRABALHO INVALIDA';
            END

            FERRAMENTAS_ALOCADAS = COALESCE(
            (SELECT LIST(LPAD(F.SERIE,4,'0') || ' - ' || F.DESCRICAO,', ')
               FROM TBFERRAMENTARIA F
              WHERE F.GP_ID   = :GP_ID
                AND F.UP_ID   = :UP_ID
                AND F.ESTACAO = :ESTACAO
             ),'');

             IF ( FERRAMENTAS_ALOCADAS <> '' ) THEN
             BEGIN
             --   EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. A ESTACAO ESTA BLOQUEADA COM A SEGUINTE FERRAMENTA: ' || FERRAMENTAS_ALOCADAS;
             END

            /* REGISTRA HISTORICO DE SAIDA DA FERRAMENTA */
            INSERT INTO TBFERRAMENTARIA_HISTORICO (
                FERRAMENTA_TIPO,
                FERRAMENTA_ID,
                STATUS,
                OPERADOR_ID,
                GP_ID,
                UP_ID,
                ESTACAO,
                TALAO_ID
            ) VALUES (
                'M',
                NEW.ID,
                NEW.SITUACAO,
                NEW.OPERADOR_ID,
                NEW.GP_ID,
                NEW.UP_ID,
                NEW.ESTACAO,
                NEW.TALAO_ID
            );
        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO INVALIDA PARA ESTA FERRAMENTA.';
        END

    END
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPU_FERRAMENTA_ALTERAR (
    FERRAMENTA_ID integer,
    DEST_FERRAMENTA_ID integer,
    DATAHORA_INICIO timestamp,
    OPERADOR_ID integer)
as
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable TIPO char(1);
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable ESTACAO integer;
declare variable REMESSA_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable HISTORICO varchar(500);
declare variable OPERADOR_DESCRICAO varchar(200);
BEGIN
    HISTORICO = NULL;

    FOR
        SELECT
            P.ID,
            P.ESTABELECIMENTO_ID,
            P.TIPO,
            P.GP_ID,
            P.UP_ID,
            P.ESTACAO,
            T.REMESSA_ID,
            T.REMESSA_TALAO_ID
        FROM
            SPC_FERRAMENTA_SEQUENCIA_SETUP(:FERRAMENTA_ID,:DATAHORA_INICIO) X,
            TBPROGRAMACAO P,
            VWREMESSA_TALAO T

        WHERE
            P.ID = X.ID
        AND T.ID = P.TABELA_ID
        AND P.TIPO = 'A'
    INTO
        ID,
        ESTABELECIMENTO_ID,
        TIPO,
        GP_ID,
        UP_ID,
        ESTACAO,
        REMESSA_ID,
        REMESSA_TALAO_ID
    DO
    BEGIN
        UPDATE TBPROGRAMACAO P SET P.FERRAMENTA_ID = :DEST_FERRAMENTA_ID WHERE P.ID = :ID;

        IF ( HISTORICO IS NULL ) THEN
        BEGIN
            HISTORICO = REMESSA_TALAO_ID;
        END
        ELSE
        BEGIN
            HISTORICO = HISTORICO || ', ' || REMESSA_TALAO_ID;
        END
    END

    IF ( HISTORICO IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'NENHUMA FERRAMENTA FOI ALTERADA';
    END
    ELSE
    BEGIN

        OPERADOR_DESCRICAO = COALESCE((SELECT FIRST 1 O.NOME FROM TBOPERADOR O WHERE O.CODIGO = :OPERADOR_ID),CURRENT_USER);
        
        HISTORICO = 'FERRAM. ALT.: ' || :FERRAMENTA_ID || ' -> ' || :DEST_FERRAMENTA_ID || ' DOS TALOES: [' || HISTORICO || '] - OPER.: ' || OPERADOR_ID || '-' || OPERADOR_DESCRICAO;

        /* EXECUTE PROCEDURE SPU_REPROGRAMACAO_BOJO(ESTABELECIMENTO_ID,TIPO,GP_ID,UP_ID,ESTACAO,DATAHORA_INICIO);   */


        EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',REMESSA_ID,HISTORICO);
    END
END
^

SET TERM ; ^

