create or replace PROCEDURE CONCILIACAO_CNC(P_NRESTABELEC IN NUMBER,
                                            P_DTINICIAL IN DATE,
                                            P_DTFINAL IN DATE)
AS
   V_COUNT NUMBER;
   /* Variaveis para controle de mudanca de estabelecimento, adquirente ou produto */
   V_NRADQUIRENTE NUMBER;

   V_VRTOLERANCIA FLOAT;

   /* Variaveis para controle de commit, o commit periodico e necessario para evitar travamentos
      no BD devido a sobrecarga no segmento de rollback */
   V_COUNTCOMMIT NUMBER;
   V_COMMIT NUMBER;

   V_SEQUENCIAL NUMBER;
   V_SEQVARCHAR VARCHAR2(50); 
   V_VRLIQVENDATMP NUMBER;
   V_VRTAXAANT NUMBER;

   V_EXISTE VARCHAR2(01);

   V_NMBAND_ESPERADA VARCHAR2(30);
   V_NMBAND_ENCONTRADA VARCHAR2(30);
   V_NRSEQBANDTMP NUMBER;
   V_NRSEQPRODTEMP NUMBER;
   V_NRSEQCONSMOVCAIXA NUMBER;

   /* VARIA?VEIS USADAS PARA REALIZAR A CONCILIACAO DE VENDAS ANTECIPADAS */
   V_VRVENDAANT NUMBER;
   V_VALORVALIDO VARCHAR2(01);

   V_NRSEQDIVERGENCIA NUMBER;
   V_DIVERGENTE VARCHAR2(01);
   V_IDSITUACAO VARCHAR2(01);

   V_NRCONCLANC NUMBER;
   V_NRCONCLANCPGTO NUMBER;

   V_VRALUGUEL FLOAT;
   V_FATORCANC FLOAT;

   V_EXISTEALUGUEL VARCHAR2(01);

   V_DIASTOLERANCIA NUMBER;

   V_EXISTEREGRAEST VARCHAR2(01);
   V_SEQTIPOCORRECAO NUMBER;

   V_VRANTIGO VARCHAR2(200);
   V_VRNOVO VARCHAR2(200);

   V_CDTIPORECE VARCHAR2(03);
   V_CDTPCTRECEB VARCHAR2(06);
   V_CDAJUCTREC VARCHAR2(04);

   /* Variaveis que armazenam os criterios de conciliacao, por estabelecimento ou adquirente.
      Os valores sao buscados atraves dos parametros OUT da procedure BUSCA_CRITERIOS_CNC */
   V_VDNSU VARCHAR2(01);
   V_VDNSUPOS VARCHAR2(01);
   V_VDTOLERANCIA  VARCHAR2(01);
   V_VDNRAUT VARCHAR2(01);
   V_VDBANCO VARCHAR2(01);
   V_VDAGENCIA VARCHAR2(01);
   V_VDCCORRENTE VARCHAR2(01);
   V_VDPRODUTO VARCHAR2(01);
   V_VDADQUIRENTE VARCHAR2(01);
   V_VDAJUSTEAUT VARCHAR2(01);
   V_VDDTVENCIMENTO VARCHAR2(01);

   V_IDCONCILIA VARCHAR2(01);
   V_CDCLASSFINA VARCHAR2(06);
   V_NRDIASVENC NUMBER;

   V_CDFILIBOLREC VARCHAR2(04);
   V_NRLANBOLREC VARCHAR2(20);
   V_CDCLIENTE VARCHAR2(20);
   V_VRCONTA NUMBER;
   V_CDREDUCONT VARCHAR2(03);

   CURSOR C_REGRAS_EST IS
      SELECT IDNSU, IDNSUPOS, IDTOLERANCIA, IDAUTORIZACAO, IDBANCO, IDAGENCIA, IDCONTCORR,
            IDPRODUTOADQ, IDADQUIRENTE, NVL(NRDIASTOL, 0) NRDIASTOL, IDAJUSTEAUT,
            IDDTVENCIMENTO
        FROM VALIDACAOADQEST
       WHERE NRESTABELEC = P_NRESTABELEC
         AND NRADQUIRENTE = V_NRADQUIRENTE
       ORDER BY NRORDEM;

   CURSOR C_REGRAS IS
      SELECT IDNSU, IDNSUPOS, IDTOLERANCIA, IDAUTORIZACAO, IDBANCO, IDAGENCIA, IDCONTCORR,
            IDPRODUTOADQ, IDADQUIRENTE, NVL(NRDIASTOL, 0) NRDIASTOL, IDAJUSTEAUT,
            IDDTVENCIMENTO
        FROM VALIDACAOADQ
       WHERE NRADQUIRENTE = V_NRADQUIRENTE
       ORDER BY NRORDEM;

   PROCEDURE COMMITA
   AS
   BEGIN
      V_COUNTCOMMIT := V_COUNTCOMMIT + 1;
      IF V_COUNTCOMMIT = V_COMMIT THEN
         V_COUNTCOMMIT := 0;
         COMMIT;
      END IF;
   END;

   FUNCTION SEQUENCIAL_DIVERGENCIA RETURN NUMBER
   AS
   BEGIN
      NOVO_CODIGO_NT('DIVCONCILIACAO', V_SEQVARCHAR);
      V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);
      RETURN V_SEQUENCIAL;
   END;

   FUNCTION SEQUENCIAL_CORRECAO RETURN NUMBER
   AS
   BEGIN
      NOVO_CODIGO_NT('ITEMCORVENDA', V_SEQVARCHAR);
      V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);
      RETURN V_SEQUENCIAL;
   END;

   FUNCTION SEQUENCIAL_TIPODIVERGENCIA(P_TIPO IN VARCHAR) RETURN NUMBER
   AS
      V_RESULT NUMBER;
   BEGIN
      BEGIN
         SELECT NRTPDIVERGENCIA
           INTO V_RESULT
           FROM TIPODIVERGENCIA
          WHERE IDDIVERGENCIA = P_TIPO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_RESULT := -1;
      END;
      V_DIVERGENTE := 'S';
      RETURN V_RESULT;
   END;

   PROCEDURE INSERE_DIVERGENCIA(P_NRTPDIVERGENCIA IN NUMBER,
                                P_NRCONCLANC IN NUMBER,
                                P_NRRETVENDAADQ IN NUMBER,
                                P_NRRETFINANCADQ IN NUMBER,
                                P_VRESPERADO IN VARCHAR,
                                P_VRENCONTRADO IN VARCHAR,
                                P_NRCONSMOVCAIXA IN NUMBER)
   AS
   BEGIN
      V_SEQUENCIAL := SEQUENCIAL_DIVERGENCIA;
      INSERT INTO DIVCONCILIACAO
         (NRDIVCONCILIACAO, NRCONCLANC, NRTPDIVERGENCIA, NRRETVENDAADQ, NRRETFINANCADQ, VRESPERADO, VRENCONTRADO, NRCONSMOVCAIXA)
      VALUES
         (V_SEQUENCIAL, P_NRCONCLANC, P_NRTPDIVERGENCIA, P_NRRETVENDAADQ, P_NRRETFINANCADQ, P_VRESPERADO, P_VRENCONTRADO, P_NRCONSMOVCAIXA);
      COMMITA;
   END;

   FUNCTION SEQUENCIAL_CONCILIACAO(P_NRATUAL IN NUMBER) RETURN NUMBER
   AS
   BEGIN
      IF P_NRATUAL IS NULL THEN
         NOVO_CODIGO_NT('CONCILIACAOLANC', V_SEQVARCHAR);
         V_NRCONCLANCPGTO := TO_NUMBER(V_SEQVARCHAR);
         INSERT INTO CONCILIACAOLANC
           (NRCONCLANC, DTCONCILIACAO, IDTPCONCILIACAO, DTINCLUSAO)
         VALUES
           (V_NRCONCLANCPGTO, SYSDATE, 'A', SYSDATE);
         COMMITA;
         RETURN V_NRCONCLANCPGTO;
      ELSE
         RETURN P_NRATUAL;
      END IF;
   END;

   PROCEDURE INSERE_CORRECAO(P_NRCONSMOVCAIXA IN NUMBER,
                             P_DSTIPOCORR IN VARCHAR,
                             P_VRANTIGO IN VARCHAR,
                             P_VRNOVO IN VARCHAR)
   AS
   BEGIN
      V_SEQUENCIAL := SEQUENCIAL_CORRECAO;

      SELECT NRITEMCORRECAO
        INTO V_SEQTIPOCORRECAO
        FROM ITEMCORRECAO
       WHERE DSITEMCORRECAO = P_DSTIPOCORR;
      INSERT INTO ITEMCORVENDA
         (NRITEMCORVENDA, NRCONSMOVCAIXA, NRITEMCORRECAO, VRANTIGO, VRNOVO)
      VALUES
         (V_SEQUENCIAL, P_NRCONSMOVCAIXA, V_SEQTIPOCORRECAO, P_VRANTIGO, P_VRNOVO);
      COMMITA;
   END;
BEGIN
   V_COUNTCOMMIT := 0;
   V_COMMIT := 1000;

   /* GERA O FINANCEIRO PARA AS VENDAS DO FOS QUE PODEM ESTAR PENDENTE DE GERACAO */
   FOR C_FIN_PEND IN
      (SELECT NRCONSMOVCAIXA
         FROM ESTABELECIMENTO E, CONSMOVCAIXA C, CTRLDTFINCNC CT
        WHERE E.NRESTABELEC = P_NRESTABELEC
          AND E.CDFILIAL = C.CDFILIAL
          AND C.DTVENDA >= CT.DTINICIOINT
          AND C.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL) LOOP
      FINANCEIRO_FOS_CNC(C_FIN_PEND.NRCONSMOVCAIXA);
   END LOOP;

   /* CONCILIA AS VENDAS */
   FOR C_ESTABELEC IN
      (SELECT DISTINCT R.NRADQUIRENTE, E.CDFILIAL, A.IDGERAFINANC, F.CDEMPRESA
         FROM RETVENDAADQ R, ESTABELECIMENTO E, ADQUIRENTE A, FILIAL F
        WHERE DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NRCONCLANC IS NULL
          AND E.NRESTABELEC = P_NRESTABELEC
          AND E.NRESTABELEC = R.NRESTABELEC
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND E.CDFILIAL = F.CDFILIAL
        UNION
       SELECT DISTINCT R.NRADQUIRENTE, E.CDFILIAL, A.IDGERAFINANC, F.CDEMPRESA
         FROM RETFINANCADQ R, ESTABELECIMENTO E, ADQUIRENTE A, FILIAL F
        WHERE DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NRCONCLANC IS NULL
          AND E.NRESTABELEC = P_NRESTABELEC
          AND E.NRESTABELEC = R.NRESTABELEC
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND E.CDFILIAL = F.CDFILIAL
        ORDER BY 1) LOOP

      /* LIMPA O LOG POR ESTABELECIMENTO */
      DELETE
        FROM LOGERROCTBCNC
       WHERE NRESTABELEC = P_NRESTABELEC;

      V_NRADQUIRENTE := C_ESTABELEC.NRADQUIRENTE;
      V_COUNT := 0;
      /* VERIFICA SE EXISTE REGRAS ESPECIFICAS PARA UM ESTABELECIMENTO */
      BEGIN
         SELECT COUNT(*)
           INTO V_COUNT
           FROM VALIDACAOADQEST
          WHERE NRESTABELEC = P_NRESTABELEC
            AND NRADQUIRENTE = V_NRADQUIRENTE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_COUNT := 0;
      END;

      /* VERIFICACAO SE EXISTE REGRAS CADASTRADAS POR ESTABELECIMENTO */
      IF V_COUNT > 0 THEN
         V_EXISTEREGRAEST := 'S';
         OPEN C_REGRAS_EST;
      ELSE
         V_EXISTEREGRAEST := 'N';
         OPEN C_REGRAS;
      END IF;

      LOOP
         IF V_EXISTEREGRAEST = 'S' THEN
            FETCH C_REGRAS_EST INTO V_VDNSU, V_VDNSUPOS, V_VDTOLERANCIA, V_VDNRAUT, V_VDBANCO,
                                    V_VDAGENCIA, V_VDCCORRENTE, V_VDPRODUTO, V_VDADQUIRENTE, V_DIASTOLERANCIA,
                                    V_VDAJUSTEAUT, V_VDDTVENCIMENTO;
            EXIT WHEN C_REGRAS_EST%NOTFOUND;
         ELSE
            FETCH C_REGRAS INTO V_VDNSU, V_VDNSUPOS, V_VDTOLERANCIA, V_VDNRAUT, V_VDBANCO,
                                V_VDAGENCIA, V_VDCCORRENTE, V_VDPRODUTO, V_VDADQUIRENTE, V_DIASTOLERANCIA,
                                V_VDAJUSTEAUT, V_VDDTVENCIMENTO;
            EXIT WHEN C_REGRAS%NOTFOUND;
         END IF;
         FOR C_RET_VENDA IN
            (SELECT R.NRRETVENDAADQ, R.NRPRODUTOADQ, R.NRADQUIRENTE, R.NRPARCELA, R.NRAUTORIZACAO, R.NRCARTAOTRUNC,
                    R.DTVENDA, R.DTCREDITO, R.VRBRUTVENDA, R.VRTAXAADM, R.VRLIQVENDA, R.CDBANCO, R.CDAGENCIA,
                    R.CDCONTCORR, R.NRBANDEIRAVAN, R.CDNSU, P.VRTOLERANCIA, NVL(NVL(TE.VRTAXAADM, T.VRTAXAADM), 0) VRTAXAPARAM,
                    R.CDFILIAL, R.NRLANCTONF, C.CDCLIENTE, C.NRINSJURCLIE, A.IDGERAFINANC, ISNUMBER(R.CDNSU) ISNUMBER, P.NMPRODUTOADQ, R.NRORG
               FROM RETVENDAADQ R, ADQUIRENTE A LEFT JOIN CLIENTE C
                                                       ON C.CDCLIENTE = A.CDCLIENTE,
                    PRODUTOADQ P LEFT JOIN TAXAADQPROD T
                                        ON T.NRADQUIRENTE = V_NRADQUIRENTE
                                       AND T.NRPRODUTOADQ = P.NRPRODUTOADQ
                                       AND T.NRESTABELEC IS NULL
                                 LEFT JOIN TAXAADQPROD TE
                                        ON TE.NRADQUIRENTE = V_NRADQUIRENTE
                                       AND TE.NRPRODUTOADQ = P.NRPRODUTOADQ
                                       AND TE.NRESTABELEC = P_NRESTABELEC
              WHERE R.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL
                AND R.NRESTABELEC = P_NRESTABELEC
                AND R.NRADQUIRENTE = V_NRADQUIRENTE
                AND R.NRCONCLANC IS NULL
                AND R.NRADQUIRENTE = A.NRADQUIRENTE
                AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
               ORDER BY R.NRPARCELA, R.CDNSU) LOOP

            IF V_VDTOLERANCIA = 'S' THEN
               V_VRTOLERANCIA := C_RET_VENDA.VRTOLERANCIA;
            ELSE
               V_VRTOLERANCIA := 0;
            END IF;

            FOR C_VENDAS_FOS IN
               (SELECT C.NRCONSMOVCAIXA, NVL(C.CDNSU, ' ') CDNSU, NVL(C.NRAUTORIZACAO, '-') NRAUTORIZACAO, C.DTVENDA, C.VRVENDA,
                       C.NRQTPARCELA, C.CDTIPORECE, C.IDVENDATEF, C.NRPARCELA,
                       NVL(P.NRPRODUTOADQ, -1) NRPRODUTOADQ, C.CDFILIALNF, C.NRLANCTONF, C.DTVENCIMENTO, C.CDFILIAL, TC.NMTIPORECE
                  FROM CONSMOVCAIXA C LEFT JOIN TPRECEPRODADQ P
                                             ON P.CDTIPORECE = C.CDTIPORECE
                                      JOIN TIPORECE TC 
                                        ON TC.CDTIPORECE = C.CDTIPORECE
                 WHERE CDFILIAL = C_ESTABELEC.CDFILIAL
                   AND DTVENDA BETWEEN C_RET_VENDA.DTVENDA-V_DIASTOLERANCIA AND C_RET_VENDA.DTVENDA+V_DIASTOLERANCIA
                   AND ROUND(VRVENDA - (VRVENDA * C_RET_VENDA.VRTAXAPARAM / 100), 2) BETWEEN C_RET_VENDA.VRLIQVENDA-V_VRTOLERANCIA AND C_RET_VENDA.VRLIQVENDA+V_VRTOLERANCIA
                   AND NRCONCLANC IS NULL
                   AND ((IDVENDATEF = 'S' AND (V_VDNSU = 'S' AND (DECODE(ISNUMBER(CDNSU), 'S', TO_CHAR(TO_NUMBER(CDNSU)), CDNSU) = DECODE(C_RET_VENDA.ISNUMBER, 'S', TO_CHAR(TO_NUMBER(C_RET_VENDA.CDNSU)), CDNSU))) OR
                        (IDVENDATEF = 'S' AND V_VDNSU = 'N')) OR (IDVENDATEF = 'N'))
                   AND ((IDVENDATEF = 'N' AND (V_VDNSUPOS = 'S' AND (DECODE(ISNUMBER(CDNSU), 'S', TO_CHAR(TO_NUMBER(CDNSU)), CDNSU) = DECODE(C_RET_VENDA.ISNUMBER, 'S', TO_CHAR(TO_NUMBER(C_RET_VENDA.CDNSU)), CDNSU))) OR
                        (IDVENDATEF = 'N' AND V_VDNSUPOS = 'N')) OR (IDVENDATEF = 'S'))
                   AND ((V_VDNRAUT = 'S' AND NRAUTORIZACAO = C_RET_VENDA.NRAUTORIZACAO) OR (V_VDNRAUT = 'N'))
                   AND ((V_VDDTVENCIMENTO = 'S' AND DTVENCIMENTO = C_RET_VENDA.DTCREDITO) OR (V_VDDTVENCIMENTO = 'N'))
                 ORDER BY C.CDNSU) LOOP
               V_NRCONCLANC := NULL;
               DELETE
                 FROM DIVCONCILIACAO
                WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;

               DELETE
                 FROM ITEMCORVENDA
                WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;
               V_NRCONCLANC := NULL;
               V_NRSEQPRODTEMP := -1;
               BEGIN
                  SELECT NRPRODUTOADQ
                    INTO V_NRSEQPRODTEMP
                    FROM TPRECEPRODADQ
                   WHERE CDTIPORECE = C_VENDAS_FOS.CDTIPORECE;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_NRSEQPRODTEMP := -1;
               END;

               V_IDSITUACAO := 'C'; /* C - CORRETO, O - CORRIGIDO */
               V_IDCONCILIA := 'S';
               IF (V_NRSEQPRODTEMP <> C_RET_VENDA.NRPRODUTOADQ) THEN
                  IF V_VDPRODUTO = 'S' THEN
                    V_IDCONCILIA := 'N';
                  ELSE
                    BEGIN
                       SELECT P.NMPRODUTOADQ, MAX(T.CDTIPORECE)
                         INTO V_VRNOVO, V_CDTIPORECE
                         FROM TPRECEPRODADQ T, PRODUTOADQ P
                        WHERE P.NRPRODUTOADQ = C_RET_VENDA.NRPRODUTOADQ
                          AND P.NRPRODUTOADQ = T.NRPRODUTOADQ
                        GROUP BY P.NMPRODUTOADQ;
                    EXCEPTION
                       WHEN NO_DATA_FOUND THEN
                          V_VRNOVO := NULL;
                          V_CDTIPORECE := NULL;
                    END;
                    IF V_VRNOVO IS NULL THEN
                      V_IDCONCILIA := 'N';
                      GRAVAERROCTBCNC(P_NRESTABELEC,
                                      P_DTINICIAL,
                                      P_DTFINAL,
                                      'ENCONTRADO VENDA NO SISTEMA UMA PARA O RECEBIMENTO '||C_VENDAS_FOS.NMTIPORECE||' MAS A VENDA CORRESPONDENTE NA OPERADORA E PARA '||C_RET_VENDA.NMPRODUTOADQ||'.',
                                      'FAVOR RELACIONAR O TIPO DE RECEBIMENTO PARA O PRODUTO '||C_RET_VENDA.NMPRODUTOADQ||'.',
                         'S',
                         C_RET_VENDA.NRORG);
                    END IF;
                  END IF;
               END IF;

               IF V_IDCONCILIA = 'S' THEN
                  IF V_NRSEQPRODTEMP <> C_RET_VENDA.NRPRODUTOADQ THEN
                     V_IDSITUACAO := 'O';
                     V_VRANTIGO := NULL;
                     BEGIN
                        SELECT NMPRODUTOADQ
                          INTO V_VRANTIGO
                          FROM PRODUTOADQ
                         WHERE NRPRODUTOADQ = V_NRSEQPRODTEMP;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_VRANTIGO := NULL;
                     END;

                     BEGIN
                        SELECT P.NMPRODUTOADQ, MAX(T.CDTIPORECE)
                          INTO V_VRNOVO, V_CDTIPORECE
                          FROM TPRECEPRODADQ T, PRODUTOADQ P
                         WHERE P.NRPRODUTOADQ = C_RET_VENDA.NRPRODUTOADQ
                           AND P.NRPRODUTOADQ = T.NRPRODUTOADQ
                         GROUP BY P.NMPRODUTOADQ;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_VRNOVO := NULL;
                           V_CDTIPORECE := NULL;
                     END;
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('P');
                     V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANC, C_RET_VENDA.NRRETVENDAADQ, NULL, NVL(TO_CHAR(V_NRSEQPRODTEMP), 'NAO RELACIONADO'), TO_CHAR(C_RET_VENDA.NRPRODUTOADQ), C_VENDAS_FOS.NRCONSMOVCAIXA);

                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'PRODUTO', V_VRANTIGO, V_VRNOVO);
                     UPDATE CONSMOVCAIXA
                        SET CDTIPORECE = V_CDTIPORECE
                      WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;

                     /* CASO O PRODUTO ALTERE E A ADQUIRENTE ESTEJA MARCADA PARA GERAR O FINANCEIRO,
                        A CONTA E A TAXA ADMINISTRATIVA PRECISAM SER ALTERADAS. */
                     IF C_ESTABELEC.IDGERAFINANC = 'S' THEN
                        /* O CODIGO DO CLIENTE E PRECISO PARA GERACAO DO BOLETO */
                        V_CDCLIENTE := C_RET_VENDA.CDCLIENTE;
                        IF V_CDCLIENTE IS NULL THEN
                           BEGIN
                              SELECT CDCLIENTE
                                INTO V_CDCLIENTE
                                FROM TIPORECE
                               WHERE CDTIPORECE = V_CDTIPORECE;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_CDCLIENTE := NULL;
                           END;
                        END IF;

                        /* BUSCA NOVAS INFORMACOES PARA ALTERAR O CONTAS A RECEBER E REALIZAR A INSERCAO DA NOVA TAXA ADMINISTRATIVA. */
                        SELECT BUSCA_PARAMETRO_CNC(P_NRESTABELEC, C_RET_VENDA.NRADQUIRENTE, C_RET_VENDA.NRPRODUTOADQ, 'TIPOCONTA', 'N', NULL, NULL),
                               BUSCA_PARAMETRO_CNC(P_NRESTABELEC, C_RET_VENDA.NRADQUIRENTE, C_RET_VENDA.NRPRODUTOADQ, 'TIPOAJUSTE', 'N', NULL, NULL),
                               BUSCA_PARAMETRO_CNC(P_NRESTABELEC, C_RET_VENDA.NRADQUIRENTE, C_RET_VENDA.NRPRODUTOADQ, 'CONTCORR', 'N', NULL, NULL)
                          INTO V_CDTPCTRECEB, V_CDAJUCTREC, V_CDREDUCONT
                          FROM DUAL;

                        V_COUNT := 0;
                        BEGIN
                           SELECT COUNT(*)
                             INTO V_COUNT
                             FROM CONTOPECTBL C
                            WHERE C.CDEMPRESA = C_ESTABELEC.CDEMPRESA
                              AND C_VENDAS_FOS.DTVENDA BETWEEN DTINICCTBL AND DTFINACCTBL
                              AND V_CDTPCTRECEB IS NOT NULL
                              AND V_CDAJUCTREC IS NOT NULL
                              AND V_CDCLIENTE IS NOT NULL
                              AND V_CDREDUCONT IS NOT NULL;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_COUNT := 0;
                        END;
                        /* PARA ALTERACAO DO FINANCEIRO, DEVE ESTAR DENTRO DO PERIODO CONTABIL, TER TIPO DE AJUSTE E TIPO DE CONTA PARAMETRIZADO
                           PARA O NOVO PRODUTO, ALEM DE TER CLIENTE PARA RELACIONAR AO BOLETO. */
                        IF V_COUNT > 0 THEN
                           /* ATUALIZA A CONTA A RECEBER RELACIONADA AO NOVO PRODUTO. */
                           UPDATE CONTARECEBER
                              SET CDTPCTRECEB = V_CDTPCTRECEB,
                                  DTATUAVENREC = C_RET_VENDA.DTCREDITO
                            WHERE CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                              AND NRLANCTONF = C_VENDAS_FOS.NRLANCTONF;

                           V_CDCLASSFINA := NULL;
                           BEGIN
                              SELECT CDCLASSFINA
                                INTO V_CDCLASSFINA
                                FROM TIPOCTRECEBER
                               WHERE CDTPCTRECEB = V_CDTPCTRECEB;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_CDCLASSFINA := NULL;
                           END;

                           /* BUSCA O AJUSTE REF. A TAXA ADMINSTRATIVA DO CARTAO */
                           FOR C_ATU_AJ_CONTA IN
                              (SELECT A.CDFILIAL, A.NRLANCTONF, A.VRAJUSTEREC, A.DTAJUSTEREC, A.CDAJUCTREC, C.CDFILIBOLREC, C.NRLANBOLREC, C.NRPARCELAREC
                                 FROM AJCTRECEBER A, TIPOAJRECEBER T, CONTARECEBER C
                                WHERE C.CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                                  AND C.NRLANCTONF = C_VENDAS_FOS.NRLANCTONF
                                  AND C.CDFILIAL = A.CDFILIAL
                                  AND C.NRLANCTONF = A.NRLANCTONF
                                  AND A.CDAJUCTREC = T.CDAJUCTREC
                                  AND T.IDAJUCTREC = 'D') LOOP

                              /* APAGA O AJUSTE DA TAXA ADMINISTRATIVA */
                              DELETE
                                FROM AJCTRECEBER
                               WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIAL
                                 AND NRLANCTONF = C_ATU_AJ_CONTA.NRLANCTONF
                                 AND CDAJUCTREC = C_ATU_AJ_CONTA.CDAJUCTREC
                                 AND DTAJUSTEREC = C_ATU_AJ_CONTA.DTAJUSTEREC;

                               /* ALTERADO O AJUSTE PARA CIMA PARA CORRIGIR PARCELAS INCORRETAS.*/                                 
                              /* RETIRA O VALOR DO AJUSTE DA CONTA NO REC CASO O PRODUTO ALTERE, POIS O VALOR DA TAXA PODE SOFRER ALTERACAO */
                              UPDATE CONTARECEBER
                                 SET VRATUAREC = VRATUAREC + C_ATU_AJ_CONTA.VRAJUSTEREC, NRPARCELAREC = C_VENDAS_FOS.NRPARCELA
                               WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIAL
                                 AND NRLANCTONF = C_ATU_AJ_CONTA.NRLANCTONF;

                              /* ATUALIZA O VALOR DO BOLETO RELACIONADO A CONTA A RECEBER, INSERINDO O VALOR DO AJUSTE DE
                                 DESCONTO QUE FOI APAGADO */ 
                              UPDATE BOLETRECEBER
                                 SET VRFINALBREC = VRFINALBREC + C_ATU_AJ_CONTA.VRAJUSTEREC
                               WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIBOLREC
                                 AND NRLANBOLREC = C_ATU_AJ_CONTA.NRLANBOLREC;
                              /* VERIFICA SE APOS RETIRADO O VALOR DO AJUSTE, O BOLETO AINDA TERA VALOR, CASO TENHA, ELE DEVERA SER ATUALIZADO. */
                              V_COUNT := 0;
                              BEGIN
                                 SELECT COUNT(*)
                                   INTO V_COUNT
                                   FROM BOLETRECEBER
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIBOLREC
                                    AND NRLANBOLREC = C_ATU_AJ_CONTA.NRLANBOLREC
                                    AND ROUND(VRFINALBREC, 2) > 0;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_COUNT := 0;
                              END;
                              IF V_COUNT > 0 THEN
                                 /* ATUALIZA O VALOR DO TIPO DE RECEBIMENTO DO BOLETO RELACIONADO A CONTA A RECEBER, INSERINDO O VALOR DO AJUSTE DE
                                    DESCONTO QUE FOI APAGADO */
                                 UPDATE TPRECBOLETO
                                    SET VRTPRECBOLR = VRTPRECBOLR + C_ATU_AJ_CONTA.VRAJUSTEREC
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIBOLREC
                                    AND NRLANBOLREC = C_ATU_AJ_CONTA.NRLANBOLREC
                                    AND CDTIPORECE = C_VENDAS_FOS.CDTIPORECE;
                                 UPDATE CONTARECEBER
                                    SET CDFILIBOLREC = NULL,
                                        NRLANBOLREC = NULL
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIAL
                                    AND NRLANCTONF = C_ATU_AJ_CONTA.NRLANCTONF;
                              ELSE
                                 UPDATE CONTARECEBER
                                    SET CDFILIBOLREC = NULL,
                                        NRLANBOLREC = NULL
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIAL
                                    AND NRLANCTONF = C_ATU_AJ_CONTA.NRLANCTONF;

                                 DELETE
                                   FROM TPRECBOLETO
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIBOLREC
                                    AND NRLANBOLREC = C_ATU_AJ_CONTA.NRLANBOLREC;

                                 DELETE BOLETRECEBER
                                  WHERE CDFILIAL = C_ATU_AJ_CONTA.CDFILIBOLREC
                                    AND NRLANBOLREC = C_ATU_AJ_CONTA.NRLANBOLREC;
                              END IF;
                           END LOOP;

                           /* REFAZ O AJUSTE DE TAXA ADMINSTRATIVA (TX DE CARTAO) */
                           FOR C_ATU_NOVA_TAXA IN
                              (SELECT C.CDFILIBOLREC, C.NRLANBOLREC, ROUND(VRATUAREC * (C_RET_VENDA.VRTAXAPARAM / 100), 2) VRAJUSTE,
                                      C.DTATUAVENREC, NF.DTEMISSAO, C.CDFILIAL, C.NRLANCTONF, C.NRORG
                                 FROM CONTARECEBER C, NOTAFISCAL NF
                                WHERE C.CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                                  AND C.NRLANCTONF = C_VENDAS_FOS.NRLANCTONF
                                  AND V_CDAJUCTREC IS NOT NULL
                                  AND C.CDFILIAL = NF.CDFILIAL
                                  AND C.NRLANCTONF = NF.NRLANCTONF
                                  AND ROUND(VRATUAREC * (C_RET_VENDA.VRTAXAPARAM / 100), 2) > 0) LOOP
                              /* RETIRA O VALOR DO AJUSTE DA CONTA NO REC CASO O PRODUTE ALTERE, POIS O VALOR DA TAXA PODE SOFRER ALTERACAO */
                              UPDATE CONTARECEBER
                                 SET VRATUAREC = VRATUAREC - C_ATU_NOVA_TAXA.VRAJUSTE
                               WHERE CDFILIAL = C_ATU_NOVA_TAXA.CDFILIAL
                                 AND NRLANCTONF = C_ATU_NOVA_TAXA.NRLANCTONF;

                              /* REINSERE O AJUSTE DA TAXA ADMINISTRATIVA */
                              ATUALIZA_FLUXO_DE_CAIXA(C_ESTABELEC.CDEMPRESA, C_VENDAS_FOS.CDFILIAL, C_ATU_NOVA_TAXA.DTATUAVENREC, 'E', V_CDCLASSFINA, C_ATU_NOVA_TAXA.VRAJUSTE, 0);
                              INSERT INTO AJCTRECEBER
                                 (CDFILIAL, NRLANCTONF, DTAJUSTEREC, CDAJUCTREC, DSAJUSTEREC, VRAJUSTEREC,
                                  NRSEQVENREC, NRPARCELAREC, CDCLASSFINA, NRORG, IDMOVFLUXO, CDEMMFAJCNTR, CDFIMFAJCNTR, DTMOVFLUXO)
                              VALUES
                                 (C_VENDAS_FOS.CDFILIALNF, C_VENDAS_FOS.NRLANCTONF, C_VENDAS_FOS.DTVENDA, V_CDAJUCTREC, 'TAXA ADMINISTRATIVA', C_ATU_NOVA_TAXA.VRAJUSTE,
                                  '01', C_VENDAS_FOS.NRPARCELA, V_CDCLASSFINA, C_ATU_NOVA_TAXA.NRORG, 'E', C_ESTABELEC.CDEMPRESA, C_VENDAS_FOS.CDFILIALNF, C_ATU_NOVA_TAXA.DTATUAVENREC);
                           END LOOP;

                           /* BUSCA A CONTA COM OS DADOS ATUALIZADOS */
                           FOR C_CONTA IN
                              (SELECT C.CDFILIAL, C.NRLANCTONF, C.CDTPCTRECEB, C.VRATUAREC, NF.CDCLIENTE, C.DTATUAVENREC, NF.CDEMPRESA
                                 FROM CONTARECEBER C, NOTAFISCAL NF
                                WHERE C.CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                                  AND C.NRLANCTONF = C_VENDAS_FOS.NRLANCTONF
                                  AND C.CDFILIAL = NF.CDFILIAL
                                  AND C.NRLANCTONF = NF.NRLANCTONF) LOOP
                              /* TRATA OS VALORES PARA O NOVO BOLETO */
                              V_CDFILIBOLREC := NULL;
                              V_NRLANBOLREC := NULL;
                              BEGIN
                                 SELECT DISTINCT CDFILIAL, MAX(NRLANBOLREC)
                                   INTO V_CDFILIBOLREC, V_NRLANBOLREC
                                   FROM BOLETRECEBER B
                                  WHERE CDCLIENTE = C_CONTA.CDCLIENTE
                                    AND CDEMPRESA = C_CONTA.CDEMPRESA
                                    AND DTVENBOLREC = C_CONTA.DTATUAVENREC
                                    AND CDFILIAL = C_CONTA.CDFILIAL
                                    AND EXISTS (SELECT 1
                                                  FROM CONTARECEBER C, NOTAFISCAL NF
                                                 WHERE C.CDFILIBOLREC = B.CDFILIAL
                                                   AND C.NRLANBOLREC = B.NRLANBOLREC
                                                   AND C.CDFILIAL = NF.CDFILIAL
                                                   AND C.NRLANCTONF = NF.NRLANCTONF
                                                   AND NF.IDSISTEMA = 'CNC'
                                                   AND C.CDTPCTRECEB = C_CONTA.CDTPCTRECEB)
                                  GROUP BY B.CDFILIAL;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_CDFILIBOLREC := NULL;
                                    V_NRLANBOLREC := NULL;
                              END;

                              /* CASO EXISTA ALGUM BOLETO JA GERADO PARA O NOVO TIPO DE RECEBIMENTO, A CONTA SERA RELACIONADA AO MESMO. */
                              IF V_NRLANBOLREC IS NOT NULL THEN
                                 /* SOMA O VALOR DA CONTA AO VALOR FINAL DO BOLETO. */
                                 UPDATE BOLETRECEBER
                                    SET VRFINALBREC = VRFINALBREC + C_CONTA.VRATUAREC
                                  WHERE CDFILIAL = V_CDFILIBOLREC
                                    AND NRLANBOLREC = V_NRLANBOLREC;
                                 /* SOMA O VALOR DA CONTA AO VALOR DO TIPO DE RECEBIMENTO CONTIDO NO BOLETO */
                                 UPDATE TPRECBOLETO
                                    SET VRTPRECBOLR = VRTPRECBOLR + C_CONTA.VRATUAREC
                                  WHERE CDFILIAL = V_CDFILIBOLREC
                                    AND NRLANBOLREC = V_NRLANBOLREC
                                    AND CDTIPORECE = V_CDTIPORECE;

                                 /* RELACIONA O BOLETO ENCONTRADO NA CONTA ALTERADA. */
                                 UPDATE CONTARECEBER
                                    SET CDFILIBOLREC = V_CDFILIBOLREC,
                                        NRLANBOLREC = V_NRLANBOLREC
                                  WHERE CDFILIAL = C_CONTA.CDFILIAL
                                    AND NRLANCTONF = C_CONTA.NRLANCTONF;
                              ELSE
                                 /* GERA O BOLETO DA CONTA CASO NAO EXISTA UM BOLETO PARA A DATA DE VENCIMENTO
                                    E TIPO DE RECEBIMENTO. */
                                 NOVO_CODIGO_NT('BOLETRECEBER'||C_CONTA.CDFILIAL, V_NRLANBOLREC);
                                 V_NRLANBOLREC := SUBSTR(V_NRLANBOLREC, 11, 10);
                                 GERA_BOLETOS_REC(V_NRLANBOLREC, /* NUMERO DO BOLETO */
                                                  C_VENDAS_FOS.CDFILIAL, /* FILIAL */
                                                  V_CDCLIENTE, /* CODIGO DO CLIENTE */
                                                  C_ESTABELEC.CDEMPRESA, /* CODIGO DA EMPRESA */
                                                  C_CONTA.VRATUAREC, /* VALOR DA CONTA */
                                                  C_RET_VENDA.DTCREDITO, /* DATA DE VENCIMENTO */
                                                  V_CDTIPORECE, /* TIPO DE RECEBIMENTO */
                                                  NULL, /* NUMERO DO CHEQUE */
                                                  NULL, /* BANCO DO CHEQUE*/
                                                  NULL, /* AGENCIA DO CHEQUE */
                                                  NULL, /* CONTA */
                                                  V_CDREDUCONT, /* CDREDUCONT */
                                                  NULL, /* TIPO DE BAIXA */
                                                  NULL); /* DATA DE MOVIMENTACAO */

                                 /* RELACIONA O NOVO BOLETO A CONTA */
                                 UPDATE CONTARECEBER
                                    SET CDFILIBOLREC = V_CDFILIBOLREC,
                                        NRLANBOLREC = V_NRLANBOLREC
                                  WHERE CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                                    AND NRLANCTONF = C_VENDAS_FOS.NRLANCTONF;
                              END IF;
                           END LOOP;
                        END IF;
                     END IF;
                     COMMITA;
                  END IF;

                  IF C_VENDAS_FOS.CDNSU <> C_RET_VENDA.CDNSU THEN
                     V_IDSITUACAO := 'O';
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('N');
                     V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANC, C_RET_VENDA.NRRETVENDAADQ, NULL, TO_CHAR(C_VENDAS_FOS.CDNSU), TO_CHAR(C_RET_VENDA.CDNSU), C_VENDAS_FOS.NRCONSMOVCAIXA);
                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'NSU', C_VENDAS_FOS.CDNSU, C_RET_VENDA.CDNSU);
                     UPDATE CONSMOVCAIXA
                        SET CDNSU = C_RET_VENDA.CDNSU
                      WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;
                     COMMITA;
                  END IF;

                  IF C_VENDAS_FOS.NRAUTORIZACAO <> C_RET_VENDA.NRAUTORIZACAO THEN
                     V_IDSITUACAO := 'O';

                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('R');
                     V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANC, C_RET_VENDA.NRRETVENDAADQ, NULL, TO_CHAR(C_VENDAS_FOS.NRAUTORIZACAO), TO_CHAR(C_RET_VENDA.NRAUTORIZACAO), C_VENDAS_FOS.NRCONSMOVCAIXA);
                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'AUTORIZACAO', C_VENDAS_FOS.NRAUTORIZACAO, C_RET_VENDA.NRAUTORIZACAO);
                     UPDATE CONSMOVCAIXA
                        SET NRAUTORIZACAO = C_RET_VENDA.NRAUTORIZACAO
                      WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;
                     COMMITA;
                  END IF;

                  IF C_VENDAS_FOS.DTVENDA <> C_RET_VENDA.DTVENDA THEN
                     V_IDSITUACAO := 'O';
                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'DATA DA VENDA', C_VENDAS_FOS.DTVENDA, C_RET_VENDA.DTVENDA);
                     COMMITA;
                  END IF;

                  IF C_VENDAS_FOS.VRVENDA <> C_RET_VENDA.VRBRUTVENDA THEN
                     V_IDSITUACAO := 'O';
                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'VALOR', C_VENDAS_FOS.VRVENDA, C_RET_VENDA.VRBRUTVENDA);
                     UPDATE CONSMOVCAIXA
                        SET VRVENDA = C_RET_VENDA.VRBRUTVENDA
                      WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;
                     COMMITA;
                  END IF;

                  IF C_RET_VENDA.VRTAXAADM <> C_RET_VENDA.VRTAXAPARAM THEN
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('T');
                     V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANC, C_RET_VENDA.NRRETVENDAADQ, NULL, TO_CHAR(C_RET_VENDA.VRTAXAPARAM), TO_CHAR(C_RET_VENDA.VRTAXAADM), C_VENDAS_FOS.NRCONSMOVCAIXA);
                  END IF;

                  IF C_RET_VENDA.DTCREDITO <> C_VENDAS_FOS.DTVENCIMENTO THEN
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('D');
                     V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANC, C_RET_VENDA.NRRETVENDAADQ, NULL, TO_CHAR(C_VENDAS_FOS.DTVENCIMENTO, 'DD/MM/YYYY'), TO_CHAR(C_RET_VENDA.DTCREDITO, 'DD/MM/YYYY'), C_VENDAS_FOS.NRCONSMOVCAIXA);
                     INSERE_CORRECAO(C_VENDAS_FOS.NRCONSMOVCAIXA, 'DATA DE VENCIMENTO', TO_CHAR(C_VENDAS_FOS.DTVENCIMENTO, 'DD/MM/YYYY'), TO_CHAR(C_RET_VENDA.DTCREDITO, 'DD/MM/YYYY'));
                     UPDATE CONSMOVCAIXA
                        SET DTVENCIMENTO = C_RET_VENDA.DTCREDITO
                      WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;

                     UPDATE CONTARECEBER
                        SET DTORIGVENREC = DTATUAVENREC,
                            DTATUAVENREC = C_RET_VENDA.DTCREDITO
                      WHERE CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                        AND NRLANCTONF = C_VENDAS_FOS.NRLANCTONF;

                      UPDATE BOLETRECEBER B
                         SET DTVENBOLREC = C_RET_VENDA.DTCREDITO
                       WHERE EXISTS (SELECT 1
                                       FROM CONTARECEBER C
                                      WHERE C.CDFILIBOLREC = B.CDFILIAL
                                        AND C.NRLANBOLREC = B.NRLANBOLREC
                                        AND C.CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                                        AND C.NRLANCTONF = C_VENDAS_FOS.NRLANCTONF);
                     COMMITA;
                  END IF;

                  IF V_IDSITUACAO <> 'O' THEN
                     V_IDSITUACAO := 'C'; /* CORRETO */
                  END IF;

                  V_NRCONCLANC := SEQUENCIAL_CONCILIACAO(V_NRCONCLANC);

                  /* ATUALIZA O STATUS DO RETORNO DE VENDA E RELACIONA UM NUMERO DE NOTAFISCAL CASO JA TENHA GERADO NA REPLICACAO.
                     ESTA NOTA SERA APAGADA E REFEITA NA ROTINA DE GERACAO DO FINANCEIRO.
                     CASO O NUMERO DA NOTA NAO ESTEJA NULO, QUER DIZER QUE PARA AQUELA CONCILIACAO JA TEM O FINANCEIRO GERADO
                     E A MESMA NOTA DEVE SER RELACIONADA NA CONSMOVCAIXA. */
                  UPDATE RETVENDAADQ
                     SET NRCONCLANC = V_NRCONCLANC,
                         IDCONCILIADO = 'C', /* VENDA CONCILIADA */
                         IDSITUACAO = V_IDSITUACAO,
                         CDFILIAL = C_VENDAS_FOS.CDFILIALNF,
                         NRLANCTONF = C_VENDAS_FOS.NRLANCTONF,
                         IDFINRECEBIDO = DECODE(NRCONCLANCPGTO, NULL, 'N', IDFINRECEBIDO) /* FALTA A VENDA SER PAGA */
                   WHERE NRRETVENDAADQ = C_RET_VENDA.NRRETVENDAADQ;

                  UPDATE CONSMOVCAIXA
                     SET NRCONCLANC = V_NRCONCLANC,
                         IDCONCILIADO = 'C', /* VENDA CONCILIADO */
                         IDSITUACAO = V_IDSITUACAO
                   WHERE NRCONSMOVCAIXA = C_VENDAS_FOS.NRCONSMOVCAIXA;

                  IF C_ESTABELEC.IDGERAFINANC = 'S' THEN
                     /*O NSU ##### E GRAVADO DESSA FORMA CASO NAO SEJA INFORMADO NO FORSALE.
                       E GRAVADO DESSA FORMA PARA QUE POSSA SER SUBSTITUIDO POSTERIORMENTE AQUI. */
                     UPDATE CONTARECEBER
                        SET IDREPFOSCNC = 'N',
                            DSCONTAREC = REPLACE(REPLACE(DSCONTAREC, '(PROVISAO FOS/CONCILIADOR)-', ''), '#####', C_RET_VENDA.CDNSU),
                            DTATUAVENREC = C_RET_VENDA.DTCREDITO
                      WHERE CDFILIAL = C_VENDAS_FOS.CDFILIALNF
                        AND NRLANCTONF = C_VENDAS_FOS.NRLANCTONF;
                  END IF;
                  COMMITA;
                  V_NRCONCLANC := NULL;
                  EXIT;
               END IF;
            END LOOP;
         END LOOP;
      END LOOP;

      IF V_EXISTEREGRAEST = 'S' THEN
         CLOSE C_REGRAS_EST;
      ELSE
         CLOSE C_REGRAS;
      END IF;

      IF V_EXISTEREGRAEST = 'S' THEN
         OPEN C_REGRAS_EST;
      ELSE
         OPEN C_REGRAS;
      END IF;
      LOOP
         IF V_EXISTEREGRAEST = 'S' THEN
            FETCH C_REGRAS_EST INTO V_VDNSU, V_VDNSUPOS, V_VDTOLERANCIA, V_VDNRAUT, V_VDBANCO,
                                    V_VDAGENCIA, V_VDCCORRENTE, V_VDPRODUTO, V_VDADQUIRENTE, V_DIASTOLERANCIA,
                                    V_VDAJUSTEAUT, V_VDDTVENCIMENTO;
            EXIT WHEN C_REGRAS_EST%NOTFOUND;
         ELSE
            FETCH C_REGRAS INTO V_VDNSU, V_VDNSUPOS, V_VDTOLERANCIA, V_VDNRAUT, V_VDBANCO,
                                V_VDAGENCIA, V_VDCCORRENTE, V_VDPRODUTO, V_VDADQUIRENTE, V_DIASTOLERANCIA,
                                V_VDAJUSTEAUT, V_VDDTVENCIMENTO;
            EXIT WHEN C_REGRAS%NOTFOUND;
         END IF;

         /* CONCILIACAO DOS PGTOS */
         FOR C_RET_PGTO IN
            (SELECT R.NRRETFINANCADQ, R.NRADQUIRENTE, R.NRPRODUTOADQ, R.VRTAXAADM,
                    R.NRAUTORIZACAO, R.VRLIQPGTO, R.DTCREDITO, R.VRTAXAANTVENDA, R.IDSTATUSVENDA, R.CDNSU,
                    R.NRPARCELA, R.VRBRUTVENDA, R.CDBANCO, R.CDAGENCIA, R.CDCONTCORR, R.NRESTABELEC,
                    P.VRTOLERANCIA, R.DTVENDA
               FROM RETFINANCADQ R, PRODUTOADQ P
              WHERE DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
                AND NRCONCLANC IS NULL
                AND NRESTABELEC = P_NRESTABELEC
                AND NRADQUIRENTE = V_NRADQUIRENTE
                AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
                AND R.IDSTATUSVENDA NOT IN ('C', 'P')
              ORDER BY R.NRPRODUTOADQ, NRPARCELA) LOOP

            IF V_VDTOLERANCIA = 'S' THEN
               V_VRTOLERANCIA := C_RET_PGTO.VRTOLERANCIA;
            ELSE
               V_VRTOLERANCIA := 0;
            END IF;

            FOR C_RETVENDA IN
               (SELECT R.NRRETVENDAADQ, R.NRADQUIRENTE, R.NRPRODUTOADQ, R.NRQTPARCELA,
                       R.VRTAXAADM, R.NRAUTORIZACAO,
                       R.VRLIQVENDA, R.DTCREDITO, R.NRCONCLANC, R.CDBANCO, R.CDAGENCIA, R.CDCONTCORR,
                       NVL(NVL(TE.VRTAXAADM, T.VRTAXAADM), 0) VRTAXAPARAM
                  FROM ADQUIRENTE A, RETVENDAADQ R LEFT JOIN TAXAADQPROD T
                                                          ON T.NRADQUIRENTE = R.NRADQUIRENTE
                                                         AND T.NRPRODUTOADQ = R.NRPRODUTOADQ
                                                         AND T.NRESTABELEC IS NULL
                                                   LEFT JOIN TAXAADQPROD TE
                                                          ON TE.NRADQUIRENTE = R.NRADQUIRENTE
                                                         AND TE.NRPRODUTOADQ = R.NRPRODUTOADQ
                                                         AND TE.NRESTABELEC = P_NRESTABELEC
                 WHERE R.CDNSU = C_RET_PGTO.CDNSU
                   AND R.DTVENDA = C_RET_PGTO.DTVENDA
                   AND R.NRESTABELEC = P_NRESTABELEC
                   AND R.NRADQUIRENTE = V_NRADQUIRENTE
                   AND R.NRADQUIRENTE = A.NRADQUIRENTE) LOOP
               V_NRCONCLANCPGTO := NULL;
               IF NVL(C_RET_PGTO.IDSTATUSVENDA, 'L') <> 'A' THEN /* RECEBIMENTO NORMAL, SEM ANTECIPACAO */
                  IF C_RET_PGTO.IDSTATUSVENDA = 'C' THEN
                     V_FATORCANC := -1;
                  ELSE
                     V_FATORCANC := 1;
                  END IF;
                  IF C_RETVENDA.VRLIQVENDA <> (C_RET_PGTO.VRLIQPGTO * V_FATORCANC) THEN
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('V');
                     V_NRCONCLANCPGTO := SEQUENCIAL_CONCILIACAO(V_NRCONCLANCPGTO);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANCPGTO, C_RETVENDA.NRRETVENDAADQ, C_RET_PGTO.NRRETFINANCADQ, TO_CHAR(C_RETVENDA.VRLIQVENDA), TO_CHAR(C_RET_PGTO.VRLIQPGTO), NULL);
                  END IF;
               ELSE /* A VENDA FOI ANTECIPADA */
                  V_VRLIQVENDATMP := C_RET_PGTO.VRBRUTVENDA - (C_RET_PGTO.VRBRUTVENDA * (C_RET_PGTO.VRTAXAADM / 100));
                  V_VRVENDAANT := V_VRLIQVENDATMP - (V_VRLIQVENDATMP * (C_RET_PGTO.VRTAXAANTVENDA / 100));
                  IF ROUND(C_RET_PGTO.VRLIQPGTO, 2) <> ROUND(V_VRVENDAANT, 2) THEN
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('V');
                     V_NRCONCLANCPGTO := SEQUENCIAL_CONCILIACAO(V_NRCONCLANCPGTO);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANCPGTO, C_RETVENDA.NRRETVENDAADQ, C_RET_PGTO.NRRETFINANCADQ, TO_CHAR(C_RETVENDA.VRLIQVENDA), TO_CHAR(C_RET_PGTO.VRLIQPGTO), NULL);
                  END IF;
               END IF;

               IF (C_RET_PGTO.IDSTATUSVENDA <> 'A') THEN
                  IF (V_VDTOLERANCIA = 'S' AND C_RET_PGTO.VRLIQPGTO BETWEEN (C_RET_PGTO.VRLIQPGTO-V_VRTOLERANCIA) AND (C_RET_PGTO.VRLIQPGTO+V_VRTOLERANCIA))
                     OR (C_RETVENDA.VRLIQVENDA = C_RET_PGTO.VRLIQPGTO AND V_VDTOLERANCIA = 'N') THEN
                     V_VALORVALIDO := 'S';
                  END IF;
               ELSIF (V_VDTOLERANCIA = 'S' AND V_VRVENDAANT BETWEEN (C_RET_PGTO.VRLIQPGTO-V_VRTOLERANCIA) AND (V_VRVENDAANT+V_VRTOLERANCIA))
                  OR (V_VRVENDAANT = C_RET_PGTO.VRLIQPGTO AND V_VDTOLERANCIA = 'N') THEN
                  V_VALORVALIDO := 'S';
               END IF;

               V_NRCONCLANCPGTO := SEQUENCIAL_CONCILIACAO(V_NRCONCLANCPGTO);
               UPDATE RETVENDAADQ
                  SET NRCONCLANCPGTO = V_NRCONCLANCPGTO,
                      IDFINRECEBIDO = 'S'
                WHERE NRRETVENDAADQ = C_RETVENDA.NRRETVENDAADQ;
               COMMITA;

               IF V_DIVERGENTE = 'S' THEN
                  V_IDSITUACAO := 'D';
               ELSE
                  V_IDSITUACAO := 'C';
               END IF;
               UPDATE RETFINANCADQ
                  SET IDCONCILIADO = 'C', /* CONCILIADO, POIS ACHOU A VENDA */
                      IDSITUACAO = V_IDSITUACAO,
                      NRCONCLANC = V_NRCONCLANCPGTO
                WHERE NRRETFINANCADQ = C_RET_PGTO.NRRETFINANCADQ;
               COMMITA;
               V_NRCONCLANCPGTO := NULL;
            END LOOP;
         END LOOP;

         IF V_VDAJUSTEAUT = 'S' THEN
            FOR C_CANC IN
               (SELECT R.NRRETFINANCADQ, R.NRADQUIRENTE, R.NRPRODUTOADQ, R.VRTAXAADM,
                       R.NRAUTORIZACAO, R.VRLIQPGTO, R.DTCREDITO, R.VRTAXAANTVENDA, R.IDSTATUSVENDA, R.CDNSU,
                       R.NRPARCELA, R.VRBRUTVENDA, R.CDBANCO, R.CDAGENCIA, R.CDCONTCORR, R.NRESTABELEC,
                       P.VRTOLERANCIA, R.DTVENDA
                  FROM RETFINANCADQ R, PRODUTOADQ P
                 WHERE DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
                   AND NRCONCLANC IS NULL
                   AND NRESTABELEC = P_NRESTABELEC
                   AND NRADQUIRENTE = V_NRADQUIRENTE
                   AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
                   AND R.IDSTATUSVENDA = 'C'
                 ORDER BY R.NRPRODUTOADQ, NRPARCELA) LOOP
               FOR C_RETVENDA IN
                  (SELECT NRRETVENDAADQ, R.NRADQUIRENTE, NRPRODUTOADQ, NRQTPARCELA,
                          R.VRTAXAADM, NRAUTORIZACAO,
                          VRLIQVENDA, DTCREDITO, NRCONCLANC, CDBANCO, CDAGENCIA, CDCONTCORR
                     FROM RETVENDAADQ R, ADQUIRENTE A
                    WHERE R.CDNSU = C_CANC.CDNSU
                      AND R.DTVENDA = C_CANC.DTVENDA
                      AND R.NRESTABELEC = P_NRESTABELEC
                      AND R.NRADQUIRENTE = V_NRADQUIRENTE
                      AND R.NRCONCLANC IS NOT NULL
                      AND R.NRADQUIRENTE = A.NRADQUIRENTE) LOOP
                  V_NRCONCLANCPGTO := NULL;
                  IF (C_RETVENDA.VRLIQVENDA) *-1 <> (ABS(C_CANC.VRLIQPGTO) * -1) THEN
                     V_NRSEQDIVERGENCIA := SEQUENCIAL_TIPODIVERGENCIA('V');
                     V_NRCONCLANCPGTO := SEQUENCIAL_CONCILIACAO(V_NRCONCLANCPGTO);
                     INSERE_DIVERGENCIA(V_NRSEQDIVERGENCIA, V_NRCONCLANCPGTO, C_RETVENDA.NRRETVENDAADQ, C_CANC.NRRETFINANCADQ, TO_CHAR(C_RETVENDA.VRLIQVENDA), TO_CHAR(C_CANC.VRLIQPGTO), NULL);
                  END IF;

                  V_NRCONCLANCPGTO := SEQUENCIAL_CONCILIACAO(V_NRCONCLANCPGTO);
                  UPDATE RETVENDAADQ
                     SET IDCONCILIADO = 'C', /* CONCILIADO, POIS ACHOU O PAGAMENTO */
                         NRCONCLANCPGTO = V_NRCONCLANCPGTO
                   WHERE NRRETVENDAADQ = C_RETVENDA.NRRETVENDAADQ;
                  COMMITA;

                  IF V_DIVERGENTE = 'S' THEN
                     V_IDSITUACAO := 'D';
                  ELSE
                     V_IDSITUACAO := 'C';
                  END IF;

                  UPDATE RETFINANCADQ
                     SET IDCONCILIADO = 'C', /* CONCILIADO, POIS ACHOU A VENDA */
                         IDSITUACAO = V_IDSITUACAO,
                         NRCONCLANC = V_NRCONCLANCPGTO
                   WHERE NRRETFINANCADQ = C_CANC.NRRETFINANCADQ;
                  COMMITA;
                  V_NRCONCLANCPGTO := NULL;
               END LOOP;
            END LOOP;
         END IF;
      END LOOP;
      IF V_EXISTEREGRAEST = 'S' THEN
         CLOSE C_REGRAS_EST;
      ELSE
         CLOSE C_REGRAS;
      END IF;
   END LOOP;
   COMMIT;
END;
/