SET TERM ^ ;

CREATE OR ALTER procedure SPU_REPOSICAO_EST_SOB_ENCOMENDA (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(400),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    COMPRADO numeric(18,4),
    REVISAO numeric(18,4),
    CONFERENCIA numeric(18,4),
    DISPONIVEL1 numeric(18,4),
    EMPENHADO numeric(18,4),
    PROJECAO numeric(18,4),
    PROJECAO_SEG numeric(18,4),
    DISPONIVEL2 numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NEC_COMPRA numeric(18,4),
    MULTIPLO integer,
    QTD_OC numeric(18,4),
    FORNECEDOR_ID integer,
    FORNECEDOR varchar(50),
    TRANSPORTADORA_ID integer,
    PAGAMENTO_CONDICAO integer,
    PAGAMENTO_FORMA integer,
    VALOR numeric(18,4),
    OC integer)
as
declare variable VOC integer;
declare variable VSEQ integer;
declare variable VCONTROLE integer;
declare variable VFORNECEDOR integer;
declare variable VOPERACAO varchar(30);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XPRODUTO_DESCRICAO varchar(400);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XCOMPRADO numeric(18,4);
declare variable XREVISAO numeric(18,4);
declare variable XCONFERENCIA numeric(18,4);
declare variable XDISPONIVEL1 numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XPROJECAO_SEG numeric(18,4);
declare variable XDISPONIVEL2 numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNEC_COMPRA numeric(18,4);
declare variable XMULTIPLO integer;
declare variable XQTD_OC numeric(18,4);
declare variable XFORNECEDOR_ID integer;
declare variable XFORNECEDOR varchar(50);
declare variable XTRANSPORTADORA_ID integer;
declare variable XPAGAMENTO_CONDICAO integer;
declare variable XPAGAMENTO_FORMA integer;
declare variable XVALOR numeric(18,4);
declare variable XOPERACAO varchar(3);
declare variable XCCUSTO varchar(8);
declare variable XCCONTABIL varchar(11);
BEGIN

  vOC = 0;
  vSeq = 0;
  vControle = 0;
  vFornecedor = 0;

--  EXECUTE PROCEDURE SPU_ALOCACAO_CONSUMO_MP;

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA >= CURRENT_DATE - 365
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
      and Coalesce(P.Remessa_Id,0) = 0
          
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :Modelo_Id, :Cor_Id, :Tamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :Modelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :Modelo_id
          AND B.COR_ID = :Cor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0, gen_id(GTMP10168_1,1));
       End

  End

  For

    Select Y.PRODUTO_ID,Y.PRODUTO_DESCRICAO,Y.LOCALIZACAO_ID,Y.ESTOQUE,Y.COMPRADO,Y.REVISAO,
           Y.CONFERENCIA,Y.DISPONIVEL1, Y.EMPENHADO,Y.PROJECAO,Y.PROJECAO_SEG,
           Y.DISPONIVEL2,Y.EST_MIN,Y.EST_MAX, Y.SEGURANCA, Y.PERC_PONTO_REP,
           Y.QTD_PONTO_REP,Y.TIPO_REP,Y.QTD_REP,Y.NEC_COMPRA, Y.MULTIPLO, Y.QTD_OC,

           Y.Fornecedor_Id,
           Cast(Substring(Y.Fornecedor_Dados From 14 For 50) as Varchar(50)) Fornecedor,
           Cast(Substring(Y.Fornecedor_Dados From  1 For  5) as Integer) Transportadora_Id,
           Cast(Substring(Y.Fornecedor_Dados From  6 For  4) as Integer) Pagamento_Condicao,
           Cast(Substring(Y.Fornecedor_Dados From 10 For  4) as Integer) Pagamento_Forma,

           IIF(Y.Valor_Edi > 0, Y.Valor_Edi,
           Coalesce((Select First 1 OI.Valor From TbOc O, TbOc_Item OI
            Where O.Oc = OI.Oc and O.Status = 1 and O.Fornecedor_Codigo = Y.Fornecedor_Id
              and OI.Produto_Codigo = Y.Produto_Id AND O.Data >= Current_Date - 90
            Order By O.Data Desc),0.0000)) as Valor

    From (
    Select W.PRODUTO_ID,W.PRODUTO_DESCRICAO,W.LOCALIZACAO_ID,W.ESTOQUE,W.COMPRADO,W.REVISAO,
           W.CONFERENCIA,W.DISPONIVEL1, W.EMPENHADO,W.PROJECAO,W.PROJECAO_SEG,
           W.DISPONIVEL2,W.EST_MIN,W.EST_MAX, W.SEGURANCA, W.PERC_PONTO_REP,
           W.QTD_PONTO_REP,W.TIPO_REP,W.QTD_REP,W.NEC_COMPRA, W.MULTIPLO,
           IIF(W.MULTIPLO>0,
               IIF(W.NEC_COMPRA / W.MULTIPLO = TRUNC(W.NEC_COMPRA / W.MULTIPLO),
                   W.NEC_COMPRA,
                  (TRUNC(W.NEC_COMPRA / W.MULTIPLO) + 1) * W.MULTIPLO),W.NEC_COMPRA) QTD_OC,
           W.Fornecedor_Id, W.Valor_Edi,

          coalesce((Select First 1 Cast((lpad(coalesce(F.Transportadora_Codigo,'0'),5,'0')||
                                lpad(coalesce(F.Pagamento_Condicao,'0'),4,'0')||
                                lpad(coalesce(F.Pagamento_Forma,'0'),4,'0')||
                                     coalesce(F.RazaoSocial,'')) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id),'0000000000000 ') Fornecedor_Dados

    From (
    Select Z.PRODUTO_ID,Z.PRODUTO_DESCRICAO,Z.LOCALIZACAO_ID,Z.ESTOQUE,Z.COMPRADO,Z.REVISAO,
           Z.CONFERENCIA,Z.DISPONIVEL1, Z.EMPENHADO,Z.PROJECAO,Z.PROJECAO_SEG,
           Z.DISPONIVEL2,Z.EST_MIN,Z.EST_MAX, Z.SEGURANCA, Z.PERC_PONTO_REP,
           Z.QTD_PONTO_REP,Z.TIPO_REP,Z.QTD_REP,Z.NEC_COMPRA,
           Cast(Substring(Z.Fornecedor From 1 For 5) as Integer) Fornecedor_Id,
           Cast(Substring(Z.Fornecedor From 6 For 6) as Integer) Multiplo,
           Z.Valor_Edi

    From (
    Select V.PRODUTO_ID,V.PRODUTO_DESCRICAO,V.LOCALIZACAO_ID,V.ESTOQUE,V.COMPRADO,V.REVISAO,V.CONFERENCIA,V.DISPONIVEL1,
    V.EMPENHADO,V.PROJECAO,V.PROJECAO_SEG,V.DISPONIVEL2,V.EST_MIN,V.EST_MAX, V.SEGURANCA, V.PERC_PONTO_REP,V.QTD_PONTO_REP,
    V.TIPO_REP,V.QTD_REP,V.NEC_COMPRA,

    Coalesce((Select First 1 Cast(lPad(PE.Empresa_Codigo,5,'0')||lPad(PE.Multiplo,6,'0') as VarChar(11))
      From TbProduto_Edi PE Where PE.Produto_Codigo = V.Produto_Id and PE.Prioridade = 1),'00000000000') Fornecedor,

    (Select First 1 PE.custo_unitario
      From TbProduto_Edi PE Where PE.Produto_Codigo = V.Produto_Id and PE.Prioridade = 1) Valor_Edi


    From (
    Select X.Produto_Id, X.Produto_Descricao,X.LOCALIZACAO_ID,
           X.ESTOQUE,X.COMPRADO, X.REVISAO, X.CONFERENCIA, X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA DISPONIVEL1,
           X.EMPENHADO, X.PROJECAO, (X.PROJECAO+(X.PROJECAO*X.SEGURANCA)) PROJECAO_SEG,
           X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA - X.EMPENHADO - (X.PROJECAO+(X.PROJECAO*X.SEGURANCA)) DISPONIVEL2,
           0.0000 EST_MIN, 0.0000 EST_MAX, X.SEGURANCA, 0.0000 PERC_PONTO_REP, 0.0000 QTD_PONTO_REP, 'ENC' TIPO_REP, 0.0000 QTD_REP,

          (X.EMPENHADO + (X.PROJECAO+(X.PROJECAO*X.SEGURANCA))) - (X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA) NEC_COMPRA

    From (
    Select  P.Codigo Produto_Id, P.Descricao Produto_Descricao, P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = P.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo
       and E.Remessa >= -1) as Numeric(15,4)),0.0000)
       +
     Coalesce(Cast((Select Sum(E.Saldo) 
      From TbEstoque_Detalhe_Alocacao E
     Where E.PRODUTO_ID = P.Codigo
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo
       and E.Tipo = 'S') as Numeric(15,4)),0.0000)  Empenhado,
    
     Coalesce(Cast((SELECT Sum(Z.QUANTIDADE)
      From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
     Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
       and X.Oc = Y.Oc
       and Y.Controle = Z.Oc_Item_Controle
       and Y.Situacao = 1
       and X.Status = 1
       and Y.Produto_Codigo = P.Codigo
       and Y.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Comprado,
    
     Coalesce(Cast((SELECT Sum(Y.QUANTIDADE)
      From TbNFe X, TbNFe_Item Y, TbOperacao O
     Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
       and X.Controle = Y.NFe_Controle
       and Y.Operacao_Codigo = O.Codigo
       and X.Natureza = 2
       and X.Situacao = 1
       and X.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
       and Y.Produto_Codigo = P.CODIGO
       and X.Status_Revisao = '0'
       and Y.Status_Revisao = '0'
       and O.Controle_Revisao = '1'
       and O.Controle_Estoque = '0'
       ) as Numeric(15,4)),0.0000) Conferencia,
            
     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S, TbFamilia_Ficha FF
     Where S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
       and S.Produto_Codigo = P.Codigo
       And S.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
       And FF.Familia_Codigo = :Familia_1
       And S.Localizacao_Codigo = FF.Localizacao_Revisao) as Numeric(15,4)),0.0000) Revisao,

--   0.0000 QUANTIDADE_PONTO_REPOSICAO,
--   0.0000 Estoque_Minimo,
--   0.0000 PONTO_REPOSICAO,
--   0.0000 Estoque_Maximo,
--  '0' Tipo_Reposicao,
    Coalesce(P.Seguranca,0.00) / 100.00 Seguranca
    
From (
        Select PRD.Codigo,
               PRD.Descricao,
               PRD.Localizacao_Codigo,
               PRD.Seguranca,
               Coalesce(B.Quantidade,0) Quantidade
        From TbProduto PRD
        Left Join TbEstoque_Minimo B
               On B.PRODUTO_Codigo = PRD.Codigo
              and B.Estabelecimento_Codigo = :Estabelecimento_1
              and B.Localizacao_Codigo = PRD.Localizacao_Codigo
              and B.QUANTIDADE > 0
         --     and B.Habilita_Kanban = '0'
       Where PRD.Familia_Codigo = :Familia_1
         and PRD.Status = '1'
         and PRD.Grade_Codigo = 0
    ) P

Where P.Quantidade = 0
    ) X
    ) V Where V.NEC_COMPRA > 0
    ) Z Order By Z.FORNECEDOR
    ) W
    ) Y

  Into  :xPRODUTO_ID, :xPRODUTO_DESCRICAO, :xLOCALIZACAO_ID, :xESTOQUE, :xCOMPRADO,
        :xREVISAO, :xCONFERENCIA, :xDISPONIVEL1, :xEMPENHADO, :xPROJECAO,
        :xPROJECAO_SEG, :xDISPONIVEL2, :xEST_MIN, :xEST_MAX, :xSEGURANCA,
        :xPERC_PONTO_REP, :xQTD_PONTO_REP, :xTIPO_REP, :xQTD_REP, :xNEC_COMPRA,
        :xMULTIPLO, :xQTD_OC, :xFORNECEDOR_ID, :xFORNECEDOR, :xTRANSPORTADORA_ID,
        :xPAGAMENTO_CONDICAO, :xPAGAMENTO_FORMA, :xVALOR

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin
            OC = 0;

            vOperacao = Coalesce((Select First 1 A.Operacao_Codigo||A.Conta_Contabil||A.CCusto
                 From TbProduto_Operacao_Contabil A, TbOperacao O
                Where A.Produto_Id = :xPRODUTO_ID
                  and O.Codigo = A.Operacao_Codigo
                  and O.Status = '1' and O.Tipo = 'E' ),'   0000000000000000000');

            xOperacao = Substring(vOperacao From  1 for  3);
            xCCusto   = Substring(vOperacao From 15 for  8);
            xCContabil= Substring(vOperacao From  4 for 11);

              if (:xVALOR > 0 and :xFornecedor_Id > 0 and :xOperacao <> '   ') Then
                  Begin
                
                  if (:vFornecedor <> :xFornecedor_Id) then
                       Begin   
                        vOC = (Select gen_id(GTBOC,1) FROM RDB$DATABASE);
                        vSeq = 0;
                        vFornecedor = :xFornecedor_Id;

                        --EXCLUI AS OC's ANTIGAS QUE NAO FORAM AUTORIZADAS
                        DELETE FROM TBOC
                        WHERE ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          AND FAMILIA_CODIGO = :FAMILIA_1
                          AND FORNECEDOR_CODIGO = :xFORNECEDOR_ID
                          AND STATUS = '0'
                          AND FLAG = '2';
            
                        INSERT INTO TbOc ( 
                        OC,Autorizacao_Protocolo,Estabelecimento_Codigo,
                        Familia_Codigo,Observacao,Autorizacao,Fornecedor_Codigo,
                        Status,StatusExclusao,Usuario_Codigo,Data,Valor_Frete,
                        Transportadora_Codigo,Frete,Pagamento_Forma,
                        Pagamento_Condicao,Observacao_Interna,Classificacao,
                        Pedido_Grupo, Flag) VALUES (
                        :vOC,'',:Estabelecimento_1,:Familia_1,'','1',
                        :xFORNECEDOR_ID,'0','0',0,Current_Date,0,
                        :xTRANSPORTADORA_ID, 2, :xPAGAMENTO_FORMA,
                        :xPAGAMENTO_CONDICAO, 'REPOSICAO AUTOMATICA DE ESTOQUE',
                        '', null, '2');
                      End
                   
                    vSeq = :vSeq + 1;
                    vControle = :Estabelecimento_1||lPad(:vOC,6,'0')||lPad(:vSeq,3,'0');
                    UPDATE OR INSERT INTO TbOc_Item ( 
                    Oc,Estabelecimento_Codigo,Sequencia,Controle,Produto_Codigo,
                    Fornecedor_Codigo,Valor,Quantidade,Ipi,Localizacao_Codigo, 
                    Data_Entrega,Data_Saida,Situacao,Observacao, 
                    T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,    
                    T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,  
                    Acrescimo,Desconto,Classificacao_Financeira, 
                    CCusto,OPERACAO_CODIGO,CONTA_CONTABIL) VALUES ( 
                    :vOC,:Estabelecimento_1,:vSeq,:vControle,:xProduto_Id,:xFornecedor_Id,
                    :xValor,:xQtd_Oc,0,:xLocalizacao_Id,Current_Date+10,Null,1,'',
                    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    0,0,'',:xCCusto,:xOperacao,:xCContabil);
               
                    Oc = :vOC;
                  
                End

                produto_id = :Xproduto_id ;
                produto_descricao = :Xproduto_descricao ;
                localizacao_id = :Xlocalizacao_id ;
                estoque = :Xestoque ;
                comprado = :Xcomprado ;
                revisao = :Xrevisao;
                conferencia = :Xconferencia ;
                disponivel1 = :Xdisponivel1 ;
                empenhado = :Xempenhado ;
                projecao = :Xprojecao ;
                projecao_seg = :Xprojecao_seg ;
                disponivel2 = :Xdisponivel2 ;
                est_min = :Xest_min ;
                est_max = :Xest_max ;
                seguranca = :Xseguranca ;
                perc_ponto_rep = :Xperc_ponto_rep ;
                qtd_ponto_rep = :Xqtd_ponto_rep ;
                tipo_rep = :Xtipo_rep ;
                qtd_rep = :Xqtd_rep ;
                nec_compra = :Xnec_compra ;
                multiplo = :Xmultiplo ;
                qtd_oc = :Xqtd_oc ;
                fornecedor_id = :Xfornecedor_id ;
                fornecedor = :Xfornecedor ;
                transportadora_id = :Xtransportadora_id ;
                pagamento_condicao = :Xpagamento_condicao ;
                pagamento_forma = :Xpagamento_forma ;
                valor = :Xvalor;
                Suspend;

          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_RENEGOCIACAO_PARCELAMENTO (
    NF_PARCELAMENTO_CONTROLE integer,
    NF_CONTROLE integer,
    NF_PARCELAMENTO_ID integer,
    NF_ID integer,
    RENEGOCIACAO_ID integer,
    VALOR_TOTAL numeric(15,2),
    TIPO_NF varchar(3))
as
declare variable ID_REG integer;
begin

IF(TIPO_NF = 'NFS')THEN
BEGIN
  ID_REG = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBCAIXABANCO_LANCAMENTO_REG A
                       WHERE A.NFS_PARCELAMENTO_CONTROLE = :NF_PARCELAMENTO_CONTROLE
                       AND A.NFS_CONTROLE = :NF_CONTROLE
                       AND A.VALOR_TOTAL = :VALOR_TOTAL),0);

   IF(ID_REG > 0)THEN
   BEGIN
      UPDATE TBRENEGOCIACAO_PARCELAMENTO SET CAIXABANCO_REGISTRO_ID = :ID_REG
        WHERE RENEGOCIACAO_ID = :RENEGOCIACAO_ID AND NFS_ID = :NF_ID AND NFS_PARCELAMENTO_ID = :NF_PARCELAMENTO_ID
        AND TIPO = 2;
   END
   IF(ID_REG = 0) THEN
   BEGIN
      EXCEPTION "..."' DADOS DA PARCELA GERADA NÃO ENCONTRADOS DURANTE RENEGOCIAÇÃO, OPERAÇÃO CANCELADA!';
   END
END

IF(TIPO_NF = 'NFE')THEN
BEGIN
  ID_REG = COALESCE((SELECT FIRST 1 A.CONTROLE FROM TBCAIXABANCO_LANCAMENTO_REG A
                       WHERE A.NFE_PARCELAMENTO_CONTROLE = :NF_PARCELAMENTO_CONTROLE
                       AND A.NFE_CONTROLE = :NF_CONTROLE
                       AND A.VALOR_TOTAL = :VALOR_TOTAL),0);

   IF(ID_REG > 0)THEN
   BEGIN
      UPDATE TBRENEGOCIACAO_PARCELAMENTO SET CAIXABANCO_REGISTRO_ID = :ID_REG
        WHERE RENEGOCIACAO_ID = :RENEGOCIACAO_ID AND NFE_ID = :NF_ID AND NFE_PARCELAMENTO_ID = :NF_PARCELAMENTO_ID
        AND TIPO = 2;
   END
   IF(ID_REG = 0) THEN
   BEGIN
      EXCEPTION "..."' DADOS DA PARCELA GERADA NÃO ENCONTRADOS DURANTE RENEGOCIAÇÃO, OPERAÇÃO CANCELADA!';
   END
END


  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_REPOSICAO_ESTOQUE_MINIMO (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(400),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    COMPRADO numeric(18,4),
    REVISAO numeric(18,4),
    CONFERENCIA numeric(18,4),
    DISPONIVEL1 numeric(18,4),
    EMPENHADO numeric(18,4),
    PROJECAO numeric(18,4),
    PROJECAO_SEG numeric(18,4),
    DISPONIVEL2 numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NEC_COMPRA numeric(18,4),
    MULTIPLO integer,
    QTD_OC numeric(18,4),
    FORNECEDOR_ID integer,
    FORNECEDOR varchar(50),
    TRANSPORTADORA_ID integer,
    PAGAMENTO_CONDICAO integer,
    PAGAMENTO_FORMA integer,
    VALOR numeric(18,4),
    OC integer)
as
declare variable VOC integer;
declare variable VSEQ integer;
declare variable VCONTROLE integer;
declare variable VFORNECEDOR integer;
declare variable VOPERACAO varchar(30);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XPRODUTO_DESCRICAO varchar(400);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XCOMPRADO numeric(18,4);
declare variable XREVISAO numeric(18,4);
declare variable XCONFERENCIA numeric(18,4);
declare variable XDISPONIVEL1 numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XPROJECAO_SEG numeric(18,4);
declare variable XDISPONIVEL2 numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNEC_COMPRA numeric(18,4);
declare variable XMULTIPLO integer;
declare variable XQTD_OC numeric(18,4);
declare variable XFORNECEDOR_ID integer;
declare variable XFORNECEDOR varchar(50);
declare variable XTRANSPORTADORA_ID integer;
declare variable XPAGAMENTO_CONDICAO integer;
declare variable XPAGAMENTO_FORMA integer;
declare variable XVALOR numeric(18,4);
declare variable XOPERACAO varchar(3);
declare variable XCCUSTO varchar(8);
declare variable XCCONTABIL varchar(11);
BEGIN

  vOC = 0;
  vSeq = 0;
  vControle = 0;
  vFornecedor = 0;

  EXECUTE PROCEDURE SPU_ALOCACAO_CONSUMO_MP;

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      AND P.DATA >= CURRENT_DATE - 365
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
      and Coalesce(P.Remessa_Id,0) = 0
    
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :Modelo_Id, :Cor_Id, :Tamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :Modelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :Modelo_id
          AND B.COR_ID = :Cor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0, gen_id(gTMP10168_1,1));
       End

  End

  For

    Select Y.PRODUTO_ID,Y.PRODUTO_DESCRICAO,Y.LOCALIZACAO_ID,Y.ESTOQUE,Y.COMPRADO,Y.REVISAO,
           Y.CONFERENCIA,Y.DISPONIVEL1, Y.EMPENHADO,Y.PROJECAO,Y.PROJECAO_SEG,
           Y.DISPONIVEL2,Y.EST_MIN,Y.EST_MAX, Y.SEGURANCA, Y.PERC_PONTO_REP,
           Y.QTD_PONTO_REP,Y.TIPO_REP,Y.QTD_REP,Y.NEC_COMPRA, Y.MULTIPLO, Y.QTD_OC,

           Y.Fornecedor_Id,
           Cast(Substring(Y.Fornecedor_Dados From 14 For 50) as Varchar(50)) Fornecedor,
           Cast(Substring(Y.Fornecedor_Dados From  1 For  5) as Integer) Transportadora_Id,
           Cast(Substring(Y.Fornecedor_Dados From  6 For  4) as Integer) Pagamento_Condicao,
           Cast(Substring(Y.Fornecedor_Dados From 10 For  4) as Integer) Pagamento_Forma,

           iif( Y.Valor_EDI > 0, Y.Valor_EDI,
           Coalesce((Select First 1 OI.Valor From TbOc O, TbOc_Item OI
            Where O.Oc = OI.Oc and O.Status = 1 and O.Fornecedor_Codigo = Y.Fornecedor_Id
              and OI.Produto_Codigo = Y.Produto_Id AND O.Data >= Current_Date - 90
            Order By O.Data Desc),0.0000)) as Valor

    From (
    Select W.PRODUTO_ID,W.PRODUTO_DESCRICAO,W.LOCALIZACAO_ID,W.ESTOQUE,W.COMPRADO,W.REVISAO,
           W.CONFERENCIA,W.DISPONIVEL1, W.EMPENHADO,W.PROJECAO,W.PROJECAO_SEG,
           W.DISPONIVEL2,W.EST_MIN,W.EST_MAX, W.SEGURANCA, W.PERC_PONTO_REP,
           W.QTD_PONTO_REP,W.TIPO_REP,W.QTD_REP,W.NEC_COMPRA, W.MULTIPLO,
           IIF(W.MULTIPLO>0,
               IIF(W.NEC_COMPRA / W.MULTIPLO = TRUNC(W.NEC_COMPRA / W.MULTIPLO),
                   W.NEC_COMPRA,
                  (TRUNC(W.NEC_COMPRA / W.MULTIPLO) + 1) * W.MULTIPLO),W.NEC_COMPRA) QTD_OC,
           W.Fornecedor_Id,

           coalesce((Select First 1 Cast((lpad(coalesce(F.Transportadora_Codigo,'0'),5,'0')||
                                lpad(coalesce(F.Pagamento_Condicao,'0'),4,'0')||
                                lpad(coalesce(F.Pagamento_Forma,'0'),4,'0')||
                                     coalesce(F.RazaoSocial,'')) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id),'0000000000000 ') Fornecedor_Dados,

          (Select First 1 PF.custo_unitario From TbProduto_EDI PF Where PF.produto_codigo = W.Produto_Id and PF.empresa_codigo = W.Fornecedor_Id) as Valor_EDI


    From (
    Select Z.PRODUTO_ID,Z.PRODUTO_DESCRICAO,Z.LOCALIZACAO_ID,Z.ESTOQUE,Z.COMPRADO,Z.REVISAO,
           Z.CONFERENCIA,Z.DISPONIVEL1, Z.EMPENHADO,Z.PROJECAO,Z.PROJECAO_SEG,
           Z.DISPONIVEL2,Z.EST_MIN,Z.EST_MAX, Z.SEGURANCA, Z.PERC_PONTO_REP,
           Z.QTD_PONTO_REP,Z.TIPO_REP,Z.QTD_REP,Z.NEC_COMPRA,
           Cast(Substring(Z.Fornecedor From 1 For 5) as Integer) Fornecedor_Id,
           Cast(Substring(Z.Fornecedor From 6 For 6) as Integer) Multiplo

    From (
    Select V.PRODUTO_ID,V.PRODUTO_DESCRICAO,V.LOCALIZACAO_ID,V.ESTOQUE,V.COMPRADO,V.REVISAO,V.CONFERENCIA,V.DISPONIVEL1,
    V.EMPENHADO,V.PROJECAO,V.PROJECAO_SEG,V.DISPONIVEL2,V.EST_MIN,V.EST_MAX, V.SEGURANCA, V.PERC_PONTO_REP,V.QTD_PONTO_REP,
    V.TIPO_REP,V.QTD_REP,V.NEC_COMPRA,

    Coalesce((Select First 1 Cast(lPad(PE.Empresa_Codigo,5,'0')||lPad(PE.Multiplo,6,'0') as VarChar(11))
      From TbProduto_Edi PE Where PE.Produto_Codigo = V.Produto_Id and PE.Prioridade = 1),'00000000000') Fornecedor

    From (
    Select X.Produto_Id, X.Produto_Descricao,X.LOCALIZACAO_ID,
           X.ESTOQUE,X.COMPRADO, X.REVISAO, X.CONFERENCIA, X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA DISPONIVEL1,
           X.EMPENHADO, X.PROJECAO, (X.PROJECAO+(X.PROJECAO*X.SEGURANCA)) PROJECAO_SEG,
           X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA - X.EMPENHADO - (X.PROJECAO+(X.PROJECAO*X.SEGURANCA)) DISPONIVEL2,
           X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX, X.SEGURANCA,
           X.PONTO_REPOSICAO PERC_PONTO_REP, X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
           IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
           IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,

           IIF( (X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA - X.EMPENHADO - (X.PROJECAO+(X.PROJECAO*X.SEGURANCA))) < X.QUANTIDADE_PONTO_REPOSICAO ,
                 IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                (X.ESTOQUE + X.COMPRADO + X.REVISAO + X.CONFERENCIA - X.EMPENHADO - (X.PROJECAO+(X.PROJECAO*X.SEGURANCA))), 0) NEC_COMPRA
    From (
    Select  P.Codigo Produto_Id, P.Descricao Produto_Descricao, B.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = B.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = B.Localizacao_Codigo
       and E.Remessa >= -1) as Numeric(15,4)),0.0000)
       +
     Coalesce(Cast((Select Sum(E.Saldo) 
      From TbEstoque_Detalhe_Alocacao E
     Where E.PRODUTO_ID = P.Codigo
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = B.Localizacao_Codigo
       and E.Tipo = 'S') as Numeric(15,4)),0.0000)  Empenhado,
    
     Coalesce(Cast((SELECT Sum(Z.QUANTIDADE)
      From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
     Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
       and X.Oc = Y.Oc
       and Y.Controle = Z.Oc_Item_Controle
       and Y.Situacao = 1
       and X.Status = 1
       and Y.Produto_Codigo = P.Codigo
       and Y.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Comprado,
    
     Coalesce(Cast((SELECT Sum(Y.QUANTIDADE)
      From TbNFe X, TbNFe_Item Y, TbOperacao O
     Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
       and X.Controle = Y.NFe_Controle
       and Y.Operacao_Codigo = O.Codigo
       and X.Natureza = 2
       and X.Situacao = 1
       and X.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
       and Y.Produto_Codigo = P.CODIGO
       and X.Status_Revisao = '0'
       and Y.Status_Revisao = '0'
       and O.Controle_Revisao = '1'
       and O.Controle_Estoque = '0'
       ) as Numeric(15,4)),0.0000) Conferencia,
            
     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S, TbFamilia_Ficha FF
     Where S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
       and S.Produto_Codigo = P.Codigo
       And S.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
       And FF.Familia_Codigo = :Familia_1
       And S.Localizacao_Codigo = FF.Localizacao_Revisao) as Numeric(15,4)),0.0000) Revisao,

    Coalesce(Cast(B.QUANTIDADE * (Coalesce(B.Ponto_Reposicao,100.0000) / 100.0000) as Numeric(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
    Coalesce(B.QUANTIDADE,0.0000) Estoque_Minimo,
    Coalesce(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
    Coalesce(B.Estoque_Max,0.0000) Estoque_Maximo,
    Coalesce(B.TIPO_REPOSICAO,'1') Tipo_Reposicao,
    Coalesce(P.Seguranca,0.00) / 100.00 Seguranca
    
    From TbProduto P , TbEstoque_Minimo B
    Where B.Estabelecimento_Codigo = :Estabelecimento_1
   --   and B.Localizacao_Codigo = P.Localizacao_Codigo
      and B.PRODUTO_Codigo = P.Codigo
      and P.Familia_Codigo = :Familia_1
      and P.Status = '1'
      and P.Grade_Codigo = 0
      and B.QUANTIDADE > 0
      and B.Habilita_Kanban = '0'

    ) X
    ) V Where V.NEC_COMPRA > 0
    ) Z Order By Z.FORNECEDOR
    ) W
    ) Y

  Into  :xPRODUTO_ID, :xPRODUTO_DESCRICAO, :xLOCALIZACAO_ID, :xESTOQUE, :xCOMPRADO,
        :xREVISAO, :xCONFERENCIA, :xDISPONIVEL1, :xEMPENHADO, :xPROJECAO,
        :xPROJECAO_SEG, :xDISPONIVEL2, :xEST_MIN, :xEST_MAX, :xSEGURANCA,
        :xPERC_PONTO_REP, :xQTD_PONTO_REP, :xTIPO_REP, :xQTD_REP, :xNEC_COMPRA,
        :xMULTIPLO, :xQTD_OC, :xFORNECEDOR_ID, :xFORNECEDOR, :xTRANSPORTADORA_ID,
        :xPAGAMENTO_CONDICAO, :xPAGAMENTO_FORMA, :xVALOR

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin
            OC = 0;

            vOperacao = Coalesce((Select First 1 A.Operacao_Codigo||A.Conta_Contabil||A.CCusto
                 From TbProduto_Operacao_Contabil A, TbOperacao O
                Where A.Produto_Id = :xPRODUTO_ID
                  and O.Codigo = A.Operacao_Codigo
                  and O.Status = '1' and O.Tipo = 'E'),'   0000000000000000000');

            xOperacao = Substring(vOperacao From  1 for  3);
            xCCusto   = Substring(vOperacao From 15 for  8);
            xCContabil= Substring(vOperacao From  4 for 11);

              if (:xVALOR > 0 and :xFornecedor_Id > 0 and :xOperacao <> '   ') Then
                  Begin

                  if (:vFornecedor <> :xFornecedor_Id) then
                       Begin
                        vOC = (Select gen_id(GTBOC,1) FROM RDB$DATABASE);
                        vSeq = 0;
                        vFornecedor = :xFornecedor_Id;
                        
                        --EXCLUI AS OC's ANTIGAS QUE NAO FORAM AUTORIZADAS
                        DELETE FROM TBOC
                        WHERE ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          AND FAMILIA_CODIGO = :FAMILIA_1
                          AND FORNECEDOR_CODIGO = :xFORNECEDOR_ID
                          AND STATUS = '0'
                          AND FLAG = '1';
            
                        INSERT INTO TbOc ( 
                        OC,Autorizacao_Protocolo,Estabelecimento_Codigo,
                        Familia_Codigo,Observacao,Autorizacao,Fornecedor_Codigo,
                        Status,StatusExclusao,Usuario_Codigo,Data,Valor_Frete,
                        Transportadora_Codigo,Frete,Pagamento_Forma,
                        Pagamento_Condicao,Observacao_Interna,Classificacao,
                        Pedido_Grupo, Flag) VALUES (
                        :vOC,'',:Estabelecimento_1,:Familia_1,'','1',
                        :xFORNECEDOR_ID,'0','0',0,Current_Date,0,
                        :xTRANSPORTADORA_ID,2,:xPAGAMENTO_FORMA,
                        :xPAGAMENTO_CONDICAO, 'REPOSICAO AUTOMATICA DE ESTOQUE',
                        '', null, '1');
                      
                      End
                
                    IF (:Xnec_compra > :Xmultiplo and :Xnec_compra < :Xqtd_oc/* and :Xqtd_oc > :Xest_max */ ) Then
                         Xqtd_oc = :Xqtd_oc - :Xmultiplo;

                    vSeq = :vSeq + 1;
                    vControle = :Estabelecimento_1||lPad(:vOC,5,'0')||lPad(:vSeq,3,'0');
                    
                    UPDATE OR INSERT INTO TbOc_Item ( 
                    Oc,Estabelecimento_Codigo,Sequencia,Controle,Produto_Codigo,
                    Fornecedor_Codigo,Valor,Quantidade,Ipi,Localizacao_Codigo, 
                    Data_Entrega,Data_Saida,Situacao,Observacao, 
                    T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,    
                    T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,  
                    Acrescimo,Desconto,Classificacao_Financeira, 
                    CCusto,OPERACAO_CODIGO,CONTA_CONTABIL) VALUES ( 
                    :vOC,:Estabelecimento_1,:vSeq,:vControle,:xProduto_Id,:xFornecedor_Id,
                    :xValor,:xQtd_Oc,0,:xLocalizacao_Id,Current_Date+10,Null,1,'',
                    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    0,0,'',:xCCusto,:xOperacao,:xCContabil);
                    
                    Oc = :vOC;
                End

                produto_id = :Xproduto_id ;
                produto_descricao = :Xproduto_descricao ;
                localizacao_id = :Xlocalizacao_id ;
                estoque = :Xestoque ;
                comprado = :Xcomprado ;
                revisao = :Xrevisao;
                conferencia = :Xconferencia ;
                disponivel1 = :Xdisponivel1 ;
                empenhado = :Xempenhado ;
                projecao = :Xprojecao ;
                projecao_seg = :Xprojecao_seg ;
                disponivel2 = :Xdisponivel2 ;
                est_min = :Xest_min ;
                est_max = :Xest_max ;
                seguranca = :Xseguranca ;
                perc_ponto_rep = :Xperc_ponto_rep ;
                qtd_ponto_rep = :Xqtd_ponto_rep ;
                tipo_rep = :Xtipo_rep ;
                qtd_rep = :Xqtd_rep ;
                nec_compra = :Xnec_compra ;
                multiplo = :Xmultiplo ;
                qtd_oc = :Xqtd_oc ;
                fornecedor_id = :Xfornecedor_id ;
                fornecedor = :Xfornecedor ;
                transportadora_id = :Xtransportadora_id ;
                pagamento_condicao = :Xpagamento_condicao ;
                pagamento_forma = :Xpagamento_forma ;
                valor = :Xvalor;

                -- Regra implementada por Haroldo em 15/08/16 as 08:24
                -- para evitar a geracao de OC com quantidade superior
                -- ao estoque maximo.
                -- IF (:Xnec_compra > :Xmultiplo and :Xnec_compra < :Xqtd_oc and :Xqtd_oc > :Xest_max) Then
                --     qtd_oc = :qtd_oc - :Xmultiplo;

                -- Regra alterada por Haroldo em 17/09/2020 as 14:41
                -- Para que seja analisado apenas os pedidos programados para at?? 40 a frente

                Suspend;

          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATAR_REQUISICOES
as
declare variable PROGRAMACAO_ID integer;
declare variable ABERTOS integer;
declare variable REQUISICAO_ID integer;
begin
  FOR
    select * from (select
    
        p.id as programacao_id,
        P.requisicao_id,
        coalesce((select
            
                count(d.id)
            
            
            from vwremessa_talao_detalhe d
            where 1=1
            and d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            and d.data_producao is null),0) as ABERTOS
    
    from tbprogramacao p,
         vwremessa_talao r
    
    where p.status_requisicao = 1
    and p.status < 3
    and r.id = p.tabela_id)
    where ABERTOS = 0

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN
      --DESATIVADA A PEDIDO DO WELLINGTON - 08/01/2020 16:53h - PARA AVERIGUAÇÃO COM A PRODUÇÃO
      --ATIVADA A PEDIDO DO HAROLDO - 08/07/2020 09:35h
    
      update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
    
      update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
            J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
      WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((SELECT
                    iif(quantidade = 0 and PLACAS = 0 and SOBRAS > 0,1,0)
                FROM(
                    select
                        coalesce(r.quantidade,0) as quantidade,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(h.quantidade) from tbrequisicao_placa h where h.requisicao_id = r.id),0) as PLACAS
                    from tbrequisicao r
                    where r.id = p.requisicao_id
               )
    
            ),-1) as SOBRA
        
        from tbprogramacao p,
             vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  SOBRA = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((
                select
                    count(1)
                from(
                    select
                        r.ID ,
                        r.gp_id,
                        coalesce(r.quantidade,0) as QUANTIDADE,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(p.quantidade) from tbrequisicao_placa p where p.requisicao_id = r.id),0) as PLACAS,
                        r.datahora
                    from tbrequisicao r
                    where r.id = p.requisicao_id
                ) where QUANTIDADE = 0 and SOBRAS = 0 and  PLACAS = 0
             ),0) zeradas
        
        from tbprogramacao p,
         vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  zeradas = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

  END

  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATAR_REQUISICOES_EX_V2
as
declare variable PROGRAMACAO_ID integer;
declare variable REQUISICAO_ID integer;
begin

  --finaliza itens da programacao com requisicoes excluidas
  FOR
    select
        PROGRAMACAO_ID,
        REQUISICAO_ID2

    from(select
        p.requisicao_id,
        (select first 1 r.id from tbrequisicao r where r.id = p.requisicao_id) as REQUISICAO_ID2,
        p.id as PROGRAMACAO_ID
    
    from
    tbprogramacao p
    where p.status = 1
    and p.requisicao_id > 0
    and p.ferramenta_id > 0)
    where REQUISICAO_ID2 is null

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID
  DO
  BEGIN
    update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;

    update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;
  END

  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_COLETOR_VALIDAR_TALAO (
    NFE_ID integer,
    EMPRESA_ID integer,
    TALAO varchar(20))
as
declare variable RETORNO varchar(300);
declare variable ITALAO integer;
declare variable PRODUTO_ID integer;
declare variable QUANTIDADE integer;
declare variable TAMANHO integer;
declare variable SITUACAO integer;
declare variable VEMPRESA_ID integer;
begin

  RETORNO = '';
  ITALAO  = cast( replace(replace(TALAO, 'RA',''), 'RD','') as integer);

  for
    select
        i.produto_codigo,
        cast( i.quantidade_pedido as integer) as QUANTIDADE,
        i.tamanho,
        i.situacao,
        coalesce((select first 1 f.EMPRESA_ID from tbfaccao_remessa f where f.remessa_id = i.remessa),0) as EMPRESA_ID
        from tbpedido_item_processado i
     where i.controle = :ITALAO
  into
    :produto_id,
    :quantidade,
    :tamanho,
    :situacao,
    :vempresa_id
  do begin

  end

  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_TRATAR_ROMANEIO (
    ROMANEIO_ID integer)
as
declare variable NUMERO_NOTAFISCAL integer;
declare variable ID integer;
declare variable SEQUENCIA integer;
declare variable OC integer;
declare variable PRODUTO_ID integer;
declare variable QUANTIDADE_BRUTA numeric(18,5);
declare variable PERDA numeric(18,5);
declare variable QUANTIDADE_LIQUIDA numeric(18,5);
declare variable LOTE varchar(20);
declare variable OC_ITEM_SEQUENCIA integer;
declare variable PRODUTO_TAMANHO varchar(5);
declare variable PECA_ID integer;
begin

    for
        select
            r.numero_notafiscal,
            i.ID,
            i.SEQUENCIA,
            i.OC,
            i.PRODUTO_ID,
            i.QUANTIDADE_BRUTA,
            i.PERDA,
            i.QUANTIDADE_LIQUIDA,
            i.LOTE,
            i.OC_ITEM_SEQUENCIA,
            i.PRODUTO_TAMANHO,
            i.PECA_ID
        from tbromaneio r, tbromaneio_item i
        where r.id = :ROMANEIO_ID
        and i.romaneio_id = r.id
    into
        NUMERO_NOTAFISCAL,
        ID,
        SEQUENCIA,
        OC,
        PRODUTO_ID,
        QUANTIDADE_BRUTA,
        PERDA,
        QUANTIDADE_LIQUIDA,
        LOTE,
        OC_ITEM_SEQUENCIA,
        PRODUTO_TAMANHO,
        PECA_ID
    do begin

    end

  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REPOSICAO_ESTOQUE (
    FAMILIA integer)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(400),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    COMPRADO numeric(18,4),
    EMPENHADO numeric(18,4),
    PROJECAO numeric(18,4),
    DISPONIVEL numeric(18,4))
as
declare variable ESTABELECIMENTO_1 integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XPRODUTO_DESCRICAO varchar(400);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XCOMPRADO numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XDISPONIVEL numeric(18,4);
BEGIN

    :ESTABELECIMENTO_1 = 1;

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA between '01.01.2017' and current_date
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
      and Coalesce(P.Remessa_Id,0) = 0
          
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :Modelo_Id, :Cor_Id, :Tamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :Modelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :Modelo_id
          AND B.COR_ID = :Cor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0, gen_id(GTMP10168_1,1));
       End

  End

  For

    Select X.Produto_Id, X.Produto_Descricao,X.LOCALIZACAO_ID,
           X.ESTOQUE, X.COMPRADO, X.EMPENHADO, X.PROJECAO,
          (X.ESTOQUE - X.EMPENHADO) + X.COMPRADO - X.PROJECAO

    From (
    Select  P.Codigo Produto_Id, P.Descricao Produto_Descricao, P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = P.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo) as Numeric(15,4)),0.0000)  Empenhado,
    
     Coalesce(Cast((SELECT Sum(Z.QUANTIDADE)
      From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
     Where X.ESTABELECIMENTO_CODIGO = Y.ESTABELECIMENTO_CODIGO
       and X.Oc = Y.Oc
       and Y.Controle = Z.Oc_Item_Controle
       and Y.Situacao = 1
       and X.Status = 1
       and Y.Produto_Codigo = P.Codigo
       and Y.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Comprado 
    
From (
        Select PRD.Codigo,
               PRD.Descricao,
               PRD.Localizacao_Codigo
        From TbProduto PRD
       Where PRD.Familia_Codigo = :Familia
         and PRD.Status = '1'
         and PRD.Grade_Codigo = 0
    ) P
    ) X Order by 2

  Into  :xPRODUTO_ID, :xPRODUTO_DESCRICAO, :xLOCALIZACAO_ID,
        :xESTOQUE, :xCOMPRADO, :xEMPENHADO, :xPROJECAO, :xDISPONIVEL

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin

                produto_id = :Xproduto_id ;
                produto_descricao = :Xproduto_descricao ;
                localizacao_id = :Xlocalizacao_id ;
                estoque = :Xestoque ;
                comprado = :Xcomprado ;
                empenhado = :Xempenhado ;
                projecao = :Xprojecao ;
                disponivel = :Xdisponivel;
                Suspend;

          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_COTA_FATURAMENTO (
    DATA_1 date = null,
    DATA_2 date = null)
as
begin

    DATA_1 = IIF(DATA_1 IS NULL, CAST(FN_START_OF_MONTH() AS DATE),DATA_1);
    DATA_2 = IIF(DATA_2 IS NULL, CAST(FN_END_OF_MONTH() AS DATE),DATA_2);

    DELETE FROM TMPCOTA_FATURAMENTO;
    INSERT INTO TMPCOTA_FATURAMENTO
    SELECT
        ANO,
        MES,
        PERIODO_DESCRICAO,
        SUM(VALOR_TOTAL)VALOR_TOTAL,
        SUM(VALOR_TOTAL_DEV)VALOR_TOTAL_DEV,
        SUM(VALOR_TOTAL_EXTRA)VALOR_TOTAL_EXTRA,
        gen_id(GTMPCOTA_FATURAMENTO,1) as ID

    FROM
   (SELECT
        EXTRACT(YEAR FROM A.DATA_EMISSAO)ANO,
        EXTRACT(MONTH FROM A.DATA_EMISSAO)MES,   
    
        TRIM(FN_MES_DESCRICAO(EXTRACT(MONTH FROM A.DATA_EMISSAO))||'/'||EXTRACT(YEAR FROM A.DATA_EMISSAO)) PERIODO_DESCRICAO,

        SUM(A.VALOR_TOTAL) VALOR_TOTAL,
        0 VALOR_TOTAL_DEV,
        0 VALOR_TOTAL_EXTRA

    FROM
        TBNFS_ITEM A,
        TBNFS B,
        TBNFS_TOTAIS C,
        TBOPERACAO D

    WHERE
        A.NFS_CONTROLE = B.CONTROLE
    AND A.NFS_CONTROLE = C.NFS_CONTROLE
    AND A.OPERACAO_CODIGO = D.CODIGO
    AND D.CONTROLE_FATURAMENTO = 1
    AND ((B.SITUACAO = 2) OR (B.SITUACAO = 1 AND B.NATUREZA = 2))
    AND B.DATA_EMISSAO BETWEEN :DATA_1 AND :DATA_2
    /*#ESTABELECIMENTO#*/

    GROUP BY 1,2,3


    UNION

    SELECT          
        EXTRACT(YEAR FROM A.DATA_ENTRADA)ANO,
        EXTRACT(MONTH FROM A.DATA_ENTRADA)MES,
    
        TRIM(FN_MES_DESCRICAO(EXTRACT(MONTH FROM A.DATA_ENTRADA))||'/'||EXTRACT(YEAR FROM A.DATA_ENTRADA)) PERIODO_DESCRICAO,
    
        0 VALOR_TOTAL,
    
        SUM(A.VALOR_TOTAL-A.VALOR_DESCONTO+A.VALOR_ACRESCIMO+A.VALOR_IPI+A.VALOR_ICMS_ST) VALOR_TOTAL_DEV,

        0 VALOR_TOTAL_EXTRA
    
    FROM TBNFE_ITEM A, TBNFE B, TBOPERACAO C
    
    WHERE A.NFE_CONTROLE = B.CONTROLE
      AND A.OPERACAO_CODIGO = C.CODIGO
      AND B.SITUACAO < 3
      AND B.DATA_ENTRADA BETWEEN :DATA_1 AND :DATA_2
      AND C.CONTROLE_DEVOLUCAO = 1
      /*#ESTABELECIMENTO#*/
    
    GROUP BY 1,2,3

    UNION

    SELECT     
        F.ANO,
        F.MES,
        TRIM(FN_MES_DESCRICAO(F.MES)||'/'||F.ANO) PERIODO_DESCRICAO,

        0 VALOR_TOTAL,
        0 VALOR_TOTAL_DEV,
        SUM(F.VALOR)VALOR_TOTAL_EXTRA

    FROM
        TBCCUSTO_FATURAMENTO F

    WHERE
        F.STATUSEXCLUSAO = '0'
    AND Cast(F.Ano||'.'||F.Mes||'.01' As Date) BETWEEN :DATA_1 AND :DATA_2
    /*#ESTABELECIMENTO#*/

    GROUP BY 1,2,3,4,5)X

    GROUP BY 1,2,3
    
    ORDER BY ANO,MES;


end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_INTERMEDIARIA (
    DATAHORA_DISPONIBILIDADE timestamp = null)
returns (
    REMESSA_ID integer)
as
declare variable REMESSA_ID_ORIGEM integer;
declare variable REMESSA_ID_VINCULO integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable OBSERVACAO varchar(200);
declare variable GP_ID integer;
declare variable TALAO_ID integer;
declare variable TALAO_PRODUTO_DESCRICAO varchar(400);
declare variable TALAO_PERFIL_SKU varchar(10);
declare variable TALAO_PERFIL_SKU_DESCRICAO varchar(80);
declare variable TALAO_COR_CLASSE varchar(10);
declare variable TALAO_COR_SUBCLASSE integer;
declare variable TALAO_CONTROLE varchar(4000);
declare variable TALAO_MODELO_ID integer;
declare variable TALAO_MODELO_DESCRICAO varchar(200);
declare variable TALAO_TAMANHO integer;
declare variable TALAO_PRODUTO_ID integer;
declare variable TALAO_TAMANHO_DESCRICAO varchar(200);
declare variable TALAO_QUANTIDADE numeric(18,5);
declare variable PRODUTO_DESCRICAO varchar(400);
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable UM varchar(12);
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable COR_CLASSE varchar(10);
declare variable COR_SUBCLASSE integer;
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable QUANTIDADE_SOBRA numeric(18,4);
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(18,2);
declare variable STATUS integer;
declare variable DATA_PRODUCAO date;
declare variable DATA_LIBERACAO date;
declare variable HORA_PRODUCAO timestamp;
declare variable HORA_LIBERACAO timestamp;
declare variable VIA_ETIQUETA integer;
declare variable TURNO char(4);
declare variable TALAO_EXTRA integer;
declare variable PERCENTUAL_EXTRA numeric(18,4);
declare variable UP_ID integer;
declare variable ESTACAO integer;
declare variable DATA date;
declare variable CONSUMO_ID integer;
declare variable CONSUMO_QUANTIDADE numeric(15,5);
declare variable C_ID_OLD integer;
declare variable C_ID integer;
declare variable C_ESTABELECIMENTO_ID integer;
declare variable C_REMESSA_ID integer;
declare variable C_REMESSA_TALAO_ID integer;
declare variable C_REMESSA_TALAO_DETALHE_ID integer;
declare variable C_CONTROLE integer;
declare variable C_LOCALIZACAO_ID integer;
declare variable C_PRODUTO_ID integer;
declare variable C_TAMANHO integer;
declare variable C_DENSIDADE integer;
declare variable C_ESPESSURA numeric(18,2);
declare variable C_QUANTIDADE_ORIGINAL numeric(18,4);
declare variable C_QUANTIDADE_NECES numeric(18,4);
declare variable C_QUANTIDADE_NECES_ALTERN numeric(18,4);
declare variable C_FATOR_UNIDADE numeric(18,8);
declare variable C_FATOR_UNIDADE_ALTERN numeric(18,8);
declare variable C_QUANTIDADE numeric(18,4);
declare variable C_QUANTIDADE_CONSUMO numeric(18,4);
declare variable C_QUANTIDADE_SALDO numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable C_QUANTIDADE_SOBRA numeric(18,4);
declare variable C_STATUS char(4);
declare variable C_QUANTIDADE_ALTERNATIVA_CONS numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA_SALDO numeric(18,4);
declare variable C_DATAHORA_CONFERENCIA timestamp;
declare variable C_COMPONENTE smallint;
declare variable C_ESTOQUE_ID integer;
declare variable C_SALDO_BAIXAR numeric(18,4);
declare variable TEMPO_TOTAL numeric(15,4);
declare variable QUANTIDADE_DETALHE numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
declare variable QTD_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_COMPONENTE numeric(15,4);
declare variable QTD numeric(15,4);
declare variable LINHA_INTERMEDIARIA numeric(15,4);
declare variable SOBRA_CONSUMO numeric(15,4);
declare variable ACRECIMO_CONSUMO numeric(15,4);
declare variable ACRECIMO_ADD numeric(15,4);
declare variable ID2 integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable DETALHE integer;
declare variable QUANTIDADE_NECES numeric(15,4);
declare variable CONT_TALOES integer;
declare variable QTD_TALOES integer;
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA (
        ESTABELECIMENTO_ID,
        FAMILIA_ID,
        FAMILIA_ID_MP,
        REMESSA_ID,
        REMESSA,
        DATA,
        PERFIL,
        STATUS,
        COMPONENTE,
        WEB,
        TIPO,
        REQUISICAO,
        GP_ID,
        USUARIO_ID,
        AMOSTRA,
        DESCRICAO,
        DATA_DISPONIBILIDADE,
        DATAHORA,
        OBSERVACAO,
        DATAHORA_DISPONIBILIDADE,
        ORIGEM
    )
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '3',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           '',
           :DATAHORA_DISPONIBILIDADE as DATAHORA_DISPONIBILIDADE,
           r.origem
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (

                select
                    z.*,
        
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_largura    , fn_array(LARGURA_COMPRIMENTO, 1, '|')) as numeric(15,4)) as LARGURA,
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_comprimento, fn_array(LARGURA_COMPRIMENTO, 2, '|')) as numeric(15,4)) COMPRIMENTO
                from(
                    SELECT
                        FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                        T2.MODELO_ID TALAO_MODELO_ID,
                        M.DESCRICAO TALAO_MODELO_DESCRICAO,
                        (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                        (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                        FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                        SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                        P.DESCRICAO PRODUTO_DESCRICAO,
                        FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                        P.UNIDADEMEDIDA_SIGLA UM,
                        --MT.LARGURA,
                        --MT.COMPRIMENTO,
                        C2.CLASSE COR_CLASSE,
                        C2.SUBCLASSE COR_SUBCLASSE,
                        T1.ID,
                        T1.ESTABELECIMENTO_ID,
                        T1.REMESSA_ID,
                        T1.REMESSA_TALAO_ID,
                        T1.LOCALIZACAO_ID,
                        T1.PRODUTO_ID,
                        T1.MODELO_ID,
                        P.COR_CODIGO COR_ID,
                        T1.TAMANHO,
                        T1.QUANTIDADE,
                        T1.QUANTIDADE_ALTERNATIVA,
                        T1.QUANTIDADE_SOBRA,
                        T1.GP_ID,
                        T1.UP_ID,
                        T1.ESTACAO,
                        T1.DENSIDADE,
                        T1.ESPESSURA,
                        T1.STATUS,
                        T1.OBSERVACAO,
                        T1.DATA_PRODUCAO,
                        T1.DATA_LIBERACAO,
                        T1.HORA_PRODUCAO,
                        T1.HORA_LIBERACAO,
                        T1.VIA_ETIQUETA,
                        T1.TURNO,
                        T1.TALAO_EXTRA,
                        T1.PERCENTUAL_EXTRA,
                        T1.placa_largura,
                        T1.placa_comprimento,
        
                        coalesce(( select MT.LARGURA||'|'||MT.COMPRIMENTO from SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT), '0|0') LARGURA_COMPRIMENTO
        
            
                    FROM
                        VWREMESSA_TALAO T1,
                        VWREMESSA_CONSUMO C,
                        TBREMESSA_CONSUMO_VINCULO V,
                        VWREMESSA_TALAO T2,
                        TBPRODUTO P,
                        TBMODELO M,
                        TBMODELO M2,
                        --SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                        TBCOR C2
            
                    WHERE
                        T1.REMESSA_ID = C.REMESSA_ID
                    AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                    AND V.CONSUMO_ID = C.ID
                    AND T2.REMESSA_ID = V.REMESSA_ID
                    AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
                    AND P.CODIGO = T1.PRODUTO_ID
                    AND M.CODIGO = T2.MODELO_ID
                    AND M2.CODIGO = P.MODELO_CODIGO
                    AND C2.CODIGO = P.COR_CODIGO
                    AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
                    AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
                    --and v.etiqueta = '1'

                    and iif((select count(1) from TBREMESSA_CONSUMO_VINCULO x where x.REMESSA_ID = :REMESSA_ID_VINCULO AND x.CONSUMO_ID = C.ID) = 1, true, v.etiqueta = '1')

                 ) Z
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   iif(coalesce(d.quantidade_altern,0) = 0, D.QUANTIDADE, d.quantidade_altern) as QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
        into :TEMPO_TOTAL, :TEMPO_SETUP;

        TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
        TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA,
            :TEMPO_SETUP
        );
    END

    --exception "..." 'Rem:'||coalesce(:REMESSA_ID_VINCULO,0);

    CONT_TALOES = 0;

    FOR
        select
            ID_OLD,
            NEW_ID,
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            CONTROLE,
            LOCALIZACAO_ID,
            PRODUTO_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE_ORIGINAL,
            QUANTIDADE_NECES,
            QUANTIDADE_NECES_ALTERN,
            FATOR_UNIDADE,
            FATOR_UNIDADE_ALTERN,
            QUANTIDADE,
            QUANTIDADE_CONSUMO,
            QUANTIDADE_SALDO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            QUANTIDADE_ALTERNATIVA_SALDO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR,
            LINHA_INTERMEDIARIA,
            QTD_INTERMEDIARIA,
            CONSUMO_INTERMEDIARIA,
            CONSUMO_COMPONENTE,
            SOBRA_CONSUMO,
            ACRECIMO_CONSUMO,
            iif(LINHA_INTERMEDIARIA >= QTD_INTERMEDIARIA, ACRECIMO_CONSUMO + (SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)), ACRECIMO_CONSUMO) as ACRECIMO_ADD
        
        from(
            select
                x.*,
            
                CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA as SOBRA_CONSUMO,
                cast((CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA) / QTD_INTERMEDIARIA as numeric(15,2)) as ACRECIMO_CONSUMO
            from(
                SELECT
                    C.ID ID_OLD,
                    GEN_ID(GTBREMESSA_CONSUMO,1) as NEW_ID,
                    C.ESTABELECIMENTO_ID,
                    :REMESSA_ID as REMESSA_ID,
                    V.REMESSA_TALAO_ID,
                    C.REMESSA_TALAO_DETALHE_ID,
                    C.CONTROLE,
                    C.LOCALIZACAO_ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.DENSIDADE,
                    C.ESPESSURA,
                    C.QUANTIDADE_ORIGINAL,
                    C.QUANTIDADE_NECES,
                    C.QUANTIDADE_NECES_ALTERN,
                    C.FATOR_UNIDADE,
                    C.FATOR_UNIDADE_ALTERN,
                    C.QUANTIDADE,
                    C.QUANTIDADE_CONSUMO,
                    C.QUANTIDADE_SALDO,
                    C.QUANTIDADE_ALTERNATIVA,
                    C.QUANTIDADE_SOBRA,
                    C.STATUS,
                    C.QUANTIDADE_ALTERNATIVA_CONSUMO,
                    C.QUANTIDADE_ALTERNATIVA_SALDO,
                    C.DATAHORA_CONFERENCIA,
                    C.COMPONENTE,
                    C.ESTOQUE_ID,
                    C.SALDO_BAIXAR,
        
                    row_number() over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as LINHA_INTERMEDIARIA,
                    count(C.QUANTIDADE_NECES) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as QTD_INTERMEDIARIA,
                    sum(v.quantidade) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as CONSUMO_INTERMEDIARIA,
                    coalesce((select SUM(D.quantidade) FROM vwremessa_talao_detalhe D WHERE D.remessa_id = V.remessa_id AND D.remessa_talao_id = V.remessa_talao_id AND D.produto_id = C.produto_id),0) AS CONSUMO_COMPONENTE
                
                FROM
                    VWREMESSA_CONSUMO C,
                    TBREMESSA_CONSUMO_VINCULO V
                
                WHERE   
                    V.REMESSA_ID = :REMESSA_ID_VINCULO
                AND V.CONSUMO_ID = C.ID
                --and v.etiqueta = '1'

                and iif((select count(1) from TBREMESSA_CONSUMO_VINCULO x where x.REMESSA_ID = :REMESSA_ID_VINCULO AND x.CONSUMO_ID = C.ID) = 1, true, v.etiqueta = '1')

                ORDER BY C.ID
            ) x
        ) y
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR,

        LINHA_INTERMEDIARIA,
        QTD_INTERMEDIARIA,
        CONSUMO_INTERMEDIARIA,
        CONSUMO_COMPONENTE,
        SOBRA_CONSUMO,
        ACRECIMO_CONSUMO,
        ACRECIMO_ADD

    DO
    BEGIN
        CONT_TALOES = CONT_TALOES + 1;

        QTD = C_QUANTIDADE_NECES + ACRECIMO_ADD;

        --seta novo vinculo com a dublagem
        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        --consulta REMESSA_TALAO_DETALHE usando o vinculo com o talao do bojo
        select
            v.REMESSA_TALAO_DETALHE_ID
        from tbremessa_consumo_vinculo v
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID
        into :C_REMESSA_TALAO_DETALHE_ID;

        /*
        --atualiza o vinculo do talao do bojo com a nova quantidade
        update tbremessa_consumo_vinculo v
        set v.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;
        */
         /*
        --atualizar consumo do bojo
        update tbremessa_consumo k
        set k.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;  */

        C_REMESSA_TALAO_DETALHE_ID = coalesce(C_REMESSA_TALAO_DETALHE_ID, 0);

        if(C_REMESSA_TALAO_DETALHE_ID = 0)then
        begin
            exception "..." 'Vínculo com remessa intermediária não encontrado, REM:'||C_REMESSA_ID||', TL:'||C_REMESSA_TALAO_ID||', CON:'||C_ID_OLD;
        end

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            CONTROLE,
            LOCALIZACAO_ID,
            PRODUTO_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE_ORIGINAL,
            QUANTIDADE_NECES,
            QUANTIDADE_NECES_ALTERN,
            QUANTIDADE,
            QUANTIDADE_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :QTD, --:C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :QTD, --:C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :QTD --:C_SALDO_BAIXAR
        );

    END

    QTD_TALOES = coalesce((select count(P.id) FROM tbremessa_item_processado P WHERE P.remessa = :remessa_id_origem),0);

    if(CONT_TALOES <> QTD_TALOES and ((fn_calc_precision(CONT_TALOES,QTD_TALOES,'/')) * 100) <= 10)then
    begin
        exception "..." 'ERRO AO GERAR VINCULOS, NECESSARIOS:'||:QTD_TALOES||', VINCULADOS:'||:CONT_TALOES||', PERC:'||((CONT_TALOES/QTD_TALOES) * 100);
    end

    --corrigir vinculos
    for select id, remessa, talao, detalhe, QUANTIDADE_NECES from(
        select
            id,
            cor_id,
            QUANTIDADE_NECES,
            fn_array(VINCULO,1,'|') as remessa,
            fn_array(VINCULO,2,'|') as talao,
            fn_array(VINCULO,3,'|') as detalhe,
            fn_array(VINCULO,4,'|') as cor
        from(
        select
        
           c.id ,
           u.cor_id,
           c.talao,
           c.QUANTIDADE_NECES,
           (
                select first 1 v.REMESSA_ID||'|'||v.REMESSA_TALAO_ID||'|'||v.REMESSA_TALAO_DETALHE_ID||'|'||p.cor_id
        
                from tbremessa_consumo_vinculo v, tbremessa_consumo d, tbpedido_item_processado p
                where d.remessa = c.remessa
                and c.talao = d.talao
                and d.talao_detalhe_id <> c.talao_detalhe_id
                and v.consumo_id = d.id
                and p.controle = v.remessa_talao_detalhe_id
                and p.remessa = v.remessa_id
                and p.remessa_acumulado_controle = v.remessa_talao_id
                and p.produto_codigo = c.produto_id
                --and p.cor_id = u.cor_id
           ) as VINCULO
        
        from tbpedido_item_processado u, tbremessa_consumo c
        left join tbremessa_consumo_vinculo v on v.consumo_id = c.id
        
        where c.componente = '1'
        and c.id > 4295314
        and v.id is null
        and u.remessa = c.remessa
        and u.remessa_acumulado_controle = c.talao
        and u.controle = c.talao_detalhe_id
        ) ) where cor_id = cor
    into
        :id2,
        :remessa,
        :talao,
        :detalhe,
        :QUANTIDADE_NECES
    do begin
        INSERT INTO TBREMESSA_CONSUMO_VINCULO (CONSUMO_ID, REMESSA_ID, REMESSA_TALAO_ID, REMESSA_TALAO_DETALHE_ID, QUANTIDADE, ETIQUETA) VALUES (:id2, :remessa, :talao, :detalhe, :QUANTIDADE_NECES, '1');
    end

    for
        select
           c.id,
           u.remessa_acumulado_controle
        from tbpedido_item_processado u, tbremessa_consumo c
        left join tbremessa_consumo_vinculo v on v.consumo_id = c.id
        
        where c.componente = '1'
        and c.id >= (select min(c.id) from tbremessa_consumo c where c.remessa = :REMESSA_ID_ORIGEM)
        and v.id is null
        and u.remessa = c.remessa
        and u.remessa_acumulado_controle = c.talao
        and u.controle = c.talao_detalhe_id
    into
        :consumo_id,
        :c_controle
    do begin
       exception "..." 'Vínculos incompletos na remessa ('||:consumo_id||'-'||:c_controle||')';
    end

  /* Procedure Text */
--  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_NFE_NF (
    ESTABELECIMENTO_1 integer,
    SERIE_1 varchar(3),
    CONTROLE_1 integer,
    NOTAFISCAL_1 integer)
as
BEGIN

Update TbNfE Set
Numero_NotaFiscal = :NotaFiscal_1
Where Controle    = :CONTROLE_1 
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1
  and Serie = :SERIE_1;

Update TbNfE_Item Set
Numero_NotaFiscal = :NotaFiscal_1
Where NfE_Controle= :CONTROLE_1
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1;

Update TbNfE_Parcelamento Set
Numero_NotaFiscal = :NotaFiscal_1
Where NfE_Controle= :CONTROLE_1
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1;

--SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_COLETA_DETALHE (
    COLETA_ID integer not null,
    REMESSA integer not null,
    TALAO integer not null)
as
begin
INSERT INTO TBCOLETA_DETALHE (ID, coleta_id, TALAO, REMESSA, STATUS, "LOG")
                      VALUES ((SELECT GEN_ID(gtbcoleta_detalhe, 1) FROM RDB$DATABASE), :Coleta_ID, :Talao, :Remessa, 0, '');
  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_ESPUMACAO_LOTE (
    PROG integer,
    REMESSA integer,
    REMESSA_CONTROLE integer)
as
declare variable TRANSACAO_DOCUMENTO integer;
BEGIN
For Select Transacao_Documento From TbEspumacao_Dublagem
Where Remessa_Controle = :REMESSA_CONTROLE
  and Remessa = :REMESSA

INTO :TRANSACAO_DOCUMENTO

DO

if (:TRANSACAO_DOCUMENTO > 0) then
   Begin
   if (:PROG = 1) then
      BEGIN
      UpDate TbPedido_Processado_Item Set
      Lote = :TRANSACAO_DOCUMENTO
      Where Remessa_Controle = :REMESSA_CONTROLE
      and Remessa = :REMESSA;
      END
   if (:PROG = 2) then
      BEGIN
      UpDate TbPedido_Item_Processado Set
      Lote = :TRANSACAO_DOCUMENTO
      Where Remessa_Acumulado_Controle = :REMESSA_CONTROLE
      and Remessa = :REMESSA;
      END

   End

--SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_NFS_NF (
    ESTABELECIMENTO_1 integer,
    SERIE_1 varchar(3),
    CONTROLE_1 integer,
    NOTAFISCAL_1 integer)
as
BEGIN

Update TbNfs Set
Numero_NotaFiscal = :NotaFiscal_1
Where Controle    = :CONTROLE_1 
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1
  and Serie = :SERIE_1;

Update TbNfs_Item Set
Numero_NotaFiscal = :NotaFiscal_1
Where Nfs_Controle= :CONTROLE_1
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1;

Update TbNfs_Parcelamento Set
Numero_NotaFiscal = :NotaFiscal_1
Where Nfs_Controle= :CONTROLE_1
  and Estabelecimento_Codigo = :ESTABELECIMENTO_1;

--SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ICMS_MATERIA_PRIMA (
    PRODUTO_ID integer,
    TAMANHO integer,
    ANO integer,
    MES integer)
returns (
    ICMS numeric(18,8))
as
declare variable I integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable PRODUTO integer;
declare variable CONSUMO numeric(18,8);
declare variable CUSTO_MEDIO numeric(18,8);
declare variable PERC_ICMS numeric(18,8);
begin

    select
        p.modelo_codigo,
        p.codigo
    from tbproduto p
    where p.codigo = :PRODUTO_ID
    into :MODELO_ID, :COR_ID;

    delete from tmpcusto_produto;

    insert into tmpcusto_produto
    select
        :ANO as ANO,
        :MES as MES,
        j.NIVEL,
        j.PRODUTO_DESCRICAO,
        j.PRODUTO_CONSUMO,
        j.TAMANHO_CONSUMO,
        j.ORIGEM,
        0 as TS,
        0 as "TO",
        0 as CMS,
        0 as CMO,
        0 as CMOIP,
        0 as CMOIA,
        0 as CSMOIP,
        0 as CSMOIA,
        0 as PERDA,
        j.C,
        j.T,
        0 as CS,
        0 as CO,
        j.CUSTO_MEDIO,
        j.FATOR_CONVERSAO,
        j.TAMANHO,
        0,0,0,0,0,0,0,0, :TAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID,0,0,0,0,gen_id(gtmpcusto_produto,1)
    from SPC_ESTRUTURA_CUSTO_LITE(:ANO, :MES, :MODELO_ID, :COR_ID, :TAMANHO, '',0, :PRODUTO_ID, :TAMANHO, '',12,1,0) j;

    i = 20;

    WHILE (i >= -1) DO
    BEGIN
        for
            select
                s.produto_consumo,
                s.t,
                s.custo_medio,
    
                coalesce((select first 1 e.FISCAL_PERCENTUAL_ICMS from tbnfe_item e
                            where e.produto_codigo = s.produto_consumo
                             and e.VALOR_CUSTO > 0
                             and e.data_entrada <= fn_end_of_month('01.'||:mes||'.'||:ano)
            
                             ORDER BY DATA_ENTRADA DESC
                ),0) as ICMS
    
            from SPC_ESTRUTURA_CUSTO_LITE(:ANO, :MES, :MODELO_ID, :COR_ID, :TAMANHO, '',0, :PRODUTO_ID, :TAMANHO, '',12,1,0) s
        into
            :produto,
            :consumo,
            :custo_medio,
            :perc_icms
        do begin
    
          ICMS = fn_calc_precision(fn_calc_precision(fn_calc_precision(perc_icms, 100, '/'), custo_medio, '*'), consumo , '*');
    
        end

   i=i-1;
   END

  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_PEDIDO_FAT_ENC (
    PEDIDO_ID integer,
    PEDIDO_ID_ITEM integer = 0,
    HISTORICO varchar(8000) = '',
    ACAO integer = 1)
as
declare variable ALOCDESALOC varchar(1);
declare variable FSEQ varchar(10);
declare variable ESTAB integer;
declare variable TAMANHO integer;
declare variable PEDIDO integer;
declare variable PEDIDO_ITEM integer;
declare variable PRODUTO_ID integer;
declare variable QTD_EST numeric(15,2);
declare variable QTD_AGP numeric(15,2);
declare variable QTD_REM numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable SALDO_ENCERRADO_AUT numeric(15,2);
declare variable QUANTIDADE_NF numeric(15,2);
declare variable QUANTIDADE_CFE numeric(15,2);
declare variable SITUACAO_ITEM integer;
declare variable BLOQUEIA_ALOCACAO integer;
declare variable QUANTIDADE_ITEM integer;
BEGIN
   :ALOCDESALOC = 'D';

   IF(:ACAO = 1)THEN
   BEGIN
       IF(COALESCE(:HISTORICO,'') = '')THEN
       BEGIN
          :HISTORICO = ' SALDO ZERADO DEVIDO A ENCERRAMENTO CONFIRMADO PELO OPERADOR APOS FATURAMENTO';
       END
    
       FOR
         SELECT
              ITEM.*

            FROM(
                SELECT
                    ITEM.PEDIDO,
                    FN_LPAD(ITEM.SEQUENCIA,3,0) AS FSEQ,
                    ITEM.ESTABELECIMENTO_CODIGO AS ESTAB,
                    ITEM.TAMANHO,
                    ITEM.CONTROLE AS PEDIDO_ITEM,
                    ITEM.PRODUTO_CODIGO AS PRODUTO_ID,
                    ITEM.QTD_EST,
                    ITEM.QTD_AGP,
                    ITEM.QTD_REM,
                    ITEM_SALDO.QUANTIDADE AS SALDO,
                    COALESCE((SELECT SUM(ITEM_NF.QUANTIDADE) FROM TBNFS_ITEM ITEM_NF, TBNFS NFS WHERE ITEM_NF.PEDIDO_ITEM_PE_CONTROLE = ITEM.CONTROLE AND NFS.CONTROLE = ITEM_NF.NFS_CONTROLE AND NFS.SITUACAO_NF <> 3),0.00) AS QUANTIDADE_NF,
                    COALESCE((SELECT SUM(ITEM_CFE.QUANTIDADE) FROM TBPDV_CFE_ITEM ITEM_CFE, TBPDV_CFE CFE WHERE CFE.ID = ITEM_CFE.PDV_CFE_ID AND ITEM_CFE.PEDIDO_ITEM_ID = ITEM.CONTROLE AND CFE.SITUACAO <> 3),0.00) AS QUANTIDADE_CFE,
                    COALESCE((PEDIDO.BLOQUEIA_ALOCACAO), 0) BLOQUEIA_ALOCACAO
                
                    FROM TBPEDIDO PEDIDO, TBPEDIDO_ITEM ITEM, TBPEDIDO_ITEM_SALDO ITEM_SALDO
                    WHERE ITEM.PEDIDO          = :PEDIDO_ID
                    AND IIF(:PEDIDO_ID_ITEM > 0, ITEM.CONTROLE = :PEDIDO_ID_ITEM, TRUE)
                    AND ITEM.PEDIDO            = ITEM_SALDO.PEDIDO
                    AND ITEM.CONTROLE          = ITEM_SALDO.PEDIDO_ITEM_CONTROLE
                    AND ITEM.PEDIDO            = PEDIDO.PEDIDO
                    AND ITEM.SITUACAO          = 1
                    AND ITEM_SALDO.QUANTIDADE  > 0
                    AND PEDIDO.ENCERRAMENTO_POS_FATURAMENTO = 1
            ) ITEM
          INTO :PEDIDO, :FSEQ, :ESTAB, :TAMANHO, :PEDIDO_ITEM, :PRODUTO_ID, :QTD_EST, :QTD_AGP, :QTD_REM, :SALDO, :QUANTIDADE_NF, :QUANTIDADE_CFE, :BLOQUEIA_ALOCACAO
          DO BEGIN
              --EXCEPTION "..." 'TENTATIVA 1 ITEM PED'||:FSEQ||' SALDO:'||:SALDO;
             /*ESTOQUE*/
               IF(:QTD_EST > 0)THEN
               BEGIN
                 DELETE FROM TBESTOQUE_DETALHE_ALOCACAO
                    WHERE ESTABELECIMENTO_ID = :ESTAB
                      AND TABELA_ID          = :PEDIDO
                      AND TAB_ITEM_ID        = :PEDIDO_ITEM
                      AND TIPO               = 'P'
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                      AND SALDO              > 0; 
               END
              --EXECUTE PROCEDURE SPU_TRATA_PED_ITEM_ESTOQUE3(:PEDIDO, :PEDIDO_ITEM, :ALOCDESALOC, 0, 0);
    
             /*REMESSA*/
              IF(:QTD_REM > 0) THEN
              BEGIN
                UPDATE TBREMESSA_ITEM_ALOCACAO SET TABELA_ID = 0, TAB_ITEM_ID = 0
                WHERE ESTABELECIMENTO_ID     = :ESTAB
                  AND TABELA_ID              = :PEDIDO
                  AND TAB_ITEM_ID            = :PEDIDO_ITEM
                --AND TIPO = 'P'
                  AND IIF(TIPO_REMESSA = '22595' AND coalesce(TAMANHO_ORIGEM,0) > 0, TAMANHO_ORIGEM = :TAMANHO, TAMANHO = :TAMANHO)
                  AND SALDO > 0;
        
                DELETE FROM TBAGRUPAMENTO_PEDIDO
                WHERE ESTABELECIMENTO_ID = :ESTAB
                  AND TABELA_ID          = :PEDIDO
                  AND TAB_ITEM_ID        = :PEDIDO_ITEM
                  AND SALDO              = 0
                  AND TIPO               = 'M';
    
                EXECUTE PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO2(:ESTAB,:PEDIDO,:PEDIDO_ITEM,:TAMANHO);
              END
    
             /*MP*/
              EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MP(:PEDIDO, :PEDIDO_ITEM, :ALOCDESALOC);
    
             /*AGRUPAMENTO*/
             IF(:QTD_AGP > 0)THEN
             BEGIN
                 EXECUTE PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO2(:ESTAB, :PEDIDO, :PEDIDO_ITEM, :TAMANHO);
             END
    
             IF(:QUANTIDADE_NF = 0 AND :QUANTIDADE_CFE = 0)THEN
             BEGIN
                UPDATE TBPEDIDO_ITEM
                    SET SITUACAO = 3,
                        MOTIVO_ENCERRAMENTO = ' ENCERRAMENTO CONFIRMADO PELO OPERADOR APOS FATURAMENTO'
                WHERE PEDIDO = :PEDIDO
                AND CONTROLE = :PEDIDO_ITEM;
             END
    
             IF(:QUANTIDADE_NF > 0 OR :QUANTIDADE_CFE > 0)THEN
             BEGIN
                :SALDO_ENCERRADO_AUT = COALESCE((SELECT FIRST 1 SALDO.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO SALDO WHERE SALDO.PEDIDO = :PEDIDO AND SALDO.PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM),0,00);

                UPDATE TBPEDIDO_ITEM_SALDO
                    SET QUANTIDADE           = QUANTIDADE-:SALDO_ENCERRADO_AUT
                  WHERE PEDIDO               = :PEDIDO
                    AND PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM;

                UPDATE TBPEDIDO_ITEM
                    SET SITUACAO             = 2,
                        SALDO_ENCERRADO_AUT  = :SALDO_ENCERRADO_AUT
                    WHERE PEDIDO             = :PEDIDO
                    AND CONTROLE             = :PEDIDO_ITEM;
             END
    
             EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO', :PEDIDO , FN_ELIPSES('ITEM SEQ.'|| :FSEQ ||:HISTORICO,500));
    
          END
    END

    IF(:ACAO = 2)THEN
    BEGIN
      FOR
         SELECT
              ITEM.*
            FROM(
                SELECT
                    ITEM.PEDIDO,
                    FN_LPAD(ITEM.SEQUENCIA,3,0) AS FSEQ,
                    ITEM.ESTABELECIMENTO_CODIGO AS ESTAB,
                    ITEM.TAMANHO,
                    ITEM.CONTROLE AS PEDIDO_ITEM,
                    ITEM.PRODUTO_CODIGO AS PRODUTO_ID,
                    ITEM.QTD_EST,
                    ITEM.QTD_AGP,
                    ITEM.QTD_REM,
                    ITEM.SALDO_ENCERRADO_AUT,
                    ITEM.SITUACAO AS SITUACAO_ITEM,
                    COALESCE((SELECT SUM(ITEM_NF.QUANTIDADE) FROM TBNFS_ITEM ITEM_NF, TBNFS NFS WHERE ITEM_NF.PEDIDO_ITEM_PE_CONTROLE = ITEM.CONTROLE AND NFS.CONTROLE = ITEM_NF.NFS_CONTROLE AND NFS.SITUACAO_NF <> 3),0.00) AS QUANTIDADE_NF,
                    COALESCE((SELECT SUM(ITEM_CFE.QUANTIDADE) FROM TBPDV_CFE_ITEM ITEM_CFE, TBPDV_CFE CFE WHERE CFE.ID = ITEM_CFE.PDV_CFE_ID AND ITEM_CFE.PEDIDO_ITEM_ID = ITEM.CONTROLE AND CFE.SITUACAO <> 3),0.00) AS QUANTIDADE_CFE,
                    COALESCE((PEDIDO.BLOQUEIA_ALOCACAO), 0) BLOQUEIA_ALOCACAO,
                    ITEM.QUANTIDADE AS QUANTIDADE_ITEM
                
                    FROM TBPEDIDO PEDIDO, TBPEDIDO_ITEM ITEM, TBPEDIDO_ITEM_SALDO ITEM_SALDO
                    WHERE ITEM.PEDIDO          = :PEDIDO_ID  
                    AND IIF(:PEDIDO_ID_ITEM > 0, ITEM.CONTROLE = :PEDIDO_ID_ITEM, TRUE)
                    AND ITEM.PEDIDO            = ITEM_SALDO.PEDIDO
                    AND ITEM.CONTROLE          = ITEM_SALDO.PEDIDO_ITEM_CONTROLE
                    AND ITEM.PEDIDO            = PEDIDO.PEDIDO
                    AND (ITEM.SALDO_ENCERRADO_AUT > 0 OR ITEM.SITUACAO = 3)
                    AND PEDIDO.ENCERRAMENTO_POS_FATURAMENTO = 1
            ) ITEM
          INTO :PEDIDO, :FSEQ, :ESTAB, :TAMANHO, :PEDIDO_ITEM, :PRODUTO_ID, :QTD_EST, :QTD_AGP, :QTD_REM, :SALDO_ENCERRADO_AUT, :SITUACAO_ITEM, :QUANTIDADE_NF, :QUANTIDADE_CFE, :BLOQUEIA_ALOCACAO, :QUANTIDADE_ITEM
          DO BEGIN
            /*SE HOUVE ENCERRAMENTO DE SALDO, INCREMENTAR O SALDO*/
             IF(:SALDO_ENCERRADO_AUT > 0)THEN
             BEGIN                                            

                UPDATE TBPEDIDO_ITEM A
                    SET A.SALDO_ENCERRADO_AUT  = 0
                    WHERE A.PEDIDO             = :PEDIDO
                    AND A.CONTROLE             = :PEDIDO_ITEM;

                UPDATE TBPEDIDO_ITEM_SALDO A
                    SET A.QUANTIDADE           = A.QUANTIDADE + :SALDO_ENCERRADO_AUT
                    WHERE A.PEDIDO             = :PEDIDO
                    AND A.PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM;

             END
             /*SE ITEM ENCERRADO AUTOMATICAMENTE, VOLTAR A SITUACAO DO ITEM PARA ABERTO*/
             IF(:SITUACAO_ITEM = 3)THEN
             begin
              UPDATE TBPEDIDO_ITEM A
                    SET A.SITUACAO             = 1
                    WHERE A.PEDIDO             = :PEDIDO
                    AND A.CONTROLE             = :PEDIDO_ITEM;
             end 

          END
    END
                                                              
  --SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CUSTO_ABSORVIDO (
    IANO integer,
    IMES integer,
    IMODELO_ID integer,
    ICOR_ID integer,
    ITAMANHO integer,
    QUANTIDADE integer)
returns (
    ANO integer,
    MES integer,
    NIVEL integer,
    PRODUTO_DESCRICAO varchar(1600),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    TAMANHO integer,
    FLAG integer,
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    FLAG_TAMANHO integer,
    H_ORIGEM varchar(200),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    FATOR_SETUP integer,
    MARGEM numeric(15,4),
    FAMILIA integer,
    MODELO_ID integer,
    FAMILIA_ID integer,
    COR_ID integer,
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8))
as
declare variable MAX_NIVEL integer;
declare variable I integer;
declare variable PAI integer;
declare variable FILHOS integer;
declare variable AVO integer;
declare variable VALIDAR integer;
declare variable DATA_TEMP date;
declare variable GENEALOGIA varchar(200);
declare variable CALC decimal(18,8);
declare variable OLD_TAMANHO integer;
declare variable IPRODUTO_TROCA varchar(300);
declare variable MODELO_ORIGINAL integer;
declare variable TAMANHO_ORIGINAL integer;
declare variable MESES integer;
declare variable VALIDAR_FICHA integer = 0;
declare variable TIPO_CUSTO integer = 1;
declare variable TAXA_DOLAR numeric(18,8) = 0;
declare variable VMARGEM numeric(15,4);
declare variable ICMS numeric(18,8);
declare variable PERC_ICMS numeric(18,8);
declare variable ID_PK integer;
begin

--in autonomous transaction do
--if(true)then
--begin
    delete from tmpcusto_produto;

    iproduto_troca      = '';
    modelo_original     = imodelo_id;
    tamanho_original    = itamanho;
    meses               = 1;
    validar_ficha       = 0;
    tipo_custo          = 1;
    taxa_dolar          = 0;

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        o.familia_codigo,
        o.modelo_codigo,
        o.cor_codigo,
        0,0,0,0, gen_id(Gtmpcusto_produto,1)
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID,0,0,0,0, gen_id(Gtmpcusto_produto,1)
        from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin

            if(:FILHOS > 0)then
            begin

                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO;

                for
                    select
                        ANO,
                        MES,
                        NIVEL,
                        PRODUTO_DESCRICAO,
                        PRODUTO_CONSUMO,
                        TAMANHO_CONSUMO,
                        ORIGEM,
                        TS,
                        "TO",
                        CMS,
                        CMO,
                        CMOIP,
                        CMOIA,
                        CSMOIP,
                        CSMOIA,
                        PERDA,
                        C,
                        T,
                        CS,
                        CO,
                        CUSTO_MEDIO,
                        FATOR_CONVERSAO,
                        TAMANHO,
                        CUSTO_MINUTO,
                        MOI_PROPRIO,
                        MOI_ABSORVIDO,
                        COIP,
                        COIA,
                        CSIP,
                        CSIA,
                        CONSUMO,
                        FLAG_TAMANHO,
                        GENEALOGIA,
                        DATA,
                        CUSTO,
                        DOLAR,
                        MARGEM,
                        FAMILIA_ID,
                        MODELO_ID,
                        COR_ID,
                        ICMS,
                        PERC_ICMS,
                        DEFEITOS,
                        PRODUZIDO
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :FAMILIA_ID,
                    :MODELO_ID,
                    :COR_ID,
                    :ICMS,
                    :PERC_ICMS,
                    :DEFEITOS,
                    :PRODUZIDO
                do begin

                       --/*
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);
                      --*/



                      :ICMS = coalesce((select first 1 e.FISCAL_PERCENTUAL_ICMS from tbnfe_item e
                                            where e.produto_codigo = :produto_consumo
                                             and e.VALOR_CUSTO > 0
                                             and e.data_entrada <= fn_end_of_month('01.'||:mes||'.'||:ano)
                            
                                             ORDER BY DATA_ENTRADA DESC
                                        ),0);

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM,
                        h.icms             = coalesce(h.icms,0) + :ICMS

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;

                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                h.custo  = h.custo_medio,
                h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                */

                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;

        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            C,
            T,
            CS,
            CO,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CONSUMO,
            FLAG_TAMANHO,
            GENEALOGIA,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID,
            ICMS,
            PERC_ICMS,
            DEFEITOS,
            PRODUZIDO
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
        --and k.nivel = -1
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :FAMILIA_ID,
        :MODELO_ID,
        :COR_ID,
        :ICMS,
        :PERC_ICMS,
        :DEFEITOS,
        :PRODUZIDO
    do begin

        for
            select first 1
                c.fator_setup
            from tbregra_calculo_custo c, tbproduto p
            where c.familia_id = p.familia_codigo
            and p.codigo = :PRODUTO_CONSUMO
        into
            :fator_setup
        do begin

            :CMS     = :CMS     / :quantidade;
            :CSMOIP  = :CSMOIP  / :quantidade;
            :CSMOIA  = :CSMOIA  / :quantidade;

            :CS      = :CS      / :fator_setup;
            :CSIP    = :CSIP    / :fator_setup;
            :CSIA    = :CSIA    / :fator_setup;

        end

        suspend;
  end
  --end

  --suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_REMESSA (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(10),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    /* COLETA OS ITENS DE PEDIDOS COM SALDO A FATURAR DESCONTANDO O QUE ESTA NO ESTOQUE E EM REMESSAS */
    FOR
        SELECT
            MODELO_ID,
            COR_ID,
            TAMANHO,
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) AS QUANTIDADE
        
        FROM
           (SELECT
                A.MODELO_CODIGO MODELO_ID,
                A.COR_ID,
                A.TAMANHO,
                CAST(SUM(S.QUANTIDADE) AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(SUM(A.QTD_EST   ) AS NUMERIC(15,4)) ALOC_EST,
                CAST(SUM(A.QTD_REM   ) AS NUMERIC(15,4)) ALOC_REM
        
            FROM
                TBPEDIDO_ITEM A,
                TBPEDIDO P,
                TBPEDIDO_ITEM_SALDO S

            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
              AND A.ESTABELECIMENTO_CODIGO =  P.ESTABELECIMENTO_CODIGO
              AND A.CONTROLE              = S.PEDIDO_ITEM_CONTROLE
              AND A.PEDIDO                = P.PEDIDO
              AND P.STATUS                = 1
              AND P.SITUACAO              = 1
              AND A.SITUACAO              = 1
              AND P.DATA            BETWEEN '01.01.2015' AND CURRENT_DATE
        
            GROUP BY
                A.MODELO_CODIGO,
                A.COR_ID,
                A.TAMANHO)
        WHERE
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) > 0
    
    INTO
        :YMODELO_ID,
        :YCOR_ID,
        :YTAMANHO,
        :QUANTIDADE
    DO
    BEGIN
        
        
        /* COLETA O CONSUMO DOS ITENS DOS PEDIDOS */
        FOR
            /* CONSULTA A FICHA TECNICA 2 (GERAL) */
            SELECT
                B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.CONSUMO_QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.CONSUMO_QUANTIDADE_T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.CONSUMO_QUANTIDADE_T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.CONSUMO_QUANTIDADE_T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.CONSUMO_QUANTIDADE_T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.CONSUMO_QUANTIDADE_T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.CONSUMO_QUANTIDADE_T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.CONSUMO_QUANTIDADE_T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.CONSUMO_QUANTIDADE_T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.CONSUMO_QUANTIDADE_T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.CONSUMO_QUANTIDADE_T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.CONSUMO_QUANTIDADE_T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.CONSUMO_QUANTIDADE_T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.CONSUMO_QUANTIDADE_T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.CONSUMO_QUANTIDADE_T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.CONSUMO_QUANTIDADE_T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.CONSUMO_QUANTIDADE_T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.CONSUMO_QUANTIDADE_T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.CONSUMO_QUANTIDADE_T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.CONSUMO_QUANTIDADE_T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.CONSUMO_QUANTIDADE_T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4))  QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO B,
                TBPRODUTO P

            WHERE B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
              AND B.MODELO_CODIGO          = :YMODELO_ID
              AND P.FAMILIA_CODIGO         = :FAMILIA_1
        
            UNION
            
            /* CONSULTA A FICHA TECNICA 3 (POR COR) */
            SELECT
                B.PRODUTO_ID,
                B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4)) QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO_COR B,
                TBPRODUTO P

            WHERE B.MODELO_ID      = :YMODELO_ID
              AND B.COR_ID         = :YCOR_ID
              AND B.PRODUTO_ID     = P.CODIGO
              AND P.FAMILIA_CODIGO = :FAMILIA_1
    
        INTO
            :VPRODUTO_ID,
            :VTAM,
            :VPROJECAO
        DO
        BEGIN
            INSERT INTO TMP10168_1 VALUES(0,'',:VPRODUTO_ID,:VTAM,0,'','',0,'',:VPROJECAO,0, gen_id(GTMP10168_1,1));
        END
  END

    FOR
        SELECT
            V.PRODUTO_ID,
            V.MODELO_ID,
            V.MODELO_DESCRICAO,
            V.COR_ID,
            V.COR_DESCRICAO,
            V.TAMANHO_ID,
            V.TAMANHO,
            V.UM,
            V.LOCALIZACAO_ID,
            V.ESTOQUE,
            V.EM_PRODUCAO,
            V.EMPENHADO,
            V.PROJECAO,
            V.EST_MIN,
            V.EST_MAX,
            V.SEGURANCA,
            V.PERC_PONTO_REP,
            V.QTD_PONTO_REP,
            V.TIPO_REP,
            V.QTD_REP,
            V.NECESSIDADE,
            (SELECT FIRST 1 M.DENSIDADE FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID),
            (SELECT FIRST 1 M.ESPESSURA FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID)
    
        FROM
            (SELECT
                X.PRODUTO_ID,
                X.MODELO_ID,
                X.MODELO_DESCRICAO,
                X.COR_ID,
                X.COR_DESCRICAO,
                X.TAMANHO_ID,
                X.TAMANHO,
                X.UM,
                X.LOCALIZACAO_ID,
                X.ESTOQUE,
                X.EM_PRODUCAO,
                X.EMPENHADO,
                X.PROJECAO,
                X.ESTOQUE_MINIMO EST_MIN,
                X.ESTOQUE_MAXIMO EST_MAX,
                X.SEGURANCA,
                X.PONTO_REPOSICAO PERC_PONTO_REP,
                X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
                IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
                IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,
                IIF(X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                    IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                    (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO /* - X.PROJECAO */ ), 0) NECESSIDADE
            FROM
               (SELECT
                    P.CODIGO PRODUTO_ID,
                    P.MODELO_CODIGO MODELO_ID,
    
                    (SELECT FIRST 1 M.DESCRICAO
                       FROM TBMODELO M
                      WHERE M.CODIGO = P.MODELO_CODIGO) MODELO_DESCRICAO,
    
                    P.COR_CODIGO COR_ID,
    
                    (SELECT FIRST 1 C.DESCRICAO
                       FROM TBCOR C
                      WHERE C.CODIGO = P.COR_CODIGO) COR_DESCRICAO,
    
                    COALESCE(B.TAMANHO_ID,0) TAMANHO_ID,
                    COALESCE((SELECT FIRST 1 TAM_DESCRICAO
                       FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,B.TAMANHO_ID)),'') TAMANHO,

                    P.UNIDADEMEDIDA_SIGLA UM,
                    P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
            
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.PROJECAO)
                           FROM TMP10168_1 S
                          WHERE S.PRODUTO_ID = P.CODIGO) AS NUMERIC(15,4)),0.0000) PROJECAO,
                
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.SALDO)
                           FROM TBESTOQUE_SALDO S, TBLOCALIZACAO L
                          WHERE S.PRODUTO_CODIGO         = P.CODIGO
                            AND S.LOCALIZACAO_CODIGO = L.CODIGO
                            AND (S.LOCALIZACAO_CODIGO    = P.LOCALIZACAO_CODIGO or (L.CODIGO = S.LOCALIZACAO_CODIGO AND L.WIP = '1'))
                            AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) AS NUMERIC(15,4)),0.0000) ESTOQUE,

                    COALESCE(CAST(
                        (SELECT CAST(SUM(E.CONSUMO_KG-COALESCE(E.QUANTIDADE_CONFERENCIA,0)) AS NUMERIC(15,4))
                           FROM TBREMESSA_CONSUMO E
                          WHERE E.PRODUTO_ID  = P.CODIGO
                            AND E.CONFERENCIA = '0'
                            and Coalesce(E.Componente,'0') = '0'
                            AND E.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                   --         AND E.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                            AND E.REMESSA >= -1) AS NUMERIC(15,4)),0.0000)  EMPENHADO,
        
                    COALESCE(CAST(
                        (SELECT SUM(PG.QUANTIDADE)
                           FROM TBPROGRAMACAO PG
                          WHERE PG.PRODUTO_ID         = P.CODIGO
                            AND PG.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                            AND PG.TIPO              IN ('A','D')
                            AND PG.STATUS            IN ('0','1','2')) AS NUMERIC(15,4)),0.0000)  EM_PRODUCAO,
            
                    COALESCE(CAST(B.ESTOQUE_MIN * (COALESCE(B.PONTO_REPOSICAO,100.0000) / 100.0000) AS NUMERIC(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MIN,0.0000) ESTOQUE_MINIMO,
                    COALESCE(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MAX,0.0000) ESTOQUE_MAXIMO,
                    COALESCE(B.TIPO_REPOSICAO,'1') TIPO_REPOSICAO,
                    COALESCE(P.SEGURANCA,0.00) / 100.00 SEGURANCA
            
                FROM TBPRODUTO P LEFT JOIN
                    (
                    SELECT M00.ESTABELECIMENTO_CODIGO, M00.PRODUTO_CODIGO, M00.LOCALIZACAO_CODIGO, M00.ESTOQUE_SEGURANCA, 00 TAMANHO_ID, M00.QUANTIDADE ESTOQUE_MIN, M00.SEGURANCA, M00.ESTOQUE_MAX ESTOQUE_MAX, M00.PONTO_REPOSICAO, M00.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M00, TBPRODUTO P WHERE P.CODIGO = M00.PRODUTO_CODIGO AND P.GRADE_CODIGO = 0 AND (M00.QUANTIDADE > 0 OR M00.ESTOQUE_MAX > 0) UNION
                    SELECT M01.ESTABELECIMENTO_CODIGO, M01.PRODUTO_CODIGO, M01.LOCALIZACAO_CODIGO, M01.ESTOQUE_SEGURANCA, 01 TAMANHO_ID, T01            ESTOQUE_MIN, M01.SEGURANCA, M01             ESTOQUE_MAX, M01.PONTO_REPOSICAO, M01.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M01, TBPRODUTO P WHERE P.CODIGO = M01.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M01.T01        > 0 OR M01.M01         > 0) UNION
                    SELECT M02.ESTABELECIMENTO_CODIGO, M02.PRODUTO_CODIGO, M02.LOCALIZACAO_CODIGO, M02.ESTOQUE_SEGURANCA, 02 TAMANHO_ID, T02            ESTOQUE_MIN, M02.SEGURANCA, M02             ESTOQUE_MAX, M02.PONTO_REPOSICAO, M02.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M02, TBPRODUTO P WHERE P.CODIGO = M02.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M02.T02        > 0 OR M02.M02         > 0) UNION
                    SELECT M03.ESTABELECIMENTO_CODIGO, M03.PRODUTO_CODIGO, M03.LOCALIZACAO_CODIGO, M03.ESTOQUE_SEGURANCA, 03 TAMANHO_ID, T03            ESTOQUE_MIN, M03.SEGURANCA, M03             ESTOQUE_MAX, M03.PONTO_REPOSICAO, M03.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M03, TBPRODUTO P WHERE P.CODIGO = M03.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M03.T03        > 0 OR M03.M03         > 0) UNION
                    SELECT M04.ESTABELECIMENTO_CODIGO, M04.PRODUTO_CODIGO, M04.LOCALIZACAO_CODIGO, M04.ESTOQUE_SEGURANCA, 04 TAMANHO_ID, T04            ESTOQUE_MIN, M04.SEGURANCA, M04             ESTOQUE_MAX, M04.PONTO_REPOSICAO, M04.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M04, TBPRODUTO P WHERE P.CODIGO = M04.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M04.T04        > 0 OR M04.M04         > 0) UNION
                    SELECT M05.ESTABELECIMENTO_CODIGO, M05.PRODUTO_CODIGO, M05.LOCALIZACAO_CODIGO, M05.ESTOQUE_SEGURANCA, 05 TAMANHO_ID, T05            ESTOQUE_MIN, M05.SEGURANCA, M05             ESTOQUE_MAX, M05.PONTO_REPOSICAO, M05.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M05, TBPRODUTO P WHERE P.CODIGO = M05.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M05.T05        > 0 OR M05.M05         > 0) UNION
                    SELECT M06.ESTABELECIMENTO_CODIGO, M06.PRODUTO_CODIGO, M06.LOCALIZACAO_CODIGO, M06.ESTOQUE_SEGURANCA, 06 TAMANHO_ID, T06            ESTOQUE_MIN, M06.SEGURANCA, M06             ESTOQUE_MAX, M06.PONTO_REPOSICAO, M06.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M06, TBPRODUTO P WHERE P.CODIGO = M06.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M06.T06        > 0 OR M06.M06         > 0) UNION
                    SELECT M07.ESTABELECIMENTO_CODIGO, M07.PRODUTO_CODIGO, M07.LOCALIZACAO_CODIGO, M07.ESTOQUE_SEGURANCA, 07 TAMANHO_ID, T07            ESTOQUE_MIN, M07.SEGURANCA, M07             ESTOQUE_MAX, M07.PONTO_REPOSICAO, M07.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M07, TBPRODUTO P WHERE P.CODIGO = M07.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M07.T07        > 0 OR M07.M07         > 0) UNION
                    SELECT M08.ESTABELECIMENTO_CODIGO, M08.PRODUTO_CODIGO, M08.LOCALIZACAO_CODIGO, M08.ESTOQUE_SEGURANCA, 08 TAMANHO_ID, T08            ESTOQUE_MIN, M08.SEGURANCA, M08             ESTOQUE_MAX, M08.PONTO_REPOSICAO, M08.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M08, TBPRODUTO P WHERE P.CODIGO = M08.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M08.T08        > 0 OR M08.M08         > 0) UNION
                    SELECT M09.ESTABELECIMENTO_CODIGO, M09.PRODUTO_CODIGO, M09.LOCALIZACAO_CODIGO, M09.ESTOQUE_SEGURANCA, 09 TAMANHO_ID, T09            ESTOQUE_MIN, M09.SEGURANCA, M09             ESTOQUE_MAX, M09.PONTO_REPOSICAO, M09.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M09, TBPRODUTO P WHERE P.CODIGO = M09.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M09.T09        > 0 OR M09.M09         > 0) UNION
                    SELECT M10.ESTABELECIMENTO_CODIGO, M10.PRODUTO_CODIGO, M10.LOCALIZACAO_CODIGO, M10.ESTOQUE_SEGURANCA, 10 TAMANHO_ID, T10            ESTOQUE_MIN, M10.SEGURANCA, M10             ESTOQUE_MAX, M10.PONTO_REPOSICAO, M10.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M10, TBPRODUTO P WHERE P.CODIGO = M10.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M10.T10        > 0 OR M10.M10         > 0) UNION
                    SELECT M11.ESTABELECIMENTO_CODIGO, M11.PRODUTO_CODIGO, M11.LOCALIZACAO_CODIGO, M11.ESTOQUE_SEGURANCA, 11 TAMANHO_ID, T11            ESTOQUE_MIN, M11.SEGURANCA, M11             ESTOQUE_MAX, M11.PONTO_REPOSICAO, M11.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M11, TBPRODUTO P WHERE P.CODIGO = M11.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M11.T11        > 0 OR M11.M11         > 0) UNION
                    SELECT M12.ESTABELECIMENTO_CODIGO, M12.PRODUTO_CODIGO, M12.LOCALIZACAO_CODIGO, M12.ESTOQUE_SEGURANCA, 12 TAMANHO_ID, T12            ESTOQUE_MIN, M12.SEGURANCA, M12             ESTOQUE_MAX, M12.PONTO_REPOSICAO, M12.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M12, TBPRODUTO P WHERE P.CODIGO = M12.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M12.T12        > 0 OR M12.M12         > 0) UNION
                    SELECT M13.ESTABELECIMENTO_CODIGO, M13.PRODUTO_CODIGO, M13.LOCALIZACAO_CODIGO, M13.ESTOQUE_SEGURANCA, 13 TAMANHO_ID, T13            ESTOQUE_MIN, M13.SEGURANCA, M13             ESTOQUE_MAX, M13.PONTO_REPOSICAO, M13.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M13, TBPRODUTO P WHERE P.CODIGO = M13.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M13.T13        > 0 OR M13.M13         > 0) UNION
                    SELECT M14.ESTABELECIMENTO_CODIGO, M14.PRODUTO_CODIGO, M14.LOCALIZACAO_CODIGO, M14.ESTOQUE_SEGURANCA, 14 TAMANHO_ID, T14            ESTOQUE_MIN, M14.SEGURANCA, M14             ESTOQUE_MAX, M14.PONTO_REPOSICAO, M14.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M14, TBPRODUTO P WHERE P.CODIGO = M14.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M14.T14        > 0 OR M14.M14         > 0) UNION
                    SELECT M15.ESTABELECIMENTO_CODIGO, M15.PRODUTO_CODIGO, M15.LOCALIZACAO_CODIGO, M15.ESTOQUE_SEGURANCA, 15 TAMANHO_ID, T15            ESTOQUE_MIN, M15.SEGURANCA, M15             ESTOQUE_MAX, M15.PONTO_REPOSICAO, M15.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M15, TBPRODUTO P WHERE P.CODIGO = M15.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M15.T15        > 0 OR M15.M15         > 0) UNION
                    SELECT M16.ESTABELECIMENTO_CODIGO, M16.PRODUTO_CODIGO, M16.LOCALIZACAO_CODIGO, M16.ESTOQUE_SEGURANCA, 16 TAMANHO_ID, T16            ESTOQUE_MIN, M16.SEGURANCA, M16             ESTOQUE_MAX, M16.PONTO_REPOSICAO, M16.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M16, TBPRODUTO P WHERE P.CODIGO = M16.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M16.T16        > 0 OR M16.M16         > 0) UNION
                    SELECT M17.ESTABELECIMENTO_CODIGO, M17.PRODUTO_CODIGO, M17.LOCALIZACAO_CODIGO, M17.ESTOQUE_SEGURANCA, 17 TAMANHO_ID, T17            ESTOQUE_MIN, M17.SEGURANCA, M17             ESTOQUE_MAX, M17.PONTO_REPOSICAO, M17.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M17, TBPRODUTO P WHERE P.CODIGO = M17.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M17.T17        > 0 OR M17.M17         > 0) UNION
                    SELECT M18.ESTABELECIMENTO_CODIGO, M18.PRODUTO_CODIGO, M18.LOCALIZACAO_CODIGO, M18.ESTOQUE_SEGURANCA, 18 TAMANHO_ID, T18            ESTOQUE_MIN, M18.SEGURANCA, M18             ESTOQUE_MAX, M18.PONTO_REPOSICAO, M18.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M18, TBPRODUTO P WHERE P.CODIGO = M18.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M18.T18        > 0 OR M18.M18         > 0) UNION
                    SELECT M19.ESTABELECIMENTO_CODIGO, M19.PRODUTO_CODIGO, M19.LOCALIZACAO_CODIGO, M19.ESTOQUE_SEGURANCA, 19 TAMANHO_ID, T19            ESTOQUE_MIN, M19.SEGURANCA, M19             ESTOQUE_MAX, M19.PONTO_REPOSICAO, M19.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M19, TBPRODUTO P WHERE P.CODIGO = M19.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M19.T19        > 0 OR M19.M19         > 0) UNION
                    SELECT M20.ESTABELECIMENTO_CODIGO, M20.PRODUTO_CODIGO, M20.LOCALIZACAO_CODIGO, M20.ESTOQUE_SEGURANCA, 20 TAMANHO_ID, T20            ESTOQUE_MIN, M20.SEGURANCA, M20             ESTOQUE_MAX, M20.PONTO_REPOSICAO, M20.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M20, TBPRODUTO P WHERE P.CODIGO = M20.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M20.T20        > 0 OR M20.M20         > 0)
                    ) B ON
                        B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                    AND B.LOCALIZACAO_CODIGO     = P.LOCALIZACAO_CODIGO
                    AND B.PRODUTO_CODIGO         = P.CODIGO
                    AND B.ESTOQUE_MIN > 0
    
                WHERE P.FAMILIA_CODIGO = :FAMILIA_1
                AND P.STATUS           = '1'
                ) X
            ) V
    
  --      WHERE V.NECESSIDADE > 0

    INTO
        :XPRODUTO_ID,
        :XMODELO_ID,
        :XMODELO_DESCRICAO,
        :XCOR_ID,
        :XCOR_DESCRICAO,
        :XTAMANHO_ID,
        :XTAMANHO,
        :XUM,
        :XLOCALIZACAO_ID,
        :XESTOQUE,
        :XEM_PRODUCAO,
        :XEMPENHADO,
        :XPROJECAO,
        :XEST_MIN,
        :XEST_MAX,
        :XSEGURANCA,
        :XPERC_PONTO_REP,
        :XQTD_PONTO_REP,
        :XTIPO_REP,
        :XQTD_REP,
        :XNECESSIDADE,
        :XDENSIDADE,
        :XESPESSURA

    DO
    BEGIN
        IF (:XPRODUTO_ID > 0) THEN
        BEGIN
            PRODUTO_ID       = :XPRODUTO_ID ;
            MODELO_ID        = :XMODELO_ID;
            MODELO_DESCRICAO = :XMODELO_DESCRICAO;
            COR_ID           = :XCOR_ID;
            COR_DESCRICAO    = :XCOR_DESCRICAO;
            TAMANHO_ID       = :XTAMANHO_ID;
            TAMANHO          = :XTAMANHO;
            UM               = :XUM;
            LOCALIZACAO_ID   = :XLOCALIZACAO_ID ;
            ESTOQUE          = :XESTOQUE ;
            EMPENHADO        = :XEMPENHADO ;
            EM_PRODUCAO      = :XEM_PRODUCAO ;
            PROJECAO         = :XPROJECAO ;
            EST_MIN          = :XEST_MIN ;
            EST_MAX          = :XEST_MAX ;
            SEGURANCA        = :XSEGURANCA ;
            PERC_PONTO_REP   = :XPERC_PONTO_REP ;
            QTD_PONTO_REP    = :XQTD_PONTO_REP ;
            TIPO_REP         = :XTIPO_REP ;
            QTD_REP          = :XQTD_REP ;
            NECESSIDADE      = :XNECESSIDADE ;
            PROGRAMAR        = (SELECT VALOR2 FROM ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            DENSIDADE        = :XDENSIDADE;
            ESPESSURA        = :XESPESSURA;
            FILTRO           = :PRODUTO_ID||' '||:MODELO_ID||' '||:MODELO_DESCRICAO||' '||:COR_DESCRICAO||' '||:TAMANHO;
            SUSPEND;
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_CONSUMO_PEDIDOS
returns (
    ESTABELECIMENTO_ID integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    GRADE_TAMANHO_ID varchar(20),
    PROJECAO_QUANTIDADE numeric(18,4),
    PEDIDO integer)
as
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
BEGIN

--  EXECUTE PROCEDURE SPU_ALOCACAO_CONSUMO_MP;

    For
    Select
      Pedido,
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade

    From (
    Select
      P.Pedido, A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA >= '01.01.2017'
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
      and Coalesce(P.Remessa_Id,0) = 0
    
    Group By Pedido, A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :Pedido, :Modelo_Id, :Cor_Id, :Tamanho, :Quantidade 
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :Modelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
        --  and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :Modelo_id
          AND B.COR_ID = :Cor_id
          and B.PRODUTO_ID = P.Codigo
        --  and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,:Pedido, gen_id(GTMP10168_1,1));
       End

  End

  For
    Select 1 ESTABELECIMENTO_ID,
           P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
           P.CODIGO PRODUTO_ID,
           P.GRADE_CODIGO||'-'||T.TAM GRADE_TAMANHO_ID,
           T.PROJECAO PROJECAO_NECESSIDADE,
           T.PEDIDO
      From TMP10168_1 T, TbProduto P
     Where T.Produto_Id = P.Codigo
       and t.projecao > 0
   Into :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :GRADE_TAMANHO_ID, :PROJECAO_QUANTIDADE,PEDIDO
   Do
   Suspend;
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_CONSUMO_PEDIDO (
    XESTABELECIMENTO integer,
    XFAMILIA integer,
    XPEDIDO integer,
    XCOR integer)
returns (
    PEDIDO integer,
    FAMILIA varchar(100),
    PRODUTO_ID integer,
    PRODUTO varchar(100),
    UM varchar(10),
    LOCALIZACAO integer,
    PROJECAO numeric(15,2),
    ALOCADO numeric(15,2))
as
declare variable VPEDIDO integer;
declare variable VMODELO_ID integer;
declare variable VMODELO_DESCRICAO varchar(100);
declare variable VCOR_ID integer;
declare variable VCOR_DESCRICAO varchar(100);
declare variable VTAM_DESCRICAO varchar(100);
declare variable VGRADE_CODIGO integer;
declare variable VTAMANHO integer;
declare variable VQUANTIDADE integer;
declare variable VSALDO_FATURAR numeric(15,2);
declare variable VALOC_EST numeric(15,2);
declare variable VALOC_REM numeric(15,2);
declare variable VALOC_AGR numeric(15,2);
declare variable VFAMILIA_CODIGO integer;
declare variable VFAMILIA_DESCRICAO varchar(100);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VGRADE_CODIGO2 integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VUM varchar(100);
declare variable VLOCALIZACAO_CODIGO integer;
declare variable VTAM_DESCRICAO2 varchar(100);
declare variable VPROJECAO numeric(15,2);
declare variable VALOCADO numeric(15,2);
declare variable VESTOQUE_SEGURANCA numeric(15,2);
BEGIN

  delete from TMP10168_1;


FOR Select
  Pedido,
  Modelo_Id,
  Modelo_Descricao,
  Cor_Id,
  Cor_Descricao,
  Tam_Descricao,
  Grade_Codigo,
  Tamanho,
  Saldo_Faturar,
  (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade,
  Aloc_Est,
  Aloc_Rem,
  Aloc_Agr


 from (

SELECT
  P.PEDIDO,
  A.MODELO_CODIGO MODELO_ID,
  M.DESCRICAO MODELO_DESCRICAO,
  A.COR_ID,
  (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.COR_ID) COR_DESCRICAO,
  (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
  M.GRADE_CODIGO,
  A.TAMANHO,
  CAST(SUM(A.QUANTIDADE) AS NUMERIC(15,4)) QUANTIDADE,
  CAST(SUM(S.QUANTIDADE) AS NUMERIC(15,4)) SALDO_FATURAR,
  CAST(SUM(A.QTD_EST) AS NUMERIC(15,4)) ALOC_EST,
  CAST(SUM(A.QTD_REM) AS NUMERIC(15,4)) ALOC_REM,
  CAST(SUM(A.QTD_AGP) AS NUMERIC(15,4)) ALOC_AGR

FROM TBPEDIDO_ITEM A, TBPEDIDO P, TBMODELO M, TBPEDIDO_ITEM_SALDO S
WHERE A.ESTABELECIMENTO_CODIGO = :xESTABELECIMENTO
  AND A.ESTABELECIMENTO_CODIGO = P.ESTABELECIMENTO_CODIGO
  AND A.CONTROLE = S.PEDIDO_ITEM_CONTROLE
  AND A.PEDIDO = P.PEDIDO
  AND A.MODELO_CODIGO = M.CODIGO
  AND COALESCE(P.REMESSA_ID,0) = 0
  AND P.DATA BETWEEN '01.01.2014' AND CURRENT_DATE
  AND P.STATUS=1
  AND P.SITUACAO=1
  AND A.SITUACAO=1
  AND IIF(:XPEDIDO > 0 , P.Pedido = :xPEDIDO, True)
  AND IIF(:XCOR > 0 , A.Cor_Id = :xCOR, True)

GROUP BY P.PEDIDO, A.MODELO_CODIGO, M.DESCRICAO, A.COR_ID, M.GRADE_CODIGO, A.TAMANHO,COR_DESCRICAO,TAM_DESCRICAO
)
WHERE (SALDO_FATURAR - ALOC_EST - ALOC_REM) > 0

INTO
    :VPEDIDO,
    :VMODELO_ID,
    :VMODELO_DESCRICAO,
    :VCOR_ID,
    :VCOR_DESCRICAO,
    :VTAM_DESCRICAO,
    :VGRADE_CODIGO,
    :VTAMANHO,
    :VSALDO_FATURAR,
    :VQUANTIDADE,
    :VALOC_EST,
    :VALOC_REM,
    :VALOC_AGR
DO
begin
    FOR
      SELECT P.FAMILIA_CODIGO, (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO) FAMILIA_DESCRICAO,
       B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.TAM, P.GRADE_CODIGO, P.DESCRICAO PRODUTO_DESCRICAO, P.UNIDADEMEDIDA_SIGLA UM,
       P.LOCALIZACAO_CODIGO, (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,B.TAM)) TAM_DESCRICAO,

        CAST((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :vmodelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and p.familia_codigo = :xFamilia --in (select osplit from split(:xFamilia,','))
        
        Union
        
        SELECT P.FAMILIA_CODIGO, (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO) FAMILIA_DESCRICAO,
               B.PRODUTO_ID, B.TAM, P.GRADE_CODIGO, P.DESCRICAO PRODUTO_DESCRICAO, P.UNIDADEMEDIDA_SIGLA UM,
               P.LOCALIZACAO_CODIGO, (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,B.TAM)) TAM_DESCRICAO,
        
        Cast((
         (Case When (Cast(:vtamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:vtamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:vQuantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) PROJECAO
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :vmodelo_id
          AND B.COR_ID = :vcor_id
          and B.PRODUTO_ID = P.Codigo
          and p.familia_codigo = :xFamilia --in (select osplit from split(:xFamilia,','))

    INTO
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
    DO
    Begin

    insert into TMP10168_1 values(
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO,
        :vPEDIDO,
        gen_id(GTMP10168_1,1)
    );

   end
end

   --/*
    for
        select
        PEDIDO,FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO,sum(PROJECAO)
        from tmp10168_1 e group by
        PEDIDO,FAMILIA_CODIGO,FAMILIA_DESCRICAO,PRODUTO_ID,TAM,GRADE_CODIGO2,
        PRODUTO_DESCRICAO,UM,LOCALIZACAO_CODIGO,TAM_DESCRICAO
   INTO
        :vPEDIDO,
        :vFAMILIA_CODIGO,
        :vFAMILIA_DESCRICAO,
        :vPRODUTO_ID,
        :vTAM,
        :vGRADE_CODIGO2,
        :vPRODUTO_DESCRICAO,
        :vUM,
        :vLOCALIZACAO_CODIGO,
        :vTAM_DESCRICAO2,
        :vPROJECAO
   do
   Begin

        FOR
           SELECT

             Coalesce(
             (Select Sum(SA.Saldo)
                From TbEstoque_Detalhe_Alocacao SA
               Where SA.Produto_Id = :vPRODUTO_ID
                 and SA.Estabelecimento_Id = :xESTABELECIMENTO
                 and SA.Localizacao_Id = :vLOCALIZACAO_CODIGO
                 and SA.Tipo = 'C'
                 and SA.Tabela_Id = :vPEDIDO
                 and SA.Saldo > 0
                 and SA.Tamanho = :vTAM)
             ,0.0000) Alocado,

             Coalesce(
             Cast(
             (SELECT First 1 B.Seguranca
                FROM TbEstoque_Minimo B
               WHERE B.Estabelecimento_Codigo = :xESTABELECIMENTO
                 and B.Localizacao_Codigo = :vLOCALIZACAO_CODIGO
                 and B.PRODUTO_Codigo = :vPRODUTO_ID)
             as Numeric(15,4))
             ,0.0000) Estoque_Seguranca
            
           From RDB$DATABASE

        INTO :vALOCADO, :vESTOQUE_SEGURANCA
        DO
        Begin

            PEDIDO          = vPEDIDO;
            PRODUTO_ID      = vPRODUTO_ID;
            FAMILIA         = vFAMILIA_DESCRICAO;
            PRODUTO         = vPRODUTO_DESCRICAO;
            UM              = vUM;
            LOCALIZACAO     = vLOCALIZACAO_CODIGO;
            PROJECAO        = vPROJECAO + (vPROJECAO*(Coalesce(vESTOQUE_SEGURANCA,0)/100.00));
            ALOCADO         = vALOCADO;

          suspend;
        end
   end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_PEDIDO (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(10),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA between '01.01.2015' and current_date
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
    
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :yModelo_Id, :yCor_Id, :yTamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :yModelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :yModelo_id
          AND B.COR_ID = :yCor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0, gen_id(GTMP10168_1,1));
       End

  End

  For

    Select V.PRODUTO_ID,V.MODELO_ID,V.MODELO_DESCRICAO,V.COR_ID,V.COR_DESCRICAO,
           V.TAMANHO_ID, V.TAMANHO,V.UM,V.LOCALIZACAO_ID,V.ESTOQUE,V.EM_PRODUCAO,
           V.EMPENHADO,V.PROJECAO,V.EST_MIN,V.EST_MAX, V.SEGURANCA,
           V.PERC_PONTO_REP, V.QTD_PONTO_REP, V.TIPO_REP,V.QTD_REP,V.NECESSIDADE,
          (Select First 1 M.Densidade From TbModelo M Where M.Codigo = V.MODELO_ID),
          (Select First 1 M.Espessura From TbModelo M Where M.Codigo = V.MODELO_ID)

    From (
    Select X.Produto_Id, X.MODELO_ID,X.MODELO_DESCRICAO,X.COR_ID,X.COR_DESCRICAO,
           X.TAMANHO_ID, X.TAMANHO,X.UM,X.LOCALIZACAO_ID, X.ESTOQUE, X.EM_PRODUCAO,
           X.EMPENHADO, X.PROJECAO, X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX, X.SEGURANCA,
           X.PONTO_REPOSICAO PERC_PONTO_REP, X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
           IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
           IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,

           IIF( X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                 IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO), 0) NECESSIDADE
    From (
    Select P.Codigo Produto_Id, P.MODELO_CODIGO MODELO_ID,
          (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
           P.COR_CODIGO COR_ID, (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
           0 TAMANHO_ID, Cast('' as VarChar(10)) TAMANHO, P.UNIDADEMEDIDA_SIGLA UM,
           P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = P.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo
       and E.Remessa >= -1) as Numeric(15,4)),0.0000)  Empenhado,

     Coalesce(Cast((Select Sum(PG.QUANTIDADE)
      From TbProgramacao PG
     Where PG.PRODUTO_ID = P.CODIGO
       and PG.Estabelecimento_Id = :Estabelecimento_1
       and PG.Tipo in ('A','D')
       and PG.STATUS in ('0','1','2')) as Numeric(15,4)),0.0000)  Em_Producao,
    
    Coalesce(Cast(B.QUANTIDADE * (Coalesce(B.Ponto_Reposicao,100.0000) / 100.0000) as Numeric(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
    Coalesce(B.QUANTIDADE,0.0000) Estoque_Minimo,
    Coalesce(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
    Coalesce(B.Estoque_Max,0.0000) Estoque_Maximo,
    Coalesce(B.TIPO_REPOSICAO,'1') Tipo_Reposicao,

    Coalesce(P.Seguranca,0.00) / 100.00 Seguranca
    
    From TbProduto P  
    Left Join TbEstoque_Minimo B ON B.Estabelecimento_Codigo = :Estabelecimento_1
                                and B.Localizacao_Codigo = P.Localizacao_Codigo
                                and B.PRODUTO_Codigo = P.Codigo and B.QUANTIDADE > 0
    Where P.Familia_Codigo = :Familia_1
      and P.Status = '1'
      and P.Grade_Codigo = 0

    
    ) X
    ) V Where V.NECESSIDADE > 0

  Into  :xPRODUTO_ID, :xModelo_Id, :xMODELO_DESCRICAO, :xCOR_Id, :xCOR_DESCRICAO,
        :xTAMANHO_ID, :xTAMANHO, :xUM, :xLOCALIZACAO_ID, :xESTOQUE,
        :xEM_PRODUCAO, :xEMPENHADO, :xPROJECAO, :xEST_MIN, :xEST_MAX, :xSEGURANCA,
        :xPERC_PONTO_REP, :xQTD_PONTO_REP, :xTIPO_REP, :xQTD_REP, :xNECESSIDADE,
        :xDensidade, :xEspessura

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin
            produto_id = :Xproduto_id ;
            modelo_id = :Xmodelo_id;
            modelo_descricao = :Xmodelo_descricao;
            cor_id = :Xcor_id;
            cor_descricao = :Xcor_descricao;
            tamanho_id = :Xtamanho_id;
            tamanho = :Xtamanho;
            um = :Xum;
            localizacao_id = :Xlocalizacao_id ;
            estoque = :Xestoque ;
            empenhado = :Xempenhado ;
            em_producao = :Xem_producao ;
            projecao = :Xprojecao ;
            est_min = :Xest_min ;
            est_max = :Xest_max ;
            seguranca = :Xseguranca ;
            perc_ponto_rep = :Xperc_ponto_rep ;
            qtd_ponto_rep = :Xqtd_ponto_rep ;
            tipo_rep = :Xtipo_rep ;
            qtd_rep = :Xqtd_rep ;
            NECESSIDADE = :XNECESSIDADE ;
            PROGRAMAR = (Select Valor2 From ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            Densidade = :xDensidade;
            Espessura = :xEspessura;
            FILTRO = :produto_id||' '||:modelo_id||' '||:modelo_descricao||' '||:cor_descricao||' '||:tamanho;
            Suspend;
          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_CONSUMO_REP_ESTMIN
returns (
    ESTABELECIMENTO_ID integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    GRADE_TAMANHO_ID varchar(20),
    PROJECAO_QUANTIDADE numeric(18,4))
as
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable GRADE_ID integer;
declare variable QUANTIDADE numeric(15,4);
declare variable T01 numeric(15,4);
declare variable T02 numeric(15,4);
declare variable T03 numeric(15,4);
declare variable T04 numeric(15,4);
declare variable T05 numeric(15,4);
declare variable T06 numeric(15,4);
declare variable T07 numeric(15,4);
declare variable T08 numeric(15,4);
declare variable T09 numeric(15,4);
declare variable T10 numeric(15,4);
declare variable T11 numeric(15,4);
declare variable T12 numeric(15,4);
declare variable T13 numeric(15,4);
declare variable T14 numeric(15,4);
declare variable T15 numeric(15,4);
declare variable T16 numeric(15,4);
declare variable T17 numeric(15,4);
declare variable T18 numeric(15,4);
declare variable T19 numeric(15,4);
declare variable T20 numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
BEGIN

--  EXECUTE PROCEDURE SPU_ALOCACAO_CONSUMO_MP;

    For Select
        MODELO_ID,COR_ID,GRADE_ID,T00,
        T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
        T11,T12,T13,T14,T15,T16,T17,T18,T19,T20
        From (
        Select p.modelo_codigo Modelo_Id,
               p.cor_codigo cor_id,
               p.grade_codigo grade_id,

               IIF(p.grade_codigo = 0 and B.Quantidade > Coalesce(A.Saldo,0)-Coalesce(S.Quantidade,0),B.Estoque_Max-(Coalesce(A.Saldo,0)-Coalesce(S.Quantidade,0)),0) T00,
               IIF(p.grade_codigo > 0 and B.T01 > Coalesce(A.T01_saldo,0)-Coalesce(S.T01,0),B.M01-(Coalesce(A.T01_saldo,0)-Coalesce(S.T01,0)),0) T01,
               IIF(p.grade_codigo > 0 and B.T02 > Coalesce(A.T02_saldo,0)-Coalesce(S.T02,0),B.M02-(Coalesce(A.T02_saldo,0)-Coalesce(S.T02,0)),0) T02,
               IIF(p.grade_codigo > 0 and B.T03 > Coalesce(A.T03_saldo,0)-Coalesce(S.T03,0),B.M03-(Coalesce(A.T03_saldo,0)-Coalesce(S.T03,0)),0) T03,
               IIF(p.grade_codigo > 0 and B.T04 > Coalesce(A.T04_saldo,0)-Coalesce(S.T04,0),B.M04-(Coalesce(A.T04_saldo,0)-Coalesce(S.T04,0)),0) T04,
               IIF(p.grade_codigo > 0 and B.T05 > Coalesce(A.T05_saldo,0)-Coalesce(S.T05,0),B.M05-(Coalesce(A.T05_saldo,0)-Coalesce(S.T05,0)),0) T05,
               IIF(p.grade_codigo > 0 and B.T06 > Coalesce(A.T06_saldo,0)-Coalesce(S.T06,0),B.M06-(Coalesce(A.T06_saldo,0)-Coalesce(S.T06,0)),0) T06,
               IIF(p.grade_codigo > 0 and B.T07 > Coalesce(A.T07_saldo,0)-Coalesce(S.T07,0),B.M07-(Coalesce(A.T07_saldo,0)-Coalesce(S.T07,0)),0) T07,
               IIF(p.grade_codigo > 0 and B.T08 > Coalesce(A.T08_saldo,0)-Coalesce(S.T08,0),B.M08-(Coalesce(A.T08_saldo,0)-Coalesce(S.T08,0)),0) T08,
               IIF(p.grade_codigo > 0 and B.T09 > Coalesce(A.T09_saldo,0)-Coalesce(S.T09,0),B.M09-(Coalesce(A.T09_saldo,0)-Coalesce(S.T09,0)),0) T09,
               IIF(p.grade_codigo > 0 and B.T10 > Coalesce(A.T10_saldo,0)-Coalesce(S.T10,0),B.M10-(Coalesce(A.T10_saldo,0)-Coalesce(S.T10,0)),0) T10,
               IIF(p.grade_codigo > 0 and B.T11 > Coalesce(A.T11_saldo,0)-Coalesce(S.T11,0),B.M11-(Coalesce(A.T11_saldo,0)-Coalesce(S.T11,0)),0) T11,
               IIF(p.grade_codigo > 0 and B.T12 > Coalesce(A.T12_saldo,0)-Coalesce(S.T12,0),B.M12-(Coalesce(A.T12_saldo,0)-Coalesce(S.T12,0)),0) T12,
               IIF(p.grade_codigo > 0 and B.T13 > Coalesce(A.T13_saldo,0)-Coalesce(S.T13,0),B.M13-(Coalesce(A.T13_saldo,0)-Coalesce(S.T13,0)),0) T13,
               IIF(p.grade_codigo > 0 and B.T14 > Coalesce(A.T14_saldo,0)-Coalesce(S.T14,0),B.M14-(Coalesce(A.T14_saldo,0)-Coalesce(S.T14,0)),0) T14,
               IIF(p.grade_codigo > 0 and B.T15 > Coalesce(A.T15_saldo,0)-Coalesce(S.T15,0),B.M15-(Coalesce(A.T15_saldo,0)-Coalesce(S.T15,0)),0) T15,
               IIF(p.grade_codigo > 0 and B.T16 > Coalesce(A.T16_saldo,0)-Coalesce(S.T16,0),B.M16-(Coalesce(A.T16_saldo,0)-Coalesce(S.T16,0)),0) T16,
               IIF(p.grade_codigo > 0 and B.T17 > Coalesce(A.T17_saldo,0)-Coalesce(S.T17,0),B.M17-(Coalesce(A.T17_saldo,0)-Coalesce(S.T17,0)),0) T17,
               IIF(p.grade_codigo > 0 and B.T18 > Coalesce(A.T18_saldo,0)-Coalesce(S.T18,0),B.M18-(Coalesce(A.T18_saldo,0)-Coalesce(S.T18,0)),0) T18,
               IIF(p.grade_codigo > 0 and B.T19 > Coalesce(A.T19_saldo,0)-Coalesce(S.T19,0),B.M19-(Coalesce(A.T19_saldo,0)-Coalesce(S.T19,0)),0) T19,
               IIF(p.grade_codigo > 0 and B.T20 > Coalesce(A.T20_saldo,0)-Coalesce(S.T20,0),B.M20-(Coalesce(A.T20_saldo,0)-Coalesce(S.T20,0)),0) T20

        
        from tbestoque_minimo b
        
        left join tbproduto p on b.produto_codigo = p.codigo
        
        left join vwestoque_saldo_alocacao s on
              s.estabelecimento_id = b.estabelecimento_codigo
          and s.localizacao_id = b.localizacao_codigo
          and s.produto_id = b.produto_codigo
        
        
        left join tbestoque_saldo a on
              a.estabelecimento_codigo = b.estabelecimento_codigo
          and a.localizacao_codigo = b.localizacao_codigo
          and a.produto_codigo = b.produto_codigo
          and a.saldo > 0
        
        Where b.quantidade > 0
          and b.habilita_kanban = '0'
        
        )
        Where T00+T01+T02+T03+T04+T05+T06+T07+T08+T09+T10+
              T11+T12+T13+T14+T15+T16+T17+T18+T19+T20 > 0
    
    Into :Modelo_Id, :Cor_Id, :Grade_Id, :Quantidade,
         :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10,
         :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (:Grade_Id = 0) and (B.CONSUMO_QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:T01 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:T02 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:T03 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:T04 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:T05 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:T06 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:T07 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:T08 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:T09 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:T10 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:T11 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:T12 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:T13 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:T14 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:T15 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:T16 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:T17 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:T18 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:T19 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:T20 as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :Modelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
        --  and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (:Grade_Id = 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T01 > 0) Then Cast( (Cast(:T01 as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T02 > 0) Then Cast( (Cast(:T02 as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T03 > 0) Then Cast( (Cast(:T03 as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T04 > 0) Then Cast( (Cast(:T04 as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T05 > 0) Then Cast( (Cast(:T05 as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T06 > 0) Then Cast( (Cast(:T06 as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T07 > 0) Then Cast( (Cast(:T07 as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T08 > 0) Then Cast( (Cast(:T08 as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T09 > 0) Then Cast( (Cast(:T09 as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T10 > 0) Then Cast( (Cast(:T10 as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T11 > 0) Then Cast( (Cast(:T11 as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T12 > 0) Then Cast( (Cast(:T12 as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T13 > 0) Then Cast( (Cast(:T13 as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T14 > 0) Then Cast( (Cast(:T14 as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T15 > 0) Then Cast( (Cast(:T15 as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T16 > 0) Then Cast( (Cast(:T16 as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T17 > 0) Then Cast( (Cast(:T17 as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T18 > 0) Then Cast( (Cast(:T18 as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T19 > 0) Then Cast( (Cast(:T19 as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (:Grade_Id > 0) and (B.T20 > 0) Then Cast( (Cast(:T20 as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :Modelo_id
          AND B.COR_ID = :Cor_id
          and B.PRODUTO_ID = P.Codigo
        --  and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0, gen_id(GTMP10168_1,1));
       End

  End

  For
    Select 1 ESTABELECIMENTO_ID,
           P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
           P.CODIGO PRODUTO_ID,
           P.GRADE_CODIGO||'-'||T.TAM GRADE_TAMANHO_ID,
           T.PROJECAO PROJECAO_NECESSIDADE
      From TMP10168_1 T, TbProduto P
     Where T.Produto_Id = P.Codigo
       and t.projecao > 0
   Into :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :GRADE_TAMANHO_ID, :PROJECAO_QUANTIDADE
   Do
   Suspend;
End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_V6 (
    IANO integer,
    IMES integer,
    IMODELO_ID integer,
    ICOR_ID integer,
    ITAMANHO integer,
    IPRODUTO_TROCA varchar(300),
    MODELO_ORIGINAL integer,
    TAMANHO_ORIGINAL integer,
    MESES integer,
    VALIDAR_FICHA integer = 0,
    TIPO_CUSTO integer = 1,
    TAXA_DOLAR numeric(18,8) = 0,
    USAR_MARGEM integer = 1)
returns (
    ANO integer,
    MES integer,
    NIVEL integer,
    PRODUTO_DESCRICAO varchar(1600),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    TAMANHO integer,
    FLAG integer,
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    FLAG_TAMANHO integer,
    H_ORIGEM varchar(200),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    MARGEM numeric(18,4),
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8))
as
declare variable MAX_NIVEL integer;
declare variable I integer;
declare variable PAI integer;
declare variable FILHOS integer;
declare variable AVO integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable VALIDAR integer;
declare variable DATA_TEMP date;
declare variable GENEALOGIA varchar(200);
declare variable CALC decimal(18,8);
declare variable OLD_TAMANHO integer;
declare variable VMARGEM numeric(15,4);
declare variable OLD_ANO integer;
declare variable OLD_MES integer;
declare variable FAMILIA_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable ICMS numeric(18,8);
declare variable PERC_ICMS numeric(18,8);
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);

    :OLD_ANO = :IANO;
    :OLD_MES = :IMES;

        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,0,0,0,0,0,0,0, gen_id(gtmpcusto_produto,1)
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0,0,0,0,0, gen_id(gtmpcusto_produto,1)
        from SPC_ESTRUTURA_CUSTO_V2(:OLD_ANO,:OLD_MES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        ANO,
                        MES,
                        NIVEL,
                        PRODUTO_DESCRICAO,
                        PRODUTO_CONSUMO,
                        TAMANHO_CONSUMO,
                        ORIGEM,
                        TS,
                        "TO",
                        CMS,
                        CMO,
                        CMOIP,
                        CMOIA,
                        CSMOIP,
                        CSMOIA,
                        PERDA,
                        C,
                        T,
                        CS,
                        CO,
                        CUSTO_MEDIO,
                        FATOR_CONVERSAO,
                        TAMANHO,
                        CUSTO_MINUTO,
                        MOI_PROPRIO,
                        MOI_ABSORVIDO,
                        COIP,
                        COIA,
                        CSIP,
                        CSIA,
                        CONSUMO,
                        FLAG_TAMANHO,
                        GENEALOGIA,
                        DATA,
                        CUSTO,
                        DOLAR,
                        MARGEM,
                        FAMILIA_ID,
                        MODELO_ID,
                        COR_ID,
                        ICMS,
                        PERC_ICMS,
                        DEFEITOS,
                        PRODUZIDO
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_id,
                    :modelo_id,
                    :cor_id,
                    :ICMS,
                    :PERC_ICMS,
                    :DEFEITOS,
                    :PRODUZIDO
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            C,
            T,
            CS,
            CO,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CONSUMO,
            FLAG_TAMANHO,
            GENEALOGIA,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID,
            ICMS,
            PERC_ICMS,
            DEFEITOS,
            PRODUZIDO
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id,
        :ICMS,
        :PERC_ICMS,
        :DEFEITOS,
        :PRODUZIDO
    do begin
        suspend;
    end
end
^

SET TERM ; ^

COMMENT ON PARAMETER SPC_CALCULAR_CUSTO_V6.TIPO_CUSTO IS
'1 - custo previsto, 2 - custo realizado, 3 - custo projetado';

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_V4 (
    IANO integer,
    IMES integer,
    IMODELO_ID integer,
    ICOR_ID integer,
    ITAMANHO integer,
    IPRODUTO_TROCA varchar(300),
    MODELO_ORIGINAL integer,
    TAMANHO_ORIGINAL integer,
    MESES integer,
    VALIDAR_FICHA integer = 0,
    TIPO_CUSTO integer = 1,
    TAXA_DOLAR numeric(18,8) = 0,
    USAR_MARGEM integer = 1)
returns (
    ANO integer,
    MES integer,
    NIVEL integer,
    PRODUTO_DESCRICAO varchar(1600),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    TAMANHO integer,
    FLAG integer,
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    FLAG_TAMANHO integer,
    H_ORIGEM varchar(200),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    MARGEM numeric(15,4),
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8))
as
declare variable MAX_NIVEL integer;
declare variable I integer;
declare variable PAI integer;
declare variable FILHOS integer;
declare variable AVO integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable VALIDAR integer;
declare variable DATA_TEMP date;
declare variable GENEALOGIA varchar(200);
declare variable CALC decimal(18,8);
declare variable OLD_TAMANHO integer;
declare variable VMARGEM numeric(15,4);
declare variable FAMILIA_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable ICMS numeric(18,8);
declare variable PERC_ICMS numeric(18,8);
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);


        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        O.familia_codigo,
        O.modelo_codigo,
        O.cor_codigo,
        0,0,0,0, gen_id(Gtmpcusto_produto,1)
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0,0,0,0,0, gen_id(Gtmpcusto_produto,1)
        from SPC_ESTRUTURA_CUSTO(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        ANO,
                        MES,
                        NIVEL,
                        PRODUTO_DESCRICAO,
                        PRODUTO_CONSUMO,
                        TAMANHO_CONSUMO,
                        ORIGEM,
                        TS,
                        "TO",
                        CMS,
                        CMO,
                        CMOIP,
                        CMOIA,
                        CSMOIP,
                        CSMOIA,
                        PERDA,
                        C,
                        T,
                        CS,
                        CO,
                        CUSTO_MEDIO,
                        FATOR_CONVERSAO,
                        TAMANHO,
                        CUSTO_MINUTO,
                        MOI_PROPRIO,
                        MOI_ABSORVIDO,
                        COIP,
                        COIA,
                        CSIP,
                        CSIA,
                        CONSUMO,
                        FLAG_TAMANHO,
                        GENEALOGIA,
                        DATA,
                        CUSTO,
                        DOLAR,
                        MARGEM,
                        FAMILIA_ID,
                        MODELO_ID,
                        COR_ID,
                        ICMS,
                        PERC_ICMS,
                        DEFEITOS,
                        PRODUZIDO
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_ID,
                    :modelo_ID,
                    :cor_ID,
                    :ICMS,
                    :PERC_ICMS,
                    :DEFEITOS,
                    :PRODUZIDO
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            C,
            T,
            CS,
            CO,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CONSUMO,
            FLAG_TAMANHO,
            GENEALOGIA,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID,
            ICMS,
            PERC_ICMS,
            DEFEITOS,
            PRODUZIDO
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id,
        :ICMS,
        :PERC_ICMS,
        :DEFEITOS,
        :PRODUZIDO
    do begin
        suspend;
    end
end
^

SET TERM ; ^

COMMENT ON PARAMETER SPC_CALCULAR_CUSTO_V4.TIPO_CUSTO IS
'1 - custo previsto, 2 - custo realizado, 3 - custo projetado';

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_V5 (
    IANO integer,
    IMES integer,
    IMODELO_ID integer,
    ICOR_ID integer,
    ITAMANHO integer)
returns (
    ANO integer,
    MES integer,
    NIVEL integer,
    PRODUTO_DESCRICAO varchar(1600),
    PRODUTO_CONSUMO integer,
    TAMANHO_CONSUMO integer,
    ORIGEM integer,
    TS numeric(18,8),
    "TO" numeric(18,8),
    CMS numeric(18,8),
    CMO numeric(18,8),
    CMOIP numeric(18,8),
    CMOIA numeric(18,8),
    CSMOIP numeric(18,8),
    CSMOIA numeric(18,8),
    PERDA numeric(18,8),
    CONSUMO numeric(18,8),
    C numeric(18,8),
    T numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    COIP numeric(18,8),
    COIA numeric(18,8),
    CSIP numeric(18,8),
    CSIA numeric(18,8),
    CUSTO_MEDIO numeric(18,8),
    FATOR_CONVERSAO numeric(18,8),
    TAMANHO integer,
    FLAG integer,
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    FLAG_TAMANHO integer,
    H_ORIGEM varchar(200),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8))
as
declare variable MAX_NIVEL integer;
declare variable I integer;
declare variable PAI integer;
declare variable FILHOS integer;
declare variable AVO integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable VALIDAR integer;
declare variable DATA_TEMP date;
declare variable GENEALOGIA varchar(200);
declare variable CALC decimal(18,8);
declare variable OLD_TAMANHO integer;
declare variable IPRODUTO_TROCA varchar(300);
declare variable MODELO_ORIGINAL integer;
declare variable TAMANHO_ORIGINAL integer;
declare variable MESES integer;
declare variable VALIDAR_FICHA integer = 0;
declare variable TIPO_CUSTO integer = 1;
declare variable TAXA_DOLAR numeric(18,8) = 0;
declare variable ICMS numeric(18,8);
declare variable VMARGEM integer;
declare variable FAMILIA_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable PERC_ICMS numeric(18,8);
begin

    in autonomous transaction do
    begin

        delete from tmpcusto_produto;
    
        iproduto_troca      = '';
        modelo_original     = imodelo_id;
        tamanho_original    = itamanho;
        meses               = 1;
        validar_ficha       = 0;
        tipo_custo          = 1;
        taxa_dolar          = 0;
    
        PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);
           --/*
            validar = 0;
            I = 0;
            WHILE (I < MESES) DO
            BEGIN
        
                if(validar = 0)then
                begin
                    validar = coalesce((select first 1
                                    f.produto_id
                                from tbficha_tempo f
                                where f.modelo_id = :IMODELO_ID
                                and f.cor_id = :icor_id
                                and f.ano = :IANO
                                and f.mes = :IMES),0);
        
                    if(validar = 0)then
                    begin
                       :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                       :IANO = extract(year  from :DATA_TEMP);
                       :IMES = extract(month from :DATA_TEMP);
                    end
                end else
                begin
        
                end
        
                I = I + 1;
            end
        
        
            I = 0;
            if(validar = 0 and VALIDAR_FICHA = 0)then
            begin
              --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
            end
    
            --*/
    
    
        --bojo
        insert into tmpcusto_produto
        select first 1
            :IANO as ANO,
            :IMES as MES,
            -1,
            o.descricao,
            o.codigo,
            :itamanho,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            0,
            0,
            1,
            :itamanho,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            :ITAMANHO,
            '',
            fn_start_of_month('01.'||:IMES||'.'||:IANO),
            0,
            0,
            0,0,0,0,0,0,0,0, gen_id(Gtmpcusto_produto,1)
        from tbproduto o
            where o.modelo_codigo = :IMODELO_ID
            and   o.cor_codigo    = :icor_id
            and   o.status = '1';
    
        --materiais q fazem parte do bojo e de seus componentes
        insert into tmpcusto_produto
            select
                :IANO as ANO,
                :IMES as MES,
                j.NIVEL,
                j.PRODUTO_DESCRICAO,
                j.PRODUTO_CONSUMO,
                j.TAMANHO_CONSUMO,
                j.ORIGEM,
                0 as TS,
                0 as "TO",
                0 as CMS,
                0 as CMO,
                0 as CMOIP,
                0 as CMOIA,
                0 as CSMOIP,
                0 as CSMOIA,
                0 as PERDA,
                j.C,
                j.T,
                0 as CS,
                0 as CO,
                j.CUSTO_MEDIO,
                j.FATOR_CONVERSAO,
                j.TAMANHO,
                0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,0,0,0,0,0,0,0,0, gen_id(Gtmpcusto_produto,1)
            from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;
    
        for
            select
                u.origem
            from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
        into
            :PAI
        do begin
            update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
        end
    
        update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;
    
    
        --nivel mais Baixo da estrutura do bojo
        MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
        
        i = MAX_NIVEL;
    
        --calcula tempo e custo de setup e operacional
        execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);
    
        update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;
    
        --atualiza custo minuto setup e operacional
         update tmpcusto_produto h
            set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
                h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
                h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
                h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
                h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
                h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),
    
                h.custo  = h.custo_medio,
                h.consumo= cast((T / fator_conversao) as numeric(18,8));
    
        -- atualiza o custo
        update tmpcusto_produto h
            set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));
    
        i = MAX_NIVEL;
        --custo medio de um produto com filhos
        WHILE (i >= -1) DO
        BEGIN
            for
                select
                    k.produto_consumo,
                    k.origem,
                    k.genealogia,
                    k.flag_tamanho,
                    coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
                from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
            into
                :PAI,
                :AVO,
                :GENEALOGIA,
                :OLD_TAMANHO,
                :FILHOS
            do begin
            --///////////////////////////////////////////////////////////////////////////////////////////
                if(:FILHOS > 0)then
                begin
                    --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end
    
                    --/*
                    update tmpcusto_produto h
                        set h.custo_medio = 0,
                        h.custo = 0,
                        h.c = 0
                      where h.ano           = :IANO
                      and h.mes             = :IMES
                      and h.produto_consumo = :PAI
                      and h.origem          = :AVO
                      and h.nivel           = :I
                      and h.genealogia      = :GENEALOGIA
                      and h.flag_tamanho    = :OLD_TAMANHO
                      ;
                    --*/
    
                    for
                        select
                            ANO,
                            MES,
                            NIVEL,
                            PRODUTO_DESCRICAO,
                            PRODUTO_CONSUMO,
                            TAMANHO_CONSUMO,
                            ORIGEM,
                            TS,
                            "TO",
                            CMS,
                            CMO,
                            CMOIP,
                            CMOIA,
                            CSMOIP,
                            CSMOIA,
                            PERDA,
                            C,
                            T,
                            CS,
                            CO,
                            CUSTO_MEDIO,
                            FATOR_CONVERSAO,
                            TAMANHO,
                            CUSTO_MINUTO,
                            MOI_PROPRIO,
                            MOI_ABSORVIDO,
                            COIP,
                            COIA,
                            CSIP,
                            CSIA,
                            CONSUMO,
                            FLAG_TAMANHO,
                            GENEALOGIA,
                            DATA,
                            CUSTO,
                            DOLAR,
                            MARGEM,
                            FAMILIA_ID,
                            MODELO_ID,
                            COR_ID,
                            ICMS,
                            PERC_ICMS,
                            DEFEITOS,
                            PRODUZIDO
                        from tmpcusto_produto k
                            where k.ano         = :IANO
                            and k.mes           = :IMES
                            and k.origem        = :PAI
                            and k.flag_tamanho  = :ITAMANHO
                            and k.nivel         = (:I + 1)
                            and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                            --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                    into
                        :ANO,
                        :MES,
                        :NIVEL,
                        :PRODUTO_DESCRICAO,
                        :PRODUTO_CONSUMO,
                        :TAMANHO_CONSUMO,
                        :ORIGEM,
                        :TS,
                        :"TO",
                        :CMS,
                        :CMO,
                        :CMOIP,
                        :CMOIA,
                        :CSMOIP,
                        :CSMOIA,
                        :PERDA,
                        :C,
                        :T,
                        :CS,
                        :CO,
                        :CUSTO_MEDIO,
                        :FATOR_CONVERSAO,
                        :TAMANHO,
                        :CUSTO_MINUTO,
                        :MOI_PROPRIO,
                        :MOI_ABSORVIDO,
                        :COIP,
                        :COIA,
                        :CSIP,
                        :CSIA,
                        :CONSUMO,
                        :FLAG_TAMANHO,
                        :H_ORIGEM,
                        :DATA,
                        :CUSTO,
                        :DOLAR,
                        :VMARGEM,
                        :familia_ID,
                        :modelo_ID,
                        :cor_ID,
                        :ICMS,
                        :PERC_ICMS,
                        :DEFEITOS,
                        :PRODUZIDO
                    do begin
                        
                        --if(75674 = :PAI)then begin exception "..." 'erro'; end
    
                       --/*
                        update tmpcusto_produto h
    
                            set h.custo_medio  = (h.custo_medio        + :C),
                            h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                            h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                            h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                            h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),
    
                            h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                            h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                            h.CS               = (h.CS   + :CMS    + :CS),
                            h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8))
    
                            where h.ano             = :IANO
                            and h.mes               = :IMES
                            and h.produto_consumo   = :PAI
                            and h.origem            = :AVO
                            and h.nivel             = :I
                            and h.genealogia        = :GENEALOGIA
                            and h.flag_tamanho      = :OLD_TAMANHO
                            ;
                       --*/
                    end
                end
    
                update tmpcusto_produto h
                set h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                    h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                    h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                    h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
        
                    h.custo  = h.custo_medio,
                    h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                    where   h.ano               = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.nivel             > -1;
            --///////////////////////////////////////////////////////////////////////////////////////////
            end
    
          i=i-1;
        END
    
    end
        --retorna o resultado do tratamento
        for
            select
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                C,
                T,
                CS,
                CO,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CONSUMO,
                FLAG_TAMANHO,
                GENEALOGIA,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                FAMILIA_ID,
                MODELO_ID,
                COR_ID,
                ICMS,
                PERC_ICMS,
                DEFEITOS,
                PRODUZIDO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
            and k.nivel = -1
        into
            :ANO,
            :MES,
            :NIVEL,
            :PRODUTO_DESCRICAO,
            :PRODUTO_CONSUMO,
            :TAMANHO_CONSUMO,
            :ORIGEM,
            :TS,
            :"TO",
            :CMS,
            :CMO,
            :CMOIP,
            :CMOIA,
            :CSMOIP,
            :CSMOIA,
            :PERDA,
            :C,
            :T,
            :CS,
            :CO,
            :CUSTO_MEDIO,
            :FATOR_CONVERSAO,
            :TAMANHO,
            :CUSTO_MINUTO,
            :MOI_PROPRIO,
            :MOI_ABSORVIDO,
            :COIP,
            :COIA,
            :CSIP,
            :CSIA,
            :CONSUMO,
            :FLAG_TAMANHO,
            :H_ORIGEM,
            :DATA,
            :CUSTO,
            :DOLAR,
            :VMARGEM,
            :familia_ID,
            :modelo_ID,
            :cor_ID,
            :ICMS,
            :PERC_ICMS,
            :DEFEITOS,
            :PRODUZIDO
        do begin
            suspend;
        end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REPLICAR_REFEICAO (
    REFEICAO_ID integer,
    TIPO_ID integer)
returns (
    ID_NOVA integer)
as
begin

  ID_NOVA = gen_id(gtbrefeitorio_refeicao,1);

  insert into TBREFEITORIO_REFEICAO  (
    ID,
    DATA_REFEICAO,
    DATA_RESERVA,
    TIPO_ID,
    REFEICAO1_ID,
    REFEICAO2_ID,
    RESERVA1_ID,
    RESERVA2_ID,
    LIVRE,
    TURNO,
    QTD_LIVRE,
    ALTERNATIVO1_ID,
    ALTERNATIVO2_ID,
    ESPECIAL1_ID,
    ESPECIAL2_ID

  )
  select
    :ID_NOVA as ID,
    DATA_REFEICAO,
    DATA_RESERVA,
    :TIPO_ID as TIPO_ID,
    REFEICAO1_ID,
    REFEICAO2_ID,
    RESERVA1_ID,
    RESERVA2_ID,
    LIVRE,
    :TIPO_ID as turno,
    QTD_LIVRE,
    r.alternativo1_id,
    r.ALTERNATIVO2_ID,
    r.ESPECIAL1_ID,
    r.ESPECIAL2_ID
  from TBREFEITORIO_REFEICAO r where r.id = :REFEICAO_ID;

  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcalendario_evento_b02u for tbcalendario_evento
active before update position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.TITULO <> OLD.TITULO) THEN
    BEGIN
        HISTORICO = HISTORICO||' TITULO:'||OLD.TITULO||' -> '||NEW.TITULO;
    END

   IF ( NEW."LOCAL" <> OLD."LOCAL") THEN
    BEGIN
        HISTORICO = HISTORICO||' LOCAL:'||OLD."LOCAL"||' -> '||NEW."LOCAL";
    END

    IF ( NEW.PRIORIDADE <> OLD.PRIORIDADE) THEN
    BEGIN
        HISTORICO = HISTORICO||' PRIORIDADE:'||OLD.PRIORIDADE||' -> '||NEW.PRIORIDADE;
    END

    IF ( NEW.INICIO <> OLD.INICIO) THEN
    BEGIN
        HISTORICO = HISTORICO||' INICIO:'||FORMATDATETIME(OLD.INICIO)||' -> '||FORMATDATETIME(NEW.INICIO);
    END

    IF ( NEW.FIM <> OLD.FIM) THEN
    BEGIN
        HISTORICO = HISTORICO||' FIM:'||FORMATDATETIME(OLD.FIM)||' -> '||FORMATDATETIME(NEW.FIM);
    END

    IF ( NEW.TIPO <> OLD.TIPO) THEN
    BEGIN
        HISTORICO = HISTORICO||' TIPO:'||OLD.TIPO||' -> '||NEW.TIPO;
    END

    IF ( NEW.PRIVACIDADE <> OLD.PRIVACIDADE) THEN
    BEGIN
        HISTORICO = HISTORICO||' PRIVACIDADE:'||OLD.PRIVACIDADE||' -> '||NEW.PRIVACIDADE;
    END

    IF ( NEW.CONFIRMAR <> OLD.CONFIRMAR) THEN
    BEGIN
        HISTORICO = HISTORICO||' CONFIRMAR:'||OLD.CONFIRMAR||' -> '||NEW.CONFIRMAR;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        --EXCEPTION "..." HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',NEW.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbveiculo_viagem_b0u1 for tbveiculo_viagem
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.VEICULO_ID <> NEW.VEICULO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||'VEIC: '|| OLD.VEICULO_ID||'->'||NEW.VEICULO_ID;
    END

    IF ( OLD.MOTORISTA_ID <> NEW.MOTORISTA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' COND: '|| OLD.MOTORISTA_ID||'->'||NEW.MOTORISTA_ID;
    END

    IF ( OLD."LOCAL" <> NEW."LOCAL") THEN
    BEGIN
        HISTORICO = HISTORICO||' LOC: '|| OLD."LOCAL"||'->'||NEW."LOCAL";
    END

    IF ( OLD.DESTINO <> NEW.DESTINO) THEN
    BEGIN
        HISTORICO = HISTORICO||' DEST: '|| OLD.DESTINO||'->'||NEW.DESTINO;
    END

    IF ( OLD.DATAHORA_SAIDA <> NEW.DATAHORA_SAIDA) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.SAI: '|| FORMATDATETIME(OLD.DATAHORA_SAIDA)||'->'||FORMATDATETIME(NEW.DATAHORA_SAIDA);
    END

    IF ( OLD.DATAHORA_CHEGADA <> NEW.DATAHORA_CHEGADA) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.CHEG: '|| FORMATDATETIME(OLD.DATAHORA_CHEGADA)||'->'||FORMATDATETIME(NEW.DATAHORA_CHEGADA);
    END

    IF ( OLD.QUILOMETRAGEM_SAIDA <> NEW.QUILOMETRAGEM_SAIDA) THEN
    BEGIN
        HISTORICO = HISTORICO||' KM.SAI: '|| OLD.QUILOMETRAGEM_SAIDA||'->'||NEW.QUILOMETRAGEM_SAIDA;
    END

    IF ( OLD.QUILOMETRAGEM_CHEGADA <> NEW.QUILOMETRAGEM_CHEGADA) THEN
    BEGIN
        HISTORICO = HISTORICO||' KM.CHEG: '|| OLD.QUILOMETRAGEM_CHEGADA||'->'||NEW.QUILOMETRAGEM_CHEGADA;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBVEICULO_VIAGEM',NEW.ID,HISTORICO);
    END
end
^

SET TERM ; ^

