create or replace PROCEDURE REPLICA_DADOS_CNC(P_DTINICIAL IN DATE,
                                              P_DTFINAL IN DATE,
                                              P_NRSEQCONTROLE IN NUMBER,
                                              P_NRHEADERAS IN NUMBER DEFAULT NULL)
AS
   V_COUNT NUMBER;
   V_SEQUENCIAL NUMBER;
   V_SEQVARCHAR VARCHAR2(50);
   V_NRSEQLOTE NUMBER;
   V_NRSEQBANDEIRA NUMBER;
   V_VRTAXAPARAM FLOAT;
   V_VRLIQVENDATMP FLOAT;
   V_VRRETORNO FLOAT;
   V_IDTIPOLOTE VARCHAR2(01);
   V_VRCOBRADOTAXA FLOAT;
   V_VRTAXATEMP FLOAT;
   V_IDTIPOVENDA VARCHAR2(01);
   V_VRTAXAADM FLOAT;
   V_NRLOTEVENDAREP NUMBER;

   V_DSAJUSTE VARCHAR2(50);

   /* Variaveis para o calculo de Antecipacao */
   V_VRLIQVENDA FLOAT;
   V_DTDIFERENCAANT NUMBER;
   V_QTDIASANT NUMBER;
   V_VRTAXAANT FLOAT;
   V_VRPORTAXAANTDIA FLOAT;
   V_VRPORANTMES FLOAT;
   V_VRDESCONTOANTECIPACAO FLOAT;
   V_VRTAXAANTVENDA FLOAT;

   /* Variaveis de controle de Bandeiras. As mesmas foram criadas para evitar que a funcao que busca
      o sequencial da bandeira seja executado para toda venda... */
   V_SEQBANDMASTER NUMBER;
   V_SEQBANDVISA NUMBER;
   V_SEQBANDELO NUMBER;
   V_SEQBANDDINERS NUMBER;
   V_SEQBANDAMEX NUMBER;
   V_SEQBANDDISCOVER NUMBER;
   V_SEQBANDGOODCARD NUMBER;
   V_SEQBANDSODEXO NUMBER;
   V_SEQBANDVR NUMBER;
   V_SEQBANDBANESCARD NUMBER;
   V_SEQBANDCABAL NUMBER;
   V_SEQBANDGREENCARD NUMBER;
   V_SEQBANDAVISTA NUMBER;
   V_SEQBANDPOLICARD NUMBER;
   V_SEQBANDJCB NUMBER;
   V_SEQBANDCRED NUMBER;
   V_SEQBANDVALE NUMBER;
   V_SEQBANDHIPER NUMBER;
   V_SEQBANDDESC NUMBER;
   V_SGLOTE VARCHAR2(100);
   FUNCTION BUSCA_BANDEIRA(P_NMPRODUTO IN VARCHAR) RETURN NUMBER
   AS
      V_SEQRESULTBAND NUMBER;
   BEGIN
      /* Retorna o sequencial de acordo com a bandeira */
      IF INSTR(P_NMPRODUTO, 'MASTER') > 0 OR
         INSTR(P_NMPRODUTO, 'MAESTRO') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDMASTER;
      ELSIF INSTR(P_NMPRODUTO, 'VISA') > 0 OR
         INSTR(P_NMPRODUTO, 'ELECTRON') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDVISA;
      ELSIF INSTR(P_NMPRODUTO, 'ELO') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDELO;
      ELSIF INSTR(P_NMPRODUTO, 'DINERS') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDDINERS;
      ELSIF INSTR(P_NMPRODUTO, 'AMEX') > 0 OR
            INSTR(P_NMPRODUTO, 'AMERICAN') > 0 OR
            INSTR(P_NMPRODUTO, 'EXPRESS') > 0 OR
            INSTR(P_NMPRODUTO, 'AME') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDAMEX;
      ELSIF INSTR(P_NMPRODUTO, 'DISCOVER') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDDISCOVER;
      ELSIF INSTR(P_NMPRODUTO, 'GOOD') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDGOODCARD;
      ELSIF INSTR(P_NMPRODUTO, 'SODEX') > 0 OR
         INSTR(P_NMPRODUTO, 'SDX') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDSODEXO;
      ELSIF INSTR(P_NMPRODUTO, 'VR') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDVR;
      ELSIF INSTR(P_NMPRODUTO, 'BANE') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDBANESCARD;
      ELSIF INSTR(P_NMPRODUTO, 'CAB') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDCABAL;
      ELSIF INSTR(P_NMPRODUTO, 'GREEN') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDGREENCARD;
      ELSIF INSTR(P_NMPRODUTO, 'POLI') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDPOLICARD;
      ELSIF INSTR(P_NMPRODUTO, 'VALE') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDVALE;
      ELSIF INSTR(P_NMPRODUTO, 'JCB') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDJCB;
      ELSIF INSTR(P_NMPRODUTO, 'CREDSYSTEM') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDCRED;
      ELSIF INSTR(P_NMPRODUTO, 'HIPER') > 0 THEN
         V_SEQRESULTBAND := V_SEQBANDHIPER;
      ELSE
         V_SEQRESULTBAND := V_SEQBANDDESC;
      END IF;
      RETURN V_SEQRESULTBAND;
   END;

   PROCEDURE GRAVA_SEQ_BANDEIRAS
   AS
   BEGIN
      /* Busca o sequencial para cada bandeira no sistema */
      V_SEQBANDMASTER := BUSCA_BANDEIRA_CNC('MASTER');
      V_SEQBANDVISA := BUSCA_BANDEIRA_CNC('VISA');
      V_SEQBANDELO := BUSCA_BANDEIRA_CNC('ELO');
      V_SEQBANDDINERS := BUSCA_BANDEIRA_CNC('DINERS');
      V_SEQBANDAMEX := BUSCA_BANDEIRA_CNC('AMEX');
      V_SEQBANDDISCOVER := BUSCA_BANDEIRA_CNC('DISCOVER');
      V_SEQBANDGOODCARD := BUSCA_BANDEIRA_CNC('GOOD');
      V_SEQBANDSODEXO := BUSCA_BANDEIRA_CNC('SODEX');
      V_SEQBANDVR := BUSCA_BANDEIRA_CNC('VR');
      V_SEQBANDBANESCARD := BUSCA_BANDEIRA_CNC('BANESCARD');
      V_SEQBANDCABAL := BUSCA_BANDEIRA_CNC('CABAL');
      V_SEQBANDGREENCARD := BUSCA_BANDEIRA_CNC('GREEN');
      V_SEQBANDAVISTA := BUSCA_BANDEIRA_CNC('AVISTA');
      V_SEQBANDPOLICARD := BUSCA_BANDEIRA_CNC('POLI');
      V_SEQBANDVALE := BUSCA_BANDEIRA_CNC('VALE');
      V_SEQBANDJCB := BUSCA_BANDEIRA_CNC('JCB');
      V_SEQBANDCRED := BUSCA_BANDEIRA_CNC('CREDSYSTEM');
      V_SEQBANDHIPER := BUSCA_BANDEIRA_CNC('HIPERCARD');
      V_SEQBANDDESC := BUSCA_BANDEIRA_CNC('DESCONHECIDA');
   END;
BEGIN
   /* Procedure responsavel por replicar os dados das tabelas de retorno dos WebServices e gravar nas tabelas do sistema
      Relaciona os sequenciais das bandeiras as variaveis para evitar execucoes desnecessarias de select */
   GRAVA_SEQ_BANDEIRAS;

   /* Busca as vendas retornadas do webservice de acordo com o sequencial de controle */
   FOR VENDA_ORIG IN
      (SELECT NRRETORIGVENDA, R.NRADQUIRENTE, NRPRODUTOADQ, NMPRODUTOADQ, TRUNC(DTVENDA) DTVENDA,
              TRUNC(DTCREDITO) DTCREDITO, CDLOTEVENDA,
              NRAUTORIZACAO, NRCARTAOTRUNC, CDNSU, NRTID, ROUND(VRBRUTVENDA, 2) VRBRUTVENDA, R.VRTAXAADM, VRCOBRADOTAXA,
              ROUND(VRLIQVENDA, 2) VRLIQVENDA, NRTERMINAL, CDBANCO, CDAGENCIA, CDCONTCORR, NRPARCELA, IDSTATUS,
              IDREJEITADO, IDCANCELADO, DTPGTO, ROUND(VRLIQPGTO, 2) VRLIQPGTO, NRQTPARCELA,
              R.NRORG, NRESTABELEC, A.CDADQUIRENTE
         FROM RETORIGVENDA R, ADQUIRENTE A
        WHERE ((R.NRCTRLACESWS = P_NRSEQCONTROLE) OR (R.NRHEADERACSTAGE = P_NRHEADERAS))
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND NOT EXISTS (SELECT 1
                            FROM RETVENDAADQ RV
                           WHERE RV.NRRETORIGVENDA = R.NRRETORIGVENDA)

          AND NOT EXISTS (SELECT 1
                            FROM RETVENDAADQ RV
                           WHERE RV.NRADQUIRENTE = R.NRADQUIRENTE
                             AND RV.DTVENDA = R.DTVENDA
                             AND RV.NRAUTORIZACAO = R.NRAUTORIZACAO
                             AND RV.CDNSU = R.CDNSU
                             AND RV.VRBRUTVENDA = R.VRBRUTVENDA)
        ORDER BY A.CDADQUIRENTE, R.DTVENDA) LOOP

      /* Verifica se existe lote ja cadastrado com o numero recebido pelo WS */
      V_COUNT := 0;
      V_IDTIPOLOTE := 'V';
      IF VENDA_ORIG.CDADQUIRENTE NOT IN ('11', '28', '31', '70', '35', '36', '7') THEN /* DIFERENTE DE VR, TICKET, SODEXO, VALECARD, BEN VISA VALE, PAGSEGURO, SAFRA PAY E STONE */
         BEGIN
            SELECT COUNT(*), NRLOTEVENDA
              INTO V_COUNT, V_NRSEQLOTE
              FROM LOTEVENDA
             WHERE NRADQUIRENTE = VENDA_ORIG.NRADQUIRENTE
               AND CDLOTEVENDA = VENDA_ORIG.CDLOTEVENDA
               AND DTLOTE = VENDA_ORIG.DTVENDA
               AND IDTIPOLOTE = V_IDTIPOLOTE
             GROUP BY NRLOTEVENDA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
               V_NRSEQLOTE := 0;
         END;
         IF V_COUNT = 0 THEN
            NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
            V_NRSEQLOTE := TO_NUMBER(V_SEQVARCHAR);
            INSERT INTO LOTEVENDA
               (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
            VALUES
               (V_NRSEQLOTE, VENDA_ORIG.NRADQUIRENTE, VENDA_ORIG.CDLOTEVENDA, VENDA_ORIG.DTVENDA, V_IDTIPOLOTE);
         END IF;
      ELSE
         IF VENDA_ORIG.CDADQUIRENTE = '7' THEN
            V_SGLOTE := 'STONE';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '11' THEN
            V_SGLOTE := 'TICKET';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '28' THEN
            V_SGLOTE := 'VR';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '31' THEN
            V_SGLOTE := 'VALECARD';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '35' THEN
            V_SGLOTE := 'PAGSEGURO';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '36' THEN
            V_SGLOTE := 'SAFRA PAY';
         ELSIF VENDA_ORIG.CDADQUIRENTE = '70' THEN
            V_SGLOTE := 'BEN VISA VALE';
         END IF;
         /* A VR NAO ENVIA OS DADOS DE VENDA, POR ISSO DEVEM SER INSERIDOS JUNTAMENTE COM OS RETORNOS DOS PAGAMENTOS. SOMENTE ASSIM
            SERA POSSIVEL REALIZAR AS CONCILIACOES E GERACOES PARA O FINANCEIRO */
         V_COUNT := 0;
         BEGIN
            SELECT COUNT(*), NRLOTEVENDA
              INTO V_COUNT, V_NRSEQLOTE
              FROM LOTEVENDA
             WHERE NRADQUIRENTE = VENDA_ORIG.NRADQUIRENTE
               AND CDLOTEVENDA = V_SGLOTE||' - '||TO_CHAR(VENDA_ORIG.DTVENDA, 'DD/MM/YYYY')
               AND DTLOTE = VENDA_ORIG.DTVENDA
               AND IDTIPOLOTE = V_IDTIPOLOTE
             GROUP BY NRLOTEVENDA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
               V_NRSEQLOTE := 0;
         END;
         IF V_COUNT = 0 THEN
            NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
            V_NRSEQLOTE := TO_NUMBER(V_SEQVARCHAR);
            INSERT INTO LOTEVENDA
               (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
            VALUES
               (V_NRSEQLOTE, VENDA_ORIG.NRADQUIRENTE, V_SGLOTE||' - '||TO_CHAR(VENDA_ORIG.DTVENDA, 'DD/MM/YYYY'),
                VENDA_ORIG.DTVENDA, V_IDTIPOLOTE);
         END IF;
      END IF;

      V_NRSEQBANDEIRA := BUSCA_BANDEIRA(VENDA_ORIG.NMPRODUTOADQ);
      NOVO_CODIGO_NT('RETVENDAADQ', V_SEQVARCHAR);
      V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);

      /* BUSCA O VALOR ESPERADO E A TAXA ESPERADA, DE ACORDO COM A PARAMETRIZACAO */
      VALORLIQUIDOCNC(VENDA_ORIG.NRESTABELEC,
                      VENDA_ORIG.NRADQUIRENTE,
                      VENDA_ORIG.NRPRODUTOADQ,
                      VENDA_ORIG.VRBRUTVENDA,
                      V_VRTAXAPARAM,
                      V_VRLIQVENDATMP,
                      VENDA_ORIG.DTVENDA);

      INSERT INTO RETVENDAADQ
         (NRRETVENDAADQ, NRADQUIRENTE, NRPRODUTOADQ, NRBANDEIRAVAN, NRLOTEVENDA,
          NRPARCELA, CDNSU, NRAUTORIZACAO, NRCARTAOTRUNC, DTVENDA, DTCREDITO,
          VRBRUTVENDA, VRTAXAADM, VRTAXAPREV, VRLIQVENDA, CDBANCO, CDAGENCIA, CDCONTCORR,
          NRTID, IDCONCILIADO, NRORG, NRRETORIGVENDA, NRQTPARCELA, IDSITUACAO, NRESTABELEC, NRTERMINAL)
      VALUES
         (V_SEQUENCIAL, VENDA_ORIG.NRADQUIRENTE, VENDA_ORIG.NRPRODUTOADQ, V_NRSEQBANDEIRA, V_NRSEQLOTE,
         VENDA_ORIG.NRPARCELA, VENDA_ORIG.CDNSU, VENDA_ORIG.NRAUTORIZACAO, VENDA_ORIG.NRCARTAOTRUNC, VENDA_ORIG.DTVENDA, VENDA_ORIG.DTCREDITO,
         VENDA_ORIG.VRBRUTVENDA, VENDA_ORIG.VRTAXAADM, V_VRTAXAPARAM, VENDA_ORIG.VRLIQVENDA, VENDA_ORIG.CDBANCO, VENDA_ORIG.CDAGENCIA, VENDA_ORIG.CDCONTCORR,
         VENDA_ORIG.NRTID, 'P', VENDA_ORIG.NRORG, VENDA_ORIG.NRRETORIGVENDA, VENDA_ORIG.NRQTPARCELA, 'N', VENDA_ORIG.NRESTABELEC, VENDA_ORIG.NRTERMINAL);
   END LOOP;

   FOR FINANC_ORIG IN
      (SELECT R.NRRETORIGFINANC, R.NRADQUIRENTE, R.NRPRODUTOADQ, R.NMPRODUTOADQ, TRUNC(R.DTVENDA) DTVENDA, TRUNC(R.DTCREDITO) DTCREDITO,
              R.CDLOTEVENDA,
              R.NRAUTORIZACAO, R.CDNSU, R.NRTID, R.VRBRUTVENDA, R.VRTAXAADM, R.VRCOBRADOTAXA, NULL NRCARTAOTRUNC,
              ROUND(R.VRLIQVENDA, 2) VRLIQVENDA, R.CDBANCO, R.CDAGENCIA, R.CDCONTCORR, R.NRPARCELA, R.NRQTPARCELA, R.IDANTECIPADO,
              R.IDTIPOTRANS, R.DSTRANSACAO, R.NRORG, R.NRESTABELEC, A.CDADQUIRENTE, A.IDTXADMANT
         FROM RETORIGFINANC R, ADQUIRENTE A
        WHERE ((NRCTRLACESWS = P_NRSEQCONTROLE) OR (R.NRHEADERACSTAGE = P_NRHEADERAS))
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND R.NRORG = A.NRORG
          AND NOT EXISTS (SELECT 1
                            FROM RETFINANCADQ RV
                           WHERE RV.NRRETORIGFINANC = R.NRRETORIGFINANC)
          AND NOT EXISTS (SELECT 1
                            FROM RETFINANCADQ RF
                           WHERE RF.NRADQUIRENTE = R.NRADQUIRENTE
                             AND RF.NRESTABELEC = R.NRESTABELEC
                             AND RF.DTCREDITO = R.DTCREDITO
                             AND RF.NRAUTORIZACAO = R.NRAUTORIZACAO
                             AND RF.CDNSU = R.CDNSU
                             AND RF.VRBRUTVENDA = R.VRBRUTVENDA)
        ORDER BY A.CDADQUIRENTE, R.DTVENDA) LOOP
      V_VRRETORNO := FINANC_ORIG.VRLIQVENDA;
      V_VRTAXAADM := FINANC_ORIG.VRTAXAADM;
      V_IDTIPOVENDA := 'L';
      V_DSAJUSTE := NULL;
      V_NRSEQLOTE := NULL;
      V_IDTIPOLOTE := 'P';

      IF FINANC_ORIG.IDTIPOTRANS IN ('C', 'D') THEN
         /* Se for "debito" sera considerado como Pagamento na tabela RETFINANCADQ */
         IF FINANC_ORIG.IDTIPOTRANS = 'D' THEN
            V_IDTIPOVENDA := 'P';
         ELSE
            V_IDTIPOVENDA := 'C';
         END IF;
         V_DSAJUSTE := FINANC_ORIG.DSTRANSACAO;
      END IF;

      /* Calcula o valor que foi cobrado em taxa administrativa */ 
      V_VRCOBRADOTAXA := ROUND(FINANC_ORIG.VRBRUTVENDA * (FINANC_ORIG.VRTAXAADM / 100), 2);

      IF FINANC_ORIG.IDANTECIPADO = 'S' THEN
         V_IDTIPOVENDA := 'A';
         V_IDTIPOLOTE := 'A';
         /* Calcula a diferenca entre o dia previsto de pagamento e o dia de pagamento antecipado */
         V_DTDIFERENCAANT := TO_NUMBER(TRUNC(FINANC_ORIG.DTCREDITO) - TRUNC(FINANC_ORIG.DTVENDA));
         V_QTDIASANT := TRUNC(V_DTDIFERENCAANT);
         VALORLIQUIDOCNC(FINANC_ORIG.NRESTABELEC,
                         FINANC_ORIG.NRADQUIRENTE,
                         FINANC_ORIG.NRPRODUTOADQ,
                         FINANC_ORIG.VRBRUTVENDA,
                         V_VRTAXAPARAM,
                         V_VRLIQVENDATMP,
                         FINANC_ORIG.DTVENDA);

         IF (FINANC_ORIG.IDTXADMANT) = 'N' OR (V_VRTAXAPARAM > FINANC_ORIG.VRTAXAADM) THEN
            /* Verifica se usa a taxa de ADM para abater na taxa que retornou. Isso e usado para
                as adquirentes que nao enviam a taxa de antecipacao separada da taxa de administracao, como a
                Sodexo, por exemplo. O calculo tambem e ignorado caso a taxa parametrizada seja menor que a taxa que
                veio a ser cobrada pela operadora. */
                
            /* Calcula o valor liquido considerando apenas a taxa de administracao */
            V_VRLIQVENDA := FINANC_ORIG.VRBRUTVENDA - (FINANC_ORIG.VRBRUTVENDA * (FINANC_ORIG.VRTAXAADM / 100));

            /* Calcula o valor que foi descontado devido a antecipacao */
            V_VRDESCONTOANTECIPACAO := V_VRLIQVENDA - FINANC_ORIG.VRLIQVENDA;

            /* Calcula a taxa de Antecipacao Mensal */
            V_VRPORANTMES := ROUND((((V_VRDESCONTOANTECIPACAO / V_QTDIASANT) * 30) * 100) / V_VRLIQVENDA, 6);
         ELSE
            V_VRTAXATEMP := FINANC_ORIG.VRTAXAADM - V_VRTAXAPARAM;
            V_VRTAXAADM := V_VRTAXAPARAM;
            
            /* Calcula o valor liquido considerando apenas a taxa de administracao */
            V_VRLIQVENDA := FINANC_ORIG.VRBRUTVENDA - (FINANC_ORIG.VRBRUTVENDA * (V_VRTAXAPARAM / 100));

            /* Calcula o valor que foi descontado devido a antecipacao */
            V_VRDESCONTOANTECIPACAO := V_VRLIQVENDA - FINANC_ORIG.VRLIQVENDA;

            /* Calcula a taxa de Antecipacao Mensal */
            V_VRPORANTMES := ROUND((V_VRTAXATEMP / V_QTDIASANT) * 30, 6);
         END IF;
         
         /* Calcula a taxa de Antecipacao Diaria */
         V_VRPORTAXAANTDIA := V_VRPORANTMES / 30;

         /* Calcula a taxa de Antecipacao para a Venda Antecipada */
         V_VRTAXAANTVENDA := ROUND(V_VRPORTAXAANTDIA * V_QTDIASANT, 6);
      ELSE
         V_VRPORANTMES := 0;
         V_VRPORTAXAANTDIA := 0;
         V_VRTAXAANTVENDA := 0;
      END IF;

      V_COUNT := 0;
      IF FINANC_ORIG.CDADQUIRENTE NOT IN ('11', '28', '13', '31', '70', '35', '36', '7') THEN /* DIFERENTE DE VR, TICKET, SODEXO, VALECARD, BEN VISA VALE, PAGSEGURO, SAFRA PAY E STONE */
         BEGIN
            SELECT COUNT(*), NRLOTEVENDA
              INTO V_COUNT, V_NRSEQLOTE
              FROM LOTEVENDA
             WHERE NRADQUIRENTE = FINANC_ORIG.NRADQUIRENTE
               AND CDLOTEVENDA = FINANC_ORIG.CDLOTEVENDA
               AND DTLOTE = FINANC_ORIG.DTCREDITO
               AND IDTIPOLOTE = V_IDTIPOLOTE
             GROUP BY NRLOTEVENDA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
               V_NRSEQLOTE := 0;
         END;
         IF V_COUNT = 0 THEN
            NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
            V_NRSEQLOTE := TO_NUMBER(V_SEQVARCHAR);
            INSERT INTO LOTEVENDA
               (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
            VALUES
               (V_NRSEQLOTE, FINANC_ORIG.NRADQUIRENTE, FINANC_ORIG.CDLOTEVENDA, FINANC_ORIG.DTCREDITO, V_IDTIPOLOTE);
         END IF;
      ELSE         
         /* A VR NAO ENVIA OS DADOS DE VENDA, POR ISSO DEVEM SER INSERIDOS JUNTAMENTE COM OS RETORNOS DOS PAGAMENTOS. SOMENTE ASSIM
            SERA POSSIVEL REALIZAR AS CONCILIACOES E GERACOES PARA O FINANCEIRO */
         IF FINANC_ORIG.IDTIPOTRANS = 'V' THEN
            IF FINANC_ORIG.CDADQUIRENTE = '7' THEN
               V_SGLOTE := 'STONE';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '11' THEN
               V_SGLOTE := 'TICKET';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '28' THEN
               V_SGLOTE := 'VR';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '13' THEN
               V_SGLOTE := 'SODEXO';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '31' THEN
               V_SGLOTE := 'VALECARD';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '35' THEN
               V_SGLOTE := 'PAGSEGURO';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '36' THEN
               V_SGLOTE := 'SAFRA PAY';
            ELSIF FINANC_ORIG.CDADQUIRENTE = '70' THEN
               V_SGLOTE := 'BEN VISA VALE';
            END IF;
            V_COUNT := 0;
            BEGIN
               SELECT COUNT(*), NRLOTEVENDA
                 INTO V_COUNT, V_NRSEQLOTE
                 FROM LOTEVENDA
                WHERE NRADQUIRENTE = FINANC_ORIG.NRADQUIRENTE
                  AND CDLOTEVENDA = V_SGLOTE||' - '||TO_CHAR(FINANC_ORIG.DTCREDITO, 'DD/MM/YYYY')
                  AND DTLOTE = FINANC_ORIG.DTCREDITO
                  AND IDTIPOLOTE = V_IDTIPOLOTE
                GROUP BY NRLOTEVENDA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_COUNT := 0;
                  V_NRSEQLOTE := 0;
            END;
            IF V_COUNT = 0 THEN
               NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
               V_NRSEQLOTE := TO_NUMBER(V_SEQVARCHAR);
               INSERT INTO LOTEVENDA
                  (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
               VALUES
                  (V_NRSEQLOTE, FINANC_ORIG.NRADQUIRENTE, V_SGLOTE||' - '||TO_CHAR(FINANC_ORIG.DTCREDITO, 'DD/MM/YYYY'),
                   FINANC_ORIG.DTCREDITO, V_IDTIPOLOTE);
            END IF;
         END IF;
      END IF;

      /* Verifica se e uma venda e se ela ja esta inserida na retvendaadq. Quando o sistema busca uma venda que nao tinha
         sido inserido devido ao periodo buscado a mesma deve ser inserida para que seja possivel a geracao do financeiro
         e seja feita a conciliacao da mesma */
      IF FINANC_ORIG.CDNSU IS NOT NULL AND FINANC_ORIG.IDTIPOTRANS = 'V' THEN
         V_COUNT := 0;
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM RETVENDAADQ R
             WHERE NRADQUIRENTE = FINANC_ORIG.NRADQUIRENTE
               AND CDNSU = FINANC_ORIG.CDNSU
               AND NRPRODUTOADQ = FINANC_ORIG.NRPRODUTOADQ
               AND DTVENDA = FINANC_ORIG.DTVENDA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         IF V_COUNT = 0 THEN
            VALORLIQUIDOCNC(FINANC_ORIG.NRESTABELEC,
                      FINANC_ORIG.NRADQUIRENTE,
                      FINANC_ORIG.NRPRODUTOADQ,
                      FINANC_ORIG.VRBRUTVENDA,
                      V_VRTAXAPARAM,
                      V_VRLIQVENDATMP,
                      FINANC_ORIG.DTVENDA);

            V_NRLOTEVENDAREP := 0;
            IF FINANC_ORIG.CDADQUIRENTE NOT IN ('11', '28', '13', '31', '70', '35', '36', '7') THEN /* DIFERENTE DE VR, TICKET, SODEXO, VALECARD, BEN VISA VALE, PAGSEGURO, SAFRA PAY E STONE */
               BEGIN
                  SELECT COUNT(*), NRLOTEVENDA
                    INTO V_COUNT, V_NRLOTEVENDAREP
                    FROM LOTEVENDA
                   WHERE NRADQUIRENTE = FINANC_ORIG.NRADQUIRENTE
                     AND CDLOTEVENDA = FINANC_ORIG.CDLOTEVENDA
                     AND DTLOTE = FINANC_ORIG.DTVENDA
                     AND IDTIPOLOTE = 'V'
                   GROUP BY NRLOTEVENDA;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
                     V_NRLOTEVENDAREP := 0;
               END;
               IF V_COUNT = 0 THEN
                  NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
                  V_NRLOTEVENDAREP := TO_NUMBER(V_SEQVARCHAR);
                  INSERT INTO LOTEVENDA
                     (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
                  VALUES
                     (V_NRLOTEVENDAREP, FINANC_ORIG.NRADQUIRENTE, FINANC_ORIG.CDLOTEVENDA, FINANC_ORIG.DTVENDA, 'V');
               END IF;
            ELSE         
               /* A TICKET NAO ENVIA OS DADOS DE VENDA, POR ISSO DEVEM SER INSERIDOS JUNTAMENTE COM OS RETORNOS DOS PAGAMENTOS. SOMENTE ASSIM
                  SERA POSSIVEL REALIZAR AS CONCILIACOES E GERACOES PARA O FINANCEIRO */ 
               IF FINANC_ORIG.CDADQUIRENTE = '7' THEN
                  V_SGLOTE := 'STONE';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '11' THEN
                  V_SGLOTE := 'TICKET';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '13' THEN
                  V_SGLOTE := 'SODEXO';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '31' THEN
                  V_SGLOTE := 'VALECARD';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '35' THEN
                  V_SGLOTE := 'PAGSEGURO';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '36' THEN
                  V_SGLOTE := 'SAFRA PAY';
               ELSIF FINANC_ORIG.CDADQUIRENTE = '70' THEN
                  V_SGLOTE := 'BEN VISA VALE';
               END IF;
               V_COUNT := 0;
               BEGIN
                  SELECT COUNT(*), NRLOTEVENDA
                    INTO V_COUNT, V_NRLOTEVENDAREP
                    FROM LOTEVENDA
                   WHERE NRADQUIRENTE = FINANC_ORIG.NRADQUIRENTE
                     AND CDLOTEVENDA = V_SGLOTE||' - '||TO_CHAR(FINANC_ORIG.DTVENDA, 'DD/MM/YYYY')
                     AND DTLOTE = FINANC_ORIG.DTVENDA
                     AND IDTIPOLOTE = 'V'
                   GROUP BY NRLOTEVENDA;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
                     V_NRLOTEVENDAREP := 0;
               END;
               IF V_COUNT = 0 THEN
                  NOVO_CODIGO_NT('LOTEVENDA', V_SEQVARCHAR);
                  V_NRLOTEVENDAREP := TO_NUMBER(V_SEQVARCHAR);
                  INSERT INTO LOTEVENDA
                     (NRLOTEVENDA, NRADQUIRENTE, CDLOTEVENDA, DTLOTE, IDTIPOLOTE)
                  VALUES
                     (V_NRLOTEVENDAREP, FINANC_ORIG.NRADQUIRENTE, V_SGLOTE||' - '||TO_CHAR(FINANC_ORIG.DTVENDA, 'DD/MM/YYYY'),
                      FINANC_ORIG.DTVENDA, 'V');
               END IF;
            END IF;
                      
            V_NRSEQBANDEIRA := BUSCA_BANDEIRA(FINANC_ORIG.NMPRODUTOADQ);
            NOVO_CODIGO_NT('RETVENDAADQ', V_SEQVARCHAR);
            V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);
            INSERT INTO RETVENDAADQ
               (NRRETVENDAADQ, NRADQUIRENTE, NRPRODUTOADQ, NRBANDEIRAVAN, NRLOTEVENDA,
                NRPARCELA, CDNSU, NRAUTORIZACAO, NRCARTAOTRUNC, DTVENDA, DTCREDITO,
                VRBRUTVENDA, VRTAXAADM, VRTAXAPREV, VRLIQVENDA, CDBANCO, CDAGENCIA, CDCONTCORR,
                NRTID, IDCONCILIADO, NRORG, NRRETORIGVENDA, NRQTPARCELA, IDSITUACAO, NRESTABELEC)
            VALUES
               (V_SEQUENCIAL, FINANC_ORIG.NRADQUIRENTE, FINANC_ORIG.NRPRODUTOADQ, V_NRSEQBANDEIRA, V_NRLOTEVENDAREP,
               FINANC_ORIG.NRPARCELA, FINANC_ORIG.CDNSU, FINANC_ORIG.NRAUTORIZACAO, FINANC_ORIG.NRCARTAOTRUNC, FINANC_ORIG.DTVENDA, FINANC_ORIG.DTCREDITO,
               FINANC_ORIG.VRBRUTVENDA, FINANC_ORIG.VRTAXAADM, V_VRTAXAPARAM, FINANC_ORIG.VRLIQVENDA, FINANC_ORIG.CDBANCO, FINANC_ORIG.CDAGENCIA, FINANC_ORIG.CDCONTCORR,
               FINANC_ORIG.NRTID, 'P', FINANC_ORIG.NRORG, NULL, FINANC_ORIG.NRQTPARCELA, 'N', FINANC_ORIG.NRESTABELEC);
         END IF;
      END IF;

      /* Quando e pagamento de algum lote o CDNSU fica nulo. */
      IF ((FINANC_ORIG.IDTIPOTRANS <> 'V' AND FINANC_ORIG.CDNSU <> '0') OR
          (FINANC_ORIG.CDNSU IS NOT NULL AND FINANC_ORIG.IDTIPOTRANS = 'V') OR
          (FINANC_ORIG.IDTIPOTRANS <> 'V' AND FINANC_ORIG.CDADQUIRENTE = '13')) THEN
         V_NRSEQBANDEIRA := BUSCA_BANDEIRA(FINANC_ORIG.NMPRODUTOADQ);
         NOVO_CODIGO_NT('RETFINANCADQ', V_SEQVARCHAR);
         V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);
         INSERT INTO RETFINANCADQ
            (NRRETFINANCADQ, NRPRODUTOADQ, NRADQUIRENTE, NRBANDEIRAVAN, NRLOTEVENDA,
             NRPARCELA, CDNSU, NRAUTORIZACAO, NRCARTAOTRUNC, DTVENDA, DTCREDITO,
             VRBRUTVENDA, VRTAXAADM, VRCOBRADOTAXA, VRLIQPGTO, VRTAXAANT, VRTAXAANTVENDA, NRANTECIPACAO,
             CDBANCO, CDAGENCIA, CDCONTCORR, DSAJUSTE, IDCONCILIADO, IDSTATUSVENDA, NRORG, NRRETORIGFINANC,
             IDSITUACAO, NRESTABELEC)
         VALUES
            (V_SEQUENCIAL, FINANC_ORIG.NRPRODUTOADQ, FINANC_ORIG.NRADQUIRENTE, V_NRSEQBANDEIRA, V_NRSEQLOTE,
            FINANC_ORIG.NRPARCELA, FINANC_ORIG.CDNSU, FINANC_ORIG.NRAUTORIZACAO, FINANC_ORIG.NRCARTAOTRUNC, FINANC_ORIG.DTVENDA, FINANC_ORIG.DTCREDITO,
            FINANC_ORIG.VRBRUTVENDA, FINANC_ORIG.VRTAXAADM, V_VRCOBRADOTAXA, V_VRRETORNO, V_VRPORANTMES, V_VRTAXAANTVENDA, NULL,
            FINANC_ORIG.CDBANCO, FINANC_ORIG.CDAGENCIA, FINANC_ORIG.CDCONTCORR, V_DSAJUSTE, 'P', V_IDTIPOVENDA, FINANC_ORIG.NRORG, FINANC_ORIG.NRRETORIGFINANC,
            'N', FINANC_ORIG.NRESTABELEC);
      END IF;
   END LOOP;

   /* A TICKET NAO ENVIA OS ARQUIVOS DE PAGAMENTO, PORTANTO, DEVE-SE BUSCAR AS VENDAS QUE ESTAVAM
      PREVISTAS E REPLICAR PARA A RETFINANCADQ */
   FOR C_RETFINANC_TICKET IN
      (SELECT R.NRRETORIGVENDA, R.NRADQUIRENTE, R.NRPRODUTOADQ, P.NMPRODUTOADQ, TRUNC(R.DTVENDA) DTVENDA, TRUNC(R.DTCREDITO) DTCREDITO,
              R.NRLOTEVENDA,
              R.NRAUTORIZACAO, R.CDNSU, R.NRTID, ROUND(R.VRBRUTVENDA, 2) VRBRUTVENDA, R.VRTAXAADM,
              ROUND(NVL(R.VRBRUTVENDA, 0) - NVL(VRLIQVENDA, 0), 2) AS VRCOBRATOXADA,
              NULL NRCARTAOTRUNC,
              ROUND(R.VRLIQVENDA, 2) VRLIQVENDA, R.CDBANCO, R.CDAGENCIA, R.CDCONTCORR, R.NRPARCELA, R.NRQTPARCELA,
              R.NRORG, R.NRESTABELEC, A.CDADQUIRENTE
         FROM RETVENDAADQ R, ADQUIRENTE A, PRODUTOADQ P
        WHERE R.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND R.NRORG = A.NRORG
          AND A.CDADQUIRENTE = '11' /* TICKET */
          AND NOT EXISTS (SELECT 1
                            FROM RETFINANCADQ RF
                           WHERE RF.NRADQUIRENTE = R.NRADQUIRENTE
                             AND RF.DTVENDA = R.DTVENDA
                             AND RF.NRAUTORIZACAO = R.NRAUTORIZACAO
                             AND RF.CDNSU = R.CDNSU
                             AND RF.VRBRUTVENDA = R.VRBRUTVENDA)
        ORDER BY A.CDADQUIRENTE, R.DTVENDA) LOOP

      V_COUNT := 0;
      BEGIN
         SELECT COUNT(*)
           INTO V_COUNT
           FROM RETFINANCADQ
          WHERE NRADQUIRENTE = C_RETFINANC_TICKET.NRADQUIRENTE
            AND NRPRODUTOADQ = C_RETFINANC_TICKET.NRPRODUTOADQ
            AND NRAUTORIZACAO = C_RETFINANC_TICKET.NRAUTORIZACAO
            AND CDNSU = C_RETFINANC_TICKET.CDNSU
            AND DTVENDA = C_RETFINANC_TICKET.DTVENDA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_COUNT := 0;
      END;
      IF V_COUNT = 0 THEN
         V_NRSEQBANDEIRA := BUSCA_BANDEIRA(C_RETFINANC_TICKET.NMPRODUTOADQ);
         NOVO_CODIGO_NT('RETFINANCADQ', V_SEQVARCHAR);
         V_SEQUENCIAL := TO_NUMBER(V_SEQVARCHAR);
         INSERT INTO RETFINANCADQ
            (NRRETFINANCADQ, NRADQUIRENTE, NRPRODUTOADQ, NRBANDEIRAVAN, NRLOTEVENDA,
             NRPARCELA, CDNSU, NRAUTORIZACAO, NRCARTAOTRUNC, DTVENDA, DTCREDITO,
             VRBRUTVENDA, VRTAXAADM, VRCOBRADOTAXA, VRLIQPGTO, CDBANCO, CDAGENCIA, CDCONTCORR,
             IDCONCILIADO, NRORG, IDSITUACAO, NRESTABELEC, IDSTATUSVENDA)
         VALUES
            (V_SEQUENCIAL, C_RETFINANC_TICKET.NRADQUIRENTE, C_RETFINANC_TICKET.NRPRODUTOADQ, V_NRSEQBANDEIRA, C_RETFINANC_TICKET.NRLOTEVENDA,
            C_RETFINANC_TICKET.NRPARCELA, C_RETFINANC_TICKET.CDNSU, C_RETFINANC_TICKET.NRAUTORIZACAO, C_RETFINANC_TICKET.NRCARTAOTRUNC, C_RETFINANC_TICKET.DTVENDA, C_RETFINANC_TICKET.DTCREDITO,
            C_RETFINANC_TICKET.VRBRUTVENDA, C_RETFINANC_TICKET.VRTAXAADM, C_RETFINANC_TICKET.VRCOBRATOXADA, C_RETFINANC_TICKET.VRLIQVENDA, C_RETFINANC_TICKET.CDBANCO, C_RETFINANC_TICKET.CDAGENCIA, C_RETFINANC_TICKET.CDCONTCORR,
            'P', C_RETFINANC_TICKET.NRORG, 'N', C_RETFINANC_TICKET.NRESTABELEC, 'L');
      END IF;
   END LOOP;
END;
/