CREATE OR REPLACE PROCEDURE APURA_IMPOSTOS_GERAIS(
   P_CDIMPOSTO    IN  MAPAAPURAC.CDIMPOSTO%TYPE,
   P_CDEMPRESA    IN  MAPAAPURAC.CDEMPRESA%TYPE,
   P_CDINSCRICAO  IN  MAPAAPURAC.CDINSCESTA%TYPE,
   P_NRSEQUMAPAPU IN  MAPAAPURAC.NRSEQUMAPAPU%TYPE,
   P_DTINICIAL    IN  MAPAAPURAC.DTINIPERIODO%TYPE,
   P_DTFINAL      IN  MAPAAPURAC.DTFIMPERIODO%TYPE,
   P_BOBLOQ       IN  MAPAAPURAC.IDBLOQMAPAPU%TYPE,
   P_CHAMADAPROC  IN  VARCHAR2 DEFAULT 'D',
   P_RETORNO      OUT VARCHAR2)
AS
   V_VERIFFORMULA       VARCHAR2(15);
   V_NFFORAPERIODO      VARCHAR2(50);
   V_VRIMPOSAID         NUMBER;
   V_VROUTRDEBI         NUMBER;
   V_VRESTOCRED         NUMBER;
   V_VRTOTADEBI         NUMBER;
   V_VRIMPOENTR         NUMBER;
   V_VROUTRCRED         NUMBER;
   V_VRESTODEBI         NUMBER;
   V_VRTOTACRED         NUMBER;
   V_VRSALDOCREDANT     NUMBER;
   V_VRDEDUCAO          NUMBER;
   V_VRDEBESP           NUMBER;
   V_VRSALDOCRED        NUMBER;
   V_VRSALDODEBI        NUMBER;
   V_VRDIFALIQU         NUMBER;
   V_BOBLOQ             VARCHAR2(01);
   V_BOBLOQSEMMOV       BOOLEAN;
   V_NOTASMAPA          NUMBER;
   V_CDAJUSTEITMAPA     VARCHAR2(10);
   V_CDITPROCEDENCIA    VARCHAR2(10);
   V_CDAJUSTEITSEF      VARCHAR2(03);
   V_VRALIQIMPOSREC     NUMBER;
   V_IDAPURCREDPRES     VARCHAR2(01);
   V_SGESTADO           VARCHAR2(02);
   V_IDREALIESTAPUR     VARCHAR2(01);
   V_VRINFORMATIVO      NUMBER;
   V_IDDIFERICMSANT     VARCHAR2(01);
   V_IDREALIESTAPURCRED VARCHAR2(01);
   V_VROUTRCREDSUBA     FLOAT;
   V_VRESTDEBSUBA       FLOAT;
   V_VRESTCREDSUBA      FLOAT;
   V_IDCALCICMSSTRJ     VARCHAR2(01);
   V_EMPRERELAC         VARCHAR2(01);
   V_PREENCHEGUIA       VARCHAR2(01);
BEGIN
   IF P_BOBLOQ = 'A' THEN
      V_BOBLOQSEMMOV := TRUE;
      V_BOBLOQ := 'S';
   ELSE
      V_BOBLOQSEMMOV := FALSE;
      V_BOBLOQ := P_BOBLOQ;
   END IF;

   V_EMPRERELAC := 'N';

   /******** VERIFICA SE O IMPOSTO UTILIZA FORMULA DE APURACAO E SE A PARAMETRIZACAO ESTA CORRETA ********/
   V_VERIFFORMULA := VERIFICA_FORMULA(P_CDIMPOSTO, P_CDEMPRESA, P_CDINSCRICAO, P_NRSEQUMAPAPU);

   IF (V_VERIFFORMULA = 'N_FORMULA') OR (V_VERIFFORMULA = 'DIVIDE_ZERO') OR (V_VERIFFORMULA = 'VER_FORMULA') THEN
      P_RETORNO := V_VERIFFORMULA;
   ELSE
      /******** ATUALIZA O STATUS DO MAPA ********/
      UPDATE MAPAAPURAC
         SET IDBLOQMAPAPU = 'A'
       WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

      /******** VERIFICA SE O MAPA JA HAVIA SIDO APURADO ANTERIORMENTE (SE O MESMO JA POSSUIA NOTAS) ********/
      BEGIN
         SELECT COUNT(*)
           INTO V_NOTASMAPA
           FROM IMPOSTONF
          WHERE (NRSEQUMAPAPU = P_NRSEQUMAPAPU OR
                 NRSEQMAPOIMP = P_NRSEQUMAPAPU);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NOTASMAPA := 0;
      END;
      V_NOTASMAPA := NVL(V_NOTASMAPA,0);

      /******** DELETA OS ITENS NECESSARIOS PARA UMA REAPURACAO DO MAPA ********/
      DELETA_MAPA(P_NRSEQUMAPAPU, V_BOBLOQ);
      BEGIN
         SELECT VRALIQIMPOSREC, IDAPURLUCPRE, SGESTADO, IDREALIESTAPUR, IDDIFERICMSANT, IDREALIESTAPURCRED
           INTO V_VRALIQIMPOSREC, V_IDAPURCREDPRES, V_SGESTADO, V_IDREALIESTAPUR, V_IDDIFERICMSANT, V_IDREALIESTAPURCRED
           FROM INSCRESTAD
          WHERE CDEMPRESA    = P_CDEMPRESA
            AND CDINSCESTA   = P_CDINSCRICAO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_VRALIQIMPOSREC     := 0;
            V_IDAPURCREDPRES     := 'N';
            V_SGESTADO           := '';
            V_IDREALIESTAPUR     := 'N';
            V_IDDIFERICMSANT     := 'N';
            V_IDREALIESTAPURCRED := 'N';
      END;

      /*NESSE CASO E NECESSARIO APAGAR O ITEM DE OUTROS CREDITOS QUE PODE TER SIDO GERADO PELA ROTINA DE CREDITO PRESUMIDO*/
      IF V_VRALIQIMPOSREC > 0 THEN
         /******** SALVA OS CODIGOS DE AJUSTE DO ITEM GERADO PELA ROTINA DE CREDITO PRESUMIDO, NO CASO DE REAPURACAO DE MAPAS ********/
         BEGIN
            SELECT MAX(CDAJUSTEITMAPA)  AS CDAJUSTEITMAPA,
                   MAX(CDITPROCEDENCIA) AS CDITPROCEDENCIA,
                   MAX(CDAJUSTEITSEF)   AS CDAJUSTEITSEF
              INTO V_CDAJUSTEITMAPA, V_CDITPROCEDENCIA, V_CDAJUSTEITSEF
              FROM ITMAPARECUP
             WHERE IDCREDPRESUMIDO = 'S'
               AND NRSEQUMAPAPU    = P_NRSEQUMAPAPU
               AND IDTIPOITMAPR    = 'OC';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDAJUSTEITMAPA  := NULL;
               V_CDITPROCEDENCIA := NULL;
               V_CDAJUSTEITSEF   := NULL;
         END;
         DELETE FROM ITMAPARECUP
          WHERE NRSEQUMAPAPU    = P_NRSEQUMAPAPU
            AND IDTIPOITMAPR    IN ('OC','ED','EC')
            AND IDCREDPRESUMIDO = 'S';
      END IF;
      GRAVA_PARCELA(P_CDEMPRESA, P_CDINSCRICAO, P_DTINICIAL, P_DTFINAL, P_NRSEQUMAPAPU, P_CDIMPOSTO);
      V_NFFORAPERIODO := SOMA_IMPOSTO(P_CDEMPRESA, P_CDIMPOSTO, P_NRSEQUMAPAPU, P_CDINSCRICAO, P_DTFINAL, P_DTINICIAL, V_NOTASMAPA,P_CHAMADAPROC);
      IF (P_CHAMADAPROC = 'M') AND (SUBSTR(V_NFFORAPERIODO,2,1) = 'S') THEN
         V_EMPRERELAC := 'S';
         P_RETORNO := 'EMPRESA_RELAC';
         ROLLBACK;
      ELSE
         /******** CREDITO DE ANTECIPACAO DO ICMS DO ARROZ ********/
         ANTECIPACAO_ICMS_ARROZ(P_NRSEQUMAPAPU);

         /******** ESTORNO DE CREDITO ICMS DIFERIDO ********/
         CALCULA_ESTORNO_CREDITO(P_CDEMPRESA,P_CDINSCRICAO,P_DTINICIAL,P_DTFINAL,P_NRSEQUMAPAPU);

         /******** CALCULA O DIFERENCIAL DE ALIQUOTA ********/
         CALC_DIFE_ALIQ(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDIMPOSTO, P_CDINSCRICAO, P_DTINICIAL, P_DTFINAL);

         /******** BUSCA OS VALORES DE FECP ********/
         GERA_AJUSTE_FECP(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDINSCRICAO, P_CDIMPOSTO);

         /******** BUSCA OS VALORES DE CIAP ********/
         INSERE_AJUSTE_CIAP(P_CDEMPRESA,P_CDINSCRICAO,P_DTINICIAL,P_DTFINAL,P_NRSEQUMAPAPU,P_CDIMPOSTO);

         /******** CALCULA O DIFERENCIAL DE ALIQUOTA E O FUNDO DE COMBATE A POBREZA NAS OPERACOES PARA NAO CONTRIBUINTE*/
         IF P_CDIMPOSTO = '00' THEN
            CALC_DIFAL_FCP_NC(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDINSCRICAO);

            /*ESTORNO NA APURACAO*/
            IF V_IDREALIESTAPUR = 'S' THEN
               CALC_ESTORNO_FAT(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDIMPOSTO, P_CDINSCRICAO);
            END IF;

            BEGIN
               SELECT NVL(IDCALCICMSSTRJ,'N') AS IDCALCICMSSTRJ
                 INTO V_IDCALCICMSSTRJ
                 FROM PARAMESTSPED
                WHERE CDEMPRESA = P_CDEMPRESA
                  AND CDINSCESTA = P_CDINSCRICAO;
            EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                    V_IDCALCICMSSTRJ  := 'N';
            END;

            /*CREDITO PROPORCIONAL AS SAIDAS RJ - ICMS - ST*/
            IF V_IDCALCICMSSTRJ = 'S' THEN
               CALCULA_CREDSTANT_RJ(P_CDEMPRESA, P_CDINSCRICAO, P_DTINICIAL, P_DTFINAL, P_NRSEQUMAPAPU, 'N');
            END IF;

         END IF;

         /*GERA OS AJUSTES AUTOMATICOS, QUANDO PARAMETRIZADO PARA A INSCRICAO ESTADUAL E IMPOSTO*/
         GERA_AJUSTE_AUTO(P_CDIMPOSTO, P_CDEMPRESA, P_CDINSCRICAO, P_NRSEQUMAPAPU);

         /******** ATUALIZA OS VALORES DA APURACAO ********/
         /******** BUSCA OS VALORES DA ITMAPARECUP PARA ATUALIZAR A TABELA MAPARECUP ********/
         BEGIN
            SELECT NVL(SUM(DECODE(IDTIPOITMAPR,'OD',VRITEMMAPR,0)),0) AS VROUTRDEBI,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'EC',VRITEMMAPR,0)),0) AS VRESTOCRED,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'OC',VRITEMMAPR,0)),0) AS VROUTRCRED,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'ED',VRITEMMAPR,0)),0) AS VRESTODEBI,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'DD',VRITEMMAPR,0)),0) AS VRDEDUCAO,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'DA',VRITEMMAPR,0)),0) AS VRDIFALIQU,
                   NVL(SUM(DECODE(IDTIPOITMAPR,'DE',VRITEMMAPR,0)),0) AS VRDEBESP
              INTO V_VROUTRDEBI, V_VRESTOCRED, V_VROUTRCRED,
                   V_VRESTODEBI, V_VRDEDUCAO,  V_VRDIFALIQU, V_VRDEBESP
              FROM ITMAPARECUP
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
                V_VROUTRDEBI := 0;
                V_VRESTOCRED := 0;
                V_VROUTRCRED := 0;
                V_VRESTODEBI := 0;
                V_VRDEDUCAO  := 0;
                V_VRDIFALIQU := 0;
                V_VRDEBESP   := 0;
         END;

         /******** BUSCA OS VALORES DA MAPAAPURAC PARA ATUALIZAR OS TOTALIZADORES ********/
         BEGIN
            SELECT NVL(VRNORMDEBI,0), NVL(VRNORMCRED,0), NVL(MR.VRSLDCRANTE, 0)
              INTO V_VRIMPOSAID, V_VRIMPOENTR, V_VRSALDOCREDANT
              FROM MAPARECUP MR
             WHERE MR.NRSEQUMAPAPU = P_NRSEQUMAPAPU;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRIMPOSAID     := 0;
               V_VRIMPOENTR     := 0;
               V_VRSALDOCREDANT := 0;
         END;

         /******** CALCULA OS VALORES: TOTAL DEBITOS, TOTAL CREDITOS, SALDO CREDOR E SALDO DEVEDOR  ********/
         V_VRTOTADEBI  := NVL(V_VRIMPOSAID,0) +  NVL(V_VROUTRDEBI,0) + NVL(V_VRESTOCRED,0);
         V_VRTOTACRED  := NVL(V_VRIMPOENTR,0) +  NVL(V_VROUTRCRED,0) + NVL(V_VRESTODEBI,0);
         V_VRSALDODEBI := NVL(V_VRTOTADEBI,0) - (NVL(V_VRTOTACRED,0) + NVL(V_VRSALDOCREDANT,0) + NVL(V_VRDEDUCAO,0));

         IF V_VRSALDODEBI < 0 THEN
            V_VRSALDOCRED := ABS(V_VRSALDODEBI);
            V_VRSALDODEBI := 0;
         ELSE
            V_VRSALDOCRED := 0;
         END IF;

         /***** ATUALIZA A TABELA MAPARECUP *****/
         UPDATE MAPARECUP
            SET VROUTRDEBI    = V_VROUTRDEBI,
                VRESTOCRED    = V_VRESTOCRED,
                VRTOTADEBI    = V_VRTOTADEBI,
                VROUTRCRED    = V_VROUTRCRED,
                VRESTODEBI    = V_VRESTODEBI,
                VRTOTACRED    = V_VRTOTACRED,
                VRDEDUCAO     = V_VRDEDUCAO,
                VRDIFALIQU    = V_VRDIFALIQU,
                VRSALDOCRED   = V_VRSALDOCRED,
                VRSALDODEBI   = V_VRSALDODEBI,
                VRDEBESPECIAL = V_VRDEBESP
          WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU;

         /***** ATUALIZA A TABELA MAPAAPURAC *****/
         UPDATE MAPAAPURAC
            SET VRTOTAIMPOS  = V_VRSALDODEBI,
                VRRECEGUIA   = DECODE(IDVRRECEGUIAMANUAL,'N',V_VRSALDODEBI,VRRECEGUIA),
                VRMULTAGUIA  = NVL(VRMULTAGUIA,0),
                VRJUROGUIA   = NVL(VRJUROGUIA,0),
                VRTOTAGUIA   = DECODE(IDVRRECEGUIAMANUAL,'N',V_VRSALDODEBI,VRRECEGUIA) + NVL(VRMULTAGUIA,0) + NVL(VRJUROGUIA,0)
          WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

         /******** CREDITO PRESUMIDO ********/
         IF V_IDAPURCREDPRES = 'S' AND P_CDIMPOSTO = '00' THEN
            CALC_CRED_PRESUMIDO(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDIMPOSTO, P_CDINSCRICAO, V_CDAJUSTEITMAPA, V_CDITPROCEDENCIA, V_CDAJUSTEITSEF);
            IF V_IDREALIESTAPURCRED = 'S' THEN
               CALC_ESTORNO_RET(P_NRSEQUMAPAPU, P_CDEMPRESA, P_CDIMPOSTO, P_CDINSCRICAO);
            END IF;

            /******** ATUALIZA OS VALORES DA APURACAO E SUB-APURACAO APOS O CALCULO DO CREDITO PRESUMIDO********/
            /******** BUSCA OS VALORES DA ITMAPARECUP PARA ATUALIZAR A TABELA MAPARECUP ********/
            BEGIN
               SELECT NVL(SUM(DECODE(IDTIPOITMAPR,'OC',DECODE(IDAJSUBAPURCP,'N',VRITEMMAPR,0),0)),0) AS VROUTRCRED,
                      NVL(SUM(DECODE(IDTIPOITMAPR,'OC',DECODE(IDAJSUBAPURCP,'S',VRITEMMAPR,0),0)),0) AS VROUTRCREDSUBA,
                      NVL(SUM(DECODE(IDTIPOITMAPR,'ED',DECODE(IDESTSUBAPUR, 'N',VRITEMMAPR,0),0)),0) AS VRESTDEB,
                      NVL(SUM(DECODE(IDTIPOITMAPR,'ED',DECODE(IDESTSUBAPUR, 'S',VRITEMMAPR,0),0)),0) AS VRESTDEBSUBA,
                      NVL(SUM(DECODE(IDTIPOITMAPR,'EC',DECODE(IDESTSUBAPUR, 'N',VRITEMMAPR,0),0)),0) AS VRESTCRED,
                      NVL(SUM(DECODE(IDTIPOITMAPR,'EC',DECODE(IDESTSUBAPUR, 'S',VRITEMMAPR,0),0)),0) AS VRESTCREDSUBA
                 INTO V_VROUTRCRED, V_VROUTRCREDSUBA, V_VRESTODEBI, V_VRESTDEBSUBA, V_VRESTOCRED, V_VRESTCREDSUBA
                 FROM ITMAPARECUP
                WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                  AND IDTIPOITMAPR IN ('OC','ED','EC');
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_VROUTRCRED     := 0;
                  V_VROUTRCREDSUBA := 0;
                  V_VRESTODEBI     := 0;
                  V_VRESTDEBSUBA   := 0;
                  V_VRESTOCRED     := 0;
                  V_VRESTCREDSUBA  := 0;
            END;

            /******** CALCULA OS VALORES: TOTAL DEBITOS, TOTAL CREDITOS, SALDO CREDOR E SALDO DEVEDOR  ********/
            V_VRTOTADEBI  := NVL(V_VRIMPOSAID,0) +  NVL(V_VROUTRDEBI,0) + NVL(V_VRESTOCRED,0) + NVL(V_VRESTCREDSUBA,0);
            V_VRTOTACRED  := NVL(V_VRIMPOENTR,0) +  NVL(V_VROUTRCRED,0) + NVL(V_VRESTODEBI,0) + NVL(V_VRESTDEBSUBA,0);
            V_VRSALDODEBI := NVL(V_VRTOTADEBI,0) - (NVL(V_VRTOTACRED,0) + NVL(V_VRSALDOCREDANT,0) + NVL(V_VRDEDUCAO,0));

            IF V_VRSALDODEBI < 0 THEN
               V_VRSALDOCRED := ABS(V_VRSALDODEBI);
               V_VRSALDODEBI := 0;
            ELSE
               V_VRSALDOCRED := 0;
            END IF;

            /******** CALCULA OS VALORES DA SUB-APURACAO APOS O CALCULO DO CREDITO PRESUMIDO********/

            /***** ATUALIZA A TABELA MAPARECUP *****/
            UPDATE MAPARECUP
               SET VROUTRCRED         = V_VROUTRCRED,
                   VRESTODEBI         = NVL(V_VRESTODEBI,0) + NVL(V_VRESTDEBSUBA,0),
                   VRESTOCRED         = NVL(V_VRESTOCRED,0) + NVL(V_VRESTCREDSUBA,0),
                   VRTOTACRED         = V_VRTOTACRED,
                   VRTOTADEBI         = V_VRTOTADEBI,
                   VRSALDOCRED        = V_VRSALDOCRED,
                   VRSALDODEBI        = V_VRSALDODEBI,
                   VRNORMDEBISUBAPUR  = V_VRESTDEBSUBA,
                   VROUTRDEBISUBAPUR  = 0,
                   VRESTOCREDSUBAPUR  = 0,
                   VRTOTADEBISUBAPUR  = V_VRESTDEBSUBA,
                   VRNORMCREDSUBAPUR  = V_VRESTCREDSUBA,
                   VROUTRCREDSUBAPUR  = V_VROUTRCREDSUBA,
                   VRESTODEBISUBAPUR  = 0,
                   VRTOTACREDSUBAPUR  = V_VRESTCREDSUBA + V_VROUTRCREDSUBA,
                   VRSLDCRANTESUBAPUR = VRSLDCRANTESUBAPUR,
                   VRDEDUCAOSUBAPUR   = 0,
                   VRSALDOCREDSUBAPUR = CASE WHEN V_VRESTDEBSUBA-(V_VRESTCREDSUBA+V_VROUTRCREDSUBA+VRSLDCRANTESUBAPUR) >= 0
                                             THEN 0 ELSE ABS(V_VRESTDEBSUBA-(V_VRESTCREDSUBA+V_VROUTRCREDSUBA+VRSLDCRANTESUBAPUR)) END,
                   VRSALDODEBISUBAPUR = CASE WHEN V_VRESTDEBSUBA-(V_VRESTCREDSUBA+V_VROUTRCREDSUBA+VRSLDCRANTESUBAPUR) >= 0
                                             THEN V_VRESTDEBSUBA-(V_VRESTCREDSUBA+V_VROUTRCREDSUBA+VRSLDCRANTESUBAPUR) ELSE 0 END
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

            /***** ATUALIZA A TABELA MAPAAPURAC *****/
            UPDATE MAPAAPURAC
               SET VRTOTAIMPOS  = V_VRSALDODEBI,
                   VRRECEGUIA   = DECODE(IDVRRECEGUIAMANUAL,'N',V_VRSALDODEBI,VRRECEGUIA),
                   VRMULTAGUIA  = NVL(VRMULTAGUIA,0),
                   VRJUROGUIA   = NVL(VRJUROGUIA,0),
                   VRTOTAGUIA   = NVL(VRRECEGUIA,0) + NVL(VRMULTAGUIA,0) + NVL(VRJUROGUIA,0)
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
         END IF;

         /*GERA OS AJUSTES DE VALOR INFORMATIVO NECESSARIOS NO SPED PARA O ESTADO DE SP, DE ACORDO COM A PORTARIA CAT No 66*/
         IF (V_SGESTADO = 'SP') AND (P_CDIMPOSTO = '00') THEN
            GERA_AJUSTE_DOC_SP(P_NRSEQUMAPAPU,P_CDEMPRESA,P_CDINSCRICAO);
         END IF;

         /*GERA AS INFORMACOES ADICIONAIS REFERENTE AOS BENEFICIOS FISCAIS*/
         IF (V_SGESTADO <> 'SP') AND (P_CDIMPOSTO = '00') THEN
            GERA_INFADIC_BENEFICIO(P_NRSEQUMAPAPU,P_CDIMPOSTO,P_CDEMPRESA,P_CDINSCRICAO);
         END IF;

         /*GERA AS INFORMACOES ADICIONAIS REFERENTE AO CREDITO DE RESSARCIMENTO DE ICMS ST NO ESTADO DO RIO GRANDE DO SUL*/
         IF (P_CDIMPOSTO = '00') THEN
            GERA_CREDITO_RESSARC_ST(P_NRSEQUMAPAPU,P_CDEMPRESA,P_CDINSCRICAO);
         END IF;

         /*CREDITO ANTECIPADO MG*/
         IF (P_CDIMPOSTO = '00') AND (V_IDDIFERICMSANT = 'S') THEN
            CALCULA_CREDSTANT_MG(P_NRSEQUMAPAPU,P_CDEMPRESA,P_CDINSCRICAO);
         END IF;

         /******** ROTINA PARA GRAVA TABELA REFENTE A PAGAMENTO ELETRONICO********/
         IF P_CDIMPOSTO = '00' THEN
            GRAVA_PAGAMENTO_ELETRONICO(P_NRSEQUMAPAPU, P_DTINICIAL, P_DTFINAL, P_CDEMPRESA, P_CDINSCRICAO);
         END IF;

         /******** ROTINA PARA PREENCHER O CODIGO DA RECEITA E DATA DO VENCIMENTO NA GUIA DO MAPA********/
         BEGIN
            SELECT NVL(MAX(IDINFPAGAPURACAO),'N')
              INTO V_PREENCHEGUIA
              FROM PARAMFISCAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PREENCHEGUIA := 'N';
         END;
         BEGIN
            SELECT NVL(SUM(DECODE(IDTIPOITMAPR,'VI',VRITEMMAPR,0)),0) AS VRINFORMATIVO
              INTO V_VRINFORMATIVO
              FROM ITMAPARECUP
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
                V_VRINFORMATIVO := 0;
         END;

         /***** ATUALIZA A TABELA MAPARECUP *****/
         UPDATE MAPARECUP
            SET VRINFORMATIVO = NVL(V_VRINFORMATIVO,0)
          WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU;

         P_RETORNO := 'OK'||V_NFFORAPERIODO;

         /******** APLICA A FORMULA DE APURACAO, NO CASO DE A MESMA ESTAR CORRETAMENTE PARAMETRIZADA ********/
         IF V_VERIFFORMULA = 'USA_FORMULA' THEN
            V_VERIFFORMULA := UTILIZA_FORMULA(P_CDIMPOSTO, P_CDEMPRESA, P_CDINSCRICAO, P_NRSEQUMAPAPU);
            IF (V_VERIFFORMULA = 'N_FORMULA') OR (V_VERIFFORMULA = 'DIVIDE_ZERO') OR (V_VERIFFORMULA = 'VER_FORMULA') THEN
               P_RETORNO := V_VERIFFORMULA;
            END IF;
         END IF;
      END IF;      
   END IF;

   IF (V_BOBLOQSEMMOV = TRUE) AND (V_EMPRERELAC = 'N') THEN
      BEGIN
         SELECT COUNT(*)
           INTO V_NOTASMAPA
           FROM IMPOSTONF
          WHERE (NRSEQUMAPAPU = P_NRSEQUMAPAPU OR
                 NRSEQMAPOIMP = P_NRSEQUMAPAPU);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NOTASMAPA := 0;
      END;
      V_NOTASMAPA := NVL(V_NOTASMAPA,0);

      IF V_NOTASMAPA = 0 THEN
         UPDATE MAPAAPURAC
            SET IDBLOQMAPAPU = 'S'
          WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

         P_RETORNO := 'SEM_MOVIMENTO';
      ELSE
         P_RETORNO := 'COM_MOVIMENTO';
      END IF;
   END IF;

   COMMIT;

EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
END;
/
