CREATE OR ALTER procedure spc_programacao_tempo_analise (
    estabelecimento_id integer,
    gp_id integer,
    up_id integer,
    estacao integer,
    nivel_anterior integer,
    nivel_proximo integer)
returns (
    programacao_id integer,
    produto_id integer,
    tamanho integer,
    modelo_id integer,
    cor_id integer,
    ferramenta_id integer,
    tempo numeric(15,4),
    tmp_operacional numeric(15,2),
    stp_ferramenta numeric(15,4),
    stp_ferramenta_aquecimento numeric(15,4),
    stp_cor numeric(15,4),
    stp_cor_aprovacao numeric(15,4))
as
declare variable old_ferramenta_id integer;
declare variable old_cor_id integer;
declare variable old_familia_id integer;
declare variable estacao_setup char(1);
declare variable cor_similar integer;
declare variable talao_id integer;
declare variable produto_id1 integer;
declare variable cor_id1 integer;
declare variable familia_id integer;
declare variable datahora_inicio timestamp;
declare variable datahora_fim timestamp;
declare variable quantidade numeric(15,4);
declare variable data date;
declare variable status char(1);
declare variable datahora_finalizado timestamp;
declare variable cor_setup numeric(15,4);
declare variable cor_setup_aprovacao numeric(15,4);
declare variable ferramenta_setup numeric(15,4);
declare variable ferramenta_setup_aquecimento numeric(15,4);
declare variable status_requisicao integer;
BEGIN

    SELECT SU.HABILITA_SETUP_AQUECIMENTO
      FROM TBSUB_UP SU
     WHERE SU.UP_ID = :UP_ID
       AND SU.ID    = :ESTACAO
      INTO ESTACAO_SETUP;

    OLD_FERRAMENTA_ID = 0;
    OLD_COR_ID        = 0;
    OLD_FAMILIA_ID    = 0;

    /* CONSULTA TALOES DA PROGRAMACAO (O ULTIMO FINALIZADO E TODOS EM ABERTO) */
    /* A CONSULTA DO ULTIMO TALAO PRODUDIZDO SERA POR CONTA DA NECESSIDADE DE VERIFICAR O REGISTRO ANTERIOR COM O PROXIMO */
    FOR
        SELECT
            X.ID,
            X.TALAO_ID,
            X.PRODUTO_ID,
            PD.COR_CODIGO COR_ID,
            PD.FAMILIA_CODIGO FAMILIA_ID,
            X.FERRAMENTA_ID,
            X.DATAHORA_INICIO,
            X.DATAHORA_FIM,
            X.QUANTIDADE,
            X.DATA,
            X.STATUS,
            X.STATUS_REQUISICAO,
            X.DATAHORA_FINALIZADO,
            C.TEMPO_SETUP COR_SETUP,
            C.TEMPO_SETUP_APROVACAO COR_SETUP_APROVACAO,
            F.TEMPO_SETUP FERRAMENTA_SETUP,
            F.TEMPO_SETUP_AQUECIMENTO FERRAMENTA_SETUP_AQUECIMENTO
        FROM (
            SELECT
                ID,
                TALAO_ID,
                PRODUTO_ID,
                FERRAMENTA_ID,
                DATAHORA_INICIO,
                DATAHORA_FIM,
                QUANTIDADE,
                TEMPO,
                DATA,
                STATUS,
                DATAHORA_FINALIZADO,
                0 STATUS_REQUISICAO
              FROM (
                SELECT FIRST 1
                       P.ID,
                       P.TABELA_ID TALAO_ID,
                       P.PRODUTO_ID,
                       P.FERRAMENTA_ID,
                       P.DATAHORA_INICIO,
                       P.DATAHORA_FIM, 
                       P.QUANTIDADE,
                       P.TEMPO,
                       P.DATA,
                       P.STATUS,
                       R.DATAHORA DATAHORA_FINALIZADO
                  FROM TBPROGRAMACAO P,
                       TBPROGRAMACAO_REGISTRO R
                 WHERE R.PROGRAMACAO_ID     = P.ID

                   AND R.STATUS             <> 1
                   AND P.status             IN (2,3)
                   AND IIF(P.STATUS = 3, R.DATAHORA >= DATEADD(-90 MINUTE TO CURRENT_TIMESTAMP), TRUE)

                   AND P.TIPO               = 'A'
                   AND P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                   AND P.GP_ID              = :GP_ID
                   AND P.UP_ID              = :UP_ID
                   AND P.ESTACAO            = :ESTACAO
                 ORDER BY DATAHORA_FINALIZADO DESC
                ) A

            UNION
    
            SELECT P.ID,  
                   P.TABELA_ID TALAO_ID,
                   P.PRODUTO_ID,
                   P.FERRAMENTA_ID,
                   P.DATAHORA_INICIO,
                   P.DATAHORA_FIM, 
                   IIF( STATUS_REQUISICAO = 1,
                    COALESCE(
                       (SELECT SUM(J.QUANTIDADE - V.SOBRAS) QUANTIDADE_REQUISICAO
                          FROM TBREQUISICAO J,
                               TBREMESSA_ITEM_PROCESSADO V
                         WHERE V.REMESSA    = J.REMESSA_GERADA
                           AND V.CONTROLE   = J.TALAO
                           AND J.GP_ID      = P.GP_ID
                           AND J.REMESSA    = P.REMESSA_ID
                           AND J.PRODUTO_ID = P.PRODUTO_ID
                           AND J.TAMANHO    = P.TAMANHO),0),
                    P.QUANTIDADE) QUANTIDADE,
                   P.TEMPO,
                   P.DATA,
                   P.STATUS,
                   CAST('01.01.9999 00:00:00' AS TIMESTAMP),
                   P.STATUS_REQUISICAO
              FROM TBPROGRAMACAO P
             WHERE P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
               AND P.TIPO               = 'A'
               AND P.GP_ID              = :GP_ID
               AND P.UP_ID              = :UP_ID
               AND P.ESTACAO            = :ESTACAO
               AND P.STATUS            IN ('0','1')
               AND NOT (P.STATUS = 1 AND P.STATUS_REQUISICAO = 1)
        ) X,
        TBPRODUTO PD,
        TBCOR C,
        TBFERRAMENTARIA F

       WHERE PD.CODIGO = X.PRODUTO_ID
         AND C.CODIGO  = PD.COR_CODIGO
         AND F.ID      = X.FERRAMENTA_ID
       ORDER BY DATAHORA_FINALIZADO, DATAHORA_INICIO
    INTO
        :PROGRAMACAO_ID,
        :TALAO_ID,
        :PRODUTO_ID,
        :COR_ID,
        :FAMILIA_ID,
        :FERRAMENTA_ID,
        :DATAHORA_INICIO,
        :DATAHORA_FIM,
        :QUANTIDADE,
        :DATA,
        :STATUS,
        :STATUS_REQUISICAO,
        :DATAHORA_FINALIZADO,
        :COR_SETUP,
        :COR_SETUP_APROVACAO,
        :FERRAMENTA_SETUP,
        :FERRAMENTA_SETUP_AQUECIMENTO
    DO
    BEGIN
        /* VERIFICA SE O TALOES ESTA EM ABERTO/PARADO */
        IF ( STATUS IN ('0','1') ) THEN
        BEGIN

            /* ZERA TODOS OS TEMPO, POIS POR PADRAO NA HAVERA SETUPS */
            TEMPO                      = 0;
            TMP_OPERACIONAL            = 0;
            STP_FERRAMENTA             = 0;
            STP_FERRAMENTA_AQUECIMENTO = 0;
            STP_COR                    = 0;
            STP_COR_APROVACAO          = 0;
              
            /* VERIFICA SE HAVERA SETUP DE FERRAMENTA */
            IF ( FERRAMENTA_ID <> OLD_FERRAMENTA_ID ) THEN
            BEGIN
                --EXCEPTION "..." FERRAMENTA_ID || ' ' || OLD_FERRAMENTA_ID;
                /* APLICA O TEMPO DE SETUP DE FERRAMENTA */
                STP_FERRAMENTA = FERRAMENTA_SETUP;

                /* VERIFICA SE A ESTACAO HABILITA SETUP DE AQUECIMENTO */
                IF ( ESTACAO_SETUP = '1' ) THEN
                BEGIN
                    /* APLICA O TEMPO DE AQUECIMENTO DA FERRAMENTA */
                    STP_FERRAMENTA_AQUECIMENTO = FERRAMENTA_SETUP_AQUECIMENTO;
                END
            END

            /* VERIFICA SE NAO HAVERA SETUP DE FERRAMENTA E EXISTE ALGUM ITEM ANTERIOR */
            /* OBS.: O SETUP DE LIMPEZA DE MATRIZ, SO OCORRE QUANDO NAO HA TROCA DE FERRAMENTA */
            IF ( STP_FERRAMENTA = 0 AND OLD_COR_ID > 0 AND OLD_COR_ID <> COR_ID ) THEN
            BEGIN

                /* APLICA O TEMPO DE LIMPEZA DE FERRAMENTA */
                STP_COR = COR_SETUP;

                /* CONSULTA AS CORES SIMILARES */
                FOR
                    /*SELECT FIRST 1 S.ID
                      FROM TBCOR_SIMILAR S
                     WHERE S.FAMILIA_ID = :OLD_FAMILIA_ID
                       AND S.COR_ID_1   = :OLD_COR_ID
                       AND S.COR_ID_2   = :COR_ID */

                       SELECT FIRST 1
                            c1.nivel_contaminacao,
                            c2.nivel_contaminacao
                          FROM TBCOR c1, tbcor c2
                         WHERE c1.codigo   = :OLD_COR_ID
                           AND c2.codigo   = :COR_ID

                INTO
                    --:COR_SIMILAR
                    :NIVEL_ANTERIOR,
                    :NIVEL_PROXIMO
                DO
                BEGIN
                    /* LIMPA O TEMPO DE SETUP DE COR (LIMPEZA) SE A COR ANTERIOR FOR SIMILIAR A ATUAL */
                    --STP_COR = 0;

                    if(NIVEL_ANTERIOR = NIVEL_PROXIMO and (NIVEL_PROXIMO = 0 or NIVEL_PROXIMO = 100))then
                    begin
                        STP_COR = 0;
                    end

                    if(NIVEL_PROXIMO > NIVEL_ANTERIOR)then
                    begin
                        STP_COR = 0;
                    end

                END
            END

            /* VERIFICA SE HAVERA TROCA DE COR */
            IF ( COR_ID <> OLD_COR_ID OR FERRAMENTA_ID <> OLD_FERRAMENTA_ID  ) THEN
            BEGIN
                /* APLICA O TEMPO DE APROVACAO */
                STP_COR_APROVACAO = COR_SETUP_APROVACAO;
            END


            TMP_OPERACIONAL = COALESCE((
                   SELECT
--                        QTD_TALAO,
--                        REQ,
--                        APROV,
--                        EXTRA,
--                        TEMPO,
                        (IIF(REQ = 0,QTD_TALAO+EXTRA-APROV,QTD_TALAO) * TEMPO)
                    FROM (
                        SELECT
                           COALESCE(T1.QUANTIDADE,0) QTD_TALAO, -- TOTAL DO TALAO
                           COALESCE(T1.REQUISICAO_ID,0) REQ,
                           COALESCE((
                            SELECT SUM(S.QUANTIDADE - S.SALDO)
                              FROM TBREQUISICAO_SOBRA S
                             WHERE S.REMESSA = RT.REMESSA_ID
                               AND S.TALAO = RT.REMESSA_TALAO_ID
                               AND S.REQUISICAO_ID = 0), 0.0000) APROV, -- SUBTRACAO DAS SOBRAS APROVEITADAS
    
                            COALESCE((SELECT FIRST 1 QUANTIDADE FROM VWREMESSA_TALAO TE WHERE TE.ID = RT.TALAO_EXTRA),0) EXTRA, -- INCLUSAO DO TALAO EXTRA
                            COALESCE((SELECT FIRST 1 TEMPO FROM SPC_PROGRAMACAO_TEMPO_BOJO(P1.MODELO_CODIGO, T1.TAMANHO, P1.COR_CODIGO, 1)),0) tempo -- TEMPO POR UNIDADEDIGO, 1)),0)
                       FROM TBPRODUTO P1,
                            TBPROGRAMACAO T1,
                            VWREMESSA_TALAO RT
                      WHERE P1.CODIGO    = :PRODUTO_ID
                        AND T1.tabela_id = :TALAO_ID
                        AND T1.tipo      = 'A'
                        AND RT.ID       = T1.TABELA_ID
                        ) X),0);




            --TMP_OPERACIONAL = (0.421 * QUANTIDADE);

            TEMPO = STP_FERRAMENTA + STP_FERRAMENTA_AQUECIMENTO + STP_COR + STP_COR_APROVACAO + TMP_OPERACIONAL;

            TEMPO = IIF(TRUNC(:TEMPO) = :TEMPO, TRUNC(:TEMPO), TRUNC(:TEMPO) + 1);

            IF ( TMP_OPERACIONAL = 0 ) THEN
            BEGIN
                TEMPO                       = 0;
                STP_FERRAMENTA              = 0;
                STP_FERRAMENTA_AQUECIMENTO  = 0;
                STP_COR                     = 0;
                STP_COR_APROVACAO           = 0;
                FERRAMENTA_ID               = 1; -- IDENTIFICACAO DE FERRAMENTA INEXISTENTE
            END
            
            SUSPEND;
        END

        --SUSPEND;

        /* -- INICIO ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
        OLD_FERRAMENTA_ID = FERRAMENTA_ID;
        OLD_COR_ID        = COR_ID;
        OLD_FAMILIA_ID    = FAMILIA_ID;
        /* --  FIM   ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
    END

END;

