create or replace PROCEDURE FINANCEIRO_FOS_CNC(
   P_NRCONSMOVCAIXA IN NUMBER)
IS
   V_COUNT NUMBER;
   V_SEQUENCIAL NUMBER;
   V_TEMP VARCHAR2(20);
   V_NRLANCTONF VARCHAR2(10);
   V_NRLANBOL VARCHAR2(20);
   V_DTVENCIMENTO DATE;
   V_VRTOTVENDA NUMBER;
   V_VRTOTGORJ NUMBER;
   V_PERCGORJ NUMBER;
   V_PERCVENDACOMTAXA NUMBER;
   V_VRVENDASEMTAXA NUMBER;
   V_CDCLASSFINA VARCHAR2(10);
   V_VRTAXASERVICO NUMBER;
   V_VRTXADMTXSERV NUMBER;
   V_NRDIASVENC NUMBER;
   V_CDNSUTEMP VARCHAR(20);
BEGIN
   FOR C_VENDA IN
      (SELECT VENDA.CDFILIAL, VENDA.CDCAIXA, VENDA.NRSEQUMOVI, VENDA.DTABERCAIX,
              VENDA.CDNSU, VENDA.NRQTPARCELA, VENDA.QTPARCELA, VENDA.CDTIPORECE, NVL(VENDA.CDREDUCONTP, NVL(TF.CDREDUCONT, VENDA.CDREDUCONT)) AS CDREDUCONT,
              VENDA.DTVENDA, VENDA.NRAUTORIZACAO,
              VENDA.VRVENDA,
              VENDA.CDEMPRESA, VENDA.CDINSCESTA, VENDA.CDINSCMUNI,
              VENDA.CDCLIENTE, VENDA.CDTIPOOPER, VENDA.CDSERIE,
              VENDA.IDENTRSAIDOP, NVL(DECODE(TF.VRTAXAADMFIL, 0, NULL, TF.VRTAXAADMFIL), VENDA.VRTAXAADM) VRTAXAADM,
              VENDA.CDTPCTRECEB, VENDA.CDAJTXADMREC,
              VENDA.NRORG, VENDA.IDGERAFIN, VENDA.IDCONTAPREVCNC,
              VENDA.IDCONTTXSERVSEP, VENDA.CDTPAJTXSERV, VENDA.CDTPAJTXADMSERV, VENDA.NRSEQVENDA, VENDA.VRTAXAADMISERV
            FROM (SELECT M.CDFILIAL, M.CDCAIXA, M.NRSEQUMOVI, M.DTABERCAIX,
                     M.CDNSU, M.NRQTPARCELA, M.NRPARCELA AS QTPARCELA, M.CDTIPORECE,
                     M.DTVENDA, '-' NRAUTORIZACAO,
                     M.VRVENDA,
                     F.CDEMPRESA, F.CDINSCESTA, F.CDINSCMUNI,
                     T.CDCLIENTE, P.CDTPOPERCNTREC CDTIPOOPER, NVL(P.CDSERIECNTREC, P.CDSERIE) CDSERIE,
                     P.IDENTRSAIDOP, NVL(T.VRTAXAADMI, 0) VRTAXAADM, P.CDREDUCONT CDREDUCONTP, T.CDREDUCONT CDREDUCONT,
                     T.CDTPCTRECEB, T.CDAJTXADMREC,
                     M.NRORG, T.IDGERAFIN, T.IDCONTAPREVCNC,
                     NVL(P.IDCONTTXSERVSEP, 'N') IDCONTTXSERVSEP, P.CDTPAJTXSERV, P.CDTPAJTXADMSERV, V.NRSEQVENDA, P.VRTAXAADMISERV
                FROM TIPORECE T
                    JOIN CONSMOVCAIXA M
                        ON M.CDTIPORECE = T.CDTIPORECE
                    JOIN MOVCAIXA V
                        ON M.CDFILIAL = V.CDFILIAL
                        AND M.CDCAIXA = V.CDCAIXA
                        AND M.DTABERCAIX = V.DTABERCAIX
                        AND M.NRSEQUMOVI = V.NRSEQUMOVI
                    JOIN FILIAL F
                        ON F.CDFILIAL = V.CDFILIAL
                        AND F.CDFILIAL = M.CDFILIAL
                    JOIN PARAVEND P
                        ON F.CDFILIAL = P.CDFILIAL
                    JOIN CTRLDTFINCNC CT
                        ON M.NRORG = CT.NRORG
                    LEFT JOIN CTRLDTFINCNCFIL CTF
                        ON M.CDFILIAL = CTF.CDFILIAL
               WHERE M.NRCONSMOVCAIXA = P_NRCONSMOVCAIXA
                 AND T.CDCLIENTE IS NOT NULL
                 AND NVL(P.CDSERIECNTREC, P.CDSERIE) IS NOT NULL
                 AND P.CDTPOPERCNTREC IS NOT NULL
                 AND F.CDINSCESTA IS NOT NULL
                 AND F.CDINSCMUNI IS NOT NULL
                 AND F.CDEMPRESA IS NOT NULL
                 AND P.IDENTRSAIDOP IS NOT NULL
                 AND T.CDTPCTRECEB IS NOT NULL
                 AND T.CDAJTXADMREC IS NOT NULL
                 AND NVL(TRUNC(CTF.DTINICIOINT),TRUNC(CT.DTINICIOINT)) <= M.DTVENDA
                 AND NOT EXISTS (SELECT 1
                                   FROM NOTAFISCAL N
                                  WHERE N.CDFILIAL = M.CDFILIALNF
                                    AND N.NRLANCTONF = M.NRLANCTONF)) VENDA LEFT JOIN TIPORECEFILIAL TF
                                                                                   ON TF.CDFILIAL = VENDA.CDFILIAL
                                                                                  AND TF.CDTIPORECE = VENDA.CDTIPORECE
            WHERE NVL(TF.IDCONTAREPFOS, VENDA.IDCONTAPREVCNC) = 'S'
            AND NVL(NVL(TF.IDGERAFINFIL, VENDA.IDGERAFIN), 'N') = 'N'
            AND NVL(VENDA.CDREDUCONTP, NVL(TF.CDREDUCONT, VENDA.CDREDUCONT)) IS NOT NULL) LOOP
      V_CDCLASSFINA := NULL;
      BEGIN
         SELECT CDCLASSFINA
           INTO V_CDCLASSFINA
           FROM TIPOCTRECEBER
          WHERE CDTPCTRECEB = C_VENDA.CDTPCTRECEB;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDCLASSFINA := NULL;
      END;
      V_NRDIASVENC := 0;
      BEGIN
         SELECT NVL(NVL(PR.NRDIASVENC, T.NRDIASADMI), 0)
           INTO V_NRDIASVENC
           FROM TIPORECE T LEFT JOIN PARAVEND P
                                  ON P.CDFILIAL = C_VENDA.CDFILIAL
                           LEFT JOIN PRODUTOADQ PR
                             ON PR.CDTIPORECE = T.CDTIPORECE
          WHERE T.CDTIPORECE = C_VENDA.CDTIPORECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRDIASVENC := 0;
      END;
      SELECT CNC_DATA_VENC(C_VENDA.CDFILIAL, C_VENDA.DTVENDA, V_NRDIASVENC, C_VENDA.CDTIPORECE)
        INTO V_DTVENCIMENTO
        FROM DUAL; 
      /* O PARAMETRO DE GERA FINANCEIRO NO FECHAMENTO DE CUPOM (IDGERAFIN) ESTANDO COMO NAO E O
         PARAMETRO DE GERA CONTA PREVISTA NA REPLICACAO (IDCONTAPREVCNC) COMO SIM.
         ISSO FARÁ A REPLICAÇÃO DO FINANCEIRO NA MESMA HORA DA REPLICACAO DO FOS */
      /* GERA UM NOVO REGISTRO NA TABELA DE FILIAL. ESSA PARTE IRÁ FAZER O PROVISIONAMENTO IMEDIATO NO CONTAS A RECEBER */
      NOVO_CODIGO_NT('LANCNF/FILIAL'||C_VENDA.CDFILIAL, V_TEMP);
      V_NRLANCTONF := SUBSTR(V_TEMP, 11, 10);
      INSERT INTO NOTAFISCAL
        (CDFILIAL, NRLANCTONF, NRNOTAFISC, CDEMPRESA, CDINSCESTA, CDINSCMUNI, CDCLIENTE, IDBLOQUEADO,
         VRPRODUTOS,
         VRNOTAFISC, IDENTRSAIDOP, CDTIPOOPER, IDSTATUS, IDSTATUSNFE, IDIMPRESSODANFE, CDSERIE,
         IDEXPNFEP, IDTIPOEMISNFE, IDEXPNFESANAND, IDEXPNFEMANAUS, IDEMAILNFE, IDVERIFNFCONF,
         IDSTATUSCTBNF, IDNFDISPFIN, IDTPAMBNFE, IDEMAILNFETRANSP, IDBLOQNFFIN, IDNFGERADAVIAXML,
         IDDEBICREDNF, NRORG, IDNFRELVENBORDO, IDNFREMESSA, IDNFVENDABORDO, IDNFCOMPRALEG, IDPRESENCIAL, IDSISTEMA,
         DTENTRSAID, DTEMISSAO, CDFILIEMIT)
      VALUES
        (C_VENDA.CDFILIAL, V_NRLANCTONF, C_VENDA.CDNSU, C_VENDA.CDEMPRESA, C_VENDA.CDINSCESTA, C_VENDA.CDINSCMUNI, C_VENDA.CDCLIENTE, 'S',
         C_VENDA.VRVENDA,
         C_VENDA.VRVENDA, C_VENDA.IDENTRSAIDOP, C_VENDA.CDTIPOOPER, 'A', 'P', 'N', C_VENDA.CDSERIE,
         'N', '0', 'N', 'N', 'P', 'N',
         'P', 'S', '0', 'N', 'L', 'N',
         'N', C_VENDA.NRORG, 'N', 'N', 'N', 'N', '9', 'CNC',
         C_VENDA.DTVENDA, C_VENDA.DTVENDA, C_VENDA.CDFILIAL);
      /* GERA O BOLETO DA CONTA */
      NOVO_CODIGO_NT('BOLETRECEBER'||C_VENDA.CDFILIAL, V_NRLANBOL);
      V_NRLANBOL := SUBSTR(V_NRLANBOL, 11, 10);
      GERA_BOLETOS_REC(V_NRLANBOL, /* NUMERO DO BOLETO */
                       C_VENDA.CDFILIAL, /* FILIAL */
                       C_VENDA.CDCLIENTE, /* CÓDIGO DO CLIENTE */
                       C_VENDA.CDEMPRESA, /* CÓDIGO DA EMPRESA */
                       ROUND(C_VENDA.VRVENDA - (C_VENDA.VRVENDA * (C_VENDA.VRTAXAADM / 100)), 2), /* VALOR DA CONTA */
                       V_DTVENCIMENTO, /* DATA DE VENCIMENTO */
                       C_VENDA.CDTIPORECE, /* TIPO DE RECEBIMENTO */
                       NULL, /* NUMERO DO CHEQUE */
                       NULL, /* BANCO DO CHEQUE*/
                       NULL, /* AGENCIA DO CHEQUE */
                       NULL, /* CONTA */
                       C_VENDA.CDREDUCONT, /* CDREDUCONT */
                       NULL, /* TIPO DE BAIXA */
                       NULL); /* DATA DE MOVIMENTAÇÃO */
      /* GERA A CONTA A RECEBER E ATUALIZA O FLUXO DE CAIXA */
      ATUALIZA_FLUXO_DE_CAIXA(C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO, 'E', V_CDCLASSFINA, ABS(ROUND(C_VENDA.VRVENDA - (C_VENDA.VRVENDA * (C_VENDA.VRTAXAADM / 100)), 2)), 0);
      IF C_VENDA.CDNSU IS NULL THEN
         V_CDNSUTEMP := C_VENDA.CDNSU;
      ELSE
         V_CDNSUTEMP := '#####';
      END IF;
      INSERT INTO CONTARECEBER
        (CDFILIAL, NRLANCTONF, CDEMPRESA, NRSEQVENREC, NRPARCELAREC, CDTPCTRECEB, QTDIASVENREC, DTORIGVENREC,
         VRORIGREC, VRATUAREC,
         IDSTATREC, IDCONTAIMPOSTO, NRORG, DTATUAVENREC,
         DSCONTAREC, CDFILIBOLREC, NRLANBOLREC, IDMOVFLUXO,
         CDCLASSFINA, CDFIMOVFLREC, DTMOVFLUXO, IDREPFOSCNC)
      VALUES
        (C_VENDA.CDFILIAL, V_NRLANCTONF, C_VENDA.CDEMPRESA, '01', C_VENDA.QTPARCELA, C_VENDA.CDTPCTRECEB, TRUNC(V_DTVENCIMENTO - C_VENDA.DTVENDA), V_DTVENCIMENTO,
         C_VENDA.VRVENDA, ROUND(C_VENDA.VRVENDA - (C_VENDA.VRVENDA * (C_VENDA.VRTAXAADM / 100)), 2),
         'A', 'N', C_VENDA.NRORG, V_DTVENCIMENTO,
         '(PROVISAO FOS/CONCILIADOR)-VENDA COM CARTAO. NSU: '||V_CDNSUTEMP, C_VENDA.CDFILIAL, V_NRLANBOL, 'E',
         V_CDCLASSFINA, C_VENDA.CDFILIAL, V_DTVENCIMENTO, 'R');
      IF C_VENDA.IDCONTTXSERVSEP = 'S' THEN
          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.CDFILIAL
                AND I.CDCAIXA = C_VENDA.CDCAIXA
                AND I.NRSEQVENDA = C_VENDA.NRSEQVENDA;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_VRTOTVENDA := 0;
          END;
          V_VRTOTGORJ := 0;
          BEGIN
             SELECT NVL(A.VRGORJETA,0) 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.CDFILIAL
                        AND I.CDCAIXA = C_VENDA.CDCAIXA
                        AND I.NRSEQVENDA = C_VENDA.NRSEQVENDA) A;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_VRTOTGORJ := 0;
          END;
          IF V_VRTOTGORJ > 0 THEN
             V_PERCGORJ := 0;
             V_VRVENDASEMTAXA := 0;
             V_PERCVENDACOMTAXA := 0;
             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 APÓS O ACRÉSCIMO DA GORJETA */
             V_VRVENDASEMTAXA := ROUND((C_VENDA.VRVENDA * 100) / V_PERCVENDACOMTAXA, 2); /* CALCULA O VALOR DA VENDA SEM A GORJETA */
             V_VRTOTGORJ := ROUND(V_VRVENDASEMTAXA * (V_PERCGORJ / 100), 2);
             V_VRTXADMTXSERV := ROUND(V_VRTOTGORJ * (C_VENDA.VRTAXAADMISERV / 100), 2);
             /* GERA O AJUSTE COM O VALOR DA TAXA ADMINISTRATIVA PARA A TAXA DE SERVIÇO. */
             ATUALIZA_FLUXO_DE_CAIXA(C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO, 'E', 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.CDFILIAL, V_NRLANCTONF, C_VENDA.DTVENDA, C_VENDA.CDTPAJTXADMSERV, 'TX ADMIN DA TX SERV', V_VRTXADMTXSERV,
                 '01', C_VENDA.QTPARCELA, V_CDCLASSFINA, C_VENDA.NRORG, 'E', C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO);
             V_VRTAXASERVICO := ROUND(V_VRTOTGORJ * (ABS(C_VENDA.VRTAXAADMISERV - 100) / 100), 2);
             /* GERA O AJUSTE COM O VALOR DA TAXA DE SERVIÇO. */
             ATUALIZA_FLUXO_DE_CAIXA(C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO, 'E', 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.CDFILIAL, V_NRLANCTONF, C_VENDA.DTVENDA, C_VENDA.CDTPAJTXSERV, 'TAXA DE SERVICO', V_VRTAXASERVICO,
                 '01', C_VENDA.QTPARCELA, V_CDCLASSFINA, C_VENDA.NRORG, 'E', C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO);
             UPDATE NOTAFISCAL
                SET VRNOTAFISC = ROUND(V_VRVENDASEMTAXA, 2)
              WHERE CDFILIAL = C_VENDA.CDFILIAL
                AND NRLANCTONF = V_NRLANCTONF;
             UPDATE CONTARECEBER
                SET VRORIGREC = ROUND(V_VRVENDASEMTAXA, 2),
                    DSCONTAREC = DSCONTAREC || ' - ' ||
                                 'VR TOTAL VENDA: R$ ' || REPLACE(LTRIM(TO_CHAR(ROUND(C_VENDA.VRVENDA, 2),'9999990.00')),'.',',')
              WHERE CDFILIAL = C_VENDA.CDFILIAL
                AND NRLANCTONF = V_NRLANCTONF;
          END IF;
      END IF;
      /* GERA O AJUSTE COM O VALOR DA TAXA ADMINISTRATIVA PARA A CONTA QUE ACABOU DE SER GERADA. */
      ATUALIZA_FLUXO_DE_CAIXA(C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO, 'E', V_CDCLASSFINA, 0, ROUND(C_VENDA.VRVENDA - (C_VENDA.VRVENDA * (C_VENDA.VRTAXAADM / 100)), 2));
      INSERT INTO AJCTRECEBER
        (CDFILIAL, NRLANCTONF, DTAJUSTEREC, CDAJUCTREC, DSAJUSTEREC,
         VRAJUSTEREC,
         NRSEQVENREC, NRPARCELAREC, CDCLASSFINA, NRORG, IDMOVFLUXO, CDEMMFAJCNTR, CDFIMFAJCNTR, DTMOVFLUXO)
      VALUES
        (C_VENDA.CDFILIAL, V_NRLANCTONF, C_VENDA.DTVENDA, C_VENDA.CDAJTXADMREC, 'TAXA ADMINISTRATIVA',
         ROUND(C_VENDA.VRVENDA * (C_VENDA.VRTAXAADM / 100), 2),
         '01', C_VENDA.QTPARCELA, V_CDCLASSFINA, C_VENDA.NRORG, 'E', C_VENDA.CDEMPRESA, C_VENDA.CDFILIAL, V_DTVENCIMENTO);
      /* RELACIONA A CONTA GERADA À PREVISÃO DE RECEBIMENTO (VENDA) QUE CHEGOU DA ADQUIRENTE */
      UPDATE CONSMOVCAIXA
         SET CDFILIALNF = C_VENDA.CDFILIAL,
             NRLANCTONF = V_NRLANCTONF
       WHERE NRCONSMOVCAIXA = P_NRCONSMOVCAIXA;
   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('FINANCEIRO_FOS_CNC','6.35.025'); END;
/
