create or replace PROCEDURE REFAZ_REC_TAXASERV_CNC(P_NRCONSMOVCAIXA IN NUMBER)
AS
  V_CDCLASSFINA VARCHAR2(6);
  V_CDAJUCTREC VARCHAR2(4);
  V_CDTPCTRECEB VARCHAR(6);
  V_NRORG NUMBER;
  V_VRTOTVENDA NUMBER;
  V_VRVENDASEMTAXA NUMBER;
  V_VRTOTGORJ NUMBER;
  V_PERCGORJ NUMBER;
  V_VRTXADMTXSERV NUMBER;
  V_VRTAXASERVICO NUMBER;
  V_PERCVENDACOMTAXA NUMBER;
  V_COUNT NUMBER;
  V_VRATUAREC NUMBER;
  V_VRAJUSTETXANT NUMBER;
  V_CDAJUCTREC_NOVO VARCHAR2(04);
BEGIN
  FOR C_VENDA_FOS IN
      (SELECT V.CDFILIAL, V.CDCAIXA, V.NRSEQVENDA, NVL(T.VRTAXAADMI, 0) VRTAXAADM, CM.VRVENDA, CM.CDFILIALNF, CM.NRLANCTONF,
              E.VRPERCTXADMSERV, E.CDEMPRESA, R.DTCREDITO, CM.DTVENDA, E.CDTPAJUCTTXADM, CM.NRORG, E.IDCTRLTXSERV,
              ROUND(CM.VRVENDA * (NVL(R.VRTAXAADM, 0)/100), 2) VRAJUSTE, E.CDTPAJUCTTXSRV, CM.CDNSU,
              R.NRESTABELEC, R.NRPRODUTOADQ, R.NRADQUIRENTE, CM.CDTIPORECE, CM.NRPARCELA
         FROM MOVCAIXA M, CONSMOVCAIXA CM, VENDA V, TIPORECE T, RETVENDAADQ R, ESTABELECIMENTO E
        WHERE CM.CDFILIAL = M.CDFILIAL
          AND CM.CDCAIXA = M.CDCAIXA
          AND CM.DTABERCAIX = M.DTABERCAIX
          AND CM.NRSEQUMOVI = M.NRSEQUMOVI
          AND M.CDFILIAL = V.CDFILIAL
          AND M.CDCAIXA = V.CDCAIXA
          AND M.NRSEQVENDA = V.NRSEQVENDA
          AND CM.CDTIPORECE = T.CDTIPORECE
          AND CM.NRCONCLANC = R.NRCONCLANC
          AND R.NRESTABELEC = E.NRESTABELEC
          AND CM.NRCONSMOVCAIXA = P_NRCONSMOVCAIXA) LOOP

      V_VRTOTVENDA := 0;
      BEGIN
         SELECT SUM(TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) + NVL(I.VRACRITVEND,0) - NVL(I.VRDESITVEND,0)) AS VRTOTVENDA
           INTO V_VRTOTVENDA
           FROM ITEMVENDA I
          WHERE I.CDFILIAL = C_VENDA_FOS.CDFILIAL
            AND I.CDCAIXA = C_VENDA_FOS.CDCAIXA
            AND I.NRSEQVENDA = C_VENDA_FOS.NRSEQVENDA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_VRTOTVENDA := 0;
      END;

      V_VRTOTGORJ := 0;
      BEGIN
         SELECT NVL(A.VRGORJETA,0) AS VRGORJETA
       INTO V_VRTOTGORJ
       FROM (SELECT SUM(NVL(I.VRACRITVEND,0)) AS VRGORJETA
           FROM ITEMVENDA I, LOJA L, VENDA V
          WHERE (I.CDPRODUTO = L.CDPRODTAXASERV)
          AND V.NRSEQVENDA  = I.NRSEQVENDA
          AND V.CDCAIXA     = I.CDCAIXA
          AND V.CDFILIAL    = I.CDFILIAL
          AND L.CDLOJA      = V.CDLOJA
          AND L.CDFILIAL    = V.CDFILIAL
          AND V.CDFILIAL = C_VENDA_FOS.CDFILIAL
          AND I.CDCAIXA = C_VENDA_FOS.CDCAIXA
          AND I.NRSEQVENDA = C_VENDA_FOS.NRSEQVENDA) A;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_VRTOTGORJ := 0;
      END;

      /* BUSCA O AJUSTE REF. A TAXA ADMINSTRATIVA DO CARTAO */
      FOR C_AJUSTE IN
         (SELECT A.CDFILIAL, A.NRLANCTONF, A.VRAJUSTEREC, A.DTAJUSTEREC, A.CDAJUCTREC, C.CDFILIBOLREC, C.NRLANBOLREC,
                 C.DTATUAVENREC, NF.CDEMPRESA, NF.DTEMISSAO DTVENDA, T.CDCLASSFINA, C.NRORG
            FROM AJCTRECEBER A, TIPOAJRECEBER T, CONTARECEBER C, NOTAFISCAL NF, TIPOCTRECEBER T
           WHERE C.CDFILIAL = C_VENDA_FOS.CDFILIALNF
             AND C.NRLANCTONF = C_VENDA_FOS.NRLANCTONF
             AND C.CDFILIAL = NF.CDFILIAL
             AND C.NRLANCTONF = NF.NRLANCTONF
             AND C.CDFILIAL = A.CDFILIAL
             AND C.NRLANCTONF = A.NRLANCTONF
             AND A.CDAJUCTREC = T.CDAJUCTREC
             AND C.CDTPCTRECEB = T.CDTPCTRECEB
             AND T.IDAJUCTREC = 'D') LOOP
         V_CDAJUCTREC := C_AJUSTE.CDAJUCTREC;
         IF V_CDAJUCTREC IS NOT NULL THEN
            DELETE
              FROM AJCTRECEBER
             WHERE CDFILIAL = C_AJUSTE.CDFILIAL
               AND NRLANCTONF = C_AJUSTE.NRLANCTONF
               AND CDAJUCTREC = C_AJUSTE.CDAJUCTREC
               AND DTAJUSTEREC = C_AJUSTE.DTAJUSTEREC;

            /* RETIRA O VALOR DO AJUSTE DA CONTA NO REC CASO O PRODUTO ALTERE, POIS O VALOR DA TAXA PODE SOFRER ALTERACAO */
            /* Atualiza a parcela da conta para a parcela preenchida na venda */
            UPDATE CONTARECEBER
               SET VRATUAREC = VRATUAREC + C_AJUSTE.VRAJUSTEREC, NRPARCELAREC = C_VENDA_FOS.NRPARCELA
             WHERE CDFILIAL = C_AJUSTE.CDFILIAL
               AND NRLANCTONF = C_AJUSTE.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_AJUSTE.VRAJUSTEREC
             WHERE CDFILIAL = C_AJUSTE.CDFILIBOLREC
               AND NRLANBOLREC = C_AJUSTE.NRLANBOLREC;

            /* 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_AJUSTE.VRAJUSTEREC
             WHERE CDFILIAL = C_AJUSTE.CDFILIBOLREC
               AND NRLANBOLREC = C_AJUSTE.NRLANBOLREC
               AND CDTIPORECE = C_VENDA_FOS.CDTIPORECE;

            /* ATUALIZA OS VALORES DO CONTAS A RECEBER COM O NOVO VALORE DE AJUSTE.
               DEVEM SER ATUALIZADOS OS VALORES:
               -CONTA
               -TIPO DE RECEBIMENTO DO BOLETO
               -VALOR FINAL DO BOLETO */
            UPDATE CONTARECEBER
               SET VRATUAREC = VRATUAREC - C_VENDA_FOS.VRAJUSTE
             WHERE CDFILIAL = C_AJUSTE.CDFILIAL
               AND NRLANCTONF = C_AJUSTE.NRLANCTONF;

            UPDATE TPRECBOLETO
               SET VRTPRECBOLR = VRTPRECBOLR - C_VENDA_FOS.VRAJUSTE
             WHERE CDFILIAL = C_AJUSTE.CDFILIBOLREC
               AND NRLANBOLREC = C_AJUSTE.NRLANBOLREC
               AND CDTIPORECE = C_VENDA_FOS.CDTIPORECE;

            /* 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_VENDA_FOS.VRAJUSTE
             WHERE CDFILIAL = C_AJUSTE.CDFILIBOLREC
               AND NRLANBOLREC = C_AJUSTE.NRLANBOLREC;

            /* REINSERE O AJUSTE DA TAXA ADMINISTRATIVA */
            ATUALIZA_FLUXO_DE_CAIXA(C_VENDA_FOS.CDEMPRESA, C_VENDA_FOS.CDFILIAL, C_AJUSTE.DTATUAVENREC, 'E', C_AJUSTE.CDCLASSFINA, C_VENDA_FOS.VRAJUSTE, 0);
            V_CDAJUCTREC_NOVO := NULL;
            BEGIN
             SELECT BUSCA_PARAMETRO_CNC(C_VENDA_FOS.NRESTABELEC, C_VENDA_FOS.NRADQUIRENTE, C_VENDA_FOS.NRPRODUTOADQ, 'TIPOAJUSTE', 'N', NULL, NULL)
               INTO V_CDAJUCTREC_NOVO
               FROM DUAL;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDAJUCTREC_NOVO := NULL;
            END;
            INSERT INTO AJCTRECEBER
               (CDFILIAL, NRLANCTONF, DTAJUSTEREC, CDAJUCTREC, DSAJUSTEREC, VRAJUSTEREC,
                NRSEQVENREC, NRPARCELAREC, CDCLASSFINA, NRORG, IDMOVFLUXO, CDEMMFAJCNTR, CDFIMFAJCNTR, DTMOVFLUXO)
            VALUES
               (C_AJUSTE.CDFILIAL, C_AJUSTE.NRLANCTONF, C_AJUSTE.DTVENDA, NVL(V_CDAJUCTREC_NOVO, V_CDAJUCTREC), 'TAXA ADMINISTRATIVA', C_VENDA_FOS.VRAJUSTE,
                '01', C_VENDA_FOS.NRPARCELA, C_AJUSTE.CDCLASSFINA, C_AJUSTE.NRORG, 'E', C_AJUSTE.CDEMPRESA, C_AJUSTE.CDFILIAL, C_AJUSTE.DTATUAVENREC);
         END IF;
      END LOOP;

      IF C_VENDA_FOS.IDCTRLTXSERV = 'S' THEN
         IF V_VRTOTGORJ > 0 THEN
            V_VRVENDASEMTAXA := ROUND(V_VRTOTVENDA - V_VRTOTGORJ, 2); /* RETIRA DO VALOR TOTAL O VALOR DA GORJETA */
            V_PERCGORJ := ROUND((V_VRTOTGORJ * 100) / V_VRVENDASEMTAXA, 2); /* CALCULA A % DA GORJETA QUE FOI APLICADA NA VENDA */
            V_PERCVENDACOMTAXA := 100 + V_PERCGORJ; /* CALCULA A % QUE A VENDA FICOU APOS O ACRESCIMO DA GORJETA */
            V_VRVENDASEMTAXA := ROUND((C_VENDA_FOS.VRVENDA * 100) / V_PERCVENDACOMTAXA, 2); /* CALCULA O VALOR DA VENDA SEM A GORJETA */
            V_VRTOTGORJ := ROUND(V_VRVENDASEMTAXA * (V_PERCGORJ / 100), 2);
            DELETE
              FROM AJCTRECEBER
             WHERE CDFILIAL = C_VENDA_FOS.CDFILIALNF
               AND NRLANCTONF = C_VENDA_FOS.NRLANCTONF
               AND CDAJUCTREC <> NVL(NVL(V_CDAJUCTREC_NOVO, V_CDAJUCTREC), 'XX');

            SELECT MAX(CDCLASSFINA)
              INTO V_CDCLASSFINA
              FROM TIPOCTRECEBER T
             WHERE EXISTS (SELECT 1
                             FROM CONTARECEBER C
                            WHERE C.CDTPCTRECEB = T.CDTPCTRECEB
                              AND C.CDFILIAL = C_VENDA_FOS.CDFILIALNF
                              AND C.NRLANCTONF = C_VENDA_FOS.NRLANCTONF);

            V_VRTXADMTXSERV := ROUND(V_VRTOTGORJ * (C_VENDA_FOS.VRPERCTXADMSERV / 100), 2);
            /* GERA O AJUSTE COM O VALOR DA TAXA ADMINISTRATIVA PARA A TAXA DE SERVICO. */
            ATUALIZA_FLUXO_DE_CAIXA(C_VENDA_FOS.CDEMPRESA, C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.DTCREDITO, 'P', V_CDCLASSFINA, V_VRTXADMTXSERV, 0);

            INSERT INTO AJCTRECEBER
              (CDFILIAL, NRLANCTONF, DTAJUSTEREC, CDAJUCTREC, DSAJUSTEREC, VRAJUSTEREC,
                NRSEQVENREC, NRPARCELAREC, CDCLASSFINA, NRORG, IDMOVFLUXO, CDEMMFAJCNTR, CDFIMFAJCNTR, DTMOVFLUXO)
            VALUES
              (C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.NRLANCTONF, C_VENDA_FOS.DTVENDA, C_VENDA_FOS.CDTPAJUCTTXADM, 'TX ADMIN DA TX SERV', V_VRTXADMTXSERV,
                '01', C_VENDA_FOS.NRPARCELA, V_CDCLASSFINA, C_VENDA_FOS.NRORG, 'P', C_VENDA_FOS.CDEMPRESA, C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.DTCREDITO);
            V_VRTAXASERVICO := 0;
            IF ABS(C_VENDA_FOS.VRPERCTXADMSERV - 100) <> 0 THEN
               V_VRTAXASERVICO := ROUND(V_VRTOTGORJ * (ABS(C_VENDA_FOS.VRPERCTXADMSERV - 100) / 100), 2);
               /* GERA O AJUSTE COM O VALOR DA TAXA DE SERVICO. */
               ATUALIZA_FLUXO_DE_CAIXA(C_VENDA_FOS.CDEMPRESA, C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.DTCREDITO, 'P', V_CDCLASSFINA, V_VRTAXASERVICO, 0);
               INSERT INTO AJCTRECEBER
                 (CDFILIAL, NRLANCTONF, DTAJUSTEREC, CDAJUCTREC, DSAJUSTEREC, VRAJUSTEREC,
                   NRSEQVENREC, NRPARCELAREC, CDCLASSFINA, NRORG, IDMOVFLUXO, CDEMMFAJCNTR, CDFIMFAJCNTR, DTMOVFLUXO)
               VALUES
                 (C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.NRLANCTONF, C_VENDA_FOS.DTVENDA, C_VENDA_FOS.CDTPAJUCTTXSRV, 'TAXA DE SERVICO', V_VRTAXASERVICO,
                   '01', C_VENDA_FOS.NRPARCELA, V_CDCLASSFINA, C_VENDA_FOS.NRORG, 'P', C_VENDA_FOS.CDEMPRESA, C_VENDA_FOS.CDFILIALNF, C_VENDA_FOS.DTCREDITO);
            END IF;

            UPDATE NOTAFISCAL
               SET VRNOTAFISC = ROUND(C_VENDA_FOS.VRVENDA - V_VRTXADMTXSERV - V_VRTAXASERVICO, 2),
                   VRPRODUTOS = C_VENDA_FOS.VRVENDA
             WHERE CDFILIAL = C_VENDA_FOS.CDFILIALNF
               AND NRLANCTONF = C_VENDA_FOS.NRLANCTONF;

            UPDATE CONTARECEBER
               SET VRORIGREC = ROUND(C_VENDA_FOS.VRVENDA - V_VRTXADMTXSERV - V_VRTAXASERVICO, 2),
                   VRATUAREC = ROUND(C_VENDA_FOS.VRVENDA - C_VENDA_FOS.VRAJUSTE, 2),
                   DSCONTAREC = 'VENDA COM CARTAO. NSU: '||C_VENDA_FOS.CDNSU||' - '||
                                'VR TOTAL VENDA: R$ ' || REPLACE(LTRIM(TO_CHAR(ROUND(C_VENDA_FOS.VRVENDA, 2),'9999990.00')),'.',',')
             WHERE CDFILIAL = C_VENDA_FOS.CDFILIALNF
               AND NRLANCTONF = C_VENDA_FOS.NRLANCTONF;
         END IF;
      END IF;
      CONTABILIZA_CONTAS_CNC(C_VENDA_FOS.CDFILIAL, C_VENDA_FOS.DTVENDA, C_VENDA_FOS.CDTIPORECE);
   END LOOP;
END;
/