CREATE OR ALTER trigger ttbestoque_trans_item_b1i_01 for tbestoque_transacao_item
active before insert or update position 1
AS
DECLARE VARIABLE TIPO   CHAR(1);
DECLARE VARIABLE ESTOQ  CHAR(1);
DECLARE VARIABLE BENEF  CHAR(1);
DECLARE VARIABLE CONSIG CHAR(1);
DECLARE VARIABLE DOCREF CHAR(1);
Declare Variable CUSTO  CHAR(1);
declare variable produto_id Integer;
Begin

For
Select First 1 O.Tipo, O.CONTROLE_ESTOQUE, O.Controle_Estoque_Externo,
               O.CONTROLE_CONSIGNACAO, O.EXIGE_NF_REFERENCIA, O.Atualiza_Custo
FROM TBOPERACAO O Where O.Codigo = New.Operacao_Codigo
Into :TIPO, :ESTOQ,:BENEF,:CONSIG,:DOCREF, :CUSTO
Do
begin

  if (New.Produto_Codigo > 0) then
      Begin

          if (New.Tipo <> 'S') then
              Begin
                  Produto_Id = Coalesce((Select First 1 Produto_codigo
                                           From TbEstoque_Saldo
                                          Where Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                                            and Localizacao_Codigo = NEW.LOCALIZACAO_CODIGO
                                            and Produto_Codigo = NEW.PRODUTO_CODIGO),0);
                  if (:produto_id = 0) then
                      Begin
                      INSERT INTO TbEstoque_Saldo (
                      Estabelecimento_Codigo, Localizacao_Codigo,Produto_Codigo)
                      VALUES (NEW.ESTABELECIMENTO_CODIGO,NEW.LOCALIZACAO_CODIGO,NEW.PRODUTO_CODIGO);
                      End
              End

--                  Produto_Id = Coalesce((Select First 1 Produto_codigo
--                                           From TbEstoque_Saldo_Diario
--                                          Where Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
--                                            and Localizacao_Codigo = NEW.LOCALIZACAO_CODIGO
--                                            and Produto_Codigo = NEW.PRODUTO_CODIGO
--                                            and Data = NEW.DATA),0);

--                  if (:produto_id = 0) then
--                      Begin
                          update or INSERT INTO TbEstoque_Saldo_Diario (
                          Estabelecimento_Codigo, Localizacao_Codigo,
                          Produto_Codigo,Data,Inventario)
                          VALUES (NEW.ESTABELECIMENTO_CODIGO,NEW.LOCALIZACAO_CODIGO,
                          NEW.PRODUTO_CODIGO,NEW.DATA,
                         (Select Coalesce(Inventario,'0') From TbProduto Where Codigo = New.Produto_Codigo))
                          MATCHING (Estabelecimento_Codigo, Localizacao_Codigo,Produto_Codigo,DATA);
--                      End
        
        /* TRANSAÇÃO DE ENTRADA/SAÃDA DE ESTOQUE  */
        
          if (:ESTOQ = '1') Then
              Begin
              if (:TIPO = 'S') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  Saldo = Saldo - NEW.QUANTIDADE,
                  T01_Saldo = T01_Saldo - NEW.T01, T02_Saldo = T02_Saldo - NEW.T02, T03_Saldo = T03_Saldo - NEW.T03, T04_Saldo = T04_Saldo - NEW.T04,
                  T05_Saldo = T05_Saldo - NEW.T05, T06_Saldo = T06_Saldo - NEW.T06, T07_Saldo = T07_Saldo - NEW.T07, T08_Saldo = T08_Saldo - NEW.T08,
                  T09_Saldo = T09_Saldo - NEW.T09, T10_Saldo = T10_Saldo - NEW.T10, T11_Saldo = T11_Saldo - NEW.T11, T12_Saldo = T12_Saldo - NEW.T12,
                  T13_Saldo = T13_Saldo - NEW.T13, T14_Saldo = T14_Saldo - NEW.T14, T15_Saldo = T15_Saldo - NEW.T15, T16_Saldo = T16_Saldo - NEW.T16,
                  T17_Saldo = T17_Saldo - NEW.T17, T18_Saldo = T18_Saldo - NEW.T18, T19_Saldo = T19_Saldo - NEW.T19, T20_Saldo = T20_Saldo - NEW.T20
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                     Saldo = Saldo - NEW.QUANTIDADE,
                     ATUALIZACAO = '0'
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
                            /*
                  if (:Custo = '1' and (NEW.Nfs_Item_Controle > 0 or NEW.Nfe_Item_Controle > 0)) then
                      Begin
                      UPDATE TbEstoque_Saldo_Diario SET ATUALIZACAO = '0'
                       WHERE Estabelecimento_Codigo = NEW.Estabelecimento_Codigo
                       --and Localizacao_Codigo = NEW.Localizacao_Codigo
                         and Produto_Codigo = NEW.Produto_codigo
                         and ATUALIZACAO = '1'
                         and Data = NEW.Data;
                      End */
        
                  end else
        
              if (:TIPO = 'E') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  Saldo = Saldo + NEW.QUANTIDADE,
                  T01_Saldo = T01_Saldo + NEW.T01, T02_Saldo = T02_Saldo + NEW.T02, T03_Saldo = T03_Saldo + NEW.T03, T04_Saldo = T04_Saldo + NEW.T04,
                  T05_Saldo = T05_Saldo + NEW.T05, T06_Saldo = T06_Saldo + NEW.T06, T07_Saldo = T07_Saldo + NEW.T07, T08_Saldo = T08_Saldo + NEW.T08,
                  T09_Saldo = T09_Saldo + NEW.T09, T10_Saldo = T10_Saldo + NEW.T10, T11_Saldo = T11_Saldo + NEW.T11, T12_Saldo = T12_Saldo + NEW.T12,
                  T13_Saldo = T13_Saldo + NEW.T13, T14_Saldo = T14_Saldo + NEW.T14, T15_Saldo = T15_Saldo + NEW.T15, T16_Saldo = T16_Saldo + NEW.T16,
                  T17_Saldo = T17_Saldo + NEW.T17, T18_Saldo = T18_Saldo + NEW.T18, T19_Saldo = T19_Saldo + NEW.T19, T20_Saldo = T20_Saldo + NEW.T20
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                     Saldo = Saldo + NEW.QUANTIDADE,
                     ATUALIZACAO = '0' 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
                   /*
                  if (:Custo = '1' and (NEW.Nfs_Item_Controle > 0 or NEW.Nfe_Item_Controle > 0)) then
                      Begin
                      UPDATE TbEstoque_Saldo_Diario SET ATUALIZACAO = '0'
                       WHERE Estabelecimento_Codigo = NEW.Estabelecimento_Codigo
                       --and Localizacao_Codigo = NEW.Localizacao_Codigo
                         and Produto_Codigo = NEW.Produto_codigo
                         and ATUALIZACAO = '1'
                         and Data = NEW.Data;
                      End
                     */
                  end 
        
              end 
        
        /* REMESSA/RECEBIMENTO PARA BENEFICIAMENTO/CONSERTO */
        
          if (:BENEF = '1' and :DOCREF = '0' and :CONSIG = '0') Then
              Begin
              if (:TIPO = 'S') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO + NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO + NEW.QUANTIDADE,
                     ATUALIZACAO = '0' 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end else
        
              if (:TIPO = 'E') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO + NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO + NEW.QUANTIDADE
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end 
        
              end else
        
        /* RETORNO DE BENEFICIAMENTO/CONSERTO COM DOC. DE REFERENCIA */
        
          if (:BENEF = '1'  and  :DOCREF = '1'  and  :CONSIG = '0') Then
              Begin
        
              if (:TIPO = 'S') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO - NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO - NEW.QUANTIDADE 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end else
        
              if (:TIPO = 'E') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO - NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO - NEW.QUANTIDADE,
                     ATUALIZACAO = '0' 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end
        
              end else
        
        /* CONSIGNAÇÃO COM DOC. DE REFERENCIA */
        
          if (:BENEF = '1'  and  :DOCREF = '1'  and  :CONSIG = '1') Then
              Begin
        
              /* VENDA DE PRODUTO CONSIGNADO*/
              if (:TIPO = 'S') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO - NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_EMTERCEIRO = SALDO_EMTERCEIRO - NEW.QUANTIDADE,
                     ATUALIZACAO = '0' 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end else
        
              /* COMPRA DE PRODUTO CONSIGNADO*/
              if (:TIPO = 'E') then
                  Begin
        
                  UPDATE TBESTOQUE_SALDO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO - NEW.QUANTIDADE 
                  Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                    and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                    and  Produto_Codigo         = NEW.PRODUTO_CODIGO;
        
                  UPDATE TBESTOQUE_SALDO_DIARIO SET
                  SALDO_DETERCEIRO = SALDO_DETERCEIRO - NEW.QUANTIDADE 
                     Where  Estabelecimento_Codigo = NEW.ESTABELECIMENTO_CODIGO
                       and  Localizacao_Codigo     = NEW.LOCALIZACAO_CODIGO
                       and  Produto_Codigo         = NEW.PRODUTO_CODIGO
                       and  Data                  >= NEW.DATA;
        
                  end
        
              end

      End

end

End