CREATE INDEX ITBREMESSA_ITEM_PROCESSADO_22 ON TBREMESSA_ITEM_PROCESSADO (PROGRAMACAO_ESTEIRA);

CREATE OR ALTER procedure spc_talao_pecas_disponiveis (
    talao_id integer)
returns (
    referencia_tipo varchar(4),
    referencia_id integer,
    produto_id integer,
    remessa varchar(20),
    remessa_id integer,
    remessa_talao_id integer,
    remessa_talao_detalhe_id integer,
    enderecamento varchar(64),
    saldo numeric(18,4),
    observacao varchar(500),
    tipo integer,
    classificacao varchar(10),
    data_classificacao timestamp,
    data_peca timestamp)
as
declare variable consumo_produto_id integer;
declare variable consumo_tamanho integer;
declare variable consumo_quantidade numeric(15,4);
declare variable gp_id integer;
BEGIN
    
    gp_id = coalesce((
            SELECT first 1
            t.gp_id
            FROM
                VWREMESSA_TALAO T,
                VWREMESSA_CONSUMO C
            
            WHERE T.ID             = :TALAO_ID
            AND C.REMESSA_ID       = T.REMESSA_ID
            AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
            AND C.COMPONENTE       = '0'
            AND C.STATUS           = '0'
    ),0);

    TIPO = IIF(fn_parametro('TBGP.PECA_DISPONIVEL2', :gp_id) = 1, 2, 1);

    if(TIPO = 1)then
    begin
        FOR
            SELECT
                C.PRODUTO_ID,
                COALESCE(C.TAMANHO,0)TAMANHO,
                MAX(C.QUANTIDADE)
            
            FROM
                VWREMESSA_TALAO T,
                VWREMESSA_CONSUMO C
            
            WHERE T.ID               = :TALAO_ID
            AND C.REMESSA_ID       = T.REMESSA_ID
            AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
            AND C.COMPONENTE       = '0'
            AND C.STATUS           = '0'
            
            GROUP BY 1,2
        INTO
            CONSUMO_PRODUTO_ID,
            CONSUMO_TAMANHO,
            CONSUMO_QUANTIDADE
        DO
        BEGIN
    
            FOR
                SELECT FIRST 5
                    REFERENCIA_TIPO,
                    REFERENCIA_ID,
                    PRODUTO_ID,
                    CAST(SUBSTRING(REMESSA_DADOS FROM  1 FOR 15) AS INTEGER)REMESSA,
                    CAST(SUBSTRING(REMESSA_DADOS FROM 16 FOR 15) AS INTEGER)REMESSA_TALAO_ID,  
                    CAST(SUBSTRING(REMESSA_DADOS FROM 31 FOR 15) AS INTEGER)REMESSA_TALAO_DETALHE_ID,
                    ENDERECAMENTO,
                    SALDO,
                    OBSERVACAO
                FROM (
                    SELECT
                        'R' REFERENCIA_TIPO,
                        R.ID REFERENCIA_ID,
                        R.PRODUTO_ID,
                
                        (SELECT FIRST 1
                                LPAD(D.REMESSA_ID       ,15)||
                                LPAD(D.REMESSA_TALAO_ID ,15)||
                                LPAD(D.ID               ,15)
                           FROM VWREMESSA_TALAO_DETALHE D
                          WHERE D.ID = R.TALAO_ID)REMESSA_DADOS,
            
                        (SELECT FIRST 1 E.GRUPO || '/' || E.SUBGRUPO
                           FROM TBENDERECAMENTO E
                          WHERE E.ID = R.ENDERECAMENTO_ID) ENDERECAMENTO,
                
                        (R.SALDO -
                        COALESCE(
                            (SELECT SUM(V.QUANTIDADE)
                               FROM TBREMESSA_TALAO_VINCULO V
                              WHERE V.TIPO = 'R'
                                AND V.TABELA_ID = R.ID
                                AND V.STATUS = '0'),0)
                        ) SALDO,
    
                        (SELECT FIRST 1 IIF(O.OB <> 0,  'OB: ' || O.OB, '') || IIF(O.CLASSIFICACAO <> '',' CLASSIF.: ' || O.CLASSIFICACAO,'')
                           FROM TBREVISAO_OB O
                          WHERE O.OB = R.OB) OBSERVACAO
                
                    FROM 
                        TBREVISAO R
                    
                    WHERE R.PRODUTO_ID          = :CONSUMO_PRODUTO_ID
                    AND COALESCE(R.TAMANHO,0) = :CONSUMO_TAMANHO
                    AND R.SALDO               > 0
            
                    ORDER BY
                        R.SALDO
                ) X
                WHERE
                    X.SALDO >= :CONSUMO_QUANTIDADE
    
                UNION
    
                SELECT FIRST 5
                    REFERENCIA_TIPO,
                    REFERENCIA_ID,
                    PRODUTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    NULL ENDERECAMENTO,
                    SALDO,
                    NULL OBSERVACAO
                FROM (
                    SELECT
                        'D' REFERENCIA_TIPO,
                        D.ID REFERENCIA_ID,
                        D.PRODUTO_ID,
                        D.REMESSA_ID,
                        D.REMESSA_TALAO_ID,
                        D.ID REMESSA_TALAO_DETALHE_ID,
                        (D.QUANTIDADE_SALDO -
                        COALESCE(
                            (SELECT SUM(V.QUANTIDADE)
                               FROM TBREMESSA_TALAO_VINCULO V
                              WHERE V.TIPO = 'D'
                                AND V.TABELA_ID = D.ID
                                AND V.STATUS = '0'),0)
                        ) SALDO,
    
                        (SELECT FIRST 1 CV.ID
                           FROM TBREMESSA_CONSUMO_VINCULO CV
                          WHERE CV.REMESSA_TALAO_DETALHE_ID = D.ID) VINCULO
    
                    FROM
                        VWREMESSA_TALAO_DETALHE D
    
                    WHERE D.PRODUTO_ID          = :CONSUMO_PRODUTO_ID
                    AND COALESCE(D.TAMANHO,0) = :CONSUMO_TAMANHO
                    AND D.QUANTIDADE_SALDO > 0
                              
                    ORDER BY
                        D.QUANTIDADE_SALDO
                ) X
                WHERE X.VINCULO IS NULL
                AND X.SALDO >= :CONSUMO_QUANTIDADE
            INTO
                REFERENCIA_TIPO,
                REFERENCIA_ID,
                PRODUTO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                ENDERECAMENTO,
                SALDO,
                OBSERVACAO
            DO
            BEGIN
                REMESSA = (SELECT FIRST 1 REMESSA FROM VWREMESSA R WHERE R.REMESSA_ID = :REMESSA_ID);
                SUSPEND;
            END
    
        END
    end else
    begin

       FOR
            SELECT
                C.PRODUTO_ID,
                COALESCE(C.TAMANHO,0)TAMANHO,
                t.gp_id,
                MAX(C.QUANTIDADE)
            
            FROM
                VWREMESSA_TALAO T,
                VWREMESSA_CONSUMO C
            
            WHERE T.ID               = :TALAO_ID
            AND C.REMESSA_ID       = T.REMESSA_ID
            AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
            AND C.COMPONENTE       = '0'
            AND C.STATUS           = '0'
            
            GROUP BY 1,2,3
        INTO
            CONSUMO_PRODUTO_ID,
            CONSUMO_TAMANHO,
            GP_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN
    
            for
                select first 6
                    CLASSIFICACAO,
                    max(DATA_CLASSIFICACAO) as DATA_CLASSIFICACAO
                from(
                    SELECT
                        o.CLASSIFICACAO,
                        max(t.hora_producao) as DATA_CLASSIFICACAO
                    FROM
                        VWREMESSA_TALAO T,
                        VWREMESSA_CONSUMO C,
                        TBREMESSA_TALAO_VINCULO v,
                        tbrevisao r,
                        TBREVISAO_OB o
                    
                    WHERE T.gp_id          = :GP_ID
                    AND C.REMESSA_ID       = T.REMESSA_ID
                    AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
                    AND C.COMPONENTE       = '0'
                    AND C.STATUS           = '1'
                    and v.consumo_id       = c.id
                    and r.id               = v.tabela_id
                    and o.ob               = r.ob
                    and r.saldo            > 0
                    and t.data_producao    between dateadd(month,-2,current_timestamp) and current_timestamp
                    and r.produto_id       = :CONSUMO_PRODUTO_ID
                    group by 1
                    
                    union all
                    
                    select distinct
                        o.CLASSIFICACAO,
                        dateadd(month,-2,current_timestamp) as DATA_CLASSIFICACAO
                    from TBREVISAO_OB o, tbrevisao r
                    where o.ob = r.ob
                    and r.saldo > 0
                    and r.produto_id = :CONSUMO_PRODUTO_ID
                ) group by 1

                order by DATA_CLASSIFICACAO ascending

            into
              :CLASSIFICACAO,
              :DATA_CLASSIFICACAO
            do begin
                FOR
                    SELECT first 10
                        REFERENCIA_TIPO,
                        REFERENCIA_ID,
                        PRODUTO_ID,
                        0 REMESSA,
                        0 REMESSA_TALAO_ID,
                        0 REMESSA_TALAO_DETALHE_ID,
                        ENDERECAMENTO,
                        SALDO,
                        OBSERVACAO,
                        datahora
                    FROM (
                        SELECT  FIRST 10
                            'R' REFERENCIA_TIPO,
                            R.ID REFERENCIA_ID,
                            R.PRODUTO_ID,
                
                            (SELECT FIRST 1 E.GRUPO || '/' || E.SUBGRUPO
                               FROM TBENDERECAMENTO E
                              WHERE E.ID = R.ENDERECAMENTO_ID) ENDERECAMENTO,
                    
                            (R.SALDO -
                            COALESCE(
                                (SELECT SUM(V.QUANTIDADE)
                                   FROM TBREMESSA_TALAO_VINCULO V
                                  WHERE V.TIPO = 'R'
                                    AND V.TABELA_ID = R.ID
                                    AND V.STATUS = '0'),0)
                            ) SALDO,
        
                            O.OB OBSERVACAO,
                            R.datahora
                    
                        FROM 
                            TBREVISAO R, TBREVISAO_OB O
                        
                        WHERE R.PRODUTO_ID          = :CONSUMO_PRODUTO_ID
                        AND COALESCE(R.TAMANHO,0)   = :CONSUMO_TAMANHO
                        AND R.SALDO                 > 0
                        and O.OB                    = R.OB
                        and o.classificacao         = :CLASSIFICACAO
                        AND ((R.RESULTADO = 'I' OR R.RESULTADO = 'R' OR R.AVULSO = '1') OR (R.RESULTADO = 'P' AND R.STATUS_OB = '2'))
                
                        ORDER BY
                            R.datahora ascending
                    ) X
                    WHERE
                        X.SALDO >= :CONSUMO_QUANTIDADE
                INTO
                    REFERENCIA_TIPO,
                    REFERENCIA_ID,
                    PRODUTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    ENDERECAMENTO,
                    SALDO,
                    OBSERVACAO,
                    DATA_PECA
                DO
                BEGIN
                    SUSPEND;
                END
             end
        END
    end

END;
