SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_processado_b3u for tbremessa_item_processado
active before update position 5
AS
Declare variable LOCALIZACAO_PROCESSO integer;
Declare variable ESTOQUE_ID integer;
Declare variable ESTOQUE_BAIXA_ID integer;
Declare variable ESTOQUE_QUANTIDADE numeric(15,4);
Declare variable perfil_up varchar(10);
Declare variable ccusto varchar(50);
Declare variable RREMESSA integer;
Declare variable WEB Char(1);
declare variable SALDO_TESTE NUMERIC(15,4);
Begin

  WEB = Coalesce((Select First 1 R.WEB From TbRemessa R Where R.Numero = New.Remessa),'0');

	--Registra no estoque WIP o bojo cortado - para remessas do GC-WEB
	--Baixa do WIP os componentes (EDC)
	IF (COALESCE(WEB,'0') = '1') THEN
    Begin

          If (NEW.FAMILIA_CODIGO > 0) then
              BEGIN

                fn_set_context('GP_ESTOQUE', new.programacao_esteira);

                if ((Old.Situacao = 1 and New.Situacao = 2) or
                    (Old.Situacao = 2 and New.Situacao = 1)) Then
                    Begin
        
                    LOCALIZACAO_PROCESSO = Coalesce((Select First 1 Localizacao_Processo From TbFamilia_Ficha
                                                      Where Familia_Codigo = Old.Familia_Codigo
                                                        and Estabelecimento_Codigo = Old.Estabelecimento_Codigo),0);
        

                    if (LOCALIZACAO_PROCESSO > 0) then
                        Begin
        
                                --Entra no Estoque em Processo
                                If (Old.Situacao = 1 and New.Situacao = 2 and Coalesce(OLD.ESTOQUE_ID,0) = 0) Then
                                    Begin

                                    RREMESSA = coalesce((select first 1 r.remessa_id from vwremessa r where r.remessa = '1R'||NEW.REMESSA),0);

                                    if (OLD.CONTROLE < 6000 and NEW.QUANTIDADE > 0 and RREMESSA = 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                        BEGIN
                                            ESTOQUE_ID = Coalesce((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                                            perfil_up  = coalesce((select first 1 u.perfil from tbup u where u.id = new.up_id),'');
                                            CCUSTO     = (SELECT FIRST 1 U.CCUSTO FROM TBUP U WHERE U.ID = new.up_id);

                                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                                                5,
                                                100, --GP: CORTE
                                                'U',--:perfil_up,
                                                new.familia_codigo,
                                                new.localizacao_id,
                                                'TBREMESSA_ITEM_PROCESSADO',
                                                0,
                                                new.id,
                                                new.estabelecimento_codigo,
                                                NEW.DATA_PRODUCAO,
                                                new.produto_codigo,
                                                new.tamanho,
                                                new.quantidade,
                                                'E',
                                                '0',
                                                :CCUSTO,
                                                'Talao: ' || COALESCE(FN_LPAD(NEW.CONTROLE,4,0),''),
                                                :ESTOQUE_ID,
                                                NEW.REMESSA,
                                                OLD.ID
                                            );
     
                                            NEW.ESTOQUE_ID = :ESTOQUE_ID;
                                        End

                                    UPDATE VWREMESSA_CONSUMO RC SET
                                    RC.Quantidade_consumo = RC.quantidade,
                                    RC.quantidade_alternativa_consumo = RC.quantidade_alternativa,
                                    RC.datahora_conferencia = NEW.DATA_PRODUCAO,
                                    RC.status = '1'
                                    Where RC.estabelecimento_id = NEW.ESTABELECIMENTO_CODIGO
                                      AND RC.REMESSA_ID = NEW.REMESSA
                                      AND RC.remessa_talao_id = NEW.CONTROLE;

                            End Else
                        --Exclui do Estoque em Processo
                        If (Old.Situacao = 2 and New.Situacao = 1 and Old.Estoque_Id > 0) Then
                            Begin

                                 NEW.ESTOQUE_ID = 0;
    
                                 DELETE FROM TbEstoque_Transacao_Item
                                  WHERE TRANSACAO_CONTROLE     = 0
                                    AND CONTROLE               = OLD.ESTOQUE_ID
                                    AND ESTABELECIMENTO_CODIGO = OLD.ESTABELECIMENTO_CODIGO
                                    AND LOCALIZACAO_CODIGO     = :LOCALIZACAO_PROCESSO
                                    AND PRODUTO_CODIGO         = OLD.PRODUTO_CODIGO;
    
                                UPDATE VWREMESSA_CONSUMO RC SET
                                RC.Quantidade_consumo = 0,
                                RC.quantidade_alternativa_consumo = 0,
                                RC.datahora_conferencia = null,
                                RC.status = '0'
                                Where RC.estabelecimento_id = NEW.ESTABELECIMENTO_CODIGO
                                  AND RC.REMESSA_ID = NEW.REMESSA
                                  AND RC.remessa_talao_id = NEW.CONTROLE;

                                --lancamento para reverter baixa de talao encerrado, isso calsava saldo
                                --negativo para o talao depois de reaberto e registrado novamente
                                for
                                    select distinct
                                        i.controle
                                    from tbestoque_transacao_item i, tbpedido_item_processado l
                                    where i.documento                   = l.remessa
                                    and i.remessa_item_controle         = l.remessa_acumulado_controle
                                    AND i.ESTABELECIMENTO_CODIGO        = l.estabelecimento_codigo
                                    AND i.LOCALIZACAO_CODIGO            = :LOCALIZACAO_PROCESSO
                                    AND i.PRODUTO_CODIGO                = l.produto_codigo
                                    and l.remessa                       = new.remessa
                                    and l.remessa_acumulado_controle    = new.controle
                                    and i.tipo                          = 'S'
                                    and l.situacao = 6
                                into
                                    :ESTOQUE_BAIXA_ID
                                do begin

                                    execute procedure SPI_EMAIL(
                                        'anderson@delfa.com.br',
                                        'Atenção - Excluir baixa para talão encerrado',
                                        'Remessa:'||new.remessa||', Talão:'||new.controle||', Estoque ID:'||:ESTOQUE_BAIXA_ID||'<br>Data:'||formatdatetime(current_timestamp)||'<br>Usuário:'||fn_current_user_id()||'-'||current_user,
                                        1,
                                        0
                                    );

                                    DELETE FROM TbEstoque_Transacao_Item where controle = :ESTOQUE_BAIXA_ID;
                                end

                            End
                        End

                    End
        
        
                if (Old.Situacao = New.Situacao and Old.Estoque_Id > 0 and NEW.QUANTIDADE <> OLD.QUANTIDADE) Then
                    Begin
        
                    LOCALIZACAO_PROCESSO = Coalesce((Select First 1 Localizacao_Processo From TbFamilia_Ficha
                                                      Where Familia_Codigo = Old.Familia_Codigo
                                                        and Estabelecimento_Codigo = Old.Estabelecimento_Codigo),0);
        
        
                       if (LOCALIZACAO_PROCESSO > 0) then
                           Begin

                                if (OLD.CONTROLE < 8000 and NEW.QUANTIDADE > 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                BEGIN

                                    ESTOQUE_ID = Coalesce((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                                    perfil_up  = coalesce((select first 1 u.perfil from tbup u where u.id = new.up_id),'');
                                    CCUSTO     = (SELECT FIRST 1 U.CCUSTO FROM TBUP U WHERE U.ID = new.up_id);

                                    SALDO_TESTE = FN_ESTOQUE_SALDO_DISPONIVEL(new.estabelecimento_codigo,:LOCALIZACAO_PROCESSO,new.produto_codigo,new.tamanho);
--                                    EXCEPTION "..." LOCALIZACAO_PROCESSO;
                                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                                        5,
                                        100, -- GP: CORTE
                                        'U',--:perfil_up,
                                        new.familia_codigo,
                                        :LOCALIZACAO_PROCESSO,
                                        'TBREMESSA_ITEM_PROCESSADO',
                                        0,
                                        new.id,
                                        new.estabelecimento_codigo,
                                        NEW.DATA_PRODUCAO,
                                        new.produto_codigo,
                                        new.tamanho,
                                        new.quantidade,
                                        'E',
                                        '0',
                                        :CCUSTO,
                                        'Entra no Estoque em Processo',
                                        :ESTOQUE_ID,
                                        NEW.REMESSA,
                                        old.controle
                                    );

                                    NEW.ESTOQUE_ID = :ESTOQUE_ID;

                                END else
                                if (OLD.CONTROLE < 8000 and NEW.QUANTIDADE <= 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                    begin
                                    NEW.ESTOQUE_ID = 0;
                                    end

                                if (OLD.CONTROLE < 8000) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                    BEGIN
                                  --Exclui do Estoque em Processo
                                     DELETE FROM TbEstoque_Transacao_Item
                                      WHERE TRANSACAO_CONTROLE     = 0
                                        AND CONTROLE               = OLD.ESTOQUE_ID
                                        AND ESTABELECIMENTO_CODIGO = OLD.ESTABELECIMENTO_CODIGO
                                        AND LOCALIZACAO_CODIGO     = :LOCALIZACAO_PROCESSO
                                        AND PRODUTO_CODIGO         = OLD.PRODUTO_CODIGO;
                                    End
        
                           End
                    End
        
      End

      End
End
^

SET TERM ; ^

