

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;

