SET TERM ^ ;

CREATE OR ALTER procedure SPU_TROCA_ESTABELECIMENTO_NFE (
    NFE_ID integer,
    ESTABELECIMENTO_DESTINO integer)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable DOCUMENTO integer;
declare variable NFE_ITEM_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable T01 numeric(15,4);
declare variable T02 numeric(15,4);
declare variable T03 numeric(15,4);
declare variable T04 numeric(15,4);
declare variable T05 numeric(15,4);
declare variable T06 numeric(15,4);
declare variable T07 numeric(15,4);
declare variable T08 numeric(15,4);
declare variable T09 numeric(15,4);
declare variable T10 numeric(15,4);
declare variable T11 numeric(15,4);
declare variable T12 numeric(15,4);
declare variable T13 numeric(15,4);
declare variable T14 numeric(15,4);
declare variable T15 numeric(15,4);
declare variable T16 numeric(15,4);
declare variable T17 numeric(15,4);
declare variable T18 numeric(15,4);
declare variable T19 numeric(15,4);
declare variable T20 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_ESTOQUE char(1);
BEGIN

  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,
           P.NUMERO_NOTAFISCAL, PI.CONTROLE, PI.LOCALIZACAO_CODIGO,
           PI.PRODUTO_CODIGO, PI.TAMANHO, PI.QUANTIDADE,
           PI.T01,PI.T02,PI.T03,PI.T04,PI.T05,
           PI.T06,PI.T07,PI.T08,PI.T09,PI.T10,
           PI.T11,PI.T12,PI.T13,PI.T14,PI.T15,
           PI.T16,PI.T17,PI.T18,PI.T19,PI.T20,
           O.CONTROLE_ESTOQUE
      FROM TBNFE P, TBNFE_ITEM PI, TBNFE_ITEM_SALDO S, TBOPERACAO O
     WHERE P.CONTROLE  = PI.NFE_CONTROLE
       AND PI.CONTROLE = S.NFE_ITEM_CONTROLE
       AND P.CONTROLE  = :NFE_ID
       AND S.QUANTIDADE = PI.QUANTIDADE
       AND PI.OPERACAO_CODIGO = O.CODIGO 
    INTO
    :ESTABELECIMENTO_ID,
    :DOCUMENTO,
    :NFE_ITEM_ID,
    :LOCALIZACAO_ID,
    :PRODUTO_ID,
    :TAMANHO,
    :QUANTIDADE,
    :T01,:T02,:T03,:T04,:T05,
    :T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,
    :T16,:T17,:T18,:T19,:T20,
    :CONTROLE_ESTOQUE
    DO BEGIN

      IF (ESTABELECIMENTO_ID = ESTABELECIMENTO_DESTINO) THEN
          BEGIN
          EXCEPTION "..." 'O ESTABELECIMENTO DE DESTINO DA NFE NAO PODE SER O MESMO ESTABELECIMENTO DE ORIGEM DA NFE!';
          END

      IF (coalesce(CONTROLE_ESTOQUE,'0') = '0') THEN
          BEGIN
          EXCEPTION "..." 'A OPERACAO DOS ITENS DESSA NOTA FISCAL NÃO ATUALIZA O ESTOQUE FISICO!';
          END

        if (LOCALIZACAO_ID > 0) then
            BEGIN
            -- BAIXA SALDO DO ESTOQUE DO PRODUTO
            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, :DOCUMENTO, :PARAMETRO_122, 'S', :USUARIO_ID, :QUANTIDADE,
             :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
             :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,
             'SAIDA DE ESTOQUE POR TROCA DE ESTABELECIMENTO DA NF');

            -- 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, :DOCUMENTO, :PARAMETRO_121, 'E', :USUARIO_ID, :QUANTIDADE,
             :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
             :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,
             'ENTRADA NO ESTOQUE POR TROCA DE ESTABELECIMENTO NA NF');
            END

       END

END
^

SET TERM ; ^

