                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;

CREATE OR ALTER trigger ttbpedido_item_b0u_03 for tbpedido_item
inactive before update position 0
AS
BEGIN
 
    if (old.Sequencia <> new.Sequencia or
        old.Produto_Codigo <> new.Produto_Codigo or
        old.Modelo_Codigo <> new.Modelo_Codigo or
        old.Cor_Id <> new.Cor_Id or
        old.Tamanho <> new.Tamanho or
        old.Perfil <> new.Perfil or
        old.Valor <> new.Valor or
        old.SITUACAO <> new.SITUACAO or
        old.Quantidade <> new.Quantidade or
        old.QTD_EST <> new.QTD_EST or
        old.QTD_REM <> new.QTD_REM or
        old.DATA_CLIENTE <> new.DATA_CLIENTE or
        old.DATA_PRODUCAO <> new.DATA_PRODUCAO or
        old.PEDIDO <> new.PEDIDO or
        old.CONTROLE <> new.CONTROLE) then
        begin
         new.SALESFORCE = '0';
         if (old.PEDIDO <> new.PEDIDO) then
              begin
                insert into TBREGISTRO_EXCLUIDO (ID, ID1, ID2, TABELA) values(gen_id(GTBREGISTRO_EXCLUIDO,1), old.PEDIDO, old.SEQUENCIA, 'TBPEDIDO_ITEM');
              end
        end

    if (old.SALESFORCE = '0' and new.SALESFORCE = '1') then
        begin
            insert into TBHISTORICO_SALESFORCE (TABELA, ID1, ID2) values ('TBPEDIDO_ITEM', old.PEDIDO, old.SEQUENCIA);
        end
    
END;

DROP INDEX ITBPEDIDO_10;

CREATE OR ALTER trigger ttbpedido_b0ui_02dlf for tbpedido
active before insert or update position 0
AS
Begin

end;

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

end;

CREATE OR ALTER procedure spc_email_pedidos_atrasados 
returns (
    html blob sub_type 0 segment size 80,
    email varchar(200),
    old_representante_email varchar(300))
as
declare variable corpo1 varchar(8150);
declare variable corpo2 varchar(8150);
declare variable tabela varchar(8150);
declare variable tabela2 varchar(8150);
declare variable tabela3 varchar(8150);
declare variable representante varchar(200);
declare variable cliente varchar(200);
declare variable pedido integer;
declare variable data varchar(20);
declare variable data_cliente varchar(20);
declare variable dias_atraso integer;
declare variable quantidade integer;
declare variable saldo_a_faturar integer;
declare variable percent numeric(15,2);
declare variable representante_id integer;
declare variable cont_linhas integer;
declare variable disponivel integer;
declare variable perc_disponivel numeric(15,2);
declare variable representante_email varchar(300);
declare variable old_representante_id integer;
declare variable html_geral blob sub_type 0 segment size 80;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_remessa5 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;


CREATE OR ALTER procedure spu_trata_pedido_remessa6 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;

CREATE OR ALTER procedure spu_trata_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN

end;

CREATE OR ALTER trigger ttbpedido_b0u_01 for tbpedido
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 TBPEDIDO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBPEDIDO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBPEDIDO DROP CLASSIFICACAO;
ALTER TABLE TBPEDIDO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBPEDIDO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBPEDIDO DROP OLD_PERFIL;

CREATE INDEX ITBPEDIDO_10 ON TBPEDIDO (CLASSIFICACAO);
SET STATISTICS INDEX ITBPEDIDO_10;

CREATE OR ALTER trigger ttbpedido_b0u_01 for tbpedido
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
  if (old.SALESFORCE = new.SALESFORCE) Then
      Begin
        For
        Select 
        (Select First 1 A.DataInicial   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),
        (Select First 1 A.DataFINAL     From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),
        Coalesce((Select First 1 A.MODULO_CODIGO From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),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 = 8)
        
        FROM RDB$DATABASE
        
        Into :DataInicial,:DataFinal,:MODULO_CODIGO,:DATA1,:DATA2,:DATA3
        Do
        begin
          if (:MODULO_CODIGO = 0) Then Exception "..." 'MÓDULO DE PEDIDOS[8] NÃO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||OLD.ESTABELECIMENTO_CODIGO||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        end
    End
End;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
    
FOR
Select First 1 A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--               Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                          Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,

               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido
                            and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :qtd_mult, :aloc_mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
           vQtd_Prd = Trunc(:Qtd_Prd);

           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data
                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                       Begin
    
                        if (:Id > 0) then
                            Begin
    
                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
            
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then -- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then 
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                           End
                        End
                   End
           End
     End
End;

CREATE OR ALTER procedure spu_trata_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
FOR 
Select First 1 A.Estabelecimento_Codigo, A.Pedido, a.modelo_codigo, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho,
               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,
               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock
Into :Estabelecimento_Id, :Pedido, :modelo_codigo, :Controle,
     :Produto_Id, :Localizacao_Id, :Tamanho, :Rem_Status, :Qtd_Prd, :Qtd_Mult, :aloc_mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
            IF(:Qtd_Mult = 0)THEN
            BEGIN
               exception "..." 'Modelo '||:modelo_codigo||' sem cota definida no tamanho '||:Tamanho;
            END
            
           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                            vQtd_Disp = Qtd_Disp;
        
                            if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                Begin
                                 :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                End
        
                            IF (:vQtd_Prd <= :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
        
                                Delete From TbPedido_Consumo
                                Where Estabelecimento_Id = :Estabelecimento_Id
                                  and Pedido_Id = :Pedido
                                  and Pedido_Item_Id = :Controle
                                  and Tamanho_Item = :Tamanho
                                  and Tipo = 'C';
        
                               End else
                            IF (:vQtd_Prd > :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :vQtd_Disp);
        
                                Delete From TbPedido_Consumo
                                Where Estabelecimento_Id = :Estabelecimento_Id
                                  and Pedido_Id = :Pedido
                                  and Pedido_Item_Id = :Controle
                                  and Tamanho_Item = :Tamanho
                                  and Tipo = 'C';
                               End
                
                            End
                          End
                    End
           End
     End
End;


CREATE OR ALTER procedure spu_trata_pedido_remessa6 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;


CREATE OR ALTER procedure spu_trata_pedido_remessa5 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;

CREATE OR ALTER procedure spu_trata_pedido_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle,
       A.Produto_Codigo, A.Localizacao_Id, A.Tamanho,
       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,
       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock
Into :Estabelecimento_Id, :Pedido, :Controle,
     :Produto_Id, :Localizacao_Id, :Tamanho, :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
           vQtd_Prd = :Qtd_Prd;

           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                                vQtd_Disp = :Qtd_Disp;

                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                IF (:vQtd_Prd <= :vQtd_Disp and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
            
                                    Delete From TbPedido_Consumo
                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                      and Pedido_Id = :Pedido
                                      and Pedido_Item_Id = :Controle
                                      and Tamanho_Item = :Tamanho
                                      and Tipo = 'C';
            
                                   End else
                                IF (:vQtd_Prd > :vQtd_Disp and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :vQtd_Disp);
            
                                    Delete From TbPedido_Consumo
                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                      and Pedido_Id = :Pedido
                                      and Pedido_Item_Id = :Controle
                                      and Tamanho_Item = :Tamanho
                                      and Tipo = 'C';
                                   End

                               End
                         End
                    End
           End
     End
End;

CREATE OR ALTER procedure spc_email_pedidos_atrasados 
returns (
    html blob sub_type 0 segment size 80,
    email varchar(200),
    old_representante_email varchar(300))
as
declare variable corpo1 varchar(8150);
declare variable corpo2 varchar(8150);
declare variable tabela varchar(8150);
declare variable tabela2 varchar(8150);
declare variable tabela3 varchar(8150);
declare variable representante varchar(200);
declare variable cliente varchar(200);
declare variable pedido integer;
declare variable data varchar(20);
declare variable data_cliente varchar(20);
declare variable dias_atraso integer;
declare variable quantidade integer;
declare variable saldo_a_faturar integer;
declare variable percent numeric(15,2);
declare variable representante_id integer;
declare variable cont_linhas integer;
declare variable disponivel integer;
declare variable perc_disponivel numeric(15,2);
declare variable representante_email varchar(300);
declare variable old_representante_id integer;
declare variable html_geral blob sub_type 0 segment size 80;
BEGIN

    tabela =  '<table class="tbl"><thead><tr>'||
                '<th class="col-0">Representante</th>'||
                '<th class="col-1">Cliente</th>'||
                '<th class="col-2">Pedido</th>'||
                '<th class="col-3">Data Pedido</th>'||
                '<th class="col-4">Data Cliente</th>'||
                '<th class="col-5">Dias Atraso</th>'||
                '<th class="col-6">Quantidade</th>'||
                '<th class="col-7">Saldo a Faturar</th>'||
                '<th class="col-8">% a Faturar</th>'||
                '<th class="col-9">Disponível</th>'||
                '<th class="col-10">% Disponível</th>'||
              '</tr></thead>';

    tabela2 = '';
    tabela3 = '';
    CONT_LINHAS = 0;
    HTML_GERAL  = '';

    corpo1 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 11));
    corpo2 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 10));

    OLD_REPRESENTANTE_ID = 0;

    EMAIL  = 'comercial2@delfa.com.br,haroldo@delfa.com.br';
    --EMAIL  = 'anderson@delfa.com.br';

        FOR
    
            select
                REPRESENTANTE_ID,
                REPRESENTANTE_EMAIL,
                REPRESENTANTE,
                CLIENTE,
                PEDIDO,
                formatdate(DATA) as DATA,
                formatdate(DATA_CLIENTE) as DATA_CLIENTE,
                DIAS_ATRASO,
                QUANTIDADE,
                SALDO_A_FATURAR,
                PERCENT,
                DISPONIVEL,
                PERC_DISPONIVEL
            from(
                Select
                    codigo as REPRESENTANTE_ID,
                    EMAIL as REPRESENTANTE_EMAIL,
                    REPRESENTANTE,
                    CLIENTE,
                    PEDIDO,
                    DATA,
                    DATA_CLIENTE,
                    datediff(day,data_cliente, CURRENT_DATE ) DIAS_ATRASO,
                    SUM(QUANTIDADE) QUANTIDADE,
                    SUM(SALDO) SALDO_A_FATURAR,
                    CAST(SUM(SALDO) / SUM(QUANTIDADE) * 100.00 AS NUMERIC(15,2)) AS PERCENT,
                    SUM(DISPONIVEL) DISPONIVEL,
                    CAST(SUM(DISPONIVEL) / SUM(SALDO) * 100.00 AS NUMERIC(15,2)) AS PERC_DISPONIVEL
                
                From (
                Select R.codigo,
                       r.email,
                       R.NomeFantasia||' ('||R.UF||')' REPRESENTANTE,
                       E.NomeFantasia||' ('||E.UF||')' CLIENTE,
                       PI.Pedido, P.Data, P.Data_Cliente,
                       PI.Quantidade, PI.Valor,
                       PI.Qtd_est   Disponivel,
                       S.quantidade Saldo,
                       PI.Valor * S.quantidade VALOR_A_FATURAR 
                
                  From TbPedido_Item PI, TbPedido P, TBProduto PD, TBEmpresa E, tbpedido_item_saldo S, TbEmpresa R
                 Where P.Pedido = PI.Pedido
                   and PI.controle = S.pedido_item_controle
                   and R.Codigo = P.Representante_Codigo
                   and PI.Produto_Codigo = PD.Codigo
                   and P.Cliente_Codigo = E.Codigo
                   and (P.Data_Cliente = CURRENT_DATE - 1 or P.Data_Cliente = CURRENT_DATE - 3)
                   and P.Classificacao = ' '
                   and P.Status = '1'
                   and P.Situacao = 1
                   and PI.Situacao = 1
                )
                GROUP BY 1,2,3,4,5,6,7
            )
    
        INTO
            :REPRESENTANTE_ID,
            :REPRESENTANTE_EMAIL,
            :REPRESENTANTE,
            :CLIENTE,
            :PEDIDO,
            :DATA,
            :DATA_CLIENTE,
            :DIAS_ATRASO,
            :QUANTIDADE,
            :SALDO_A_FATURAR,
            :PERCENT,
            :DISPONIVEL,
            :PERC_DISPONIVEL
        DO
        BEGIN


                if((:OLD_REPRESENTANTE_ID <> :REPRESENTANTE_ID) and :OLD_REPRESENTANTE_ID > 0)then
                begin
                     html = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
                     HTML_GERAL = HTML_GERAL || coalesce(coalesce(:tabela2,'')||coalesce(:tabela3,''),'');
                     suspend;
            
                     if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and CONT_LINHAS > 0) then
                     begin
                        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
                        VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
                     end

                    :tabela2     = '';
                    :tabela3     = '';
                    :CONT_LINHAS = 0;
                end

                :OLD_REPRESENTANTE_ID    = :REPRESENTANTE_ID;
                :OLD_REPRESENTANTE_EMAIL = :REPRESENTANTE_EMAIL;
                
                CONT_LINHAS = CONT_LINHAS + 1;

                if (CHAR_LENGTH (tabela2) < 6000) then
                begin
                    tabela2 =  tabela2||'<tr class="--">';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela2 =  tabela2||'</tr>';
                end else
                begin
                    tabela3 =  tabela3||'<tr class="--">';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela3 =  tabela3||'</tr>';
                end

         END

         html       = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
         HTML_GERAL = coalesce(:tabela,'')|| HTML_GERAL || coalesce(coalesce(:tabela2,'')||coalesce(:tabela3,''),'');
         suspend;

         if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and CONT_LINHAS > 0) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
         end

         if((CHAR_LENGTH(:EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 )) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:HTML_GERAL,'')||:corpo2);
         end

END;



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

   HISTORICO = '';

   if (OLD.Cliente_Codigo <> NEW.Cliente_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Cliente:'||OLD.Cliente_Codigo||'->'||NEW.Cliente_Codigo;
       END
   if (OLD.Cliente_Id_Amostra <> NEW.Cliente_Id_Amostra) then
       BEGIN
       HISTORICO = HISTORICO||' Cli.Amostra:'||OLD.Cliente_Id_Amostra||'->'||NEW.Cliente_Id_Amostra;
       END
   if (OLD.Data <> NEW.Data) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Emiss.'||OLD.Data||'->'||NEW.Data;
       END
   if (OLD.Data_Cliente <> NEW.Data_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Cli.'||OLD.Data_Cliente||'->'||NEW.Data_Cliente;
       END
   if (OLD.Programado<> NEW.Programado) then
       BEGIN
       HISTORICO = HISTORICO||' Prog.'||OLD.Programado||'->'||NEW.Programado;
       END
   if (OLD.Data_Entrega <> NEW.Data_Entrega) then
       BEGIN
       HISTORICO = HISTORICO||' Prev.Fat.'||OLD.Data_Entrega||'->'||NEW.Data_Entrega;
       END
   if (OLD.Pedido_Cliente <> NEW.Pedido_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Ped.Cli.'||OLD.Pedido_Cliente||'->'||NEW.Pedido_Cliente;
       END
   if (OLD.Transportadora_Codigo<> NEW.Transportadora_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Transp.'||OLD.Transportadora_Codigo||'->'||NEW.Transportadora_Codigo;
       END
   if (OLD.Prioridade<> NEW.Prioridade) then
       BEGIN
       HISTORICO = HISTORICO||' Prior.'||OLD.Prioridade||'->'||NEW.Prioridade;
       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.Valor_Frete <> NEW.Valor_Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Vr.Frt.'||OLD.Valor_Frete||'->'||NEW.Valor_Frete;
       END
   if (OLD.Peso <> NEW.Peso) then
       BEGIN
       HISTORICO = HISTORICO||' Peso:'||OLD.Peso||'->'||NEW.Peso;
       END
   if (OLD.Tipo_Pedido <> NEW.Tipo_Pedido) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Ped.'||OLD.Tipo_Pedido||'->'||NEW.Tipo_Pedido;
       END
   if (OLD.Classificacao <> NEW.Classificacao) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Classificacao||'->'||NEW.Classificacao;
       END
   if (OLD.Classificacao_Financeira <> NEW.Classificacao_Financeira) then
       BEGIN
       HISTORICO = HISTORICO||' Class.Fin.'||OLD.Classificacao_Financeira||'->'||NEW.Classificacao_Financeira;
       END
   if (OLD.CCusto <> NEW.CCusto) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo:'||OLD.CCusto||'->'||NEW.CCusto;
       END
   if (OLD.Tabela_Uf <> NEW.Tabela_Uf) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Uf:'||OLD.Tabela_Uf||'->'||NEW.Tabela_Uf;
       END
   if (OLD.Codigo_Rastreio <> NEW.Codigo_Rastreio) then
       BEGIN
       HISTORICO = HISTORICO||' Cód.Rastreio:'||OLD.Codigo_Rastreio||'->'||NEW.Codigo_Rastreio;
       END
   if (OLD.Embalagem <> NEW.Embalagem) then
       BEGIN
       HISTORICO = HISTORICO||' Emb.'||OLD.Embalagem||'->'||NEW.Embalagem;
       END
   if (OLD.Tabela_Preco_Id <> NEW.Tabela_Preco_Id) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Preço:'||OLD.Tabela_Preco_Id||'->'||NEW.Tabela_Preco_Id;
       END
   if (OLD.Desconto1 <> NEW.Desconto1) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.1:'||OLD.Desconto1||'->'||NEW.Desconto1;
       END
   if (OLD.Desconto2 <> NEW.Desconto2) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.2:'||OLD.Desconto2||'->'||NEW.Desconto2;
       END


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

   if (OLD.Volumes<> NEW.Volumes) then
       BEGIN
       HISTORICO = HISTORICO||' Vol.'||OLD.Volumes||'->'||NEW.Volumes;
       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.SITUACAO <> NEW.SITUACAO) then
       BEGIN
       if (NEW.SITUACAO = '0') then
           HISTORICO = HISTORICO||' Pedido Desconfirmado';
           new.status_ecommerce = 2;
       if (NEW.SITUACAO = '1') then
           HISTORICO = HISTORICO||' Pedido Confirmado';
           new.status_ecommerce = 3;
       END

   if (OLD.FORMA_ANALISE <> NEW.FORMA_ANALISE) then
       BEGIN
       HISTORICO = HISTORICO||' F.Analise:'||OLD.FORMA_ANALISE ||'->'||NEW.FORMA_ANALISE;
       END
    
   if (OLD.CHAVE_LIBERACAO <> NEW.CHAVE_LIBERACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Chave:'||OLD.CHAVE_LIBERACAO||'->'||NEW.CHAVE_LIBERACAO;
       END
 
   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO', OLD.PEDIDO,
      (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;


CREATE OR ALTER trigger ttbpedido_b0ui_02dlf for tbpedido
active before insert or update position 0
AS
Begin
  if (NEW.CLASSIFICACAO = 'A') Then
      NEW.TIPO_PEDIDO = 2;

  if (NEW.DATA_CLIENTE IS NULL) Then
      NEW.DATA_CLIENTE = NEW.DATA_ENTREGA;

  if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA and NEW.CLASSIFICACAO <> ' ') Then
      NEW.DATA_CLIENTE = NEW.DATA_ENTREGA;

  if (INSERTING) then
      Begin
      if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA) Then Exception "..." 'DATA DO CLIENTE NAO PODE SER MENOR QUE PREVISAO DE FATURAMENTO! DT.CLIENTE:'||NEW.DATA_CLIENTE||' DT.PREV.FAT:'||NEW.DATA_ENTREGA||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (UPDATING) then
      Begin
      if (NEW.DATA_CLIENTE <> OLD.DATA_CLIENTE or NEW.DATA_ENTREGA <> OLD.DATA_ENTREGA) Then
          Begin
          if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA) Then Exception "..." 'DATA DO CLIENTE NAO PODE SER MENOR QUE PREVISAO DE FATURAMENTO! DT.CLIENTE:'||NEW.DATA_CLIENTE||' DT.PREV.FAT:'||NEW.DATA_ENTREGA||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          End
      End

end;





ALTER TABLE TBOPERADOR_SETOR ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBOPERADOR_SETOR set OLD_PERFIL = PERFIL;
ALTER TABLE TBOPERADOR_SETOR DROP PERFIL;
ALTER TABLE TBOPERADOR_SETOR ADD PERFIL VARCHAR(10) DEFAULT '';
update TBOPERADOR_SETOR set PERFIL = OLD_PERFIL;
ALTER TABLE TBOPERADOR_SETOR DROP OLD_PERFIL;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;



CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1u_01 for tbagrupamento_carga_sku_cor
active before update position 1
AS
declare variable vPerfil varchar(10);
declare variable vMinutos integer;
declare variable vAgrup_Cor_id  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
          if (NEW.Quantidade < OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade - Abs(Old.Quantidade - New.Quantidade),
               Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_cor_Id;
              End else
          if (NEW.Quantidade > OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade + Abs(New.Quantidade - Old.Quantidade),
               Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_Cor_Id;
              End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      vPerfil = Coalesce((Select First 1 F1.Perfil
                            From TBAGRUPAMENTO_CARGA_COR F1
                           Where F1.agrupamento_id = Old.Agrupamento_Id
                             and F1.id = Old.Agrup_Cor_Id),0);

       For
       Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as Agrup_Cor_id from TbAgrupamento A
         Left Join TBAGRUPAMENTO_CARGA_COR F2 ON F2.agrupamento_id = A.ID and f2.Perfil = :vPerfil
        Where A.ID = New.Agrupamento_Id
        Into :vMinutos, :vAgrup_Cor_id
        Do Begin
           if (:vAgrup_Cor_id = 0) then
               Begin
               vAgrup_Cor_id = gen_id(gtbagrupamento_carga_cor,1);
               Insert into TBAGRUPAMENTO_CARGA_COR
               (AGRUPAMENTO_ID,PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                values (New.Agrupamento_Id,:vPerfil,:vAgrup_Cor_id,:vMinutos,0,:vMinutos);
               End
           End

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.Agrup_Cor_Id;

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAgrup_Cor_Id;

       New.Agrup_Cor_Id = :vAgrup_Cor_Id;
      End
End;



CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1u_01 for tbagrupamento_carga_sku_gp
active before update position 1
AS
declare variable vGP_id integer;
declare variable vSubUP_id integer;
declare variable vPerfil varchar(10);

declare variable vMinutos integer;
declare variable vAgrup_GP_id  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
      if (NEW.Quantidade < OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_gp set
           Quantidade = Quantidade - (Old.Quantidade - New.Quantidade),
           Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.Agrup_gp_Id;
          End else
      if (NEW.Quantidade > OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_gp set
           Quantidade = Quantidade + (New.Quantidade - Old.Quantidade),
           Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.Agrup_Gp_Id;
          End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      For
      Select First 1 F1.GP_id, F1.subup_id, F1.perfil
        From TBAGRUPAMENTO_CARGA_GP F1
       Where F1.agrupamento_id = Old.Agrupamento_Id
         and F1.id = Old.Agrup_GP_Id
      Into :vGP_id, :vsubup_id, :vPerfil
      Do Begin

           For
           Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as Agrup_GP_id from TbAgrupamento A
             Left Join TBAGRUPAMENTO_CARGA_GP F2 ON F2.agrupamento_id = A.ID and F2.GP_id = :vGP_id and F2.Subup_id = :vsubup_id and F2.Perfil = :vPerfil
            Where A.ID = New.Agrupamento_Id
            Into :vMinutos, :vAgrup_GP_id
            Do Begin
               if (:vAgrup_GP_id = 0) then
                   Begin
                   vAgrup_GP_id = gen_id(gtbagrupamento_carga_GP,1);
                   Insert into TBAGRUPAMENTO_CARGA_GP
                   (AGRUPAMENTO_ID,GP_ID,SUBUP_ID, PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                    values (New.Agrupamento_Id,:vGP_id,:vSUBUP_ID,:vPERFIL,:vAgrup_GP_id,:vMinutos,0,:vMinutos);
                   End
               End

         End

       UPDATE tbagrupamento_carga_gp set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.Agrup_Gp_Id;

       UPDATE tbagrupamento_carga_gp set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAgrup_Gp_Id;

       New.Agrup_Gp_Id = :vAgrup_Gp_Id;
      End
End;



CREATE OR ALTER trigger ttbremessa_consumo_a1i for tbremessa_consumo
active after insert position 1
AS
declare variable vPerfil varchar(10);
declare variable Remessa_Req Char(1);
declare variable vId_Req Integer;
Begin

if (Coalesce(NEW.COMPONENTE,'') = '') Then
    begin

    vPerfil = Coalesce((Select First 1 Perfil From TbRemessa Where Numero = New.Remessa),'');
    if (vPerfil = '') then -- Processar as regras abaixo somente nas remessas de bojos
        begin

            if (New.Requisicao_Id > 0) Then
                Begin
                Remessa_Req = '1';
                End else
                Begin
                Remessa_Req = (Coalesce((Select First 1 Requisicao From TbRemessa Where Numero = New.Remessa),'1'));
                End
        
            --Aloca no estoque
            Execute Procedure Spi_Remessa_Consumo (New.Estabelecimento_Id,
            New.Localizacao_Id, New.Produto_Id, New.Tamanho, New.Remessa, New.Id);
        
            if (:Remessa_Req = '0' and NEW.SEGURANCA > 0) then
                Begin
                --Reserva saldo para requisição
                    vID_Req = (Coalesce((Select First 1 ID From TbRemessa_Consumo_Req
                                          Where Remessa = New.Remessa
                                            and Produto_Id = New.Produto_Id
                                            and Tamanho = New.Tamanho),0));
        
                    if (vID_Req = 0) then
                        Begin
                            Insert Into TbRemessa_Consumo_Req (Estabelecimento_Id,
                            Remessa,Localizacao_Id,Produto_Id,Tamanho,Quantidade,Saldo)
                            Values (New.Estabelecimento_Id,New.Remessa,New.Localizacao_Id,
                            New.Produto_Id,New.Tamanho,New.Seguranca,New.Seguranca);
                        End else
                        Begin
                            Update TbRemessa_Consumo_Req Set
                            Quantidade = Quantidade + NEW.SEGURANCA,
                            Saldo = Saldo + NEW.SEGURANCA
                            Where Estabelecimento_Id = New.Estabelecimento_Id
                              and Localizacao_Id = New.Localizacao_ID
                              and Remessa = New.Remessa
                              and Produto_Id = New.Produto_Id
                              and Tamanho = New.Tamanho;
                        End
        
                End
        End
    End
End;



CREATE OR ALTER trigger ttbremessa_consumo_b0u_02 for tbremessa_consumo
active before update position 0
AS
declare variable Cor_Basica Integer;
declare variable vPerfil varchar(10);
declare variable estoque numeric(15,4);
Begin

IF (COALESCE(NEW.COMPONENTE,'0') = '0' ) THEN
    Begin
    --vPerfil = Coalesce((Select First 1 Perfil From TbRemessa Where Numero = New.Remessa),'');
    --if (vPerfil = '') then -- Processar as regras abaixo somente nas remessas de bojos
    --    begin

              if ((OLD.CONFERENCIA = '0' and NEW.CONFERENCIA = '1') or
                  (Coalesce(NEW.QUANTIDADE_CONFERENCIA,0) >= NEW.CONSUMO_KG)) Then
                  Begin
            
                    DELETE FROM TBESTOQUE_DETALHE_ALOCACAO WHERE
                    ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_ID
                    AND TABELA_ID = OLD.REMESSA
                    AND TAB_ITEM_ID = OLD.ID
                    AND TIPO = 'R';
            
                  End else
            
              if (Coalesce(NEW.QUANTIDADE_CONFERENCIA,0) > Coalesce(OLD.QUANTIDADE_CONFERENCIA,0) AND
                  NEW.CONFERENCIA = '0' and OLD.CONFERENCIA = '0') Then
                  Begin
                                      
                      Cor_Basica = Coalesce((Select First 1 P.Cor_Codigo
                          From TbProduto P, TbFamilia F, TbCor_Composicao CC
                         where p.codigo = New.produto_id
                           and p.familia_codigo = f.codigo
                           and f.cores_basicas = cc.cor_id
                           and p.cor_codigo = cc.cor_composicao_id),0);
                    
                      if (:Cor_Basica = 0) then
                          Begin
                            --Aloca no estoque
                            Execute Procedure Spi_Remessa_Consumo (New.Estabelecimento_Id,
                            New.Localizacao_Id, New.Produto_Id, New.Tamanho, New.Remessa, New.Id);

                          End
            
                  End else
            
              if ((OLD.CONFERENCIA = '1' AND NEW.CONFERENCIA = '0') or
                  (OLD.CONSUMO_KG <> NEW.CONSUMO_KG)  or
                  (OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID) or
                  (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) or
                  (OLD.SETOR_ID <> NEW.SETOR_ID) or
                  (Coalesce(NEW.QUANTIDADE_CONFERENCIA,0) < Coalesce(OLD.QUANTIDADE_CONFERENCIA,0))  ) then
                  Begin

                    DELETE FROM TBESTOQUE_DETALHE_ALOCACAO WHERE
                    ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_ID
                    AND TABELA_ID = OLD.REMESSA
                    AND TAB_ITEM_ID = OLD.ID
                    AND TIPO = 'R';

                    --estoque = coalesce((select s.saldo from VWESTOQUE_SALDO_DISPONIVEL s  where s.estabelecimento_id = new.estabelecimento_id
                    --and s.localizacao_id = new.localizacao_id and s.produto_id = new.produto_id and s.tamanho = new.tamanho),0);
            
                    --if(estoque > NEW.CONSUMO_KG)then
                    --begin
                        Execute Procedure Spi_Remessa_Consumo (New.Estabelecimento_Id, New.Localizacao_Id, New.Produto_Id, New.Tamanho, New.Remessa, New.Id);
                    --end
            
                 End
    --    End

    End
end;



CREATE OR ALTER trigger ttbremessa_consumo_b1i for tbremessa_consumo
active before insert position 1
AS

declare variable vPerfil varchar(10);
declare variable Seguranca Numeric(15,4);
declare variable vRemessa Integer;
declare variable vPedido Integer;
declare variable vPed_Item_Id Integer;
declare variable Remessa_Req Char(1);
declare variable vQuantidade Numeric(15,4);
Begin

if (Coalesce(NEW.COMPONENTE,'') = '') Then
    begin
    vPerfil = Coalesce((Select First 1 Perfil From TbRemessa Where Numero = New.Remessa),'');
    
    if (vPerfil = '') then -- Processar as regras abaixo somente nas remessas de bojos
        begin
    
        if (New.Requisicao_Id > 0) Then
            Begin
            Remessa_Req = '1';
            End else
            Begin
            Remessa_Req = (Coalesce((Select First 1 Requisicao From TbRemessa Where Numero = New.Remessa),'1'));
            End
    
        if (:Remessa_Req = '0') then
            Begin
            Seguranca = (Coalesce((Select First 1 Seguranca From TbProduto Where Codigo = New.Produto_Id),0));
            NEW.SEGURANCA = New.Consumo_Kg * (:Seguranca / 100.0000);
                /*
                For Select  RIA.Tabela_Id, RIA.Tab_Item_Id, Sum(RIA.Quantidade)
                      From TbRemessa_Item_Alocacao RIA, TbPedido_Item_Processado PIP
                     Where RIA.estabelecimento_id = New.Estabelecimento_Id
                       and RIA.Remessa = New.Remessa
                       and RIA.Remessa = PIP.Remessa
                       and RIA.Talao = PIP.Controle
                       and PIP.Remessa_Acumulado_Controle = New.Talao
                     Group By 1,2
                 Into :vPedido, :vPed_Item_Id, :vQuantidade
                 Do
                   Begin
    
                   if (:vPedido > 0) then
                       Begin
                          Update TbPedido_Consumo A Set
                          A.Pedido_Quantidade = A.Pedido_Quantidade - :vQuantidade
                          Where A.Pedido_Id = :vPedido
                            and A.Pedido_Item_Id = :vPed_Item_Id
                            and A.Tipo = 'C';
                       End
                   End */
            End
    
        --Baixa saldo reservado para requisição
        if (:Remessa_Req = '1') then
            Begin -- Localiza a remessa original da requisição
              For Select First 1 RQ.Remessa
                    From TbRequisicao RQ
                   Where RQ.Remessa_Gerada = New.Remessa
                     and RQ.Talao = New.Talao
                    Into :vRemessa
                      Do
                  Begin
                  if (:vRemessa > 0) then
                      Begin
                        Update TbRemessa_Consumo_Req Set
                        Saldo = Saldo - New.Consumo_Kg
                        Where Estabelecimento_Id = New.Estabelecimento_Id
                          and Localizacao_Id = New.Localizacao_ID
                          and Remessa = :vRemessa
                          and Produto_Id = New.Produto_Id
                          and Tamanho = New.Tamanho;
                      End
                  End
            End
    
        End
    End
END;



CREATE OR ALTER function fn_programacao_tempo_novo (
    modelo_id integer,
    cor_id integer,
    tam integer,
    tipo integer)
returns numeric(14,4)
as
declare variable totalsetup2 integer;
declare variable totalsetup1 integer;
declare variable totalsetup3 numeric(14,4);
declare variable resultado numeric(14,4);
declare variable totalprocesso1 numeric(14,4);
declare variable totalprocesso2 integer;
declare variable totalprocesso3 integer;
declare variable id integer;
declare variable familia_producao integer;
declare variable sequencia integer;
declare variable familia_id integer;
declare variable gp_id varchar(40);
declare variable perfil_up varchar(10);
declare variable up_padrao1 integer;
declare variable up_padrao2 integer;
declare variable calculo_rebobinamento char(4);
declare variable calculo_conformacao char(4);
declare variable ccusto varchar(40);
declare variable fator numeric(18,2);
declare variable status char(4);
declare variable remessas_defeito integer;
begin

  for
    SELECT
        c.ID,
        c.FAMILIA_PRODUCAO,
        c.SEQUENCIA,
        c.FAMILIA_ID,
        c.GP_ID,
        c.PERFIL_UP,
        c.UP_PADRAO1,
        c.UP_PADRAO2,
        c.CALCULO_REBOBINAMENTO,
        c.CALCULO_CONFORMACAO,
        c.CCUSTO,
        c.FATOR,
        c.STATUS,
        c.REMESSAS_DEFEITO

    from TBREGRA_CALCULO_CUSTO c, tbmodelo m
    where c.familia_producao = 3
    and m.familia_codigo = c.familia_id
    and m.codigo = :MODELO_ID
  into
    ID,
    FAMILIA_PRODUCAO,
    SEQUENCIA,
    FAMILIA_ID,
    GP_ID,
    PERFIL_UP,
    UP_PADRAO1,
    UP_PADRAO2,
    CALCULO_REBOBINAMENTO,
    CALCULO_CONFORMACAO,
    CCUSTO,
    FATOR,
    STATUS,
    REMESSAS_DEFEITO
  do
  begin

  end

  :TOTALPROCESSO1 = 0;
  :TOTALSETUP1    = 0;
  :TOTALPROCESSO2 = 0;
  :TOTALSETUP2    = 0;
  :TOTALPROCESSO3 = 0;
  :TOTALSETUP3    = 0;

  if(UP_PADRAO2 > 0)then
  begin  
      Delete from Tmp22040 Where True;
      INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:UP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
      SELECT TOTALPROCESSO, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO into :TOTALPROCESSO1, :TOTALSETUP1;
  end

  if(UP_PADRAO1 > 0)then
  begin
      Delete from Tmp22040 Where True;
      INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:UP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
      SELECT TOTALPROCESSO, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO into :TOTALPROCESSO2, :TOTALSETUP2;
  end

  SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO3, :TOTALSETUP3;

  if(TIPO = 1)then
  begin
    RESULTADO = TOTALPROCESSO1 + TOTALPROCESSO2 + TOTALPROCESSO3;
  end
  else
  begin
    RESULTADO = TOTALSETUP1 + TOTALSETUP2 + TOTALSETUP3;
  end

  return RESULTADO;
end;
CREATE OR ALTER procedure spc_corte_etiqueta (
    remessa_id integer,
    remessa_talao_id integer)
returns (
    etiq blob sub_type 1 segment size 80 character set win1252)
as
declare variable id integer;
declare variable remessa integer;
declare variable remessa_data date;
declare variable remessa_requisicao char(4);
declare variable remessa_tipo char(4);
declare variable controle integer;
declare variable modelo_codigo integer;
declare variable modelo_densidade integer;
declare variable modelo_espessura numeric(18,2);
declare variable matriz_codigo integer;
declare variable matriz_descricao varchar(80);
declare variable matriz_largura numeric(18,5);
declare variable produto_codigo integer;
declare variable produto_descricao varchar(400);
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable tolerancia numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable placas_ smallint;
declare variable sobras_ smallint;
declare variable lib char(4);
declare variable consumo_medio numeric(18,5);
declare variable placa_altura numeric(18,5);
declare variable placa_comprimento numeric(18,5);
declare variable placa_sobra numeric(18,5);
declare variable placa numeric(18,5);
declare variable observacao varchar(800);
declare variable situacao integer;
declare variable descricao varchar(400);
declare variable grade_codigo integer;
declare variable cor_codigo integer;
declare variable classe varchar(20);
declare variable programacao_boca integer;
declare variable programacao_esteira integer;
declare variable tamanho_grade varchar(40);
declare variable programacao_sequencia integer;
declare variable esteira_descricao varchar(80);
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable turno char(4);
declare variable cor_descricao varchar(80);
declare variable seq varchar(40);
declare variable perfil char(10);
declare variable perc_sobra numeric(18,1);
declare variable flag char(4);
declare variable aproveitamento numeric(18,4);
declare variable mediapar numeric(18,4);
declare variable talao_origem blob sub_type 1 segment size 100;
declare variable largura_t numeric(15,5);
declare variable comprimento_t numeric(15,5);
declare variable placa_t numeric(15,5);
declare variable sobra_t numeric(15,5);
declare variable up_destino varchar(255);
declare variable cliente varchar(255);
declare variable localizacao varchar(255);
declare variable talao_vinculo_controle varchar(50);
begin

SELECT FIRST 1
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE
FROM
    (SELECT
        X.ID,
        X.REMESSA,
        X.REMESSA_DATA,
        X.REMESSA_REQUISICAO,
        X.REMESSA_TIPO,
        X.CONTROLE,
        X.MODELO_CODIGO,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 1 FOR 5) AS INTEGER)  MODELO_DENSIDADE,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 6 FOR 5) AS NUMERIC(15,2))  MODELO_ESPESSURA,
        
        X.MATRIZ_CODIGO,
        X.MATRIZ_DESCRICAO,
        X.MATRIZ_LARGURA,
        X.PRODUTO_CODIGO,
        X.PRODUTO_DESCRICAO,
        X.TAMANHO,
        X.QUANTIDADE,
        X.QUANTIDADE_SOBRA,
        X.TOLERANCIA,
        X.CHAPAS,
        X.PLACAS,
        X.SOBRAS,
        X.PLACAS_,
        X.SOBRAS_,
        X.LIB,
        X.CONSUMO_MEDIO,
        X.OBSERVACAO,
        X.SITUACAO,
        X.DESCRICAO,
        X.GRADE_CODIGO,
        X.COR_CODIGO,
        X.CLASSE,
        X.PROGRAMACAO_BOCA,
        X.PROGRAMACAO_ESTEIRA,
        X.TAMANHO_GRADE,
        X.PROGRAMACAO_SEQUENCIA,
        X.ESTEIRA_DESCRICAO,
        X.HORA_PRODUCAO,
        X.HORA_LIBERACAO,
        X.TURNO,
        (SELECT FIRST 1 DESCRICAO FROM TBCOR WHERE CODIGO = X.COR_CODIGO) COR_DESCRICAO,
        X.SEQ,
        X.PERFIL,
        X.PERC_SOBRA,
        '0' FLAG,
        X.APROVEITAMENTO,

        (SELECT FIRST 1 LARGURA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_ALTURA,
        (SELECT FIRST 1 COMPRIMENTO
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_COMPRIMENTO,  
        (SELECT FIRST 1 SOBRA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_SOBRA,    
        (SELECT FIRST 1 PLACA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA,

        CAST(IIF(X.CONSUMO_MEDIO>0,(X.QUANTIDADE-X.QUANTIDADE_SOBRA)/X.CONSUMO_MEDIO,0) AS NUMERIC(15,4)) MEDIAPAR,
        CLIENTE,
        LOCALIZACAO,
        TALAO_VINCULO_CONTROLE
    FROM
       (SELECT
            A.ID,
            A.REMESSA,
            R.DATA REMESSA_DATA,
            R.REQUISICAO REMESSA_REQUISICAO,
            R.TIPO REMESSA_TIPO,
            A.CONTROLE,
            A.MODELO_CODIGO,
            P.GRADE_CODIGO,
            A.MATRIZ_CODIGO,
            A.PRODUTO_CODIGO,
            P.DESCRICAO PRODUTO_DESCRICAO,
            A.TAMANHO,
            A.QUANTIDADE,
            A.TOLERANCIA,
            A.CHAPAS,
            A.PLACAS,
            A.SOBRAS,
            A.PLACAS_,
            A.SOBRAS_,
            A.CONSUMO_MEDIO,
            A.OBSERVACAO,
            A.SITUACAO,
            P.DESCRICAO,
            P.COR_CODIGO,
            A.PROGRAMACAO_BOCA,
            A.PROGRAMACAO_ESTEIRA,
            A.PROGRAMACAO_SEQUENCIA,
            A.HORA_PRODUCAO,
            A.HORA_LIBERACAO,
            A.TURNO,
            A.SEQ,
                         
            COALESCE(A.LIB,'0') LIB,

            COALESCE((SELECT SUM(S.QUANTIDADE) FROM TBREQUISICAO_SOBRA S
                       WHERE S.REMESSA = A.REMESSA AND S.TALAO = A.CONTROLE
                         AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,

           (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)) TAMANHO_GRADE,

            IIF(A.ESPESSURA > 0 AND A.DENSIDADE > 0, LPAD(A.DENSIDADE,5,'0')||LPAD(A.ESPESSURA,5,'0'),
            IIF(M.ESPESSURA > 0 AND M.DENSIDADE > 0, LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0'),
            COALESCE(
            (SELECT FIRST 1
              COALESCE((SELECT FIRST 1 LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0')
                 FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
              FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
             WHERE MC.MODELO_ID = A.MODELO_CODIGO
               AND MC.COR_ID = P.COR_CODIGO
               AND MC.PRODUTO_ID = P2.CODIGO
               AND P2.FAMILIA_CODIGO = F.CODIGO
               AND F.DENSIDADE_ESPESSURA = '1'),'0000000000'))) DENS_ESPESS,
        
            (SELECT FIRST 1 E.DESCRICAO FROM TBESTEIRA E WHERE A.PROGRAMACAO_ESTEIRA = E.CODIGO) ESTEIRA_DESCRICAO,

            (SELECT FIRST 1 G.DESCRICAO FROM TBMATRIZ G WHERE A.MATRIZ_CODIGO = G.CODIGO) MATRIZ_DESCRICAO,

            (SELECT FIRST 1 H.LARGURA   FROM TBMATRIZ H WHERE A.MATRIZ_CODIGO = H.CODIGO) MATRIZ_LARGURA,

            (SELECT FIRST 1 COALESCE(CLASSE||'.'||LPAD(SUBCLASSE,3,'0'),'0.000') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) CLASSE,

            (SELECT FIRST 1 COALESCE(PERFIL,'') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) PERFIL, A.PERC_SOBRA, A.APROVEITAMENTO,

            COALESCE((SELECT
                X.TABELA_ID ||' - '||
               (SELECT FIRST 1 (SELECT FIRST 1 LEFT(E.RAZAOSOCIAL,20) FROM TBEMPRESA E WHERE E.CODIGO = P.CLIENTE_CODIGO)
                  FROM TBPEDIDO P
                 WHERE P.PEDIDO = X.TABELA_ID) CLIENTE
            FROM (
                SELECT FIRST 1 B.TABELA_ID
                FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA_ITEM_ALOCACAO B
                WHERE A.REMESSA = C.REMESSA_ID
                  AND A.REMESSA_ACUMULADO_CONTROLE = C.REMESSA_TALAO_ID
                  AND A.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_ID
                  AND A.REMESSA = B.REMESSA
                  AND A.CONTROLE = B.TALAO
                  AND TIPO = 'P'
                  AND B.STATUS = 1) X
            ),'PRONTA ENTREGA')CLIENTE,
            COALESCE((SELECT FIRST 1 LPAD(L.CODIGO,3,0)||' - '||L.DESCRICAO AS LOCALIZACAO FROM TBLOCALIZACAO L WHERE L.CODIGO = A.LOCALIZACAO_ID),'') AS LOCALIZACAO,
            COALESCE((SELECT FIRST 1 ' T.' ||FN_LPAD(T1.REMESSA_TALAO_ID,4,0) || ' '
               FROM VWREMESSA_TALAO T1
              WHERE T1.ID = A.TALAO_VINCULO),'') TALAO_VINCULO_CONTROLE
    
        
        FROM
            TBPRODUTO P,
            TBMODELO M,
            TBREMESSA R,
            TBREMESSA_ITEM_PROCESSADO A
            left join VWREMESSA_CONSUMO C on A.REMESSA = C.REMESSA_ID and a.CONTROLE = C.REMESSA_TALAO_ID
        WHERE          
            A.PRODUTO_CODIGO = P.CODIGO
        AND A.MODELO_CODIGO  = M.CODIGO
        AND A.REMESSA        = R.NUMERO
        AND A.REMESSA        = :REMESSA_ID
        AND A.CONTROLE       = :REMESSA_TALAO_ID
        ORDER BY A.CONTROLE
        ) X
    ) Y
    ORDER BY MODELO_DENSIDADE DESC, MODELO_ESPESSURA DESC, CLASSE DESC, COR_DESCRICAO, PLACA_ALTURA, PLACA_COMPRIMENTO, ESTEIRA_DESCRICAO DESC, PRODUTO_DESCRICAO DESC
INTO
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE;


    ETIQ = '';
    IF ( ID > 0) THEN
    BEGIN
    
        ETIQ = COALESCE((
        SELECT FIRST 1 E.SCRIPT
          FROM TBETIQUETAS E
         WHERE E.ID = 136),'');
        
        SELECT FIRST 1
               FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_ORIGEM,
               FN_DESCRICAO('TBUP',T2.UP_ID)UP_DESCRICAO
          FROM VWREMESSA_CONSUMO C,
               TBREMESSA_CONSUMO_VINCULO V,
               VWREMESSA_TALAO T2
         WHERE C.REMESSA_ID        = :REMESSA
           AND C.REMESSA_TALAO_ID  = :CONTROLE
           AND V.CONSUMO_ID        = C.ID
           AND T2.REMESSA_ID       = V.REMESSA_ID
           AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
          INTO TALAO_ORIGEM,
               UP_DESTINO;

        TALAO_ORIGEM = COALESCE(TALAO_ORIGEM,'');
        UP_DESTINO   = COALESCE(UP_DESTINO,'');




        ETIQ = REPLACE(ETIQ,':)'                   ,'#2');
        ETIQ = REPLACE(ETIQ,'#MTZ#'                ,MATRIZ_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#CONSUMO#'            ,FN_FORMAT_NUMBER(CONSUMO_MEDIO,2)||' MTS '||FN_FORMAT_NUMBER(MEDIAPAR,2)||' PRS/MT');
        ETIQ = REPLACE(ETIQ,'#ESPESSURA#'          ,FN_FORMAT_NUMBER(MODELO_ESPESSURA,2));
        ETIQ = REPLACE(ETIQ,'#DENSIDADE#'          ,FN_LPAD(MODELO_DENSIDADE,2,0));
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO1#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'03');
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO2#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'04');
        ETIQ = REPLACE(ETIQ,'#NUMERO_TALAO#'       ,FN_LPAD(CONTROLE,3,0));
        ETIQ = REPLACE(ETIQ,'#TAMANHO#'            ,TAMANHO_GRADE);
        ETIQ = REPLACE(ETIQ,'#DATA_HORA_IMPRESSAO#',FN_DATE('NOW','DT HRS'));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADELIBERACAO#',FN_FORMAT_NUMBER(QUANTIDADE-QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADE_SOBRA#'   ,FN_FORMAT_NUMBER(QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#FABRICA#'            ,ESTEIRA_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#DATA#'               ,FN_DATE(REMESSA_DATA,'DT'));
        ETIQ = REPLACE(ETIQ,'#CHAPAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(CHAPAS),2,0));
        ETIQ = REPLACE(ETIQ,'#PLACAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SOBRAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_PLACAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_SOBRAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#REMESSA#'            ,FN_LPAD(REMESSA,5,0));
        ETIQ = REPLACE(ETIQ,'#TURNO#'              ,TURNO);
        ETIQ = REPLACE(ETIQ,'#OB#'                 ,'');
        ETIQ = REPLACE(ETIQ,'#SUBUP#'              ,FN_LPAD(PROGRAMACAO_BOCA,2,0));
        ETIQ = REPLACE(ETIQ,'#CLASSE#'             ,'('||FN_FORMAT_NUMBER(CLASSE)||')');
        ETIQ = REPLACE(ETIQ,'#PRODUTO_ID#'         ,FN_LPAD(PRODUTO_CODIGO,5,0));
        ETIQ = REPLACE(ETIQ,'#PRODUTO#'            ,FN_REMOVE_ACENTOS(PRODUTO_DESCRICAO));
        ETIQ = REPLACE(ETIQ,'#PRODUTO2#'           ,TRIM(REPLACE(PRODUTO_DESCRICAO,'BOJO','')));
        ETIQ = REPLACE(ETIQ,'#COMPOSICAO#'         ,'');
        ETIQ = REPLACE(ETIQ,'#VIP#'                ,IIF(REMESSA_TIPO = '2','VIP',''));
        ETIQ = REPLACE(ETIQ,'#CLIENTE#'            ,CLIENTE );
        ETIQ = REPLACE(ETIQ,'#APROVEITAMENTO#'     ,IIF(APROVEITAMENTO > 0,'+'||FN_FORMAT_NUMBER(APROVEITAMENTO),''));
        ETIQ = REPLACE(ETIQ,'#TALAO_ORIGEM#'       ,TALAO_ORIGEM);
        ETIQ = REPLACE(ETIQ,'#UP_DESTINO#'         ,UP_DESTINO);
    
        IF ( MATRIZ_CODIGO > 0 ) THEN
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(PLACA_COMPRIMENTO,2));
            
            IF (PLACA_SOBRA > 0) THEN
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(MATRIZ_LARGURA - (PLACA * PLACA_COMPRIMENTO),2));
            END
            ELSE
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
            END
        END
        ELSE
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#','');
            ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
        END
    
                                            
        ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',TALAO_VINCULO_CONTROLE);
--        IF (SUBSTRING(SEQ FROM 1 FOR 3) = 'ULT') THEN
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#','');
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',SEQ);
--        END ELSE
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#',SEQ);
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#','');
--        END
    
        IF ((PERC_SOBRA > 0) AND (REMESSA_REQUISICAO = '0')) THEN --SOBRAS
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',FN_FORMAT_NUMBER(PERC_SOBRA,1)||'%');
        END
        ELSE
        IF ((CONTROLE > 9000) AND (REMESSA_REQUISICAO = '1')) THEN --REQUISIÇÃO
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',' REQ ');
        END
        ELSE
        BEGIN                                         --NORMAL
            ETIQ = REPLACE(ETIQ,'#TIPO#','N');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#','');
        END
    END

    SUSPEND;

end;



CREATE OR ALTER procedure spc_minutos_disponiveis (
    familia_id integer,
    gp_id varchar(10),
    perfil_up varchar(10),
    mes integer,
    ano integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
begin

  data_inicio = Cast('01.'||mes||'.'||ano as Date);
  data_fim = Cast(FN_END_OF_MONTH(Data_Inicio) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;



CREATE OR ALTER procedure spc_minutos_disponiveis2 (
    familia_id integer,
    gp_id varchar(10),
    perfil_up varchar(10),
    mes1 integer,
    ano1 integer,
    mes2 integer,
    ano2 integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
declare variable data_inicio2 date;
begin

  data_inicio = Cast('01.'||mes1||'.'||ano1 as Date);

  data_inicio2 = Cast('01.'||mes2||'.'||ano2 as Date);
  data_fim = Cast(FN_END_OF_MONTH(data_inicio2) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;



CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(10),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin


   suspend;

  end

end;



CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(10);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe varchar(10);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe varchar(10);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente smallint;
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


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


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


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



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

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (
            SELECT
                FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                T2.MODELO_ID TALAO_MODELO_ID,
                M.DESCRICAO TALAO_MODELO_DESCRICAO,
                (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                P.DESCRICAO PRODUTO_DESCRICAO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                P.UNIDADEMEDIDA_SIGLA UM,
                MT.LARGURA,
                MT.COMPRIMENTO,
                C2.CLASSE COR_CLASSE,
                C2.SUBCLASSE COR_SUBCLASSE,
                T1.ID,
                T1.ESTABELECIMENTO_ID,
                T1.REMESSA_ID,
                T1.REMESSA_TALAO_ID,
                T1.LOCALIZACAO_ID,
                T1.PRODUTO_ID,
                T1.MODELO_ID,
                P.COR_CODIGO COR_ID,
                T1.TAMANHO,
                T1.QUANTIDADE,
                T1.QUANTIDADE_ALTERNATIVA,
                T1.QUANTIDADE_SOBRA,
                T1.GP_ID,
                T1.UP_ID,
                T1.ESTACAO,
                T1.DENSIDADE,
                T1.ESPESSURA,
                T1.STATUS,
                T1.OBSERVACAO,
                T1.DATA_PRODUCAO,
                T1.DATA_LIBERACAO,
                T1.HORA_PRODUCAO,
                T1.HORA_LIBERACAO,
                T1.VIA_ETIQUETA,
                T1.TURNO,
                T1.TALAO_EXTRA,
                T1.PERCENTUAL_EXTRA
    
            FROM
                VWREMESSA_TALAO T1,
                VWREMESSA_CONSUMO C,
                TBREMESSA_CONSUMO_VINCULO V,
                VWREMESSA_TALAO T2,
                TBPRODUTO P,
                TBMODELO M,
                TBMODELO M2,
                SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                TBCOR C2
    
            WHERE
                T1.REMESSA_ID = C.REMESSA_ID
            AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
            AND V.CONSUMO_ID = C.ID
            AND T2.REMESSA_ID = V.REMESSA_ID
            AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
            AND P.CODIGO = T1.PRODUTO_ID
            AND M.CODIGO = T2.MODELO_ID
            AND M2.CODIGO = P.MODELO_CODIGO
            AND C2.CODIGO = P.COR_CODIGO
            AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

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

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

        END

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

    END


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

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

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

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

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

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


    FOR
        SELECT
            C.ID ID_OLD,
            GEN_ID(GTBREMESSA_CONSUMO,1),
            C.ESTABELECIMENTO_ID,
            :REMESSA_ID,
            V.REMESSA_TALAO_ID,
            C.REMESSA_TALAO_DETALHE_ID,
            C.CONTROLE,
            C.LOCALIZACAO_ID,
            C.PRODUTO_ID,
            C.TAMANHO,
            C.DENSIDADE,
            C.ESPESSURA,
            C.QUANTIDADE_ORIGINAL,
            C.QUANTIDADE_NECES,
            C.QUANTIDADE_NECES_ALTERN,
            C.FATOR_UNIDADE,
            C.FATOR_UNIDADE_ALTERN,
            C.QUANTIDADE,
            C.QUANTIDADE_CONSUMO,
            C.QUANTIDADE_SALDO,
            C.QUANTIDADE_ALTERNATIVA,
            C.QUANTIDADE_SOBRA,
            C.STATUS,
            C.QUANTIDADE_ALTERNATIVA_CONSUMO,
            C.QUANTIDADE_ALTERNATIVA_SALDO,
            C.DATAHORA_CONFERENCIA,
            C.COMPONENTE,
            C.ESTOQUE_ID,
            C.SALDO_BAIXAR
        
        FROM
            VWREMESSA_CONSUMO C,
            TBREMESSA_CONSUMO_VINCULO V
        
        WHERE   
            V.REMESSA_ID = :REMESSA_ID_VINCULO
        AND V.CONSUMO_ID = C.ID
        ORDER BY C.ID
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR
    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

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

    END




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



CREATE OR ALTER procedure spi_remessa_talao_extra (
    i_remessa_id integer)
as
declare variable estabelecimento_id integer;
declare variable familia_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable matriz_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable status varchar(4);
declare variable perfil_sku varchar(10);
declare variable gp_id integer;
declare variable quantidade_total_taloes numeric(18,4);
declare variable percentual numeric(18,4);
declare variable quantidade numeric(18,4);
BEGIN

    FOR
        SELECT           
            ESTABELECIMENTO_ID, 
            FAMILIA_ID,
            REMESSA_ID,
            8000 + ROW_NUMBER() OVER() REMESSA_TALAO_ID,
            MATRIZ_ID,
            MODELO_ID,    
            COR_ID,
            PRODUTO_ID,
            TAMANHO,
            STATUS,
            PERFIL_SKU,
            GP_ID,
            QUANTIDADE_TOTAL_TALOES,
            PERCENTUAL,
            QUANTIDADE

        FROM (
            SELECT         
                ESTABELECIMENTO_ID, 
                FAMILIA_ID,     
                REMESSA_ID,
                MODELO_ID,
                MATRIZ_ID,
                PRODUTO_ID,
                COR_ID,
                TAMANHO,
                STATUS,
                PERFIL_SKU,
                GP_ID,
                QUANTIDADE_TOTAL_TALOES,
                PERCENTUAL,
                FN_ARRENDONDAR_PARA_CIMA(QUANTIDADE_TOTAL_TALOES * PERCENTUAL) QUANTIDADE
            
            FROM (
                SELECT
                    T.REMESSA                AS REMESSA_ID,
                    T.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                    T.FAMILIA_CODIGO         AS FAMILIA_ID,
                    P.MODELO_CODIGO          AS MODELO_ID,
                    T.MATRIZ_CODIGO          AS MATRIZ_ID,
                    T.PRODUTO_CODIGO         AS PRODUTO_ID,
                    P.COR_CODIGO             AS COR_ID,
                    T.TAMANHO                AS TAMANHO,
                    '1'                      AS STATUS,
                    T.PERFIL                 AS PERFIL_SKU,
                    T.PROGRAMACAO_ESTEIRA    AS GP_ID,
                    SUM(T.QUANTIDADE)        AS QUANTIDADE_TOTAL_TALOES,
                    (SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT (P.MODELO_CODIGO,P.COR_CODIGO,T.TAMANHO,T.REMESSA,0,'1')) PERCENTUAL
                
                FROM
                    TBREMESSA_ITEM_PROCESSADO T,
                    TBPRODUTO P
                
                WHERE T.REMESSA = :I_REMESSA_ID
                AND P.CODIGO  = T.PRODUTO_CODIGO
                
                GROUP BY 1,2,3,4,5,6,7,8,9,10,11
                ) X
            ) Y
        WHERE Y.QUANTIDADE > 0
    INTO    
        ESTABELECIMENTO_ID,   
        FAMILIA_ID,
        REMESSA_ID,
        REMESSA_TALAO_ID,     
        MATRIZ_ID,
        MODELO_ID,  
        COR_ID,
        PRODUTO_ID,
        TAMANHO,
        STATUS,
        PERFIL_SKU,
        GP_ID,
        QUANTIDADE_TOTAL_TALOES,
        PERCENTUAL,
        QUANTIDADE
    DO
    BEGIN
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            ESTABELECIMENTO_CODIGO,   
            FAMILIA_CODIGO,  
            REMESSA,
            CONTROLE,
            MATRIZ_CODIGO,
            MODELO_CODIGO,
            PRODUTO_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SITUACAO,
            PERFIL,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PERCENTUAL_TALAO_EXTRA
        ) VALUES (        
            :ESTABELECIMENTO_ID, 
            :FAMILIA_ID,
            :REMESSA_ID,
            :REMESSA_TALAO_ID, 
            :MATRIZ_ID,
            :MODELO_ID,
            :PRODUTO_ID,
            :TAMANHO,
            :QUANTIDADE,
            :STATUS,
            :PERFIL_SKU,
            :GP_ID,
            0,
            :PERCENTUAL
        );
    END

END;



CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil varchar(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

FOR Select A.MODELO_ID, A.COR_ID, A.PERCENTUAL_TALAO,
    Coalesce((Select First 1 P.Status From TbProduto P Where P.Modelo_Codigo = A.Modelo_Id and P.Cor_Codigo = C.Codigo),'1') Status_Produto
From TbModelo_Cor A, TbCor C
Where A.Cor_Id = C.Codigo
--  and C.Status = '1'
  and A.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :PERCENTUAL_TALAO, :Status_Produto
DO
  Begin
  IF (:MODELO_ID > 0/* and :Status_Produto = '1'*/) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_COR (MODELO_ID, COR_ID, PERCENTUAL_TALAO)
       VALUES (:ID2, :COR_ID, :PERCENTUAL_TALAO)
       MATCHING (MODELO_ID, COR_ID);
       END
  End

FOR Select M.MODELO_ID, M.COR_ID, M.TAMANHO, M.PERFIL, M.BLQ_PED
From TbModelo_Bloqueio M
Where M.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED
DO
  Begin
  IF (:MODELO_ID > 0) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_BLOQUEIO (MODELO_ID, COR_ID, TAMANHO, PERFIL, BLQ_PED)
       VALUES (:ID2, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED)
       MATCHING (MODELO_ID, COR_ID, TAMANHO);
       END
  End

END;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer)
returns (
    quant numeric(15,4),
    saldo numeric(15,4),
    cap_sku numeric(15,4),
    cap_cor numeric(15,4),
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido2 (
    estabelecimento_id integer,
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable quant numeric(15,4);
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable agrupamento_id integer;
declare variable id integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.agrupamento_id, A.id
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and tabela_id = :tabela_id
      and tab_item_id = :tab_item_id
      and tamanho = :tamanho
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor,
         :Cap_Sku, :Cap_Cor, :agrupamento_id, :id
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido3 (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer,
    quant numeric(15,4))
as
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable tabela_id integer;
declare variable tab_item_id integer;
declare variable tamanho integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

For
   Select A.Quantidade-A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Quantidade - Saldo > 0
    Into :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (Quant < Saldo) then
            Begin
            Saldo = :Quant;
            End

        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - :Saldo,
               Necess_Sku = (Quantidade - :Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - :Saldo)/:Cap_Cor 
--             Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;
              /*
              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End
              */
              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_modelos_perdas (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
     and h.familia_id = 3
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

              For
                    select
                        k.*,
                        count(k.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                        select distinct
                            a.modelo_id,
                            a.cor_id,
                            a.produto_id
                        from(
                        select distinct a.modelo_codigo
                          from tbpedido_item_processado a
                         where a.familia_codigo = 3
                           and a.data_producao between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        
                        union
                        
                        select distinct pp.modelo_codigo modelo_id
                          from tbpedido p, tbpedido_item a, tbproduto pp
                         where a.produto_codigo = pp.codigo
                           and p.pedido = a.pedido
                           and pp.familia_codigo = 3
                           and p.data between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        
                        union
                        
                        select distinct pp.modelo_codigo modelo_id
                          from tbnfs p, tbnfs_item a, tbproduto pp
                         where a.produto_codigo = pp.codigo
                           and a.nfs_controle = p.controle
                           and pp.familia_codigo = 3
                           and p.data_emissao between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        ) j, tbficha_tecnica a
                        Where j.modelo_codigo = a.modelo_id
                    ) k
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                                PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);
  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO
    From TBREGRA_CALCULO_CUSTO
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos,:vCCUSTO);           -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For Select distinct a.modelo_id, a.cor_id, a.produto_id
                from tbficha_tecnica a, TbModelo m
                Where m.codigo = a.modelo_id
                  and m.familia_codigo = :vFamilia_id
              Into :modelo_id, :cor_id, :produto_id
              do Begin

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos2 (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);
  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO;

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For
                    select
                        j.*,
                        count(j.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                        
                        Select distinct
                        
                            a.modelo_id,
                            a.cor_id,
                            a.produto_id
                        
                        from tbficha_tecnica a,  tbproduto k
                          Where a.produto_id = k.codigo
                          and k.familia_codigo = 133

                    ) j
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos3 (
    estabelecimento_id integer,
    data date)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  SELECT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
    CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
    Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
    Select DISTINCT  FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
             CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
             REMESSAS_DEFEITO
        From TBREGRA_CALCULO_CUSTO h
       Where Status = '1'
       --AND FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
       and h.familia_id = 133
      Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For
                    select
                        j.*,
                        count(j.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                    Select distinct
                    
                        a.modelo_id,
                        a.cor_id,
                        a.produto_id
                    
                    from tbficha_tecnica a, TbModelo m
                      Where m.codigo = a.modelo_id
                      and m.familia_codigo = :vFamilia_id
                    ) j
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos_v2 (
    estabelecimento_id integer,
    data date,
    imodelo_id integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable tipo integer;
declare variable linha_id integer;
Begin

  MES  = EXTRACT(MONTH FROM :DATA);
  ANO  = EXTRACT(YEAR  FROM :DATA);

  DATA = fn_end_of_month(DATA);

  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO and iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true);

  --DELETE FROM TBFICHA_TEMPO pm WHERE pm.MES = :MES AND pm.ANO = :ANO and pm.produto_id in (
  --  select p.codigo from tbproduto p where p.familia_codigo = 133
  --);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
    SELECT
        FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
        CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
        Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
        Select DISTINCT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
                 CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
                 REMESSAS_DEFEITO
            From TBREGRA_CALCULO_CUSTO h
           Where Status = '1'
           and iif(:IMODELO_ID > 0, h.familia_id = (select m.familia_codigo from tbmodelo m where m.codigo = :IMODELO_ID), true)
          Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

        --in autonomous transaction do
        --begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For   select * from
                    (select
                         a.*
                     from SPC_PRODUTOS_CUSTO_V2(:vFamilia_id, :ANO, :MES, :IMODELO_ID) a) where iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true)
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO, :linha_id
              do Begin

              --in autonomous transaction do
              --begin

                 if(vFATOR > 1)then
                 begin
                    vFATOR = fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', linha_id);
                 end

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, :vREMESSAS_DEFEITO, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END
                        END
                  --END
           END
     END
END;



