CREATE OR REPLACE PROCEDURE VENDA_FINCTBFIS_LOJA(
  P_CDFILIAL IN FILIAL.CDFILIAL%TYPE,
  P_CDLOJA   IN LOJA.CDLOJA%TYPE,
  P_DTREDUZ  IN REDUCAOZ.DTREDUCAOZ%TYPE,
  P_OPERADOR IN OPERADOR.CDOPERADOR%TYPE,
  P_IDORIGEMREDZ IN VARCHAR2,
  P_RETORNO  OUT NOCOPY VARCHAR,
  P_TIPORECE OUT NOCOPY VARCHAR,
  P_ERROS    OUT NOCOPY VARCHAR)
IS
  V_RETORNO         VARCHAR2(02);
  V_CDHISTPADR      VARCHAR2(4);
  V_DSHISTPADR      VARCHAR2(1000);
  V_SEQUENCIAL      VARCHAR2(20);
  V_CDFILIAL        VARCHAR2(4);
  V_NRLANCTONF      VARCHAR2(20);
  V_STCONTCTBL      VARCHAR2(20);
  V_STCONTCTBLREC   VARCHAR2(20);
  V_LANCCONT        VARCHAR2(20);
  V_NRSEQLANC       VARCHAR2(05);
  V_IDCONTCCUS      VARCHAR2(01);
  V_CDCENTCUST      VARCHAR2(04);
  V_CDTIPOOPER      VARCHAR2(02);
  V_RETORNOFIN      VARCHAR2(02);
  V_FILIPROC        VARCHAR2(04);
  V_FILIALFIS       VARCHAR2(04);
  V_NRLANCTONFFIS   VARCHAR2(10);
  V_RETORNOCTB      INTEGER;
  V_RETORNOREC      INTEGER;
  V_COUNT           INTEGER;
  V_SEQUENCIAL1     VARCHAR2(20);
  V_CDCLIENTE       VARCHAR2(21);
  V_RETIPORECE      VARCHAR2(100);
  V_CDSERIE         VARCHAR2(5);
  V_CDMODDOCFISC    VARCHAR2(2);
  V_CDCTRLNUMENF    VARCHAR2(10);
  V_IDGERAFIN       VARCHAR2(1);
  V_CDEMPRESA       VARCHAR2(2);
  V_IDUTILCONTAB    VARCHAR2(1);
  V_IDFECHLOJA      VARCHAR2(1);
  V_ERROS           VARCHAR2(5000);
  V_CDERRO          VARCHAR2(4);
  V_NRSEQERRO       NUMBER;
  V_ERROCTB         VARCHAR2(500);
  V_IDRETORNOCTB    VARCHAR2(100);
  V_RETSANGRIA      VARCHAR2(01);
  V_IDCONTTXSERVSEP VARCHAR2(01);
  V_VRTAXATPRECE    NUMBER;
  V_VRTIPORECUT     NUMBER;
  V_VRVENDATPRECE   NUMBER;
  V_VRTAXASERVICO   NUMBER;
  V_IDAPURLUCPRE    VARCHAR2(01);
  V_NRBAIXAREC      VARCHAR2(20);
  V_IDORCLVERSAOANT VARCHAR2(01);
BEGIN
   V_RETORNOREC := 0;
   V_RETORNOCTB := 0;
   V_RETIPORECE := '';
   V_NRSEQERRO  := 0;
   V_RETSANGRIA := '';

   BEGIN
      SELECT NVL(IDORCLVERSAOANT, 'N')
        INTO V_IDORCLVERSAOANT
        FROM PARAMFISCAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDORCLVERSAOANT := 'N';
   END;

   BEGIN
      SELECT MAX(NRSEQERROREDZ)
        INTO V_NRSEQERRO
        FROM ERROCTBREDZ;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_NRSEQERRO := 0;
   END;

   V_NRSEQERRO  := NVL(V_NRSEQERRO,0) + 1;
   BEGIN
      /*DELETA OS ERROS AO APROVAR A REDUCAOZ NOVAMENTE*/
      DELETE
        FROM ERROCTBREDZ
       WHERE CDCAIXA    = P_CDLOJA
         AND CDFILIAL   = P_CDFILIAL
         AND DTREDUCAOZ = P_DTREDUZ;
      COMMIT;

      /*VERIFICA SE O CLIENTE UTILIZA O MODULO DE CONTABILIDADE*/
      BEGIN
         SELECT IDUTILCONTAB, IDFECHLOJA, IDCONTTXSERVSEP
           INTO V_IDUTILCONTAB, V_IDFECHLOJA, V_IDCONTTXSERVSEP
           FROM PARAVEND
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDUTILCONTAB := 'N';
            V_IDFECHLOJA   := 'N';
            V_IDCONTTXSERVSEP := 'N';
      END;

      /*VERIFICA SE POSSUI TIPO DE OPERACAO PARAMETRIZADO POR LOJA*/
      BEGIN
         SELECT CDTIPOOPER
           INTO V_CDTIPOOPER
           FROM LOJA
          WHERE CDFILIAL = P_CDFILIAL
            AND CDLOJA   = P_CDLOJA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDTIPOOPER := NULL;
      END;

      /*CASO NAO EXISTA PARAMETRIZACAO DE TIPO DE OPERACAO POR LOJA, PEGA O TIPO DE OPERACAO DA TELA DE PARAMETROS DO GESTAO DE VENDAS/INTEGRACAO CONTAS A RECEBER*/
      IF V_CDTIPOOPER IS NULL THEN
         BEGIN
            SELECT CDTPOPERCNTREC
              INTO V_CDTIPOOPER
              FROM PARAVEND
             WHERE CDFILIAL = P_CDFILIAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTIPOOPER := NULL;
         END;
      END IF;
      /*VERIFICA O CLIENTE PADRAO PARAMETRIZADO*/
      BEGIN
         SELECT CDCLIENTE
           INTO V_CDCLIENTE
           FROM PARAVEND
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDCLIENTE := NULL;
      END;
      /*ALTERADO PARA CONSIDERAR A SERIE PARAMETRIZADA NA TELA DE PARAMETROS DE GESTAO DE VENDAS*/
      BEGIN
         SELECT NVL(P.CDSERIECNTREC,P.CDSERIE)
           INTO V_CDSERIE
           FROM PARAVEND P, FILIAL F, SERIENF S
          WHERE P.CDFILIAL   = P_CDFILIAL
            AND F.CDFILIAL   = P.CDFILIAL
            AND S.CDEMPRESA  = F.CDEMPRESA
            AND S.CDINSCESTA = F.CDINSCESTA
            AND S.CDINSCMUNI = F.CDINSCMUNI
            AND NVL(P.CDSERIECNTREC,P.CDSERIE) = S.CDSERIE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDSERIE := NULL;
      END;

      /*VERIFICA O MODELO DE DOCUMENTO POR TIPO DE OPERACAO*/
      IF V_CDTIPOOPER IS NOT NULL THEN
         BEGIN
            SELECT MIN(CDMODDOCFISC)
              INTO V_CDMODDOCFISC
              FROM MODDOCFISCTPOP
             WHERE CDTIPOOPER = V_CDTIPOOPER
               AND IDENTRSAIDOP = 'S';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDMODDOCFISC := NULL;
         END;
      ELSE
         V_CDMODDOCFISC := 'ER'; /* UM VALOR QUALQUER PARA QUE A VARIAVEL NAO FIQUE NULA E MOSTRE A MENSAGEM CASO O TIPO DE OPERACAO NAO ESTEJA CADASTRADO*/
      END IF;

      BEGIN
         SELECT F.CDEMPRESA, I.IDAPURLUCPRE
           INTO V_CDEMPRESA, V_IDAPURLUCPRE
           FROM FILIAL F, INSCRESTAD I
          WHERE F.CDFILIAL   = P_CDFILIAL
            AND F.CDINSCESTA = I.CDINSCESTA
            AND F.CDEMPRESA  = I.CDEMPRESA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDEMPRESA    := NULL;
            V_IDAPURLUCPRE := 'N';
      END;

      IF V_CDTIPOOPER IS NOT NULL AND V_CDCLIENTE IS NOT NULL AND V_CDSERIE IS NOT NULL AND V_CDMODDOCFISC IS NOT NULL THEN
         FOR C_REDZERRO IN (SELECT DISTINCT M.CDTIPORECE, TR.CDTPCTRECEB, TP.CDCLIENTE
                              FROM MOVLOJA M, TIPORECE TP, TIPOCTRECEBER TR, FILIAL FL, CLIENTE C, PARAVEND PA
                             WHERE M.CDFILIAL     = P_CDFILIAL
                               AND M.CDLOJA       = P_CDLOJA
                               AND M.DTMOVIMENTO  = P_DTREDUZ
                               AND M.CDFILIAL     = FL.CDFILIAL
                               AND M.CDTIPORECE   = TP.CDTIPORECE(+)
                               AND TP.CDTPCTRECEB = TR.CDTPCTRECEB(+)
                               AND C.CDCLIENTE(+) = TP.CDCLIENTE
                               AND PA.CDFILIAL    = M.CDFILIAL
                               AND M.IDCONFERIDO  = 'S'
                               AND M.IDAPROVACAO  = 'N') LOOP
            V_RETSANGRIA := 'S';
            /*VERIFICA SE GERA AS INFORMACOES PARA O FINANCEIRO POR FILIAL*/
            BEGIN
               SELECT IDGERAFINFIL
                 INTO V_IDGERAFIN
                 FROM TIPORECEFILIAL
                WHERE CDFILIAL   = P_CDFILIAL
                  AND CDTIPORECE = C_REDZERRO.CDTIPORECE;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDGERAFIN := NULL;
            END;
            /*VERIFICA SE GERA AS INFORMACOES PARA O FINANCEIRO GERAL*/
            IF V_IDGERAFIN IS NULL THEN
               BEGIN
                  SELECT IDGERAFIN
                    INTO V_IDGERAFIN
                    FROM TIPORECE
                   WHERE CDTIPORECE = C_REDZERRO.CDTIPORECE;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDGERAFIN := NULL;
               END;
            END IF;
         END LOOP;
        
         /*SE NENHUMA DAS INFORMACOES OBRIGATORIAS ESTIVER FALTANDO GERA AS NOTAS FISCAIS PARA O FINANCEIRO COM BASE NA MOVIMENTACAO POR TIPO DE RECEBIMENTO*/
         IF P_RETORNO IS NULL THEN
            FOR C_REDZ IN(SELECT SUM(TRUNC(DECODE(M.IDTIPOMOVIVE,'T',VRMOVIVEND,DECODE(M.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(M.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0))),2)) AS VRVENDA,
                                 M.CDTIPORECE, NVL(T.CDTPCTRECEB,TR.CDTPCTRECEB) AS CDTPCTRECEB,V.CDEMPRESA,NVL(T.CDCLIENTE,TP.CDCLIENTE) AS CDCLIENTE,V.DTENTRVENDA,
                                 FL.CDINSCESTA,FL.CDINSCMUNI, FL.CDFILIAL, TO_CHAR(V.DTENTRVENDA,'DDMMYY') || V.CDLOJA AS NRREDREDZ,
                                 C.IDTPIJURCLIE,C.NRINSJURCLIE,C.CDMODDOCFISC, PA.CDSERIECNTREC,
                                 PA.CDSERIE, PA.IDTPAPUFIL, NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS) AS IDCONSVRDEBCONS
                            FROM VENDA V, REDUCAOZ R, MOVCAIXA M, TIPORECE TP, TIPORECEFILIAL T, TIPOCTRECEBER TR, FILIAL FL, CLIENTE C, PARAVEND PA
                           WHERE V.CDFILIAL     = R.CDFILIAL
                             AND V.CDCAIXA      = R.CDCAIXA
                             AND V.DTENTRVENDA  = R.DTREDUCAOZ
                             AND M.CDFILIAL     = V.CDFILIAL
                             AND M.CDCAIXA      = V.CDCAIXA
                             AND M.NRSEQVENDA   = V.NRSEQVENDA
                             AND M.CDFILIAL     = FL.CDFILIAL
                             AND V.CDEMPRESA    = FL.CDEMPRESA
                             AND M.CDTIPORECE   = TP.CDTIPORECE(+)
                             AND TP.CDTPCTRECEB = TR.CDTPCTRECEB(+)
                             AND T.CDTPCTRECEB  = TR.CDTPCTRECEB(+)
                             AND V.IDSITUVENDA  = 'O'
                             AND V.CDFILIAL     = P_CDFILIAL
                             AND V.CDCAIXA      IN (SELECT CDCAIXA
                                                      FROM CAIXA
                                                     WHERE CDFILIAL = P_CDFILIAL
                                                       AND CDLOJA   = P_CDLOJA)
                             AND V.DTENTRVENDA  = P_DTREDUZ
                             AND C.CDCLIENTE(+) = TP.CDCLIENTE
                             AND C.CDCLIENTE(+) = T.CDCLIENTE
                             AND PA.CDFILIAL    = V.CDFILIAL
                             AND ((V.IDTPEMISVEND NOT IN ('N','S')) OR (V.IDTPEMISVEND IS NULL))
                             AND R.IDSTATUS = 'P'
                             AND M.IDTIPOMOVIVE IN ('E', 'S',DECODE(NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS),'S','T',''))
                             AND T.CDTIPORECE(+) = TP.CDTIPORECE
                             AND T.CDFILIAL  (+) = P_CDFILIAL
                             AND ((INSTR('SAT_NFCE',P_IDORIGEMREDZ) = 0) OR (P_IDORIGEMREDZ IS NULL))
                           GROUP BY M.CDTIPORECE, NVL(T.CDTPCTRECEB,TR.CDTPCTRECEB),NVL(T.CDCLIENTE,TP.CDCLIENTE), V.CDEMPRESA,V.DTENTRVENDA,FL.CDINSCESTA,FL.CDINSCMUNI,FL.CDFILIAL,
                                    C.IDTPIJURCLIE,C.NRINSJURCLIE,C.CDMODDOCFISC, TO_CHAR(V.DTENTRVENDA,'DDMMYY') || V.CDLOJA, PA.CDSERIECNTREC, PA.CDSERIE,
                                    PA.IDTPAPUFIL, NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS)
                           UNION ALL
                          SELECT SUM(TRUNC(DECODE(M.IDTIPOMOVIVE,'T',VRMOVIVEND,DECODE(M.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(M.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0))),2)) AS VRVENDA, M.CDTIPORECE,
                                 NVL(T.CDTPCTRECEB,TR.CDTPCTRECEB) AS CDTPCTRECEB,V.CDEMPRESA,
                                 NVL(T.CDCLIENTE,TP.CDCLIENTE) AS CDCLIENTE,V.DTENTRVENDA,
                                 FL.CDINSCESTA,FL.CDINSCMUNI,FL.CDFILIAL,
                                 TO_CHAR(V.DTENTRVENDA,'DDMMYY') || V.CDLOJA AS NRREDREDZ,C.IDTPIJURCLIE,C.NRINSJURCLIE,C.CDMODDOCFISC, PA.CDSERIECNTREC , PA.CDSERIE, PA.IDTPAPUFIL,
                                 NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS) AS IDCONSVRDEBCONS
                            FROM VENDA V, MOVCAIXA M, TIPORECE TP, TIPORECEFILIAL T, TIPOCTRECEBER TR, FILIAL FL, CLIENTE C, PARAVEND PA
                           WHERE M.CDFILIAL      = V.CDFILIAL
                             AND M.CDCAIXA       = V.CDCAIXA
                             AND M.NRSEQVENDA    = V.NRSEQVENDA
                             AND M.CDFILIAL      = FL.CDFILIAL
                             AND V.CDEMPRESA     = FL.CDEMPRESA
                             AND M.CDTIPORECE    = TP.CDTIPORECE(+)
                             AND TP.CDTPCTRECEB  = TR.CDTPCTRECEB(+)
                             AND T.CDTPCTRECEB   = TR.CDTPCTRECEB(+)
                             AND V.IDSITUVENDA   = 'O'
                             AND V.CDFILIAL      = P_CDFILIAL
                             AND V.CDCAIXA       IN (SELECT CDCAIXA
                                                       FROM CAIXA
                                                      WHERE CDFILIAL = P_CDFILIAL
                                                        AND CDLOJA   = P_CDLOJA)
                             AND V.DTENTRVENDA  = P_DTREDUZ
                             AND C.CDCLIENTE(+) = TP.CDCLIENTE
                             AND C.CDCLIENTE(+) = T.CDCLIENTE
                             AND PA.CDFILIAL     = V.CDFILIAL
                             AND V.IDTPAMBNFCE   = '1'
                             AND V.IDSTATUSNFCE  = 'A'
                             AND V.IDTPEMISVEND  IN ('N','S')
                             AND M.IDTIPOMOVIVE  IN ('E', 'S',DECODE(NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS),'S','T',''))
                             AND V.IDAPROVACAONFCE = 'P'
                             AND T.CDTIPORECE(+) = TP.CDTIPORECE
                             AND T.CDFILIAL  (+) = P_CDFILIAL
                             AND P_IDORIGEMREDZ  = DECODE(V.IDTPEMISVEND,'N','NFCE','SAT')
                           GROUP BY M.CDTIPORECE,NVL(T.CDTPCTRECEB,TR.CDTPCTRECEB),V.CDEMPRESA,NVL(T.CDCLIENTE,TP.CDCLIENTE), V.DTENTRVENDA,
                                    FL.CDINSCESTA,FL.CDINSCMUNI,FL.CDFILIAL, TO_CHAR(V.DTENTRVENDA,'DDMMYY') || V.CDLOJA, C.IDTPIJURCLIE, C.NRINSJURCLIE,
                                    C.CDMODDOCFISC, PA.CDSERIECNTREC, PA.CDSERIE, PA.IDTPAPUFIL, NVL(T.IDCONSVRDEBCONS,TP.IDCONSVRDEBCONS)
                           ORDER BY CDTIPORECE) LOOP

               V_VRTAXASERVICO := 0;
               IF V_IDCONTTXSERVSEP = 'S' THEN
                  IF ((INSTR('SAT_NFCE',P_IDORIGEMREDZ) = 0) OR (P_IDORIGEMREDZ IS NULL)) THEN
                      FOR C_VRTAXA IN (SELECT SUM(TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS VRVENDA,
                                              SUM(CASE WHEN IT.CDPRODUTO IN (SELECT CDPRODTAXASERV FROM LOJA WHERE CDFILIAL = P_CDFILIAL)
                                                       THEN TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)
                                                       ELSE 0 END) AS VRTAXASERVICO, MV.CONT, MV.NRSEQVENDA, MV.CDCAIXA
                                         FROM VENDA VE, ITEMVENDA IT, (SELECT COUNT(NRSEQVENDA) AS CONT, CDFILIAL, CDCAIXA, NRSEQVENDA
                                                                         FROM MOVCAIXA MO
                                                                        WHERE CDFILIAL     = P_CDFILIAL
                                                                          AND CDCAIXA      IN (SELECT CDCAIXA
                                                                                                 FROM CAIXA
                                                                                                WHERE CDFILIAL = P_CDFILIAL
                                                                                                  AND CDLOJA   = P_CDLOJA)
                                                                          AND DTMOVIMCAIXA = P_DTREDUZ
                                                                          AND EXISTS (SELECT *
                                                                                        FROM MOVCAIXA M
                                                                                       WHERE MO.CDFILIAL     = M.CDFILIAL
                                                                                         AND MO.CDCAIXA      = M.CDCAIXA
                                                                                         AND MO.DTMOVIMCAIXA = M.DTMOVIMCAIXA
                                                                                         AND M.CDTIPORECE    = C_REDZ.CDTIPORECE
                                                                                         AND MO.NRSEQVENDA   = M.NRSEQVENDA)
                                                                          AND IDTIPOMOVIVE IN ('E',DECODE(C_REDZ.IDCONSVRDEBCONS,'S','T',''))
                                                                        GROUP BY CDFILIAL, CDCAIXA, NRSEQVENDA) MV
                                        WHERE VE.CDFILIAL      = IT.CDFILIAL
                                          AND VE.CDCAIXA       = IT.CDCAIXA
                                          AND VE.NRSEQVENDA    = IT.NRSEQVENDA
                                          AND VE.CDFILIAL      = P_CDFILIAL
                                          AND VE.IDSITUVENDA   = 'O'
                                          AND MV.CDFILIAL      = VE.CDFILIAL
                                          AND MV.CDCAIXA       = VE.CDCAIXA
                                          AND MV.NRSEQVENDA    = VE.NRSEQVENDA
                                          AND VE.CDLOJA        = P_CDLOJA
                                          AND NVL(VE.IDTPEMISVEND,'E') NOT IN ('N','S')
                                          AND VE.DTENTRVENDA = C_REDZ.DTENTRVENDA
                                        GROUP BY MV.CONT, MV.NRSEQVENDA, MV.CDCAIXA
                                       HAVING SUM(CASE WHEN IT.CDPRODUTO IN (SELECT CDPRODTAXASERV FROM LOJA WHERE CDFILIAL = P_CDFILIAL)
                                                       THEN TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)
                                                       ELSE 0 END) > 0) LOOP

                         IF C_VRTAXA.CONT = 1 THEN
                            V_VRTAXASERVICO := NVL(V_VRTAXASERVICO,0) + ROUND(C_VRTAXA.VRTAXASERVICO,2);
                         ELSE
                            SELECT SUM(CASE WHEN CDTIPORECE = C_REDZ.CDTIPORECE
                                            THEN TRUNC(DECODE(M.IDTIPOMOVIVE,'T',VRMOVIVEND,DECODE(M.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(M.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0))),2)
                                            ELSE 0 END) AS VRVENDATIPORECE
                              INTO V_VRVENDATPRECE
                              FROM MOVCAIXA M
                             WHERE CDFILIAL     = P_CDFILIAL
                               AND CDCAIXA      = C_VRTAXA.CDCAIXA
                               AND DTMOVIMCAIXA = P_DTREDUZ
                               AND NRSEQVENDA   = C_VRTAXA.NRSEQVENDA;

                            V_VRTIPORECUT   := V_VRVENDATPRECE/NVL(C_VRTAXA.VRVENDA,1);
                            V_VRTAXATPRECE  := V_VRTIPORECUT*C_VRTAXA.VRTAXASERVICO;
                            V_VRTAXASERVICO := NVL(V_VRTAXASERVICO,0) + ROUND(V_VRTAXATPRECE,2);
                         END IF;
                      END LOOP;
                  ELSE
                     FOR C_VRTAXA IN (SELECT SUM(TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS VRVENDA,
                                              SUM(CASE WHEN IT.CDPRODUTO IN (SELECT CDPRODTAXASERV FROM LOJA WHERE CDFILIAL = P_CDFILIAL)
                                                       THEN TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)
                                                       ELSE 0 END) AS VRTAXASERVICO, MV.CONT, MV.NRSEQVENDA, MV.CDCAIXA
                                        FROM VENDA VE, ITEMVENDA IT, (SELECT COUNT(NRSEQVENDA) AS CONT, CDFILIAL, CDCAIXA, NRSEQVENDA
                                                                        FROM MOVCAIXA MO
                                                                       WHERE CDFILIAL     = P_CDFILIAL
                                                                         AND CDCAIXA      IN (SELECT CDCAIXA
                                                                                                 FROM CAIXA
                                                                                                WHERE CDFILIAL = P_CDFILIAL
                                                                                                  AND CDLOJA   = P_CDLOJA)
                                                                         AND DTMOVIMCAIXA = P_DTREDUZ
                                                                         AND EXISTS (SELECT *
                                                                                       FROM MOVCAIXA M
                                                                                      WHERE MO.CDFILIAL     = M.CDFILIAL
                                                                                        AND MO.CDCAIXA      = M.CDCAIXA
                                                                                        AND MO.DTMOVIMCAIXA = M.DTMOVIMCAIXA
                                                                                        AND M.CDTIPORECE    = C_REDZ.CDTIPORECE
                                                                                        AND MO.NRSEQVENDA   = M.NRSEQVENDA)
                                                                         AND IDTIPOMOVIVE IN ('E',DECODE(C_REDZ.IDCONSVRDEBCONS,'S','T',''))
                                                                       GROUP BY CDFILIAL, CDCAIXA, NRSEQVENDA) MV
                                       WHERE VE.CDFILIAL      = IT.CDFILIAL
                                         AND VE.CDCAIXA       = IT.CDCAIXA
                                         AND VE.NRSEQVENDA    = IT.NRSEQVENDA
                                         AND VE.CDFILIAL      = P_CDFILIAL
                                         AND VE.IDSITUVENDA   = 'O'
                                         AND MV.CDFILIAL      = VE.CDFILIAL
                                         AND MV.CDCAIXA       = VE.CDCAIXA
                                         AND MV.NRSEQVENDA    = VE.NRSEQVENDA
                                         AND VE.CDLOJA        = P_CDLOJA
                                         AND VE.IDTPEMISVEND  IN ('N','S')
                                         AND VE.IDTPAMBNFCE   = '1'
                                         AND VE.IDSTATUSNFCE  = 'A'
                                         AND VE.DTENTRVENDA = C_REDZ.DTENTRVENDA
                                       GROUP BY MV.CONT, MV.NRSEQVENDA, MV.CDCAIXA
                                      HAVING SUM(CASE WHEN IT.CDPRODUTO IN (SELECT CDPRODTAXASERV FROM LOJA WHERE CDFILIAL = P_CDFILIAL)
                                                       THEN TRUNC((IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0))),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)
                                                       ELSE 0 END) > 0) LOOP

                         IF C_VRTAXA.CONT = 1 THEN
                            V_VRTAXASERVICO := NVL(V_VRTAXASERVICO,0) + ROUND(C_VRTAXA.VRTAXASERVICO,2);
                         ELSE
                            SELECT SUM(CASE WHEN CDTIPORECE = C_REDZ.CDTIPORECE
                                            THEN TRUNC(DECODE(M.IDTIPOMOVIVE,'T',VRMOVIVEND,DECODE(M.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(M.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0))),2)
                                            ELSE 0 END) AS VRVENDATIPORECE
                              INTO V_VRVENDATPRECE
                              FROM MOVCAIXA M
                             WHERE CDFILIAL     = P_CDFILIAL
                               AND CDCAIXA      = C_VRTAXA.CDCAIXA
                               AND DTMOVIMCAIXA = P_DTREDUZ
                               AND NRSEQVENDA   = C_VRTAXA.NRSEQVENDA;

                            V_VRTIPORECUT   := V_VRVENDATPRECE/NVL(C_VRTAXA.VRVENDA,1);
                            V_VRTAXATPRECE  := V_VRTIPORECUT*C_VRTAXA.VRTAXASERVICO;
                            V_VRTAXASERVICO := NVL(V_VRTAXASERVICO,0) + ROUND(V_VRTAXATPRECE,2);
                         END IF;
                      END LOOP;
                  END IF;
               END IF;

               /*VERIFICA A FILIAL DE PROCESSAMENTO*/
               BEGIN
                 SELECT MAX(CDFILIAL)
                   INTO V_FILIPROC
                   FROM PARAMGERAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_FILIPROC := NULL;
               END;
               /*VERIFICA SE O TIPO DE RECEBIMENTO DA VENDA GERA FINANCEITO POR FILIAL*/
               BEGIN
                  SELECT IDGERAFINFIL
                    INTO V_IDGERAFIN
                    FROM TIPORECEFILIAL
                   WHERE CDFILIAL = P_CDFILIAL
                     AND CDTIPORECE = C_REDZ.CDTIPORECE;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDGERAFIN := NULL;
               END;
               /*VERIFICA SE O TIPO DE RECEBIMENTO DA VENDA GERA FINANCEITO GERAL*/
               IF V_IDGERAFIN IS NULL THEN
                  BEGIN
                     SELECT IDGERAFIN
                       INTO V_IDGERAFIN
                       FROM TIPORECE
                      WHERE CDTIPORECE = C_REDZ.CDTIPORECE;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IDGERAFIN := NULL;
                  END;
               END IF;
               /*SE ESTIVER PARAMETRIZADO PARA GERAR O FINANCEIRO INSERE AS NOTAS FISCAIS*/
               IF V_IDGERAFIN = 'S' THEN
                  NOVO_CODIGO_NT('LANCNF/FILIAL' || V_FILIPROC,V_NRLANCTONF);
                  V_NRLANCTONF := SUBSTR(V_NRLANCTONF,11,10);

                  INSERT INTO NOTAFISCAL
                     (CDFILIAL,     NRLANCTONF,   CDEMPRESA,    CDINSCESTA,   CDINSCMUNI,
                      CDFILIEMIT,   IDBLOQUEADO,  IDDOCFISCAL,  IDDOCFINANC,  NRNOTAFISC,
                      DTEMISSAO,    DTENTRSAID,   VRPRODUTOS,   VRNOTAFISC,   IDENTRSAIDOP,
                      CDTIPOOPER,   CDSERIE,      IDDOCCONTAB,  IDSTATUS,     IDDOCFATUR,
                      IDDOCFISCENT, IDDOCFISCSAI, IDDOCESTOQUE, IDSISTEMA,    IDORIGDESTNF,
                      DTEXPORTACAO, CDCLIENTE,    IDTPIJURNF,   NRINSJURNF,   CDMODDOCFISC)
                  VALUES
                     (V_FILIPROC,V_NRLANCTONF,C_REDZ.CDEMPRESA,C_REDZ.CDINSCESTA,C_REDZ.CDINSCMUNI,
                      C_REDZ.CDFILIAL,'S','S','N',C_REDZ.NRREDREDZ,
                      C_REDZ.DTENTRVENDA,C_REDZ.DTENTRVENDA,C_REDZ.VRVENDA,C_REDZ.VRVENDA-NVL(V_VRTAXASERVICO,0),'S',
                      V_CDTIPOOPER, V_CDSERIE, 'N','A','N',
                      'N', 'N', 'N', 'TMP', 'C',
                      C_REDZ.DTENTRVENDA,C_REDZ.CDCLIENTE,C_REDZ.IDTPIJURCLIE,C_REDZ.NRINSJURCLIE, V_CDMODDOCFISC);


                  IF V_IDORCLVERSAOANT = 'S' THEN
                     FOR C_MOVCAIXA IN (
                         SELECT M.CDFILIAL, M.CDCAIXA, M.DTABERCAIX, M.NRSEQUMOVI
                           FROM MOVCAIXA M, CAIXA C
                          WHERE M.CDFILIAL     = P_CDFILIAL
                            AND M.DTMOVIMCAIXA = P_DTREDUZ
                            AND M.CDCAIXA      = C.CDCAIXA
                            AND M.CDFILIAL     = C.CDFILIAL
                            AND C.CDLOJA       = P_CDLOJA
                            AND M.CDTIPORECE   = C_REDZ.CDTIPORECE)
                     LOOP
                        UPDATE MOVCAIXA
                           SET CDFILIALNF   = V_FILIPROC,
                               NRLANCTONF   = V_NRLANCTONF
                         WHERE CDFILIAL     = C_MOVCAIXA.CDFILIAL
                           AND CDCAIXA      = C_MOVCAIXA.CDCAIXA
                           AND DTABERCAIX   = C_MOVCAIXA.DTABERCAIX
                           AND NRSEQUMOVI   = C_MOVCAIXA.NRSEQUMOVI;

                     END LOOP;
                  ELSE
                     UPDATE MOVCAIXA
                        SET CDFILIALNF   = V_FILIPROC,
                            NRLANCTONF   = V_NRLANCTONF
                      WHERE CDFILIAL     = P_CDFILIAL
                        AND DTMOVIMCAIXA = P_DTREDUZ
                        AND CDCAIXA      IN (SELECT CDCAIXA
                                               FROM CAIXA
                                              WHERE CDFILIAL = P_CDFILIAL
                                                AND CDLOJA   = P_CDLOJA)
                        AND CDTIPORECE   = C_REDZ.CDTIPORECE;

                  END IF;

                  GERA_FINANCEIRO_ECF_LOJA(V_FILIPROC, V_NRLANCTONF, P_OPERADOR, P_CDFILIAL, P_CDLOJA, V_VRTAXASERVICO, P_IDORIGEMREDZ, V_RETORNOFIN);

                  /*GRAVA OS IMPOSTOS FEDERAIS PARA APURACAO DO PIS E COFINS REGIME DE CAIXA*/
                  FOR C_CAIXA IN (SELECT CDCAIXA
                                    FROM CAIXA
                                   WHERE CDFILIAL = P_CDFILIAL
                                     AND CDLOJA   = P_CDLOJA) LOOP
                      GRAVA_IMP_FEDERAIS_VND_CAIXA(P_CDFILIAL, V_CDCLIENTE, V_CDTIPOOPER, C_CAIXA.CDCAIXA, '', P_IDORIGEMREDZ, P_DTREDUZ, P_DTREDUZ, V_FILIPROC, V_NRLANCTONF);
                  END LOOP;

                  /*VERIFICA SE A NOTA TEVE BAIXA AUTOMATICA, PARA PRRENCHER A TABELA DO REGIME DE CAIXA*/
                  V_NRBAIXAREC := NULL;
                  BEGIN
                     SELECT MAX(NRBAIXAREC) AS NRBAIXAREC
                       INTO V_NRBAIXAREC
                       FROM CONTARECEBER C, BOLETRECEBER B
                      WHERE C.CDFILIAL    = V_FILIPROC
                        AND C.NRLANCTONF  = V_NRLANCTONF
                        AND C.CDFILIAL    = B.CDFILIAL
                        AND C.NRLANBOLREC = B.NRLANBOLREC
                        AND C.IDSTATREC   = 'B';
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_NRBAIXAREC := NULL;
                  END;
                  IF V_NRBAIXAREC IS NOT NULL THEN
                     GRAVA_BAIXA_IMPOSTO(V_FILIPROC, V_NRBAIXAREC, '', '','R');
                  END IF;
                  /*VERIFICA SE O CLIENTE UTILIZA O MODULO CONTABILIDADE*/
                  IF NVL(V_IDUTILCONTAB,'N') = 'S' THEN
                     /*PASSA O CDLOJA PARA GRAVAR NA TABELA RELACNFLANCLOTE, E O CAMPO DE CAIXA VAI VAZIO*/
                     CONTABILIZA_FOS(V_FILIPROC,V_NRLANCTONF,'','',P_CDFILIAL,'',P_DTREDUZ,V_RETORNO,V_ERROS,P_CDLOJA);
                     V_ERROCTB := NVL(V_ERROCTB,'') || NVL(V_ERROS,'');
                     V_IDRETORNOCTB := NVL(V_IDRETORNOCTB,'') || '_' || NVL(V_RETORNO,'');
                  END IF;
               END IF;
               /*VERIFICA SE O RETORNO DO FINANCEIRO FOI '0' OPERACAO REALIZADA COM SUCESSO*/
               IF V_RETORNOREC = 0 THEN
                  IF V_RETORNOFIN = 'N' THEN
                 -- RAISE_APPLICATION_ERROR(-20501,V_RETORNOFIN,TRUE);
                     V_RETORNOREC := V_RETORNOREC+1;
                     IF P_RETORNO IS NULL THEN
                        P_RETORNO := 'R2';
                     ELSE
                        P_RETORNO := P_RETORNO||'_R2';
                     END IF;
                  END IF;
               END IF;
               /*VERIFICA SE O RETORNO DA CONTABILIZACAO FOI '0' OPERACAO REALIZADA COM SUCESSO*/
               IF V_RETORNOCTB = 0 THEN
                  IF V_RETORNO = 'N' THEN
                     V_RETORNOCTB := V_RETORNOCTB+1;
                  END IF;
               END IF;
            END LOOP;

            /*VERIFICA SE NAO TEVE NENHUM RETORNO DE ERRO AO GERAR O FINANCEIRO E O CONTABIL PRA GERAR A NOTA FISCAL DO FISCAL*/
            IF (V_RETORNOREC = 0 AND V_RETORNOCTB = 0) THEN
               /*NO CASO DE HAVER VENDAS DEPOIS DA MEIA NOITE, PARA NFCE E SAT, AS INFORMACOES NO FISCAL DEVEM SER GERADAS EM NOTAS DIFERENTES*/
               FOR C_DTNFFISCAL IN (SELECT DISTINCT VD.DTENTRVENDA, VD.DTENTRVENDA AS DTEMISSAONFCE, VD.CDCAIXA
                                      FROM VENDA VD, CAIXA CX
                                     WHERE VD.CDFILIAL     = P_CDFILIAL
                                       AND VD.CDCAIXA      = CX.CDCAIXA
                                       AND VD.CDFILIAL     = CX.CDFILIAL
                                       AND CX.CDLOJA       = P_CDLOJA
                                       AND VD.DTENTRVENDA  = P_DTREDUZ
                                       AND VD.IDSITUVENDA  = 'O'
                                       AND ((VD.IDTPEMISVEND NOT IN ('N','S')) OR (VD.IDTPEMISVEND IS NULL))
                                       AND ((INSTR('SAT_NFCE',P_IDORIGEMREDZ) = 0) OR (P_IDORIGEMREDZ IS NULL))
                                     UNION
                                    SELECT DISTINCT VD.DTENTRVENDA, TRUNC(VD.DTEMISSAONFCE) AS DTEMISSAONFCE, VD.CDCAIXA
                                      FROM VENDA VD, CAIXA CX
                                     WHERE VD.CDFILIAL      = P_CDFILIAL
                                       AND VD.CDCAIXA       = CX.CDCAIXA
                                       AND VD.CDFILIAL      = CX.CDFILIAL
                                       AND CX.CDLOJA        = P_CDLOJA
                                       AND VD.DTENTRVENDA   = P_DTREDUZ
                                       AND VD.IDSITUVENDA   = 'O'
                                       AND VD.IDTPAMBNFCE   = '1'
                                       AND VD.IDSTATUSNFCE  = 'A'
                                       AND VD.IDAPROVACAONFCE = 'P'
                                       AND VD.IDTPEMISVEND  IN ('N','S')
                                       AND P_IDORIGEMREDZ   = DECODE(VD.IDTPEMISVEND,'N','NFCE','SAT')
                                     UNION
                                    SELECT DISTINCT M.DTMOVIMCAIXA AS DTENTRVENDA, M.DTMOVIMCAIXA AS DTEMISSAONFCE, M.CDCAIXA
                                      FROM MOVCAIXA M, CAIXA CX
                                     WHERE M.CDFILIAL    = P_CDFILIAL
                                       AND M.CDCAIXA     = CX.CDCAIXA
                                       AND M.CDFILIAL    = CX.CDFILIAL
                                       AND CX.CDLOJA     = P_CDLOJA
                                       AND M.DTMOVIMCAIXA = P_DTREDUZ
                                     ORDER BY DTEMISSAONFCE) LOOP

                  GERANF_MAPARESUMO_NRREDZ(P_CDFILIAL, C_DTNFFISCAL.CDCAIXA, P_DTREDUZ, C_DTNFFISCAL.DTEMISSAONFCE, V_CDCTRLNUMENF, V_CDTIPOOPER, P_IDORIGEMREDZ, 'N', SYSDATE, V_FILIALFIS, V_NRLANCTONFFIS);
                  /*VERIFICA SE O CLIENTE UTILIZA O MODULO CONTABILIDADE*/
                  IF NVL(V_IDUTILCONTAB,'N') = 'S' THEN
                     CONTABILIZA_FOS('', '', V_FILIALFIS, V_NRLANCTONFFIS, P_CDFILIAL, C_DTNFFISCAL.CDCAIXA, P_DTREDUZ, V_RETORNO, V_ERROS);
                     V_ERROCTB := NVL(V_ERROCTB,'') || NVL(V_ERROS,'');
                     V_IDRETORNOCTB := NVL(V_IDRETORNOCTB,'') || '_' || NVL(V_RETORNO,'');

                     NOVO_CODIGO_NT('LANCCONTABIL' || V_CDEMPRESA || TO_CHAR(P_DTREDUZ,'YYYYMM'),V_SEQUENCIAL1,1);
                     V_SEQUENCIAL1 := TO_CHAR(P_DTREDUZ,'YYYYMM') || SUBSTR(V_SEQUENCIAL1,15,6);
                     LIBERA_LOTE_VND(P_CDFILIAL,C_DTNFFISCAL.CDCAIXA,P_DTREDUZ,C_DTNFFISCAL.DTEMISSAONFCE,V_SEQUENCIAL1,P_OPERADOR,P_CDLOJA);
                  END IF;
               END LOOP;
               /*VERIFICA O CLIENTE PARAMETRIZADO*/
               BEGIN
                  SELECT CDCLIENTE
                    INTO V_CDCLIENTE
                    FROM PARAVEND
                   WHERE CDFILIAL = P_CDFILIAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDCLIENTE := NULL;
               END;
               /*GRAVA OS IMPOSTOS FEDERAIS PARA APURACAO DO PIS E COFINS*/
               FOR C_CAIXA IN (SELECT CDCAIXA
                                 FROM CAIXA
                                WHERE CDFILIAL = P_CDFILIAL
                                  AND CDLOJA   = P_CDLOJA) LOOP
                  GRAVA_IMP_FEDERAIS_VND(P_CDFILIAL, V_CDCLIENTE, V_CDTIPOOPER,  C_CAIXA.CDCAIXA, '', P_IDORIGEMREDZ, P_DTREDUZ, P_DTREDUZ, V_FILIALFIS, V_NRLANCTONFFIS,'N',SYSDATE);

                  /*GRAVA OS DADOS NA TABELA POR PRODUTO, QUANDO UTILIZAR A ROTINA DE CREDITO PRESUMIDO*/
                  IF V_IDAPURLUCPRE  = 'S' THEN
                     GRAVA_IMPFOS_PRODUTO(P_CDFILIAL, C_CAIXA.CDCAIXA, P_DTREDUZ, V_CDTIPOOPER, P_IDORIGEMREDZ);
                  END IF;
               END LOOP;

               IF V_RETORNOREC = 0 THEN
                  IF V_RETORNOFIN = 'N' THEN
                     V_RETORNOREC := V_RETORNOREC+1;
                     IF P_RETORNO IS NULL THEN
                        P_RETORNO := 'R4';
                     ELSE
                        P_RETORNO := P_RETORNO||'_R4';
                     END IF;
                  END IF;
               END IF;
               IF V_RETORNOCTB = 0 THEN
                  IF V_RETORNO = 'N' THEN
                     V_RETORNOCTB := V_RETORNOCTB+1;
                  END IF;
               END IF;
            END IF;
            IF (V_RETORNOREC = 0 AND V_RETORNOCTB = 0) THEN
               IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
                  UPDATE VENDA
                     SET IDAPROVACAONFCE = 'A',
                         CDOPERFECHCUPOM = P_OPERADOR,
                         DTFECHCUPOM     = SYSDATE,
                         IDTPAPROV       = 'M'
                   WHERE CDFILIAL        = P_CDFILIAL
                     AND CDCAIXA         IN (SELECT CDCAIXA
                                               FROM CAIXA
                                              WHERE CDFILIAL = P_CDFILIAL
                                                AND CDLOJA   = P_CDLOJA)
                     AND DTENTRVENDA = P_DTREDUZ
                     AND IDTPAMBNFCE     = '1'
                     AND IDSTATUSNFCE    = 'A'
                     AND IDTPEMISVEND    = DECODE(P_IDORIGEMREDZ,'NFCE','N','S');
               ELSE
                  UPDATE REDUCAOZ
                     SET IDSTATUS        = 'A',
                         CDOPERFECHCUPOM = P_OPERADOR,
                         DTFECHCUPOM     = SYSDATE,
                         IDTPAPROV       = 'M'
                   WHERE CDFILIAL   = P_CDFILIAL
                     AND CDCAIXA    IN (SELECT CDCAIXA
                                               FROM CAIXA
                                              WHERE CDFILIAL = P_CDFILIAL
                                                AND CDLOJA   = P_CDLOJA)
                     AND DTREDUCAOZ = P_DTREDUZ;
               END IF;

               UPDATE MOVCAIXA
                  SET IDAPROVREDZNFCE = 'A'
                WHERE CDFILIAL        = P_CDFILIAL
                  AND CDCAIXA         IN (SELECT CDCAIXA
                                            FROM CAIXA
                                           WHERE CDFILIAL = P_CDFILIAL
                                             AND CDLOJA   = P_CDLOJA)
                  AND DTMOVIMCAIXA    = P_DTREDUZ;

               UPDATE MOVLOJA
                  SET IDAPROVACAO = 'S'
                WHERE CDFILIAL    = P_CDFILIAL
                  AND CDLOJA      = P_CDLOJA
                  AND DTMOVIMENTO = P_DTREDUZ;

               P_RETORNO := 'S';
            ELSE
               ROLLBACK;
               IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
                  UPDATE VENDA
                     SET IDAPROVACAONFCE = 'E',
                         CDOPERFECHCUPOM = P_OPERADOR,
                         DTFECHCUPOM     = SYSDATE,
                         IDTPAPROV       = 'M'
                   WHERE CDFILIAL        = P_CDFILIAL
                     AND CDCAIXA         IN (SELECT CDCAIXA
                                               FROM CAIXA
                                              WHERE CDFILIAL = P_CDFILIAL
                                                AND CDLOJA   = P_CDLOJA)
                     AND DTENTRVENDA = P_DTREDUZ
                     AND IDTPAMBNFCE   = '1'
                     AND IDSTATUSNFCE  = 'A'
                     AND IDTPEMISVEND  = DECODE(P_IDORIGEMREDZ,'NFCE','N','S');
               ELSE
                  UPDATE REDUCAOZ
                     SET IDSTATUS        = 'E',
                         CDOPERFECHCUPOM = P_OPERADOR,
                         DTFECHCUPOM     = SYSDATE,
                         IDTPAPROV       = 'M'
                   WHERE CDFILIAL        = P_CDFILIAL
                     AND CDCAIXA         IN (SELECT CDCAIXA
                                               FROM CAIXA
                                              WHERE CDFILIAL = P_CDFILIAL
                                                AND CDLOJA   = P_CDLOJA)
                     AND DTREDUCAOZ      = P_DTREDUZ;
               END IF;

               UPDATE MOVCAIXA
                  SET IDAPROVREDZNFCE = 'E'
                WHERE CDFILIAL        = P_CDFILIAL
                  AND CDCAIXA         IN (SELECT CDCAIXA
                                            FROM CAIXA
                                           WHERE CDFILIAL = P_CDFILIAL
                                             AND CDLOJA   = P_CDLOJA)
                  AND DTMOVIMCAIXA    = P_DTREDUZ;

               UPDATE MOVLOJA
                  SET IDAPROVACAO = 'N'
                WHERE CDFILIAL    = P_CDFILIAL
                  AND CDLOJA      = P_CDLOJA
                  AND DTMOVIMENTO = P_DTREDUZ;

               IF (V_RETORNOREC > 0) AND (P_RETORNO IS NULL) THEN
                  P_RETORNO := 'N';
               ELSIF (V_RETORNOCTB > 0) AND (P_RETORNO IS NULL) THEN
                  P_RETORNO := '_';
               END IF;
            END IF;
         END IF;
      ELSE
         IF V_CDTIPOOPER IS NULL THEN
            P_RETORNO := 'R6';    /* TIPO DE OPERACAO NAO INFORMADO */
         END IF;
         IF V_CDCLIENTE IS NULL THEN
            IF P_RETORNO IS NULL THEN
               P_RETORNO := 'R9'; /* CLIENTE PADRAO PARA VENDAS NAO CADASTRADO */
            ELSE
               P_RETORNO := P_RETORNO||'_R9';
            END IF;
         END IF;

         IF V_CDSERIE IS NULL THEN
            IF P_RETORNO IS NULL THEN
               P_RETORNO := 'R7'; /* SERIE NF NAO VINCULADA A FILIAL INFORMADA NA TELA DE PARAMETROS DE GESTAO DE VENDAS*/
            ELSE
               P_RETORNO := P_RETORNO||'_R7';
            END IF;
         END IF;
         IF V_CDMODDOCFISC IS NULL THEN
            IF P_RETORNO IS NULL THEN
               P_RETORNO := 'R8'; /* MODELO DE DOCUMENTO FISCAL NAO CADASTRADO PARA O TIPO DE OPERACAO */
            ELSE
               P_RETORNO := P_RETORNO||'_R8';
            END IF;
         END IF;
      END IF;
      /*SE OCORRER ALGUM PROBLEMA AO GERAR OS LANCAMENTOS PARA O CONTABIL O FINANCEIRO E O FISCAL, TODAS AS OPERACOES SERAO DESFEITAS*/
      IF P_RETORNO <> 'S' THEN
         ROLLBACK;
         IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
            UPDATE VENDA
               SET IDAPROVACAONFCE    = 'P',
                   CDOPERFECHCUPOM    = P_OPERADOR,
                   DTFECHCUPOM        = SYSDATE,
                   IDTPAPROV          = 'M'
             WHERE CDFILIAL           = P_CDFILIAL
               AND CDCAIXA            IN (SELECT CDCAIXA
                                            FROM CAIXA
                                           WHERE CDFILIAL = P_CDFILIAL
                                             AND CDLOJA   = P_CDLOJA)
               AND DTENTRVENDA = P_DTREDUZ
               AND IDTPAMBNFCE        = '1'
               AND IDSTATUSNFCE       = 'A'
               AND IDTPEMISVEND       = DECODE(P_IDORIGEMREDZ,'NFCE','N','S');
         ELSE
            UPDATE REDUCAOZ
               SET IDSTATUS        = 'P',
                   CDOPERFECHCUPOM = P_OPERADOR,
                   DTFECHCUPOM     = SYSDATE,
                   IDTPAPROV       = 'M'
             WHERE CDFILIAL        = P_CDFILIAL
               AND CDCAIXA         IN (SELECT CDCAIXA
                                         FROM CAIXA
                                        WHERE CDFILIAL = P_CDFILIAL
                                          AND CDLOJA   = P_CDLOJA)
               AND DTREDUCAOZ      = P_DTREDUZ;
         END IF;

         UPDATE MOVCAIXA
            SET IDAPROVREDZNFCE = 'P'
          WHERE CDFILIAL        = P_CDFILIAL
            AND CDCAIXA         IN (SELECT CDCAIXA
                                      FROM CAIXA
                                     WHERE CDFILIAL = P_CDFILIAL
                                       AND CDLOJA   = P_CDLOJA)
            AND DTMOVIMCAIXA    = P_DTREDUZ;

         UPDATE MOVLOJA
            SET IDAPROVACAO = 'N'
          WHERE CDFILIAL    = P_CDFILIAL
            AND CDLOJA      = P_CDLOJA
            AND DTMOVIMENTO = P_DTREDUZ;
         ROLLBACK;
         /*INSERE AS INCONSISTENCIAS NA CONTABILIDADE PARA QUE SEJAM EXIBIDAS NO RELATORIO DO SISTEMA*/
         IF ((P_RETORNO <> 'S') AND (P_RETORNO <>  '_')) THEN
            P_RETORNO := P_RETORNO;
            P_ERROS   := NULL;
         ELSE
            IF INSTR(V_IDRETORNOCTB,'N') > 0 THEN
               P_RETORNO := 'N';
               P_ERROS   := V_ERROCTB;
            ELSE
               P_RETORNO := 'S';
               P_ERROS   :=  NULL;
            END IF;
         END IF;
         /* 001 TOTAL DE DEBITOS DIFERE TOTAIS DE DEBITO */
         IF INSTR(V_ERROS,'001') > 0 THEN
            V_CDERRO := '001';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 002 DATA DE MOVIMENTACAO FORA DOPERIODO CONTABIL */
         IF INSTR(V_ERROS,'002') > 0 THEN
            V_CDERRO := '002';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 003 CONTA CONTABIL NAO CADASTRADA */
         IF INSTR(V_ERROS,'003') > 0 THEN
            V_CDERRO := '003';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 004 HISTORICO PADRAO NAO CADASTRADO */
         IF INSTR(V_ERROS,'004') > 0 THEN
            V_CDERRO := '004';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 005 - CODIGO COMERCIAL NAO CADASTRADO*/
         IF INSTR(V_ERROS,'005') > 0 THEN
            V_CDERRO := '005';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 006 VALOR PARTIDA ZERADO */
         IF INSTR(V_ERROS,'006') > 0 THEN
            V_CDERRO := '006';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 007 VALOR RATEIO ZERADO */
         IF INSTR(V_ERROS,'007') > 0 THEN
            V_CDERRO := '007';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 008 FILIAL DE RATEIO NAO CADASTRADA */
         IF INSTR(V_ERROS,'008') > 0 THEN
            V_CDERRO := '008';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 009 CENTRO DE CUSTO NAO CADASTRADO PARA FILIAL */
         IF INSTR(V_ERROS,'009') > 0 THEN
            V_CDERRO := '009';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ ,V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
         /* 010 VALOR DO RATEIO DIFERE DO LANCAMENTO DO LOTE*/
         IF INSTR(V_ERROS,'010') > 0 THEN
            V_CDERRO := '010';
            IF V_CDERRO IS NOT NULL THEN
               INSERT INTO ERROCTBREDZ
                  (NRSEQERROREDZ, CDFILIAL, CDCAIXA, DTREDUCAOZ, CDERRO)
               VALUES
                  (V_NRSEQERRO, P_CDFILIAL , P_CDLOJA, P_DTREDUZ, V_CDERRO);
               V_NRSEQERRO := V_NRSEQERRO + 1;
            END IF;
         END IF;
       COMMIT;
      END IF;
   EXCEPTION
      WHEN OTHERS THEN BEGIN
         P_RETORNO := SQLERRM(SQLCODE);
         ROLLBACK;
         IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
            UPDATE VENDA
               SET IDAPROVACAONFCE    = 'E',
                   CDOPERFECHCUPOM    = P_OPERADOR,
                   DTFECHCUPOM        = SYSDATE,
                   IDTPAPROV          = 'M'
             WHERE CDFILIAL           = P_CDFILIAL
               AND CDCAIXA            IN (SELECT CDCAIXA
                                            FROM CAIXA
                                           WHERE CDFILIAL = P_CDFILIAL
                                             AND CDLOJA   = P_CDLOJA)
               AND DTENTRVENDA = P_DTREDUZ
               AND IDTPAMBNFCE        = '1'
               AND IDSTATUSNFCE       = 'A'
               AND IDTPEMISVEND       = DECODE(P_IDORIGEMREDZ,'NFCE','N','S');
         ELSE
            UPDATE REDUCAOZ
               SET IDSTATUS        = 'E',
                   CDOPERFECHCUPOM = P_OPERADOR,
                   DTFECHCUPOM     = SYSDATE,
                   IDTPAPROV       = 'M'
             WHERE CDFILIAL        = P_CDFILIAL
               AND CDCAIXA         IN (SELECT CDCAIXA
                                         FROM CAIXA
                                        WHERE CDFILIAL = P_CDFILIAL
                                          AND CDLOJA   = P_CDLOJA)
               AND DTREDUCAOZ      = P_DTREDUZ;
         END IF;

         UPDATE MOVCAIXA
            SET IDAPROVREDZNFCE = 'E'
          WHERE CDFILIAL        = P_CDFILIAL
            AND CDCAIXA         IN (SELECT CDCAIXA
                                      FROM CAIXA
                                     WHERE CDFILIAL = P_CDFILIAL
                                       AND CDLOJA   = P_CDLOJA)
            AND DTMOVIMCAIXA    = P_DTREDUZ;

         UPDATE MOVLOJA
            SET IDAPROVACAO = 'N'
          WHERE CDFILIAL    = P_CDFILIAL
            AND CDLOJA      = P_CDLOJA
            AND DTMOVIMENTO = P_DTREDUZ;
     END;
   END;
END;
/