SET TERM ^ ;

CREATE OR ALTER function FN_FERRAMENTA_COMPARAR (
    NEW_FERRAMENTA integer,
    OLD_FERRAMENTA integer)
returns integer
AS
declare variable NEW_MATRIZ_ID integer;
declare variable NEW_LINHA_ID integer;
declare variable NEW_TAMANHO integer;
declare variable OLD_MATRIZ_ID integer;
declare variable OLD_LINHA_ID integer;
declare variable OLD_TAMANHO integer;
declare variable RETORNO integer;
begin
    retorno = 0;

    for
        select
            f.matriz_id,
            i.linha_id,
            i.tamanho
        from TBFERRAMENTARIA f, TBFERRAMENTARIA_ITEM I
        where f.id = :NEW_FERRAMENTA
        and i.ferramentaria_id = f.id
    into
      :NEW_MATRIZ_ID,
      :NEW_LINHA_ID,
      :NEW_TAMANHO
    do begin

        for
            select
                f.matriz_id,
                i.linha_id,
                i.tamanho
            from TBFERRAMENTARIA f, TBFERRAMENTARIA_ITEM I
            where f.id = :OLD_FERRAMENTA
            and i.ferramentaria_id = f.id
        into
          :OLD_MATRIZ_ID,
          :OLD_LINHA_ID,
          :OLD_TAMANHO
        do begin
           if(OLD_LINHA_ID = NEW_LINHA_ID and NEW_TAMANHO = OLD_TAMANHO)then
           begin
               retorno = 1;
           end
        end

    end

    return retorno;
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 ; ^


