SET TERM ^ ;

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

            -- ATUALIZA CAMPO DE BLOQUEIO PARA DESABILITAR TRIGGER
            UPDATE TBPEDIDO_ITEM
                SET ALTERANDO_CONFERENCIA = 1
                WHERE PEDIDO = :PEDIDO
                AND CONTROLE = :PED_ITEM_ID;

            -- 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


            -- ATUALIZA CAMPO DE BLOQUEIO PARA HABILITAR TRIGGER
            UPDATE TBPEDIDO_ITEM
                SET ALTERANDO_CONFERENCIA = 0
                WHERE PEDIDO = :PEDIDO
                AND CONTROLE = :PED_ITEM_ID;

       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
^

SET TERM ; ^

