CREATE OR REPLACE PROCEDURE CANCVND_FINCTBFIS(
   P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
   P_CDCAIXA       IN CAIXA.CDCAIXA%TYPE,
   P_DTREDUZ       IN REDUCAOZ.DTREDUCAOZ%TYPE,
   P_IDORIGEMREDZ  IN VARCHAR2,
   P_IDAPROVEXTEMP IN VENDA.IDAPROVEXTEMP%TYPE,
   P_RETORNO       OUT NOCOPY VARCHAR)
IS
   V_RETORNO         VARCHAR2(02);
   V_CDFILIAL        VARCHAR2(04);
   V_NRLANCTONF      VARCHAR2(10);
   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_IDUTILCONTAB    VARCHAR2(01);
   V_IDORCLVERSAOANT VARCHAR2(01);

BEGIN
   BEGIN

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

      /*VERIFICA SE O PARAMETRO UTILIZA O MODULO CONTABIL ESTA MARCADO*/
      BEGIN
         SELECT IDUTILCONTAB
           INTO V_IDUTILCONTAB
           FROM PARAVEND
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDUTILCONTAB := 'N';
      END;

      FOR C_LOTE IN (SELECT DISTINCT M.CDFILIALNF, M.NRLANCTONF
                       FROM MOVCAIXA M, VENDA V
                      WHERE M.CDFILIAL      = P_CDFILIAL
                        AND M.CDCAIXA       = P_CDCAIXA
                        AND M.DTMOVIMCAIXA  = P_DTREDUZ
                        AND M.IDAPROVEXTEMP = P_IDAPROVEXTEMP
                        AND M.NRLANCTONF    IS NOT NULL
                        AND M.CDFILIAL      = V.CDFILIAL
                        AND M.CDCAIXA       = V.CDCAIXA
                        AND M.NRSEQVENDA    = V.NRSEQVENDA
                        AND DECODE(V.IDTPEMISVEND,'N','NFCE','S','SAT','ECF') = DECODE(P_IDORIGEMREDZ,'SAT','SAT','NFCE','NFCE','ECF'))LOOP

         DELETE FROM ITEMVENOUTIMPOSCX
          WHERE CDFILIALNF = C_LOTE.CDFILIALNF
            AND NRLANCTONF = C_LOTE.NRLANCTONF;

         /*SE O PARAMETRO PARA GERAR O CONTABIL ESTAVA DESMARCADO QUANDO A REDUCAOZ FOI APROVADA E FOI MARCADO ANTES DO CANCELAMENTO, A CANCELA DADOS FINANECEIROS E CHAMADA INDEPENDENTE DO PARAMETRO*/
         CANCELA_DADOS_FINANCEIRO(C_LOTE.CDFILIALNF,C_LOTE.NRLANCTONF, 'S',V_RETORNO);
         P_RETORNO := P_RETORNO||V_RETORNO||'_';

         /*SE O RETORNO DA CANCELA DADOS FOR 0 :"DADOS FINANCEIROS CANCELADOS" APAGA A NOTA FISCAL GERADA PARA ALIMENTAR O FINANCEIRO*/
         IF V_RETORNO = '0' THEN
            P_RETORNO := '9'||'_'||P_RETORNO;
            EXCLUI_LANCCONTABIL('12', C_LOTE.CDFILIALNF||C_LOTE.NRLANCTONF);

            IF V_IDORCLVERSAOANT = 'S' THEN
               FOR C_MOVCAIXA IN (SELECT CDFILIAL, CDCAIXA, DTABERCAIX, NRSEQUMOVI
                                    FROM MOVCAIXA
                                   WHERE CDFILIALNF = C_LOTE.CDFILIALNF
                                     AND NRLANCTONF = C_LOTE.NRLANCTONF)
               LOOP
                  UPDATE MOVCAIXA
                     SET CDFILIALNF   = NULL,
                         NRLANCTONF   = NULL
                   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 = NULL,
                      NRLANCTONF = NULL
                WHERE CDFILIALNF = C_LOTE.CDFILIALNF
                  AND NRLANCTONF = C_LOTE.NRLANCTONF;
            END IF;

            DELETE FROM NOTAFISCAL
             WHERE CDFILIAL   = C_LOTE.CDFILIALNF
               AND NRLANCTONF = C_LOTE.NRLANCTONF;
         ELSE
            IF P_RETORNO IS NULL THEN
               P_RETORNO := V_RETORNO||'_';
            ELSE
               P_RETORNO := P_RETORNO||V_RETORNO||'_';
            END IF;
         END IF;

         /*SE O PARAMETRO UTILIZA O MODULO CONTABIL ESTIVER MARCADO E VERIFICADO O STATUS DO LOTE CONTABIL
           HOJE, COM O PROCESSO DO LOTE FIXO, ELE SEMPRE VAI ESTAR LIBERADO, POR ISSO ESSA VALIDACAO FOI RETIRADA.
         IF NVL(V_IDUTILCONTAB,'N') = 'S' THEN
            FOR C_LANCLOTE IN (SELECT DISTINCT CL.CDEMPRESA, CL.CDLOTE, RL.NRLANCLOTE, IDLOTE
                                 FROM RELACNFLANCLOTE RL, CAPALOTE CL
                                WHERE RL.CDFILIAL   = C_LOTE.CDFILIALNF
                                  AND RL.NRLANCTONF = C_LOTE.NRLANCTONF
                                  AND CL.CDEMPRESA  = RL.CDEMPRESA
                                  AND CL.CDLOTE     = RL.CDLOTE) LOOP

               IF C_LANCLOTE.IDLOTE = 'L' THEN
                  IF P_RETORNO IS NULL THEN
                     P_RETORNO := '10_';
                  ELSE
                     P_RETORNO := P_RETORNO||'10_';
                  END IF;
               END IF;
            END LOOP;
         END IF;*/
      END LOOP;

      IF P_RETORNO IS NULL THEN
         P_RETORNO := '9';
      /*DOCUMENTO COM BOLETO BAIXADO*/
      ELSIF INSTR(P_RETORNO,'1') > 0 THEN
         P_RETORNO := '1';
      /*DOCUMENTO COM VENCIMENTOS PARCELADOS*/
      ELSIF INSTR(P_RETORNO,'2') > 0 THEN
         P_RETORNO := '2';
      /*DOCUMENTO COM AJUSTES*/
      ELSIF INSTR(P_RETORNO,'4') > 0 THEN
         P_RETORNO := '4';
      /*DOCUMENTO COM BOLETO EMITIDO*/
      ELSIF INSTR(P_RETORNO,'5') > 0 THEN
         P_RETORNO := '5';
      /*DOCUMENTO COM BOLETO ENVIADO VIA CNAB*/
      ELSIF INSTR(P_RETORNO,'6') > 0 THEN
         P_RETORNO := '6';
      /*DOCUMENTO COM BOLETO ASSOCIADO*/
      ELSIF INSTR(P_RETORNO,'7') > 0 THEN
         P_RETORNO := '7';
      /*DOCUMENTO COM VALOR UTILIZADO EM NF DE DEVOLUCAO*/
      ELSIF INSTR(P_RETORNO,'8') > 0 THEN
         P_RETORNO := '8';
      /*CANCELAMENTO CONCLUIDO COM SUCESSO*/
      ELSE
         P_RETORNO := '9';
      END IF;

      IF P_RETORNO = '9' THEN
         FOR C_LOTEFIS IN (SELECT DISTINCT M.CDFILIALNFFIS, M.NRLANCTONFFIS
                             FROM MOVCAIXA M, VENDA V
                            WHERE M.CDFILIAL      = P_CDFILIAL
                              AND M.CDCAIXA       = P_CDCAIXA
                              AND M.DTMOVIMCAIXA  = P_DTREDUZ
                              AND M.IDAPROVEXTEMP = P_IDAPROVEXTEMP
                              AND M.NRLANCTONFFIS IS NOT NULL
                              AND M.CDFILIAL      = V.CDFILIAL
                              AND M.CDCAIXA       = V.CDCAIXA
                              AND M.NRSEQVENDA    = V.NRSEQVENDA
                              AND DECODE(V.IDTPEMISVEND,'N','NFCE','S','SAT','ECF') = DECODE(P_IDORIGEMREDZ,'SAT','SAT','NFCE','NFCE','ECF')) LOOP

            DELETE FROM ITMAPARECUP
             WHERE (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR) IN (SELECT I.NRSEQUMAPAPU, I.IDTIPOITMAPR, I.NRSEQITMAPR
                                                                   FROM ITMAPARECUP I, MAPAAPURAC M
                                                                  WHERE I.CDFILIAL     = C_LOTEFIS.CDFILIALNFFIS
                                                                    AND I.NRLANCTONF   = C_LOTEFIS.NRLANCTONFFIS
                                                                    AND I.NRSEQUMAPAPU = M.NRSEQUMAPAPU
                                                                    AND NVL(M.IDBLOQMAPAPU,'A') <> 'S'
                                                                    AND I.IDTIPOITMAPR = 'VI');

            EXCLUI_LANCCONTABIL('12', C_LOTEFIS.CDFILIALNFFIS||C_LOTEFIS.NRLANCTONFFIS);
            IF V_IDORCLVERSAOANT = 'S' THEN
               FOR C_MOVCAIXA IN (SELECT CDFILIAL, CDCAIXA, DTABERCAIX, NRSEQUMOVI
                                    FROM MOVCAIXA
                                   WHERE CDFILIALNFFIS = C_LOTEFIS.CDFILIALNFFIS
                                     AND NRLANCTONFFIS = C_LOTEFIS.NRLANCTONFFIS)
               LOOP
                  UPDATE MOVCAIXA
                     SET CDFILIALNFFIS = NULL,
                         NRLANCTONFFIS = NULL
                   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 CDFILIALNFFIS = NULL,
                      NRLANCTONFFIS = NULL
                WHERE CDFILIALNFFIS = C_LOTEFIS.CDFILIALNFFIS
                  AND NRLANCTONFFIS = C_LOTEFIS.NRLANCTONFFIS;
            END IF;

            UPDATE MAPARESUMECF
               SET CDFILIALNF = NULL,
                   NRLANCTONF = NULL
             WHERE CDFILIALNF = C_LOTEFIS.CDFILIALNFFIS
               AND NRLANCTONF = C_LOTEFIS.NRLANCTONFFIS;

            IF V_IDORCLVERSAOANT = 'S' THEN
               FOR C_REDUCAOZ IN (SELECT CDFILIAL, CDCAIXA, NRECFREDZ, DTREDUCAOZ
                                    FROM REDUCAOZ
                                   WHERE CDFILIALNF = C_LOTEFIS.CDFILIALNFFIS
                                     AND NRLANCTONF = C_LOTEFIS.NRLANCTONFFIS) LOOP
                  UPDATE REDUCAOZ
                     SET CDFILIALNF = NULL,
                         NRLANCTONF = NULL
                   WHERE CDFILIAL   = C_REDUCAOZ.CDFILIAL
                     AND CDCAIXA    = C_REDUCAOZ.CDCAIXA
                     AND NRECFREDZ  = C_REDUCAOZ.NRECFREDZ
                     AND DTREDUCAOZ = C_REDUCAOZ.DTREDUCAOZ;

               END LOOP;
            ELSE
               UPDATE REDUCAOZ
                  SET CDFILIALNF = NULL,
                      NRLANCTONF = NULL
                WHERE CDFILIALNF = C_LOTEFIS.CDFILIALNFFIS
                  AND NRLANCTONF = C_LOTEFIS.NRLANCTONFFIS;
            END IF;

            DELETE FROM NOTAFISCAL
             WHERE CDFILIAL   = C_LOTEFIS.CDFILIALNFFIS
               AND NRLANCTONF = C_LOTEFIS.NRLANCTONFFIS;

            DELETE FROM ITEMVENOUTIMPOS
             WHERE CDFILIALNFFIS = C_LOTEFIS.CDFILIALNFFIS
               AND NRLANCTONFFIS = C_LOTEFIS.NRLANCTONFFIS;
         END LOOP;

         /*APAGA OS DADOS NA TABELA QUE GRAVA AS INFORMACOES FISCAIS POR PRODUTO (ROTINA DE CREDITO PRESUMIDO)*/
         DELETE FROM IMPPRODVENDAFIS
          WHERE CDFILIAL    = P_CDFILIAL
            AND CDCAIXA     = P_CDCAIXA
            AND DTENTRVENDA = P_DTREDUZ;
      END IF;

      IF P_RETORNO <> '9' THEN
         ROLLBACK;
      ELSE
         IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
            IF V_IDORCLVERSAOANT = 'S' THEN
               FOR C_VENDA IN (SELECT CDFILIAL, CDCAIXA, NRSEQVENDA
                                 FROM VENDA
                                WHERE CDFILIAL      = P_CDFILIAL
                                  AND CDCAIXA       = P_CDCAIXA
                                  AND DTENTRVENDA   = P_DTREDUZ
                                  AND IDTPAMBNFCE   = '1'
                                  AND IDSTATUSNFCE  = 'A'
                                  AND IDAPROVEXTEMP = P_IDAPROVEXTEMP
                                  AND IDTPEMISVEND  = DECODE(P_IDORIGEMREDZ,'NFCE','N','S')) LOOP
                  UPDATE VENDA
                     SET IDAPROVACAONFCE = 'P',
                         DTFECHCUPOM     = NULL,
                         CDOPERFECHCUPOM = NULL,
                         IDTPAPROV       = 'M',
                         IDAPROVEXTEMP   = 'N',
                         DTREFPERIODO    = NULL
                   WHERE CDFILIAL        = C_VENDA.CDFILIAL
                     AND CDCAIXA         = C_VENDA.CDCAIXA
                     AND NRSEQVENDA      = C_VENDA.NRSEQVENDA;
               END LOOP;
            ELSE
               UPDATE VENDA
                  SET IDAPROVACAONFCE = 'P',
                      DTFECHCUPOM     = NULL,
                      CDOPERFECHCUPOM = NULL,
                      IDTPAPROV       = 'M',
                      IDAPROVEXTEMP   = 'N',
                      DTREFPERIODO    = NULL
                WHERE CDFILIAL        = P_CDFILIAL
                  AND CDCAIXA         = P_CDCAIXA
                  AND DTENTRVENDA     = P_DTREDUZ
                  AND IDTPAMBNFCE     = '1'
                  AND IDSTATUSNFCE    = 'A'
                  AND IDAPROVEXTEMP   = P_IDAPROVEXTEMP
                  AND IDTPEMISVEND    = DECODE(P_IDORIGEMREDZ,'NFCE','N','S');
            END IF;
         ELSE
            IF V_IDORCLVERSAOANT = 'S' THEN
               FOR C_REDUCAOZ IN (SELECT CDFILIAL, CDCAIXA, NRECFREDZ, DTREDUCAOZ
                                    FROM REDUCAOZ
                                   WHERE CDFILIAL   = P_CDFILIAL
                                     AND CDCAIXA    = P_CDCAIXA
                                     AND DTREDUCAOZ = P_DTREDUZ) LOOP
                  UPDATE REDUCAOZ
                     SET IDSTATUS        = 'P',
                         DTFECHCUPOM     = NULL,
                         CDOPERFECHCUPOM = NULL,
                         IDTPAPROV       = 'M'
                   WHERE CDFILIAL        = C_REDUCAOZ.CDFILIAL
                     AND CDCAIXA         = C_REDUCAOZ.CDCAIXA
                     AND NRECFREDZ       = C_REDUCAOZ.NRECFREDZ
                     AND DTREDUCAOZ      = C_REDUCAOZ.DTREDUCAOZ;
               END LOOP;
            ELSE
               UPDATE REDUCAOZ
                  SET IDSTATUS        = 'P',
                      DTFECHCUPOM     = NULL,
                      CDOPERFECHCUPOM = NULL,
                      IDTPAPROV       = 'M'
                WHERE CDFILIAL   = P_CDFILIAL
                  AND CDCAIXA    = P_CDCAIXA
                  AND DTREDUCAOZ = P_DTREDUZ;
            END IF;
         END IF;
         FOR C_MOVCAIXA IN (SELECT DISTINCT M.CDFILIAL, M.CDCAIXA, M.DTABERCAIX, M.NRSEQUMOVI
                              FROM MOVCAIXA M, VENDA V
                             WHERE M.CDFILIAL      = P_CDFILIAL
                               AND M.CDCAIXA       = P_CDCAIXA
                               AND M.DTMOVIMCAIXA  = P_DTREDUZ
                               AND M.IDAPROVEXTEMP = P_IDAPROVEXTEMP
                               AND M.CDFILIAL      = V.CDFILIAL
                               AND M.CDCAIXA       = V.CDCAIXA
                               AND M.NRSEQVENDA    = V.NRSEQVENDA
                               AND DECODE(V.IDTPEMISVEND,'N','NFCE','S','SAT','ECF') = DECODE(P_IDORIGEMREDZ,'SAT','SAT','NFCE','NFCE','ECF')
                             UNION ALL
                            SELECT DISTINCT M.CDFILIAL, M.CDCAIXA, M.DTABERCAIX, M.NRSEQUMOVI
                              FROM MOVCAIXA M
                             WHERE M.CDFILIAL      = P_CDFILIAL
                               AND M.CDCAIXA       = P_CDCAIXA
                               AND M.DTMOVIMCAIXA  = P_DTREDUZ
                               AND M.IDAPROVEXTEMP = P_IDAPROVEXTEMP
                               AND M.IDTIPOMOVIVE  = 'G') LOOP
            UPDATE MOVCAIXA
               SET IDAPROVREDZNFCE = 'P',
                   IDAPROVEXTEMP   = 'N'
             WHERE CDFILIAL        = C_MOVCAIXA.CDFILIAL
               AND CDCAIXA         = C_MOVCAIXA.CDCAIXA
               AND DTABERCAIX      = C_MOVCAIXA.DTABERCAIX
               AND NRSEQUMOVI      = C_MOVCAIXA.NRSEQUMOVI;
         END LOOP;
      END IF;
   EXCEPTION
      WHEN OTHERS THEN BEGIN
         P_RETORNO := SQLERRM(SQLCODE);
         ROLLBACK;
      END;
   END;
END;
/