CREATE OR ALTER PROCEDURE SPI_NF_CONTABIL (
    ORIGEM VARCHAR(3),
    NF_ID INTEGER,
    TRAVAR_SE_FALHAR CHAR(1) = '1')
RETURNS (
    ESTABELECIMENTO_ID INTEGER,
    NUMERO_NOTAFISCAL INTEGER,
    DATA DATE,
    HISTORICO_CONTABIL VARCHAR(100),
    CONTA_DEBITO VARCHAR(50),
    CONTA_CREDITO VARCHAR(50),
    VALOR NUMERIC(18,2),
    VFALHAS VARCHAR(50))
AS
DECLARE VARIABLE IDCONTMOV INTEGER = 0;
BEGIN

      /*EXCLUI CONTABILIZACAO DO DOCUMENTO FISCAL, SE HOUVER*/
   --   if (ORIGEM in ('NFE','NFS')) Then
          BEGIN
          FOR SELECT DISTINCT
                     B.IDCONTMOV
                FROM TBMOVCONTABIL B
               WHERE B.IDDOCUMENTO = :NF_ID
                 AND B.CODORIGEM   = :ORIGEM
                INTO :IDCONTMOV
                  DO BEGIN
                     DELETE FROM TBMOVCONTMESTRE WHERE ID = :IDCONTMOV;
                     DELETE FROM TBMOVCONTABIL   WHERE IDCONTMOV = :IDCONTMOV;
                     END
          END

      IDCONTMOV = 0;

      /*CONULTA A CONTABILIZACAO DA NOTA FISCAL, CONFORME REGRAS DEFINIDAS NAS OPERACOES DOS ITENS E PARCELAS*/
      FOR SELECT
                ESTABELECIMENTO_ID,
                NUMERO_NOTAFISCAL,
                DATA,                                                        
                HISTORICO_CONTABIL,
                CONTA_DEBITO,
                CONTA_CREDITO,
                VALOR,
                VFALHAS
            FROM SP_NF_CONTABIL (:ORIGEM,:NF_ID)
            ORDER BY VFALHAS DESC
      INTO :ESTABELECIMENTO_ID, :NUMERO_NOTAFISCAL, :DATA, :HISTORICO_CONTABIL, :CONTA_DEBITO, :CONTA_CREDITO, :VALOR, :VFALHAS
      DO BEGIN
           IF (:VALOR > 0) THEN
               BEGIN

                IF (:VFALHAS <> '') THEN
                    BEGIN
                    if (TRAVAR_SE_FALHAR = '1') then
                        BEGIN
                          EXCEPTION "..." 'FALHA NA CONTABILIZACAO DESSE DOCUMENTO:'||ASCII_CHAR(13)||:VFALHAS;
                          EXIT;
                        END
                    END ELSE
                    BEGIN

                        if (ORIGEM = 'CFI') Then
                            Begin -- Lancamento Multiplo
                            if (IDCONTMOV = 0) then
                                BEGIN
                                IDCONTMOV = GEN_ID(GTBMOVCONTMESTRE,1);
                               -- exception "..." IDCONTMOV;
                                INSERT INTO TBMOVCONTMESTRE (ID, CODESTABELECIMENTO, DATA) VALUES (:IDCONTMOV, :ESTABELECIMENTO_ID, :DATA);
                                UPDATE TBPDV_CFE CF SET CF.CONTABILIZACAO_ID = :IDCONTMOV WHERE ID = :NF_ID;
                                END
                            End else
                        if (ORIGEM in ('NFE','NFS')) Then
                            Begin -- Varios Pares de Lancamentos Simples
                                IDCONTMOV = GEN_ID(GTBMOVCONTMESTRE,1);
                                INSERT INTO TBMOVCONTMESTRE (ID, CODESTABELECIMENTO, DATA) VALUES (:IDCONTMOV, :ESTABELECIMENTO_ID, :DATA);
                            End

                        /*PROCESSA CONTABILIZACAO DA NOTA FISCAL, CONFORME CONSULTA ANTERIOR*/
                        INSERT INTO TBMOVCONTABIL (CODESTABELECIMENTO, IDCONTMOV, DATA, NATUREZA, IDDOCUMENTO, DESCRICAO,
                                                   CODORIGEM, HISTORICO, CONTA, VALOR, HISTORICO_DRE)
                                          VALUES (:ESTABELECIMENTO_ID, :IDCONTMOV, :DATA, 'D', :NF_ID, LPAD(:NUMERO_NOTAFISCAL,10,'0'), :ORIGEM,
                                                  :HISTORICO_CONTABIL, :CONTA_DEBITO, :VALOR, '');
                        INSERT INTO TBMOVCONTABIL (CODESTABELECIMENTO, IDCONTMOV, DATA, NATUREZA, IDDOCUMENTO, DESCRICAO,
                                                   CODORIGEM, HISTORICO, CONTA, VALOR, HISTORICO_DRE)
                                          VALUES (:ESTABELECIMENTO_ID, :IDCONTMOV, :DATA, 'C', :NF_ID, LPAD(:NUMERO_NOTAFISCAL,10,'0'), :ORIGEM,
                                                  :HISTORICO_CONTABIL, :CONTA_CREDITO, :VALOR, '');
                    END
              

               END
         END
         SUSPEND;

END;