SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PREVISAO_MULT_AGP (
    CONF_AGRUPAMENTO_ID integer,
    PROGRAMADO varchar(10),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(10),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN varchar(10),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS varchar(10),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP varchar(10),
    PRODUZIR numeric(18,4),
    CAP_PROD_SKU numeric(18,4),
    TIPO_EXEC integer)
as
declare variable OLD_TIPO_AGP varchar(10);
declare variable SUB_TIPO_GP integer;
declare variable ORDEM_AGP integer;
declare variable OPERFIL varchar(10);
declare variable OPERFIL_COR varchar(10);
declare variable OPRODUTO_CODIGO integer;
declare variable OCOR_ID integer;
declare variable ODATA_PRODUCAO date;
declare variable ODATA_AGRUPAMENTO date;
declare variable TIPO_AGP varchar(10);
declare variable TIPO_DATA integer;
declare variable GP_AGRUPAMENTO_ID integer;
declare variable PRINCIPAL integer;
declare variable CONJUNTO_MODELO_PAI integer;
declare variable CONJUNTO_PECA_ID integer;
declare variable FATOR_CONVERSAO numeric(15,4);
declare variable TAMANHO_ORIGINAL integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable MODELO_ORIGINAL integer;
declare variable PERFIL_ORIGINAL varchar(10);
declare variable TPRINCIPAL integer;
declare variable TIPO_CONSUMO integer;
declare variable GERAR_CONJUNTOS integer;
declare variable ITEM_CONJUNTOS integer;
declare variable TDATA date;
begin
  
    OLD_TIPO_AGP = '';

    TAMANHO_ORIGINAL = TAMANHO;
    PRODUTO_ORIGINAL = PRODUTO_CODIGO;
    MODELO_ORIGINAL  = MODELO_CODIGO;
    PERFIL_ORIGINAL  = PERFIL;

    for
        select
            h.PECA_ID,
            h.MODELO_PAI_ID,
            h.modelo_id,
            h.PRODUTO_ID,
            h.FATOR_CONVERSAO,
            h.TAMANHO,
            h.PERFIL_SKU,
            0 as PRINCIPAL,
            1 as ITEM_CONJUNTOS
        from SPC_CONJUNTO(:MODELO_CODIGO, :COR_ID, :TAMANHO) h

        union all

        select
            0 PECA_ID,
            0 MODELO_PAI_ID,
            :MODELO_CODIGO modelo_id,
            :PRODUTO_CODIGO PRODUTO_ID,
            1 FATOR_CONVERSAO,
            :TAMANHO TAMANHO,
            :PERFIL PERFIL_SKU,
            1 as PRINCIPAL,
            0 as ITEM_CONJUNTOS
       from RDB$DATABASE

    into
        CONJUNTO_PECA_ID,
        CONJUNTO_MODELO_PAI,
        MODELO_CODIGO,
        PRODUTO_CODIGO,
        FATOR_CONVERSAO,
        TAMANHO,
        PERFIL,
        TPRINCIPAL,
        ITEM_CONJUNTOS
    do begin

        for
            select
                g.gp_id,
                g.principal,
                iif(g.principal = 1, 'P', h.tipo_agrupamento) as tipo_agrupamento,
                h.sub_tipo_gp,
                g.ordem,
                g.tipo_consumo,
                g.GERAR_CONJUNTOS
            from TBCONFI_ALOCACAO_MODELO_ITENS g, tbesteira h
            where g.confi_alocacao_id = :conf_agrupamento_id
            and h.codigo = g.gp_id
            order by ordem
        into
            :GP_AGRUPAMENTO_ID,
            :PRINCIPAL,
            :TIPO_AGP,
            :SUB_TIPO_GP,
            :ORDEM_AGP,
            :TIPO_CONSUMO,
            :GERAR_CONJUNTOS
        do begin

            if(GERAR_CONJUNTOS = ITEM_CONJUNTOS)then
            begin

                if(GERAR_CONJUNTOS = 0)then
                begin
                    TAMANHO         = TAMANHO_ORIGINAL;
                    PRODUTO_CODIGO  = PRODUTO_ORIGINAL;
                    MODELO_CODIGO   = MODELO_ORIGINAL;
                    PERFIL          = PERFIL_ORIGINAL;
                end

                :OPERFIL            = PERFIL;
                :OPERFIL_COR        = PERFIL_COR;
                :OPRODUTO_CODIGO    = PRODUTO_CODIGO;
                :OCOR_ID            = COR_ID;
                :ODATA_PRODUCAO     = DATA_PRODUCAO;
                :ODATA_AGRUPAMENTO  = DATA_AGRUPAMENTO;
    
                if(TIPO_CONSUMO = 0 and SUB_TIPO_GP <> 8 and SUB_TIPO_GP <> 9)then
                begin
                    :OPRODUTO_CODIGO = 0;
                    OPERFIL_COR = '';

                    select
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.codigo,
                        p.cor_codigo
                    from tbproduto p
                    where p.modelo_codigo = :MODELO_CODIGO
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL_COR, :OPRODUTO_CODIGO, :OCOR_ID;
    
                    if(coalesce(:OPRODUTO_CODIGO,0) = 0)then
                    begin                               
                        exception "..." 'COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DA COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
                end

                if(SUB_TIPO_GP = 8)then
                begin
    
                    OPERFIL = '';
                    OPERFIL_COR = '';
                    OCOR_ID = 0;

                    select
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.cor_codigo
                    from tbmodelo m, tbgrupo_modelo j, tbmodelo m2, tbproduto p
                    where m.codigo = :MODELO_CODIGO
                    and j.id = m.grupo_id
                    and m2.codigo = j.modelo_id
                    and p.modelo_codigo = m2.codigo
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OCOR_ID;
    
                    if(coalesce(:OCOR_ID,0) = 0)then
                    begin                               
                        exception "..." 'COR DO GRUPO DE FIO (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end

                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DO GRUPO DE FIO NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                if(SUB_TIPO_GP = 9)then
                begin
                    :OPRODUTO_CODIGO = 0;
    
                    OPERFIL = '';
                    OPERFIL_COR = '';
                    OCOR_ID = 0;

                    select  
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo AND B.tamanho = :tamanho) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.codigo,
                        p.cor_codigo
                    from tbproduto p
                    where p.modelo_codigo = :MODELO_CODIGO
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OPRODUTO_CODIGO, :OCOR_ID;
    
                    if(coalesce(:OPRODUTO_CODIGO,0) = 0)then
                    begin                               
                        exception "..." 'COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DA COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end

                QTD_AGP  = coalesce((select
                                        sum(p.quantidade)
                                     from tbagrupamento_previsao p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                QTD_REM  = coalesce((select
                                        sum(p.quantidade)
                                     from TbRemessa_Item_Alocacao p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                PRODUZIR = SALDO - (QTD_EST + QTD_REM + QTD_AGP);
                PRODUZIR = FN_INT_ROUND_UP(PRODUZIR * FATOR_CONVERSAO);

                TIPO_DATA = 0;
    
                if(ORDEM_AGP > 1)then
                begin
                    :TIPO_DATA = 1;
                    :ODATA_PRODUCAO = (select
                                            max(a.data_inicial)
                                         from tbagrupamento_previsao p, tbagrupamento a
                                         where p.tipo = :OLD_TIPO_AGP
                                         and p.tabela_id = :PEDIDO
                                        and p.tab_item_id = :VPED_ITEM_ID
                                         and p.tamanho_original = :tamanho_original
                                         and a.id = p.agrupamento_id
                                         and iif(:GERAR_CONJUNTOS = 0, true,
                                            p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                                         )
                                      );

                    if(ODATA_PRODUCAO is null)then
                    begin
                        exception "..." 'Agrupamentos não encontrado, ORDEM: '||ORDEM_AGP||', TIPO: '||OLD_TIPO_AGP||', GP:'||GP_AGRUPAMENTO_ID||', DATA. AGP. ANTERIOR: '||formatdate(ODATA_AGRUPAMENTO)
                        ||'<br><br><strong>Verifique:</strong>Tempo dos Modelos<br>Perfil nos modelos de grupo de fio<br>Modelos no grupo de fio<br>Calendário de produção<br>Agrupamentos de Produção';
                        PRODUZIR = 0;
                    end

                    :TDATA = ODATA_PRODUCAO;
                    :ODATA_AGRUPAMENTO = ODATA_PRODUCAO;


                end else
                begin
                    ODATA_PRODUCAO = null;
                end
    
                if(ODATA_AGRUPAMENTO < current_date)then
                begin
                    ODATA_AGRUPAMENTO = current_date;
                end

                IF (PRODUZIR <= 0) THEN
                BEGIN
                    exception "..." 'Produzir:'||PRODUZIR;
                END

                IF (PRODUZIR > 0) THEN
                BEGIN

                    if(TIPO_EXEC = 1)then
                    begin
    
                        EXECUTE PROCEDURE SPI_PREVISAO_AGP_CAP_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :PRODUTO_CODIGO,
                             :PERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :CAP_PROD_SKU,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :PERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,  
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
    
                    end else
                    begin
    
                        EXECUTE PROCEDURE SPI_PREVISAO_AGP_TEMPO_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :OPRODUTO_CODIGO,
                             :OCOR_ID,
                             :OPERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :OPERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
                     end
                 END
             end
             OLD_TIPO_AGP = :TIPO_AGP;
         end
    end
end
^

SET TERM ; ^

