SET TERM ^ ;

CREATE OR ALTER procedure SPC_FERRAMENTA_SEQUENCIA_SETUP (
    I_FERRAMENTA_ID integer,
    I_DATAHORA_INICIO timestamp,
    I_UP_ID integer = 0,
    I_ESTACAO integer = 0)
returns (
    ID integer,
    DATAHORA_INICIO timestamp,
    DATAHORA_FIM timestamp)
as
declare variable PROXIMO numeric(18,4);
BEGIN

    FOR
        SELECT
            ID,
            DATAHORA_INICIO,
            DATAHORA_FIM,
            PROXIMO
        FROM (
        
            SELECT P.ID,
                   P.DATAHORA_INICIO,
                   P.DATAHORA_FIM,
                   LEAD(P.TEMPO_SETUP_FERRAMENTA) OVER (ORDER BY P.FERRAMENTA_ID, P.GP_ID, P.UP_ID, P.ESTACAO, P.DATAHORA_INICIO) PROXIMO
              FROM TBPROGRAMACAO P
             WHERE P.FERRAMENTA_ID > 0
               AND P.FERRAMENTA_ID = :I_FERRAMENTA_ID
               AND P.DATAHORA_INICIO >= :I_DATAHORA_INICIO
               AND NOT (P.STATUS = '1' AND P.STATUS_REQUISICAO  = 1)
               and iif(:I_UP_ID   > 0, p.up_id   = :I_UP_ID  , true)
               and iif(:I_ESTACAO > 0, p.estacao = :I_ESTACAO, true)
             ORDER BY P.FERRAMENTA_ID, P.GP_ID, P.UP_ID, P.ESTACAO, P.DATAHORA_INICIO
        ) X

    INTO
        :ID,
        :DATAHORA_INICIO,
        :DATAHORA_FIM,
        :PROXIMO
    DO
    BEGIN
      SUSPEND;

      IF (PROXIMO > 0) THEN
      BEGIN
         BREAK;
      END

    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPC_FERRAMENTA_DISPONIVEL (
    I_FERRAMENTA_ID integer,
    I_DATAHORA_INICIO timestamp,
    TALAO_ID integer = 0,
    I_UP_ID integer = 0,
    I_ESTACAO integer = 0)
returns (
    GRUPO_ID integer,
    ID integer,
    DESCRICAO varchar(200),
    SERIE varchar(80),
    MATRIZ_ID integer,
    MATRIZ_DESCRICAO varchar(80),
    LINHA_ID integer,
    TAMANHO integer,
    LARGURA numeric(18,4),
    COMPRIMENTO numeric(18,4),
    ALTURA numeric(18,4),
    DATA date,
    OBSERVACAO varchar(400),
    TEMPO_SETUP numeric(18,4),
    TEMPO_SETUP_AQUECIMENTO numeric(18,4),
    STATUS_CONFLITO integer,
    TMP_LINHA integer)
as
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable ESTACAO integer;
declare variable FIRST_DATAHORA_INICIO timestamp;
declare variable LAST_DATAHORA_FIM timestamp;
BEGIN

    SELECT
        GP_ID,
        UP_ID,
        ESTACAO,
        FIRST_DATAHORA_INICIO,
        LAST_DATAHORA_FIM
    FROM (
    
    SELECT FIRST 1
           P.GP_ID, 
           P.UP_ID, 
           P.ESTACAO,
           X.ID FIRST_ID,
           FIRST_VALUE(X.ID) OVER(ORDER BY X.DATAHORA_INICIO DESC) LAST_ID,
           X.DATAHORA_INICIO FIRST_DATAHORA_INICIO,
           FIRST_VALUE(X.DATAHORA_FIM) OVER(ORDER BY X.DATAHORA_INICIO DESC) LAST_DATAHORA_FIM
      FROM SPC_FERRAMENTA_SEQUENCIA_SETUP(:I_FERRAMENTA_ID,:I_DATAHORA_INICIO, :I_UP_ID, :I_ESTACAO) X,
           TBPROGRAMACAO P
     WHERE P.ID = X.ID
     ORDER BY X.DATAHORA_INICIO)
     INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :FIRST_DATAHORA_INICIO,
        :LAST_DATAHORA_FIM;

    if(TALAO_ID > 0)then
    begin
        TMP_LINHA = coalesce((select first 1 m.linha_codigo from tbremessa_item_processado p, TBMODELO M where p.id = :TALAO_ID and m.codigo = p.modelo_codigo),0);

        SELECT
            GP_ID,
            UP_ID,
            ESTACAO,
            FIRST_DATAHORA_INICIO,
            LAST_DATAHORA_FIM
        FROM (
        SELECT FIRST 1
               P.GP_ID, 
               P.UP_ID, 
               P.ESTACAO,
               p.ID FIRST_ID,
               FIRST_VALUE(p.ID) OVER(ORDER BY p.DATAHORA_INICIO DESC) LAST_ID,
               p.DATAHORA_INICIO FIRST_DATAHORA_INICIO,
               FIRST_VALUE(p.DATAHORA_FIM) OVER(ORDER BY p.DATAHORA_INICIO DESC) LAST_DATAHORA_FIM
          FROM TBPROGRAMACAO P
         WHERE P.tabela_id = :TALAO_ID
         and p.tipo = 'A')
         INTO
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :FIRST_DATAHORA_INICIO,
            :LAST_DATAHORA_FIM;

    end else
    begin
        TMP_LINHA = 0;
    end

    FOR
        SELECT
            GRUPO_ID,
            ID,
            DESCRICAO,
            SERIE,
            MATRIZ_ID,
            MATRIZ_DESCRICAO,
            LINHA_ID,
            TAMANHO,
            LARGURA,
            COMPRIMENTO,
            ALTURA,
            DATA,
            OBSERVACAO,
            TEMPO_SETUP,
            TEMPO_SETUP_AQUECIMENTO,
            STATUS_CONFLITO
        
        FROM (
            SELECT
                F.GRUPO_ID,
                F.ID,
                F.DESCRICAO,
                F.SERIE,
                F.MATRIZ_ID,
                (SELECT FIRST 1 M.DESCRICAO
                   FROM TBMATRIZ M
                  WHERE M.CODIGO = F.MATRIZ_ID) MATRIZ_DESCRICAO,  
                LPAD(I.LINHA_ID,4,'0') LINHA_ID,
                I.TAMANHO,
                F.LARG LARGURA,
                F.COMP COMPRIMENTO,
                F.ALT ALTURA,
                F.DATA,
                F.OBSERVACAO,
                F.TEMPO_SETUP,
                F.TEMPO_SETUP_AQUECIMENTO,
                COALESCE((SELECT FIRST 1 DATAHORA_INICIO
                   FROM TBPROGRAMACAO P
                  WHERE P.FERRAMENTA_ID = F.ID
                    AND P.DATAHORA_INICIO > '01.01.2010'
                    AND P.STATUS IN ('0','1') ORDER BY DATAHORA_INICIO),CAST('01.01.2000 00:00' AS TIMESTAMP)) DATAHORA_INICIO,
            
                COALESCE((SELECT FIRST 1 1
                     FROM TBPROGRAMACAO W
                    WHERE W.FERRAMENTA_ID = F.ID
                      AND W.STATUS IN (0,2)
                      AND ( FO.DATAHORA_INICIO BETWEEN W.DATAHORA_INICIO AND W.DATAHORA_FIM
                       OR   FO.DATAHORA_FIM    BETWEEN W.DATAHORA_INICIO AND W.DATAHORA_FIM
                       OR  W.DATAHORA_INICIO   BETWEEN FO.DATAHORA_INICIO AND FO.DATAHORA_FIM
                       OR  W.DATAHORA_FIM      BETWEEN FO.DATAHORA_INICIO AND FO.DATAHORA_FIM)
            
                ),0) AS STATUS_CONFLITO
            
            FROM
                TBFERRAMENTARIA F,
                TBFERRAMENTARIA_ITEM I,
                (SELECT
                    X.LINHA_ID,
                    I.TAMANHO,
                    X.MATRIZ_ID,
                    X.UP_ID,
                    X.ESTACAO,
                    X.FERRAMENTA_ID,
                    X.LARGURA,
                    X.COMPRIMENTO,
                    X.ALTURA,
                    X.DATAHORA_INICIO,
                    X.DATAHORA_FIM
                FROM (
                    SELECT
                        SU.UP_ID,
                        SU.ID ESTACAO,
                        F.MATRIZ_ID,
                        DH.DATAHORA_INICIO,
                        DH.DATAHORA_FIM,
                        F.ID FERRAMENTA_ID,
                        SU.LARG LARGURA,
                        SU.COMP COMPRIMENTO,
                        SU.ALT ALTURA,

                        coalesce((SELECT FIRST 1 M.LINHA_CODIGO LINHA_ID
                           FROM TBPROGRAMACAO P, VWREMESSA_TALAO T, TBMODELO M
                          WHERE M.CODIGO           = T.MODELO_ID
                            AND P.TIPO             = 'A'
                            AND P.TABELA_ID        = T.ID
                            AND P.DATAHORA_INICIO >= DH.DATAHORA_INICIO
                            AND P.DATAHORA_FIM    <= DH.DATAHORA_FIM
                            AND P.UP_ID            = :UP_ID
                            AND P.ESTACAO          = :ESTACAO
                            and p.ferramenta_id    = f.id
                            ), :TMP_LINHA ) as LINHA_ID

                    FROM TBFERRAMENTARIA F, TBSUB_UP SU,
                        (SELECT FIRST 1
                         CAST(:FIRST_DATAHORA_INICIO AS TIMESTAMP)DATAHORA_INICIO,
                         CAST(:LAST_DATAHORA_FIM AS TIMESTAMP)DATAHORA_FIM FROM RDB$DATABASE) DH
                    WHERE F.ID     = :I_FERRAMENTA_ID
                      AND SU.UP_ID = :UP_ID
                      AND SU.ID    = :ESTACAO) X,
                      TBFERRAMENTARIA_ITEM I
                WHERE
                    I.FERRAMENTARIA_ID = X.FERRAMENTA_ID
                AND I.LINHA_ID = X.LINHA_ID) FO
            
            WHERE
                F.STATUS = '1'
            --AND COALESCE(F.SITUACAO,'E') = 'E'
            AND F.ID = I.FERRAMENTARIA_ID
            AND F.ID <> FO.FERRAMENTA_ID
            AND I.LINHA_ID = FO.LINHA_ID
            AND I.TAMANHO = FO.TAMANHO
            --AND F.MATRIZ_ID = FO.MATRIZ_ID
            AND F.LARG <= FO.LARGURA
            AND F.COMP <= FO.COMPRIMENTO
            AND F.ALT  <= FO.ALTURA
            AND F.LARG  > 0
            AND F.COMP  > 0
            AND F.ALT   > 0
            
            ORDER BY LARG DESC, COMP DESC, ALT DESC, SERIE
        ) Z
    INTO
        :GRUPO_ID,
        :ID,
        :DESCRICAO,
        :SERIE,
        :MATRIZ_ID,
        :MATRIZ_DESCRICAO,
        :LINHA_ID,
        :TAMANHO,
        :LARGURA,
        :COMPRIMENTO,
        :ALTURA,
        :DATA,
        :OBSERVACAO,
        :TEMPO_SETUP,
        :TEMPO_SETUP_AQUECIMENTO,
        :STATUS_CONFLITO
    DO
    BEGIN  
        SUSPEND;

    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,
    I_UP_ID integer = 0,
    I_ESTACAO integer = 0)
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, :I_UP_ID, :I_ESTACAO) 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 ; ^



