CREATE OR ALTER PROCEDURE SP_FORMA_PAGAMENTO_CARTAO (
    ORIGEM VARCHAR(3),
    DOCUMENTO_ID INTEGER = NULL,
    REGISTRAR_TABELA INTEGER = NULL)
RETURNS (
    DOCUMENTO_TIPO VARCHAR(3),
    DOCUMENTO INTEGER,
    PAGAMENTO_FORMA_ID INTEGER,
    PARCELA INTEGER,
    VALOR DECIMAL(15,2),
    TARIFA DECIMAL(15,4),
    VALOR_LIQUIDO DECIMAL(15,2),
    NSU VARCHAR(50),
    ADQUIRENTE_ID INTEGER,
    BANDEIRA_CARTAO VARCHAR(100),
    CODIGO_AUTORIZACAO VARCHAR(50),
    CONCILIACAO VARCHAR(1))
AS
DECLARE VARIABLE PARCELA_CONTROLE       INTEGER;
DECLARE VARIABLE FORMA_PAGAMENTO_ID     INTEGER;
DECLARE VARIABLE NEW_FORMA_PAGAMENTO_ID INTEGER;
DECLARE VARIABLE DOCUMENTO_CONTROLE     INTEGER;
DECLARE VARIABLE TIMES                  INTEGER;
DECLARE VARIABLE ULTIMA_SEQUENCIA       INTEGER;
DECLARE VARIABLE SEQUENCIA              INTEGER;
DECLARE VARIABLE PDV_CFE_ID             INTEGER;
DECLARE VARIABLE OLD_DOCUMENTO_CONTROLE INTEGER;
BEGIN
  IF(:REGISTRAR_TABELA IS NULL) THEN
  BEGIN
    
       IF(:ORIGEM = 'CFE')THEN
       BEGIN
         FOR
           SELECT
                'CFE' AS DOCUMENTO_TIPO,
                A.PDV_CFE_ID AS DOCUMENTO,
                A.PAGAMENTO_FORMA_ID,
                B.PARCELA,
                A.VALOR,
                0 AS TARIFA,
                A.VALOR_LIQUIDO,
                A.NSU,
                A.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
                
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                INNER JOIN TBNFS_PARCELAMENTO B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                INNER JOIN TBPAGAMENTO_FORMA  C ON C.CODIGO = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' or C.NFE_TIPPAG = '04')
                INNER JOIN TBCARTAO_BANDEIRA  D ON D.DESCRICAO = A.BANDEIRA_CARTAO
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL AND B.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.PDV_CFE_ID = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
            DO BEGIN
               SUSPEND;
            END
       END
    
       IF(:ORIGEM = 'NFS')THEN
       BEGIN
          FOR
            SELECT
                'NFS' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.PARCELA,
                A.VALOR,
                0 AS TARIFA,
                (A.VALOR) - (A.VALOR_DESCONTO) AS VALOR_LIQUIDO,
                A.NSU,
                E.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
                
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID

            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
         DO BEGIN
            SUSPEND;
         END
       END
    
       IF(:ORIGEM = 'AVU')THEN
       BEGIN
           FOR
            SELECT
                'AVU' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.PARCELA,
                A.VALOR,
                0 AS TARIFA,
                (A.VALOR) - (A.VALOR_DESCONTO) AS VALOR_LIQUIDO,
                A.NSU,
                E.ADQUIRENTE_ID,
                A.BANDEIRA_ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
            
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 1
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
            DO BEGIN
                SUSPEND;
            END
       END
    
    END

    IF(:REGISTRAR_TABELA > 0) THEN
    BEGIN
    
       IF(:ORIGEM = 'CFE')THEN
       BEGIN

         DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

         FOR
            SELECT
            --    A.ID,
                'CFE' AS DOCUMENTO_TIPO,
                A.PDV_CFE_ID AS DOCUMENTO,
                A.PAGAMENTO_FORMA_ID,
                A.NSU,
                COUNT(B.CONTROLE) AS PARCELAS,
                MAX(A.VALOR) AS VALOR,
                sum(B.VALOR_DESCONTO) AS TARIFA,
                MAX(A.VALOR_LIQUIDO) AS VALOR_LIQUIDO,
                A.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO,
                ROW_NUMBER() OVER (ORDER BY A.ID) AS SEQUENCIA
                
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                INNER JOIN TBNFS_PARCELAMENTO B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                INNER JOIN TBPAGAMENTO_FORMA  C ON C.CODIGO = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' or C.NFE_TIPPAG = '04')
                INNER JOIN TBCARTAO_BANDEIRA  D ON D.DESCRICAO = A.BANDEIRA_CARTAO
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL AND B.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.PDV_CFE_ID = :DOCUMENTO_ID)
            GROUP BY A.ID, A.PDV_CFE_ID, A.PAGAMENTO_FORMA_ID, A.NSU, A.CODIGO_AUTORIZACAO, A.ADQUIRENTE_ID, D.ID
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO, :SEQUENCIA
            DO BEGIN
               
                 UPDATE OR INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        TARIFA,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :TARIFA,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO
                    )
                    MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);
            END

            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             FOR SELECT
                    A.PDV_CFE_ID,
                    A.ID,
                    COUNT(B.CONTROLE) AS PARCELAS
                    
                    FROM TBPDV_CFE_FORMA_PAGAMENTO A
                    INNER JOIN TBNFS_PARCELAMENTO B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                    WHERE (:DOCUMENTO_ID IS NULL or A.PDV_CFE_ID = :DOCUMENTO_ID)
                    GROUP BY A.PDV_CFE_ID,A.ID, A.PAGAMENTO_FORMA_ID
                    INTO :PDV_CFE_ID,:DOCUMENTO_CONTROLE,:PARCELA DO
                    BEGIN
                         :SEQUENCIA = 0;
                         IF(:OLD_DOCUMENTO_CONTROLE <> :PDV_CFE_ID AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                         BEGIN
                           :ULTIMA_SEQUENCIA = 0;
                           :times            = 0;
                         END
                         :times     = :times+1;
                         FOR
                         SELECT A.CONTROLE
                            FROM TBNFS_PARCELAMENTO A
                            WHERE A.PDV_CFE_FORMA_PAGAMENTO_ID = :DOCUMENTO_CONTROLE
                            ORDER BY A.PARCELA
                            INTO :PARCELA_CONTROLE DO
                            BEGIN
                                IF(:SEQUENCIA = 0)THEN
                                BEGIN
                                  :SEQUENCIA = 1;
                                END
                                IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                                BEGIN
                                  :SEQUENCIA = :PARCELA+1;
                                  IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                                  BEGIN
                                  :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                                  END
                                END
    
                                UPDATE TBNFS_PARCELAMENTO SET SEQUENCIA = :SEQUENCIA WHERE CONTROLE = :PARCELA_CONTROLE;
                                :ULTIMA_SEQUENCIA = :SEQUENCIA;
                                :SEQUENCIA = :SEQUENCIA+1;
                            END
    
                       :OLD_DOCUMENTO_CONTROLE = :PDV_CFE_ID;
                    END
       END
    
       IF(:ORIGEM = 'NFS')THEN
       BEGIN
          DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

          FOR
             SELECT
                'NFS' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.NSU,
                count(A.PARCELA),
                sum(A.VALOR),
                sum(A.VALOR_DESCONTO) AS TARIFA,
                sum(A.VALOR) - sum(A.VALOR_DESCONTO) AS VALOR_LIQUIDO,

                E.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
                
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
            
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            
            GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
         DO BEGIN
            
                 UPDATE OR INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        TARIFA,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :TARIFA,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO
                    )
                    MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);

             END
            
            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             FOR
                SELECT
                    A.NFS_CONTROLE AS DOCUMENTO,
                    count(A.PARCELA) AS PARCELAS,
                    F.ID
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA AND F.NSU = A.NSU AND F.ADQUIRENTE_ID = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO = D.ID AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                
                WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                AND A.AVULSO = 0
                AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                
                GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO, f.id
                INTO :DOCUMENTO_CONTROLE, :PARCELA, :FORMA_PAGAMENTO_ID DO
                BEGIN
                 :SEQUENCIA        = 1;
                 IF(:OLD_DOCUMENTO_CONTROLE <> :DOCUMENTO_CONTROLE AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                 BEGIN
                   :ULTIMA_SEQUENCIA = 0;
                   :times            = 0;
                 END
                 :times            = :times+1;

                 FOR
                 SELECT A.CONTROLE ,f.id
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA AND F.NSU = A.NSU AND F.ADQUIRENTE_ID = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO = D.ID AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                    AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                    AND A.AVULSO = 0
                    AND (A.NFS_CONTROLE = :DOCUMENTO_CONTROLE)
                    AND F.ID = :FORMA_PAGAMENTO_ID
                    ORDER BY A.PARCELA
                    INTO :PARCELA_CONTROLE,:NEW_FORMA_PAGAMENTO_ID DO
                    BEGIN

                        IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                        BEGIN
                          :SEQUENCIA = :PARCELA+1;
                          IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                          BEGIN
                          :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                          END
                        END

                        UPDATE TBNFS_PARCELAMENTO SET SEQUENCIA = :SEQUENCIA WHERE CONTROLE = :PARCELA_CONTROLE;
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;
                END

       END
    
       IF(:ORIGEM = 'AVU')THEN
       BEGIN

           DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

           FOR
              SELECT
                'AVU' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.NSU,
                count(A.PARCELA),
                sum(A.VALOR),
                sum(A.VALOR_DESCONTO) AS TARIFA,
                sum(A.VALOR) - sum(A.VALOR_DESCONTO) AS VALOR_LIQUIDO,
                E.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO,
                ROW_NUMBER() OVER (ORDER BY A.NFS_CONTROLE) AS SEQUENCIA
                
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
            
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 1
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            
            GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO

         INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
              :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO, :SEQUENCIA
            DO BEGIN
                
                 UPDATE OR INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        TARIFA,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :TARIFA,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO
                    )
                  MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);

            END
            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             FOR
                SELECT
                    A.NFS_CONTROLE AS DOCUMENTO,
                    count(A.PARCELA) AS PARCELAS,
                    F.ID
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA AND F.NSU = A.NSU AND F.ADQUIRENTE_ID = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO = D.ID AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                
                WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                AND A.AVULSO = 1
                AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                
                GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO, f.id
                INTO :DOCUMENTO_CONTROLE, :PARCELA, :FORMA_PAGAMENTO_ID DO
                BEGIN
                 :SEQUENCIA        = 1;
                 IF(:OLD_DOCUMENTO_CONTROLE <> :DOCUMENTO_CONTROLE AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                 BEGIN
                   :ULTIMA_SEQUENCIA = 0;
                   :times            = 0;
                 END
                 :times            = :times+1;

                 FOR
                 SELECT A.CONTROLE ,f.id
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA AND F.NSU = A.NSU AND F.ADQUIRENTE_ID = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO = D.ID AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                    AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                    AND A.AVULSO = 1
                    AND (A.NFS_CONTROLE = :DOCUMENTO_CONTROLE)
                    AND F.ID = :FORMA_PAGAMENTO_ID
                    ORDER BY A.PARCELA
                    INTO :PARCELA_CONTROLE,:NEW_FORMA_PAGAMENTO_ID DO
                    BEGIN

                        IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                        BEGIN
                          :SEQUENCIA = :PARCELA+1;
                          IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                          BEGIN
                          :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                          END
                        END

                        UPDATE TBNFS_PARCELAMENTO SET SEQUENCIA = :SEQUENCIA WHERE CONTROLE = :PARCELA_CONTROLE;
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;
                END

       END

    END

END;