SET TERM ^ ;
CREATE OR ALTER TRIGGER TTBPDV_DEVOLUCAO_TROCA_B03U FOR TBPDV_DEVOLUCAO_TROCA
ACTIVE BEFORE UPDATE POSITION 1
AS
DECLARE VARIABLE DOCUMENTO          VARCHAR(50);
DECLARE VARIABLE ITEM_DEVOLUCAO     VARCHAR(50);
DECLARE VARIABLE ESTABELECIMENTO    VARCHAR(50);
DECLARE VARIABLE NF_CONTROLE        INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE CLIENTE            VARCHAR(100);
DECLARE VARIABLE SALDO_SOMA         NUMERIC(15,8);

BEGIN
  IF(NEW.TIPO_ED IS DISTINCT FROM OLD.TIPO_ED) THEN
  BEGIN
      --SE NOVO TIPO FOR DEVOLUÇÃO
      IF(NEW.TIPO_ED = 1)THEN
      BEGIN
        SALDO_SOMA = CAST(COALESCE((SELECT SUM(B.VALOR_LIQUIDO) FROM TBPDV_DEVOLUCAO_TROCA_ITEM B WHERE B.PDV_DEVOLUCAO_ID = NEW.ID),0) AS NUMERIC(15,2));
        IF(NEW.VALOR_SALDO <> SALDO_SOMA)THEN
        BEGIN
           EXCEPTION "..." 'SALDO DA DEVOLUCAO UTILIZADO, OPERACAO CANCELADA.';
        END
        
        FOR
          SELECT
            Q.CONTROLE               AS NF_CONTROLE,
            Q.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID
        
            FROM TBNFE_ITEM X, TBNFS N, TBPDV_DEVOLUCAO_TROCA_ITEM PDTI, TBNFE_ITEM_SALDO XS, TBNFE Q, TBNF_DEVOLUCAO QD
            WHERE N.CONTROLE             = PDTI.DOCUMENTO_CONTROLE
            AND N.NUMERO_NOTAFISCAL      = X.NFS
            AND PDTI.CLIENTE_ID          = X.EMPRESA_CODIGO
            AND X.ESTABELECIMENTO_CODIGO = N.ESTABELECIMENTO_CODIGO
            AND X.SEQUENCIA              = PDTI.ITEM_SEQUENCIA
            AND Q.CONTROLE               = X.NFE_CONTROLE
            AND X.CONTROLE               = XS.NFE_ITEM_CONTROLE
            AND X.NFE_CONTROLE           = XS.NFE_CONTROLE
            AND PDTI.PDV_DEVOLUCAO_ID    = NEW.ID
            AND QD.NFE_ID                = Q.CONTROLE
            AND QD.ESTABELECIMENTO_ID    = Q.ESTABELECIMENTO_CODIGO
            AND QD.NFS_ID                = 0
            AND Q.SITUACAO IN (1,2)

           INTO :NF_CONTROLE, :ESTABELECIMENTO_ID DO
           BEGIN
                DELETE FROM TBNF_DEVOLUCAO Z WHERE Z.NFE_ID = :NF_CONTROLE AND Z.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND Z.NFS_ID = 0;
           END

        FOR
          SELECT
            Q.CONTROLE               AS NF_CONTROLE,
            Q.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID
        
        
            FROM TBNFE_ITEM X, TBNFE Q, TBPDV_CFE_ITEM K, TBPDV_DEVOLUCAO_TROCA_ITEM T, TBPDV_CFE C, TBNFE_ITEM_SALDO XS, TBNF_DEVOLUCAO QD
            WHERE X.PDV_CFE_ITEM_ID      =  K.ID
            AND X.NFE_CONTROLE           =  Q.CONTROLE
            AND T.CLIENTE_ID             =  X.EMPRESA_CODIGO
            AND X.ESTABELECIMENTO_CODIGO =  C.ESTABELECIMENTO_ID
            AND K.PDV_CFE_ID             =  T.DOCUMENTO_CONTROLE
            AND T.ITEM_ID                =  X.PDV_CFE_ITEM_ID
            AND K.SEQUENCIA              =  T.ITEM_SEQUENCIA
            AND T.PDV_DEVOLUCAO_ID       =  NEW.ID
            AND C.ID                     =  T.DOCUMENTO_CONTROLE
            AND XS.NFE_ITEM_CONTROLE     =  X.CONTROLE
            AND XS.NFE_CONTROLE          =  X.NFE_CONTROLE
            AND QD.NFE_ID                =  Q.CONTROLE
            AND QD.NFS_ID                = 0
            AND QD.ESTABELECIMENTO_ID    = Q.ESTABELECIMENTO_CODIGO
            AND Q.SITUACAO IN (1,2)
           INTO :NF_CONTROLE, :ESTABELECIMENTO_ID DO
           BEGIN
                DELETE FROM TBNF_DEVOLUCAO Z WHERE Z.NFE_ID = :NF_CONTROLE AND Z.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND Z.NFS_ID = 0;
           END
      END

      --SE NOVO TIPO FOR TROCA
      IF(NEW.TIPO_ED = 2)THEN
      BEGIN
        FOR
          SELECT FIRST 1
            FN_LPAD(PDTI.ID, 5, 0) AS ITEM_DEVOLUCAO,
            COALESCE((SELECT FIRST 1 FN_LPAD(N.EMPRESA_CODIGO,5,'0')||' - '||D.RAZAOSOCIAL FROM TBCLIENTE C, TBEMPRESA D WHERE C.CODIGO = N.EMPRESA_CODIGO AND C.CODIGO = D.CODIGO),'') AS CLIENTE,
            FN_LPAD(N.NUMERO_NOTAFISCAL,7,0) AS DOCUMENTO,
            FN_LPAD(Q.ESTABELECIMENTO_CODIGO,3,0) AS ESTABELECIMENTO
        
            FROM TBNFE_ITEM X, TBNFS N, TBPDV_DEVOLUCAO_TROCA_ITEM PDTI, TBNFE_ITEM_SALDO XS, TBNFE Q, TBNF_DEVOLUCAO QD
            WHERE N.CONTROLE             = PDTI.DOCUMENTO_CONTROLE
            AND N.NUMERO_NOTAFISCAL      = X.NFS
            AND PDTI.CLIENTE_ID          = X.EMPRESA_CODIGO
            AND X.ESTABELECIMENTO_CODIGO = N.ESTABELECIMENTO_CODIGO
            AND X.SEQUENCIA              = PDTI.ITEM_SEQUENCIA
            AND Q.CONTROLE               = X.NFE_CONTROLE
            AND X.CONTROLE               = XS.NFE_ITEM_CONTROLE
            AND X.NFE_CONTROLE           = XS.NFE_CONTROLE
            AND PDTI.PDV_DEVOLUCAO_ID    = NEW.ID
            AND QD.NFE_ID                = Q.CONTROLE
            AND QD.ESTABELECIMENTO_ID    = Q.ESTABELECIMENTO_CODIGO
            AND QD.NFS_ID                = 0
            AND Q.SITUACAO IN (1,2)

           INTO :ITEM_DEVOLUCAO, :CLIENTE, :DOCUMENTO, :ESTABELECIMENTO DO
           BEGIN
              EXCEPTION "..." 'EST.'||:ESTABELECIMENTO||'NF.'||:DOCUMENTO||', POSSUI LANCAMENTOS DE DEVOLUCAO, OPERACAO CANCELADA!';
           END

        FOR
          SELECT FIRST 1 FN_LPAD(T.ID, 5, 0) AS ITEM_DEVOLUCAO,
            COALESCE((SELECT FIRST 1 FN_LPAD(C.CLIENTE_ID,5,'0')||' - '||D.RAZAOSOCIAL FROM TBCLIENTE CI, TBEMPRESA D WHERE CI.CODIGO = C.CLIENTE_ID AND CI.CODIGO = D.CODIGO),'') AS CLIENTE,
            FN_LPAD(C.NUMERO_CFE,7,0) AS DOCUMENTO,
            FN_LPAD(Q.ESTABELECIMENTO_CODIGO,3,0) AS ESTABELECIMENTO
        
            FROM TBNFE_ITEM X, TBNFE Q, TBPDV_CFE_ITEM K, TBPDV_DEVOLUCAO_TROCA_ITEM T, TBPDV_CFE C, TBNFE_ITEM_SALDO XS, TBNF_DEVOLUCAO QD
            WHERE X.PDV_CFE_ITEM_ID      =  K.ID
            AND X.NFE_CONTROLE           =  Q.CONTROLE
            AND T.CLIENTE_ID             =  X.EMPRESA_CODIGO
            AND X.ESTABELECIMENTO_CODIGO =  C.ESTABELECIMENTO_ID
            AND K.PDV_CFE_ID             =  T.DOCUMENTO_CONTROLE
            AND T.ITEM_ID                =  X.PDV_CFE_ITEM_ID
            AND K.SEQUENCIA              =  T.ITEM_SEQUENCIA
            AND T.PDV_DEVOLUCAO_ID       =  NEW.ID
            AND C.ID                     =  T.DOCUMENTO_CONTROLE
            AND XS.NFE_ITEM_CONTROLE     =  X.CONTROLE
            AND XS.NFE_CONTROLE          =  X.NFE_CONTROLE
            AND QD.NFE_ID                =  Q.CONTROLE
            AND QD.NFS_ID                = 0
            AND QD.ESTABELECIMENTO_ID    = Q.ESTABELECIMENTO_CODIGO
            AND Q.SITUACAO IN (1,2)
            INTO :ITEM_DEVOLUCAO, :CLIENTE, :DOCUMENTO, :ESTABELECIMENTO DO
            BEGIN
               EXCEPTION "..." 'EST.'||:ESTABELECIMENTO||'CF.'||:DOCUMENTO||', POSSUI LANCAMENTOS DE DEVOLUCAO, OPERACAO CANCELADA!';
            END

          /*CORRIGIR SALDO SE ACASO A TROCA FOR LANCADA ERRONEAMENTE COMO DEVOLUCAO*/
          IF(OLD.TIPO_ED = 1)THEN
          BEGIN
              NEW.VALOR_SALDO = CAST(COALESCE((SELECT SUM(B.VALOR_LIQUIDO) FROM TBPDV_DEVOLUCAO_TROCA_ITEM B WHERE B.PDV_DEVOLUCAO_ID = NEW.ID),0) AS NUMERIC(15,2));
          END

      END
  END
END
^ SET TERM ; ^