CREATE OR ALTER trigger ttboc_b9u for tboc
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER procedure spu_reposicao_estoque_auto (
    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),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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 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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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

end;

CREATE OR ALTER procedure spu_reposicao_estoque_kamban (
    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),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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 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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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

end;

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

end;

CREATE OR ALTER procedure spu_reposicao_estoque_v2 (
    estabelecimento_1 integer)
returns (
    produto_id integer,
    produto_descricao varchar(400),
    localizacao_id integer,
    estoque numeric(18,4),
    comprado numeric(18,4),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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,
    familia varchar(100))
as
declare variable voc integer;
declare variable vseq integer;
declare variable vcontrole integer;
declare variable vfornecedor integer;
declare variable voperacao varchar(30);
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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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);
declare variable xfamilia varchar(100);
declare variable xfamilia_codigo integer;
BEGIN

end;

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

end;

CREATE OR ALTER trigger ttboc_b0u_01 for tboc
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin

end;

ALTER TABLE TBOC ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBOC set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBOC DROP CLASSIFICACAO;
ALTER TABLE TBOC ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBOC set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBOC DROP OLD_PERFIL;

CREATE OR ALTER trigger ttboc_b0u_01 for tboc
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin

	For
	Select 
	(Select First 1 A.DataInicial   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 7),
	(Select First 1 A.DataFINAL     From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 7),
	Coalesce((Select First 1 A.MODULO_CODIGO From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 7),0),

	extract(day from OLD.DATA)||'/'||extract(month from OLD.DATA)||'/'||extract(year from OLD.DATA),
	extract(day from NEW.DATA)||'/'||extract(month from NEW.DATA)||'/'||extract(year from NEW.DATA),
	(Select First 1 extract(day from A.DataInicial)||'/'||extract(month from A.DataInicial)||'/'||extract(year from A.DataInicial)
					||' A '||extract(day from A.DataFINAL)||'/'||extract(month from A.DataFINAL)||'/'||extract(year from A.DataFINAL)
	   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 7)

	FROM RDB$DATABASE

	Into :DataInicial,:DataFinal,:MODULO_CODIGO,:DATA1,:DATA2,:DATA3
	Do
	begin

	  if (:MODULO_CODIGO = 0) Then Exception "..." 'MÓDULO DE ORDENS DE COMPRA[7] NÃO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||OLD.ESTABELECIMENTO_CODIGO||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
	  if (OLD.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE ORDENS DE COMPRA[7]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
	  if (OLD.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE ORDENS DE COMPRA[7]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
	  if (NEW.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE ORDENS DE COMPRA[7]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
	  if (NEW.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE ORDENS DE COMPRA[7]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

	end

End;

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 between '01.01.2015' 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_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);
       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,

           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) 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,
          (Select First 1 Cast((lpad(F.Transportadora_Codigo,5,'0')||
                                lpad(F.Pagamento_Condicao,4,'0')||
                                lpad(F.Pagamento_Forma,4,'0')||
                                     F.RazaoSocial) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id) 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

    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,
           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,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;
                Suspend;

          End
      End 

End;


CREATE OR ALTER procedure spu_reposicao_estoque_v2 (
    estabelecimento_1 integer)
returns (
    produto_id integer,
    produto_descricao varchar(400),
    localizacao_id integer,
    estoque numeric(18,4),
    comprado numeric(18,4),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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,
    familia varchar(100))
as
declare variable voc integer;
declare variable vseq integer;
declare variable vcontrole integer;
declare variable vfornecedor integer;
declare variable voperacao varchar(30);
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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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);
declare variable xfamilia varchar(100);
declare variable xfamilia_codigo integer;
BEGIN

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

  For

    Select y.Familia_Codigo, lpad(y.Familia_Codigo,4,0)||' - '||f.descricao as FAMILIA,
           Y.PRODUTO_ID,Y.PRODUTO_DESCRICAO,Y.LOCALIZACAO_ID,Y.ESTOQUE,Y.COMPRADO,
           Y.DISPONIVEL1, Y.EST_MIN, Y.EST_MAX, 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,

           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),
             Coalesce((Select First 1 PF.custo_unitario From TbProduto_EDI PF Where PF.produto_codigo = Y.Produto_Id and PF.empresa_codigo = Y.Fornecedor_Id),0.0000)
            ) Valor

    From (
    Select Familia_Codigo, W.PRODUTO_ID,W.PRODUTO_DESCRICAO,W.LOCALIZACAO_ID,W.ESTOQUE,W.COMPRADO,
           W.DISPONIVEL1, W.EST_MIN, W.EST_MAX, 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,
          (Select First 1 Cast((lpad(F.Transportadora_Codigo,5,'0')||
                                lpad(F.Pagamento_Condicao,4,'0')||
                                lpad(F.Pagamento_Forma,4,'0')||
                                     F.RazaoSocial) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id) Fornecedor_Dados

    From (
    Select Familia_Codigo, Z.PRODUTO_ID,Z.PRODUTO_DESCRICAO,Z.LOCALIZACAO_ID,Z.ESTOQUE,Z.COMPRADO,
           Z.DISPONIVEL1,Z.EST_MIN,Z.EST_MAX, 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 Familia_Codigo, V.PRODUTO_ID,V.PRODUTO_DESCRICAO,V.LOCALIZACAO_ID,V.ESTOQUE,V.COMPRADO,V.DISPONIVEL1,
    V.EST_MIN,V.EST_MAX, 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.Familia_Codigo, X.Produto_Id, X.Produto_Descricao,X.LOCALIZACAO_ID,
           X.ESTOQUE,X.COMPRADO,
           X.ESTOQUE + X.COMPRADO DISPONIVEL1,
           X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX,
           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.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), 0) NEC_COMPRA
    From (
    Select  P.Familia_Codigo, P.Codigo Produto_Id, P.Descricao Produto_Descricao, B.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.SALDO+S.Saldo_EmTerceiro)
      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 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(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

    From TbProduto P , TbEstoque_Minimo B, tblocalizacao l
    Where B.Estabelecimento_Codigo = :Estabelecimento_1
      and B.PRODUTO_Codigo = P.Codigo
      and P.Familia_Codigo <> 39
      and P.Status = '1'
      and P.Grade_Codigo = 0
      and B.QUANTIDADE > 0
      and P.Gerar_Oc = '1'
      and b.habilita_kanban = '0'
      and l.codigo = b.localizacao_codigo
      and l.wip = 0
    
    ) X
    ) V Where V.NEC_COMPRA > 0
    ) Z Order By Z.FORNECEDOR
    ) W
    ) Y, tbfamilia f
    where f.codigo = y.Familia_Codigo

  Into  :XFAMILIA_CODIGO, :XFAMILIA, :xPRODUTO_ID, :xPRODUTO_DESCRICAO, :xLOCALIZACAO_ID, :xESTOQUE, :xCOMPRADO,
        :xDISPONIVEL1, :xEST_MIN, :xEST_MAX, :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 O
                        WHERE O.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          AND O.FAMILIA_CODIGO = :XFAMILIA_CODIGO
                          AND O.FORNECEDOR_CODIGO = :xFORNECEDOR_ID
                          AND O.STATUS = '0'
                          AND O.FLAG = '1'
                          AND O.DATA >= (SELECT C.DATAINICIAL FROM TBCONFIGURACAO_PERIODO C WHERE C.MODULO_CODIGO = 7 AND C.ESTABELECIMENTO_CODIGO = O.ESTABELECIMENTO_CODIGO)
                          AND O.DATA <= (SELECT C.DATAFINAL FROM TBCONFIGURACAO_PERIODO C WHERE C.MODULO_CODIGO = 7 AND C.ESTABELECIMENTO_CODIGO = O.ESTABELECIMENTO_CODIGO);

                        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,:XFAMILIA_CODIGO,'','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

                FAMILIA    = :xfamilia;
                produto_id = :Xproduto_id ;
                produto_descricao = :Xproduto_descricao ;
                localizacao_id = :Xlocalizacao_id ;
                estoque = :Xestoque ;
                comprado = :Xcomprado ;
                disponivel1 = :Xdisponivel1 ;
                est_min = :Xest_min ;
                est_max = :Xest_max ;
                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;

                -- Alterado por anderson em 18/04/2018 as 14:00 para processar todas as familias

                Suspend;

          End
      End 

End;


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 between '01.01.2015' 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_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);
       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,

           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) 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,
          (Select First 1 Cast((lpad(F.Transportadora_Codigo,5,'0')||
                                lpad(F.Pagamento_Condicao,4,'0')||
                                lpad(F.Pagamento_Forma,4,'0')||
                                     F.RazaoSocial) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id) 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

    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;

                Suspend;

          End
      End 

End;

CREATE OR ALTER procedure spu_reposicao_estoque_kamban (
    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),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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 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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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;

  For

    Select Y.PRODUTO_ID,Y.PRODUTO_DESCRICAO,Y.LOCALIZACAO_ID,Y.ESTOQUE,Y.COMPRADO,
           Y.DISPONIVEL1, Y.EST_MIN, Y.EST_MAX, 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,

           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) Valor

    From (
    Select W.PRODUTO_ID,W.PRODUTO_DESCRICAO,W.LOCALIZACAO_ID,W.ESTOQUE,W.COMPRADO,
           W.DISPONIVEL1, W.EST_MIN, W.EST_MAX, 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,
          (Select First 1 Cast((lpad(F.Transportadora_Codigo,5,'0')||
                                lpad(F.Pagamento_Condicao,4,'0')||
                                lpad(F.Pagamento_Forma,4,'0')||
                                     F.RazaoSocial) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id) Fornecedor_Dados

    From (
    Select Z.PRODUTO_ID,Z.PRODUTO_DESCRICAO,Z.LOCALIZACAO_ID,Z.ESTOQUE,Z.COMPRADO,
           Z.DISPONIVEL1,Z.EST_MIN,Z.EST_MAX, 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.DISPONIVEL1,
    V.EST_MIN,V.EST_MAX, 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.ESTOQUE + X.COMPRADO DISPONIVEL1,
           X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX,
           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.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), 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.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 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(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

    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,
        :xDISPONIVEL1, :xEST_MIN, :xEST_MAX, :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 NÃƒÆ’Ã†â€™O 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 ;
                disponivel1 = :Xdisponivel1 ;
                est_min = :Xest_min ;
                est_max = :Xest_max ;
                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;

                Suspend;

          End
      End 

End;


CREATE OR ALTER procedure spu_reposicao_estoque_auto (
    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),
    disponivel1 numeric(18,4),
    est_min numeric(18,4),
    est_max 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 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 xdisponivel1 numeric(18,4);
declare variable xest_min numeric(18,4);
declare variable xest_max 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;

  For

    Select Y.PRODUTO_ID,Y.PRODUTO_DESCRICAO,Y.LOCALIZACAO_ID,Y.ESTOQUE,Y.COMPRADO,
           Y.DISPONIVEL1, Y.EST_MIN, Y.EST_MAX, 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,

           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),
             Coalesce((Select First 1 PF.custo_unitario From TbProduto_EDI PF Where PF.produto_codigo = Y.Produto_Id and PF.empresa_codigo = Y.Fornecedor_Id),0.0000)
            ) Valor

    From (
    Select W.PRODUTO_ID,W.PRODUTO_DESCRICAO,W.LOCALIZACAO_ID,W.ESTOQUE,W.COMPRADO,
           W.DISPONIVEL1, W.EST_MIN, W.EST_MAX, 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,
          (Select First 1 Cast((lpad(F.Transportadora_Codigo,5,'0')||
                                lpad(F.Pagamento_Condicao,4,'0')||
                                lpad(F.Pagamento_Forma,4,'0')||
                                     F.RazaoSocial) as Varchar(70))
             From TbFornecedor F Where F.Codigo = W.Fornecedor_Id) Fornecedor_Dados

    From (
    Select Z.PRODUTO_ID,Z.PRODUTO_DESCRICAO,Z.LOCALIZACAO_ID,Z.ESTOQUE,Z.COMPRADO,
           Z.DISPONIVEL1,Z.EST_MIN,Z.EST_MAX, 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.DISPONIVEL1,
    V.EST_MIN,V.EST_MAX, 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.ESTOQUE + X.COMPRADO DISPONIVEL1,
           X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX,
           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.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), 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.SALDO+S.Saldo_EmTerceiro)
      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 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(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

    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 P.Gerar_Oc = '1'
      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,
        :xDISPONIVEL1, :xEST_MIN, :xEST_MAX, :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
                        vSeq = 0;
                        vFornecedor = :xFornecedor_Id;
                       
                        vOC = (Select gen_id(GTBOC,1) FROM RDB$DATABASE);
                        --EXCLUI AS OC's ANTIGAS QUE NAO FORAM AUTORIZADAS
                        DELETE FROM TBOC O
                        WHERE O.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          AND O.FAMILIA_CODIGO = :FAMILIA_1
                          AND O.FORNECEDOR_CODIGO = :xFORNECEDOR_ID
                          AND O.STATUS = '0'
                          AND O.FLAG = '1'
                          AND O.DATA >= (SELECT C.DATAINICIAL FROM TBCONFIGURACAO_PERIODO C WHERE C.MODULO_CODIGO = 7 AND C.ESTABELECIMENTO_CODIGO = O.ESTABELECIMENTO_CODIGO)
                          AND O.DATA <= (SELECT C.DATAFINAL FROM TBCONFIGURACAO_PERIODO C WHERE C.MODULO_CODIGO = 7 AND C.ESTABELECIMENTO_CODIGO = O.ESTABELECIMENTO_CODIGO);

                        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) 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 ;
                disponivel1 = :Xdisponivel1 ;
                est_min = :Xest_min ;
                est_max = :Xest_max ;
                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;

                Suspend;

          End
      End 

End;


CREATE OR ALTER trigger ttboc_b9u for tboc
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO) then
       BEGIN
       HISTORICO = HISTORICO||' Estab.'||OLD.ESTABELECIMENTO_CODIGO||'->'||NEW.ESTABELECIMENTO_CODIGO;
       END
   if (OLD.FORNECEDOR_CODIGO <> NEW.FORNECEDOR_CODIGO) then
       BEGIN
       HISTORICO = HISTORICO||' Forn.'||OLD.FORNECEDOR_CODIGO||'->'||NEW.FORNECEDOR_CODIGO;
       END
   if (OLD.Data <> NEW.Data) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Emiss.'||OLD.Data||'->'||NEW.Data;
       END
   if (OLD.Frete<> NEW.Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Frete.'||OLD.Frete||'->'||NEW.Frete;
       END
   if (OLD.Pagamento_Forma<> NEW.Pagamento_Forma) then
       BEGIN
       HISTORICO = HISTORICO||' Form.Pg.'||OLD.Pagamento_Forma||'->'||NEW.Pagamento_Forma;
       END
   if (OLD.Pagamento_Condicao<> NEW.Pagamento_Condicao) then
       BEGIN
       HISTORICO = HISTORICO||' Cond.Pg.'||OLD.Pagamento_Condicao||'->'||NEW.Pagamento_Condicao;
       END
   if (OLD.Transportadora_Codigo<> NEW.Transportadora_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Transp.'||OLD.Transportadora_Codigo||'->'||NEW.Transportadora_Codigo;
       END
   if (OLD.Valor_Frete <> NEW.Valor_Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Vr.Frt.'||OLD.Valor_Frete||'->'||NEW.Valor_Frete;
       END
   if (OLD.AUTORIZACAO <> NEW.AUTORIZACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Autor.'||OLD.AUTORIZACAO||'->'||NEW.AUTORIZACAO;
       END
   if (OLD.CLASSIFICACAO <> NEW.CLASSIFICACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Perfil '||OLD.CLASSIFICACAO||'->'||NEW.CLASSIFICACAO;
       END

   if (OLD.FLAG <> NEW.FLAG) then
       BEGIN
       HISTORICO = HISTORICO||' Flag '||OLD.FLAG||'->'||NEW.FLAG;
       END
   if (OLD.NIVEL_OC <> NEW.NIVEL_OC) then
       BEGIN
       HISTORICO = HISTORICO||' Nível Aut.'||OLD.NIVEL_OC||'->'||NEW.NIVEL_OC;
       END
   if (OLD.OC_ENVIADA <> NEW.OC_ENVIADA) then
       BEGIN
       HISTORICO = HISTORICO||' Env.'||OLD.OC_ENVIADA||'->'||NEW.OC_ENVIADA;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (OLD.Observacao<> NEW.Observacao) then
       BEGIN
       HISTORICO = HISTORICO||' Observ.'||OLD.Observacao||'->'||NEW.Observacao;
       END
   if (OLD.Observacao_Interna<> NEW.Observacao_Interna) then
       BEGIN
       HISTORICO = HISTORICO||' Obs.Int.'||OLD.Observacao_Interna||'->'||NEW.Observacao_Interna;
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBOC', OLD.OC,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
end;

