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

   HISTORICO = '';

   if (OLD.Estabelecimento_Codigo <> NEW.Estabelecimento_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Estab:'||OLD.Estabelecimento_Codigo||'->'||NEW.Estabelecimento_Codigo;
       END
   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
       USUARIO = (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO', OLD.PEDIDO, :USUARIO,
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

       if (OLD.Data_Cliente <> NEW.Data_Cliente) then
           begin

               UPDATE TBPEDIDO_HISTORICO_DATA SET ULTIMA_ALTERACAO = '0'
               WHERE PEDIDO = OLD.PEDIDO AND DATA_CAMPO = 'DATA_CLIENTE' AND ULTIMA_ALTERACAO = '1';
    
               INSERT INTO TBPEDIDO_HISTORICO_DATA (
               PEDIDO, DATA_CAMPO, DATA_ORIGEM, DATA_DESTINO, USUARIO) VALUES (
               OLD.PEDIDO, 'DATA_CLIENTE', OLD.DATA_CLIENTE, NEW.DATA_CLIENTE, :USUARIO);

           end

       if (OLD.Data_Entrega <> NEW.Data_Entrega) then
           begin

               UPDATE TBPEDIDO_HISTORICO_DATA SET ULTIMA_ALTERACAO = '0'
               WHERE PEDIDO = OLD.PEDIDO AND DATA_CAMPO = 'DATA_ENTREGA' AND ULTIMA_ALTERACAO = '1';

               INSERT INTO TBPEDIDO_HISTORICO_DATA (
               PEDIDO, DATA_CAMPO, DATA_ORIGEM, DATA_DESTINO, USUARIO) VALUES (
               OLD.PEDIDO, 'DATA_ENTREGA', OLD.DATA_ENTREGA, NEW.DATA_ENTREGA, :USUARIO);

           end

       End

end;

create or alter procedure SPU_TROCA_ESTABELECIMENTO_PED (
    ESTABELECIMENTO_ORIGEM integer,
    PEDIDO integer,
    ESTABELECIMENTO_DESTINO integer)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PED_ITEM_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable USUARIO_NOME varchar(100);
declare variable USUARIO_ID integer;
declare variable PARAMETRO_122 varchar(100);
declare variable PARAMETRO_121 varchar(100);
declare variable CONTROLE_EXTERNO integer;
BEGIN

  IF (ESTABELECIMENTO_ORIGEM = ESTABELECIMENTO_DESTINO) THEN
      BEGIN
      EXCEPTION "..." 'O ESTABELECIMENTO DE DESTINO DO PEDIDO NAO PODE SER O MESMO ESTABELECIMENTO DE ORIGEM DO PEDIDO!';
      END

  CONTROLE_EXTERNO = 0;
  IF (CONTROLE_EXTERNO = 0) THEN
      CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 ID FROM TBPEDIDO_CONSUMO WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ORIGEM AND PEDIDO_ID = :PEDIDO),0);
  IF (CONTROLE_EXTERNO = 0) THEN
      CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 TABELA_ID FROM TBREMESSA_ITEM_TRATAMENTO WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ORIGEM AND TABELA_ID = :PEDIDO),0);
  IF (CONTROLE_EXTERNO = 0) THEN
      CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 ID FROM TBREMESSA_ITEM_ALOCACAO WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ORIGEM AND TABELA_ID = :PEDIDO AND TIPO = 'P'),0);
  IF (CONTROLE_EXTERNO = 0) THEN
      CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 ID FROM TBAGRUPAMENTO_PEDIDO WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ORIGEM AND TABELA_ID = :PEDIDO),0);

  IF (CONTROLE_EXTERNO > 0) THEN
      BEGIN
      EXCEPTION "..." 'PEDIDO NAO PODE TER O ESTABELECIMENTO ALTERADO, JA EXISTEM VINCULOS DO PEDIDO COM OUTROS PROCESSOS NO SISTEMA!';
      END

  CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 P.PEDIDO FROM TBPEDIDO P
                                WHERE P.PEDIDO = :PEDIDO
                                  AND ((P.STATUS = '0') or (P.SITUACAO <> 1))),0);

  IF (CONTROLE_EXTERNO > 0) THEN
      BEGIN
      EXCEPTION "..." 'PEDIDO NAO PODE TER O ESTABELECIMENTO ALTERADO, PEDIDO ESTA INATIVO OU NAO CONFIRMADO!';
      END

  CONTROLE_EXTERNO = COALESCE((SELECT FIRST 1 PI.PEDIDO FROM TBPEDIDO_ITEM PI, TBPEDIDO_ITEM_SALDO S
                                WHERE PI.PEDIDO = :PEDIDO AND PI.CONTROLE = S.PEDIDO_ITEM_CONTROLE
                                  AND ((S.QUANTIDADE <> PI.QUANTIDADE) or (PI.SITUACAO > 1))),0);

  IF (CONTROLE_EXTERNO > 0) THEN
      BEGIN
      EXCEPTION "..." 'PEDIDO NAO PODE TER O ESTABELECIMENTO ALTERADO, JA EXISTEM ITENS ENCERRADOS OU FATURADOS!';
      END

  USUARIO_NOME  = COALESCE((SELECT MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),'');
  USUARIO_ID    = COALESCE((SELECT FIRST 1 U.CODIGO FROM TBUSUARIO U WHERE U.USUARIO = :USUARIO_NOME AND U.STATUS = '1'),0);
  PARAMETRO_122 = COALESCE((SELECT FIRST 1 C.VALOR_EXT FROM TBCONTROLE_N C, TBOPERACAO O WHERE C.ID = 122 AND O.CODIGO = C.VALOR_EXT AND O.TIPO = 'S' AND O.ESTOQUE = '1'),'');
  PARAMETRO_121 = COALESCE((SELECT FIRST 1 C.VALOR_EXT FROM TBCONTROLE_N C, TBOPERACAO O WHERE C.ID = 121 AND O.CODIGO = C.VALOR_EXT AND O.TIPO = 'E' AND O.ESTOQUE = '1'),'');

  if (USUARIO_ID = 0) then
      BEGIN
      EXCEPTION "..." 'USUARIO INVALIDO OU NAO CADASTRADO! '||USUARIO_NOME;
      END
  if (PARAMETRO_122 = '') then
      BEGIN
      EXCEPTION "..." '(P122) OPERACAO DE TRANSFERENCIA DE SAIDA INVALIDA OU NAO CADASTRADA!';
      END
  if (PARAMETRO_121 = '') then
      BEGIN
      EXCEPTION "..." '(P121) OPERACAO DE TRANSFERENCIA DE ENTRADA INVALIDA OU NAO CADASTRADA!';
      END

    FOR
    SELECT P.ESTABELECIMENTO_CODIGO,
           PI.CONTROLE, PI.LOCALIZACAO_ID,
           PI.PRODUTO_CODIGO, PI.TAMANHO, PI.QTD_EST
      FROM TBPEDIDO P, TBPEDIDO_ITEM PI, TBPEDIDO_ITEM_SALDO S
     WHERE P.PEDIDO    = PI.PEDIDO
       AND PI.CONTROLE = S.PEDIDO_ITEM_CONTROLE
       AND P.PEDIDO    = :PEDIDO
       AND P.STATUS    = '1'
       AND P.SITUACAO  = 1
       AND PI.SITUACAO = 1
       AND PI.QTD_EST  > 0
       AND PI.QTD_AGP  = 0
       AND PI.QTD_REM  = 0
       AND S.QUANTIDADE = PI.QUANTIDADE
    INTO
    :ESTABELECIMENTO_ID,
    :PED_ITEM_ID,
    :LOCALIZACAO_ID,
    :PRODUTO_ID,
    :TAMANHO,
    :QUANTIDADE
    DO BEGIN
    
        if (LOCALIZACAO_ID > 0) then
            BEGIN
            -- DESALOCA SALDO DO ITEM DO PEDIDO
            DELETE FROM TBESTOQUE_DETALHE_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND TABELA_ID =  :PEDIDO
              AND TAB_ITEM_ID = :PED_ITEM_ID
              AND TIPO = 'P';

            -- BAIXA SALDO DO ESTOQUE DO PRODUTO DESALOCADO
            INSERT INTO TBESTOQUE_TRANSACAO_ITEM
            (ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, DATA,
             TRANSACAO_CONTROLE, DOCUMENTO, OPERACAO_CODIGO, TIPO, USUARIO_CODIGO,
             QUANTIDADE, T01, T02, T03, T04, T05, T06, T07, T08, T09, T10,
                         T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, OBSERVACAO) VALUES (
             :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, CURRENT_DATE,
             1, :PEDIDO, :PARAMETRO_122, 'S', :USUARIO_ID, :QUANTIDADE,
             IIF(:TAMANHO=1,:QUANTIDADE,0),IIF(:TAMANHO=2,:QUANTIDADE,0),
             IIF(:TAMANHO=3,:QUANTIDADE,0),IIF(:TAMANHO=4,:QUANTIDADE,0),
             IIF(:TAMANHO=5,:QUANTIDADE,0),IIF(:TAMANHO=6,:QUANTIDADE,0),
             IIF(:TAMANHO=7,:QUANTIDADE,0),IIF(:TAMANHO=8,:QUANTIDADE,0),
             IIF(:TAMANHO=9,:QUANTIDADE,0),IIF(:TAMANHO=10,:QUANTIDADE,0),
             IIF(:TAMANHO=11,:QUANTIDADE,0),IIF(:TAMANHO=12,:QUANTIDADE,0),                            
             IIF(:TAMANHO=13,:QUANTIDADE,0),IIF(:TAMANHO=14,:QUANTIDADE,0),                           
             IIF(:TAMANHO=15,:QUANTIDADE,0),IIF(:TAMANHO=16,:QUANTIDADE,0),
             IIF(:TAMANHO=17,:QUANTIDADE,0),IIF(:TAMANHO=18,:QUANTIDADE,0),
             IIF(:TAMANHO=19,:QUANTIDADE,0),IIF(:TAMANHO=20,:QUANTIDADE,0),
             'SAIDA DE ESTOQUE POR TROCA DE ESTABELECIMENTO NO PEDIDO');

            -- ENTRADA NO SALDO DO ESTOQUE DO PRODUTO A SER ALOCADO NO NOVO ESTABELECIMENTO
            INSERT INTO TBESTOQUE_TRANSACAO_ITEM
            (ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, DATA,
             TRANSACAO_CONTROLE, DOCUMENTO, OPERACAO_CODIGO, TIPO, USUARIO_CODIGO,
             QUANTIDADE, T01, T02, T03, T04, T05, T06, T07, T08, T09, T10,
                         T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, OBSERVACAO) VALUES (
             :ESTABELECIMENTO_DESTINO, :LOCALIZACAO_ID, :PRODUTO_ID, CURRENT_DATE,
             1, :PEDIDO, :PARAMETRO_121, 'E', :USUARIO_ID, :QUANTIDADE,
             IIF(:TAMANHO=1,:QUANTIDADE,0),IIF(:TAMANHO=2,:QUANTIDADE,0),
             IIF(:TAMANHO=3,:QUANTIDADE,0),IIF(:TAMANHO=4,:QUANTIDADE,0),
             IIF(:TAMANHO=5,:QUANTIDADE,0),IIF(:TAMANHO=6,:QUANTIDADE,0),
             IIF(:TAMANHO=7,:QUANTIDADE,0),IIF(:TAMANHO=8,:QUANTIDADE,0),
             IIF(:TAMANHO=9,:QUANTIDADE,0),IIF(:TAMANHO=10,:QUANTIDADE,0),
             IIF(:TAMANHO=11,:QUANTIDADE,0),IIF(:TAMANHO=12,:QUANTIDADE,0),
             IIF(:TAMANHO=13,:QUANTIDADE,0),IIF(:TAMANHO=14,:QUANTIDADE,0),
             IIF(:TAMANHO=15,:QUANTIDADE,0),IIF(:TAMANHO=16,:QUANTIDADE,0),
             IIF(:TAMANHO=17,:QUANTIDADE,0),IIF(:TAMANHO=18,:QUANTIDADE,0),
             IIF(:TAMANHO=19,:QUANTIDADE,0),IIF(:TAMANHO=20,:QUANTIDADE,0),
             'ENTRADA NO ESTOQUE POR TROCA DE ESTABELECIMENTO NO PEDIDO');
            END

       END

     -- ALTERA O ESTABELECIMENTO DO PEDIDO
     UPDATE TBPEDIDO SET ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_DESTINO WHERE PEDIDO = :PEDIDO;
     UPDATE TBPEDIDO_ITEM SET ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_DESTINO WHERE PEDIDO = :PEDIDO;

END;

ALTER TABLE TBPERFIL_PEDIDO_USUARIOS
ADD TRANSF_ESTABELECIMENTO VARCHAR(1) CHARACTER SET UTF8 
DEFAULT 0 
COLLATE UTF8;

UPDATE TBPERFIL_PEDIDO_USUARIOS SET TRANSF_ESTABELECIMENTO = 0;
