CREATE OR REPLACE PROCEDURE CALC_DIFE_ALIQ(
   P_NRSEQUMAPAPU    IN MAPAAPURAC.NRSEQUMAPAPU%TYPE,
   P_CDEMPRESA       IN MAPAAPURAC.CDEMPRESA%TYPE,
   P_CDIMPOSTO       IN MAPAAPURAC.CDIMPOSTO%TYPE,
   P_INSCRICAO       IN MAPAAPURAC.CDINSCESTA%TYPE,
   P_DTINICIAL       IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_DTFINAL         IN MAPAAPURAC.DTFIMPERIODO%TYPE)
AS
   V_NRSEQITMAPA      VARCHAR2(10);
   V_CODAJUSTE        VARCHAR2(20);
   V_BOCFOP           BOOLEAN;
   V_CDAJUSTE         VARCHAR2(20);
   V_DSAJUSTE         VARCHAR2(250);
   V_CDAJUSTENFEXTEMP VARCHAR2(20);
   V_DSAJUSTENFEXTEMP VARCHAR2(250);
   V_IDDIFEALIQUOTA   VARCHAR2(02);
   V_NFEXTEMPORANEA   VARCHAR2(01);
   V_NRSEQITMAPR      VARCHAR2(10);
   V_DTININFFORPER    DATE;
   V_CDAJUSTECFOP     VARCHAR2(20);
   V_DSAJUSTECFOP     VARCHAR2(250);
   CURSOR C_CODAJUSTEDANF (P_SEQUMAPAPU   IN MAPAAPURAC.NRSEQUMAPAPU%TYPE,
                           P_IDTIPOITMAPR IN ITMAPARECUP.IDTIPOITMAPR%TYPE) IS
      (SELECT CDFILIAL, NRLANCTONF, CDAJUSTEITMAPA, CDAJUSTEITSEF, CDITPROCEDENCIA, CDITEMOCOR,
              DSITEMOCOR, DSFLEGALOCOR, 'N' AS IDNOTADIFAL, NRSEQITMAPR, DSITEMMAPR, IDTIPOITMAPR, CDCFOPPADRAO
         FROM ITMAPARECUP
        WHERE NRSEQUMAPAPU = P_SEQUMAPAPU
          AND IDTIPOITMAPR = P_IDTIPOITMAPR);
   TYPE CODAJUSTEDANF IS TABLE OF C_CODAJUSTEDANF%ROWTYPE;
   V_CODAJUSTEDANF   CODAJUSTEDANF;
   V_VROUTRDEBI      NUMBER;
   V_VRESTOCRED      NUMBER;
   V_VROUTRCRED      NUMBER;
   V_VRESTODEBI      NUMBER;
   V_VRDEDUCAO       NUMBER;
   V_VRDIFALIQU      NUMBER;
   V_VRIMPOSAID      NUMBER;
   V_VRTOTACRED      NUMBER;
   V_VRIMPOENTR      NUMBER;
   V_VRTOTADEBI      NUMBER;
   V_VRSALDOCREDANT  NUMBER;
   V_VRSALDODEBI     NUMBER;
   V_VRSALDOCRED     NUMBER;
   V_DSITEMMAPR      ITMAPARECUP.DSITEMMAPR%TYPE;
   V_CDAJUSTEITSEF   ITMAPARECUP.CDAJUSTEITSEF%TYPE;
   V_CDITPROCEDENCIA ITMAPARECUP.CDITPROCEDENCIA%TYPE;
   V_CDITEMOCOR      ITMAPARECUP.CDITEMOCOR%TYPE;
   V_DSITEMOCOR      ITMAPARECUP.DSITEMOCOR%TYPE;
   V_SEQITMAPR       ITMAPARECUP.NRSEQITMAPR%TYPE;
   V_NRSEQDETITMAPA  DETITMAPARECUP.NRSEQDETITMAPA%TYPE;
   V_DSFLEGALOCOR    ITMAPARECUP.DSFLEGALOCOR%TYPE;
   V_SGESTADO        INSCRESTAD.SGESTADO%TYPE;
BEGIN
   V_CODAJUSTE := '';
   V_BOCFOP    := FALSE;
   
  /*Como o diferencial é apenas nas notas de entrada não é necessário testar o FECP, o valor sempre deve ser passado*/

   BEGIN
      SELECT I.SGESTADO
        INTO V_SGESTADO
        FROM INSCRESTAD I
       WHERE I.CDEMPRESA  = P_CDEMPRESA
         AND I.CDINSCESTA = P_INSCRICAO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_SGESTADO := '';
   END;
    
   /******** Busca o código de ajuste geral para os itens do registro E111 do sped e retorna se será gerado DA ou OD ********/
   BEGIN
      SELECT CDAJUSTE, DSAJUSTE, CDAJUSTENFEXTEMP, DSAJUSTENFEXTEMP, NVL(IDDIFEALIQUOTA,'DA') AS IDDIFEALIQUOTA
        INTO V_CDAJUSTE, V_DSAJUSTE, V_CDAJUSTENFEXTEMP, V_DSAJUSTENFEXTEMP, V_IDDIFEALIQUOTA
        FROM PARAMESTSPED
       WHERE CDEMPRESA  = P_CDEMPRESA
         AND CDINSCESTA = P_INSCRICAO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDAJUSTE         := NULL;
         V_DSAJUSTE         := NULL;
         V_CDAJUSTENFEXTEMP := NULL;
         V_DSAJUSTENFEXTEMP := NULL;
         V_IDDIFEALIQUOTA   := NULL;
   END;

   IF V_IDDIFEALIQUOTA IS NULL THEN
      V_IDDIFEALIQUOTA := 'DA';
   END IF;

   /******** Busca as NF's que já estavam na ITMAPARECUP, de acordo com a parametrização,
             para salvar os dados digitados pelo usuário, em caso de reapuração de mapas ********/
   OPEN  C_CODAJUSTEDANF (P_NRSEQUMAPAPU, V_IDDIFEALIQUOTA);
   FETCH C_CODAJUSTEDANF BULK COLLECT INTO V_CODAJUSTEDANF;
   CLOSE C_CODAJUSTEDANF;


   /******** Deleta da DETITMAPARECUP o detalhamento das NF´s que vieram da IMPOSTONF
             que possuem diferencial de aliquota gerado automaticamente pela rotina ********/
   DELETE DETITMAPARECUP
    WHERE (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR) IN (SELECT NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR
                                                          FROM ITMAPARECUP
                                                         WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU
                                                           AND IDTIPOITMAPR  IN ('DA','OD')
                                                           AND IDDIFALMANUAL = 'N');

   /******** Deleta da ITMAPARECUP as NF´s que vieram da IMPOSTONF que possuem diferencial de aliquota,
             conforme a parametrização (Gerado como Diferencial de Alíquota ou como Outros Débitos) ********/
   DELETE ITMAPARECUP
    WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU
      AND IDTIPOITMAPR  IN ('DA','OD')
      AND IDDIFALMANUAL = 'N';
   
   /******** Busca o último sequencial na ITMAPARECUP, DA ou OD, de acordo com a parametrização ********/
   V_NRSEQITMAPR := 0;
   BEGIN
      SELECT MAX(NRSEQITMAPR) AS NRSEQITMAPR
        INTO V_NRSEQITMAPR
        FROM ITMAPARECUP
       WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
         AND IDTIPOITMAPR = V_IDDIFEALIQUOTA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_NRSEQITMAPR := 0;
   END;

   /******** Busca a data inicial para considerar as NF's fora do período ********/
   SELECT DTININFFORPER
     INTO V_DTININFFORPER
     FROM PARAMFISCAL;

   FOR C_TOTADIFEALIQ IN (SELECT SUM(ROUND(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0),2)) AS VRIMPOSTONF,
                                 IT.NRLANCTONF AS NRLANCTONF,
                                 IT.CDFILIAL AS CDFILIAL, P.CDAJUSTE, P.DSAJUSTE, P.CDCFOPPADRAO
                            FROM ITEMPROIMPOS IT, NOTAFISCAL NF, IMPOSTO I,
                                 (SELECT DISTINCT CDFILIAL, NRLANCTONF
                                    FROM IMPOSTONF
                                   WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU) IP,
                                 (SELECT CDCFOPPADRAO, CDAJUSTE, DSAJUSTE
                                    FROM PARAMESTSPEDCFOP
                                   WHERE CDEMPRESA  = P_CDEMPRESA
                                     AND CDINSCESTA = P_INSCRICAO) P
                           WHERE NF.IDENTRSAIDOP   = 'E'
                             AND NF.CDFILIAL       = IT.CDFILIAL
                             AND NF.NRLANCTONF     = IT.NRLANCTONF
                             AND IT.NRITPROIMPOS   = '3'
                             AND IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0) > 0
                             AND IT.CDIMPOSTO      = I.CDIMPOSTO
                             AND I.CDIMPOSTONFE    = P_CDIMPOSTO
                             AND IT.CDFISCOPERIT   = P.CDCFOPPADRAO(+)
                             AND IT.CDFILIAL       = IP.CDFILIAL
                             AND IT.NRLANCTONF     = IP.NRLANCTONF
                           GROUP BY IT.NRLANCTONF, IT.CDFILIAL, P.CDAJUSTE, P.DSAJUSTE, P.CDCFOPPADRAO) LOOP

      IF C_TOTADIFEALIQ.VRIMPOSTONF > 0 THEN
         /******** Busca o ajuste para o itens do registro E111 do sped por CFOP ********/
         V_SEQITMAPR       := '';
         V_DSITEMMAPR      := '';
         V_CODAJUSTE       := '';
         V_CDAJUSTEITSEF   := '';
         V_CDITPROCEDENCIA := '';
         V_CDITEMOCOR      := '';
         V_DSITEMOCOR      := '';
         V_DSFLEGALOCOR    := '';

         /******** Busca os dados das notas que já existiam, para recuperar as informações alteradas pelo usuário ********/
         FOR I IN 1 .. V_CODAJUSTEDANF.COUNT LOOP
            IF (V_CODAJUSTEDANF(I).CDFILIAL   = C_TOTADIFEALIQ.CDFILIAL)   AND
               (V_CODAJUSTEDANF(I).NRLANCTONF = C_TOTADIFEALIQ.NRLANCTONF) AND
               ((V_CODAJUSTEDANF(I).CDCFOPPADRAO  = C_TOTADIFEALIQ.CDCFOPPADRAO) OR
                ((V_CODAJUSTEDANF(I).CDCFOPPADRAO IS NULL) AND (C_TOTADIFEALIQ.CDCFOPPADRAO IS NULL)))THEN

               /******** Deleta da itmaparecup as nf´s que vieram da impostonf que possuem
                         diferencial de aliquota  e que não foram apagadas porque estavam
                         com o campo iddifalmanual vazio (mapas antigos)  
               DELETE ITMAPARECUP
                WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU
                  AND CDFILIAL      = C_TOTADIFEALIQ.CDFILIAL
                  AND NRLANCTONF    = C_TOTADIFEALIQ.NRLANCTONF
                  AND IDTIPOITMAPR  = 'DA';********/

               V_CODAJUSTEDANF(I).IDNOTADIFAL := 'S';
               V_DSITEMMAPR      := V_CODAJUSTEDANF(I).DSITEMMAPR;
               V_CDITPROCEDENCIA := V_CODAJUSTEDANF(I).CDITPROCEDENCIA;
               V_CDITEMOCOR      := V_CODAJUSTEDANF(I).CDITEMOCOR;
               V_DSITEMOCOR      := V_CODAJUSTEDANF(I).DSITEMOCOR;
               V_DSFLEGALOCOR    := V_CODAJUSTEDANF(I).DSFLEGALOCOR;
               EXIT;
            END IF;
         END LOOP; 

         /******** Verifica se a nota é Extemporânea ********/
         V_NFEXTEMPORANEA := 'N';
         BEGIN
            SELECT 'S' AS NFEXTEMPORANEA
              INTO V_NFEXTEMPORANEA
              FROM NOTAFISCAL N
             WHERE N.CDFILIAL   = C_TOTADIFEALIQ.CDFILIAL
               AND N.NRLANCTONF = C_TOTADIFEALIQ.NRLANCTONF
               AND NOT N.DTENTRSAID BETWEEN P_DTINICIAL AND P_DTFINAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_NFEXTEMPORANEA := 'N';
         END;

         /******** Verifica o sequencial da ITMAPARECUP ********/
         IF (V_SEQITMAPR IS NULL) OR (V_SEQITMAPR = '') THEN
             V_NRSEQITMAPR := NVL(V_NRSEQITMAPR,0) + 1;
             V_SEQITMAPR   := V_NRSEQITMAPR;
         END IF;

         /******** Verifica a descrição do item, conforme o caso (Diferencial de Alíquota ou Outros Débitos) ********/
         IF (V_DSITEMMAPR IS NULL) OR (V_DSITEMMAPR = '') THEN
            IF (C_TOTADIFEALIQ.CDAJUSTE IS NULL) OR (V_NFEXTEMPORANEA = 'S') THEN
               IF V_NFEXTEMPORANEA = 'S' THEN
                  V_DSITEMMAPR := V_DSAJUSTENFEXTEMP;
               ELSE
                  V_DSITEMMAPR := V_DSAJUSTE;
               END IF;
            ELSE
               V_DSITEMMAPR := C_TOTADIFEALIQ.DSAJUSTE;
            END IF;
            IF (V_DSITEMMAPR IS NULL) OR (V_DSITEMMAPR = '') THEN
               V_DSITEMMAPR := 'DIF. ALIQUOTA';
            END IF;
         END IF;

         /******** Verifica o código de ajuste do item, conforme parametrização ********/
         IF (V_CODAJUSTE IS NULL) OR (V_CODAJUSTE = '') THEN
            IF (C_TOTADIFEALIQ.CDAJUSTE IS NULL) OR (V_NFEXTEMPORANEA = 'S') THEN
               IF V_NFEXTEMPORANEA = 'S' THEN
                  V_CODAJUSTE := V_CDAJUSTENFEXTEMP;
               ELSE
                  V_CODAJUSTE := V_CDAJUSTE;
               END IF;
            ELSE
               V_CODAJUSTE := C_TOTADIFEALIQ.CDAJUSTE;
            END IF;
         END IF;
         
         IF V_SGESTADO = 'PE' THEN
            V_CDAJUSTEITSEF := SUBSTR(LPAD(V_CODAJUSTE,20,'0'),18,3);
         END IF;

         /******** Insere o item na ITMAPARECUP ********/
         /******** Verifica se o registro será gerado no C197 ou não ********/
         IF SUBSTR(V_CODAJUSTE,3,2) IN ('30','33','34','35','37','38','40','43','44','45','46',
                                        '47','48','50','53','54','55','56','57','58','70','72') THEN
            INSERT INTO ITMAPARECUP
               (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR, DSITEMMAPR, VRITEMMAPR, CDITEMOCOR, DSITEMOCOR,
                DSFLEGALOCOR, NRLANCTONF, CDFILIAL, CDAJUSTEITMAPA, CDAJUSTEITSEF, CDITPROCEDENCIA,
                IDCREDPRESUMIDO, IDDIFALMANUAL, IDCARGATRIBUTARIA, IDCOMPOEC197, CDCFOPPADRAO)
            VALUES
               (P_NRSEQUMAPAPU, V_IDDIFEALIQUOTA, LPAD(V_SEQITMAPR,10,'0'), V_DSITEMMAPR, C_TOTADIFEALIQ.VRIMPOSTONF, V_CDITEMOCOR, V_DSITEMOCOR,
                V_DSFLEGALOCOR, C_TOTADIFEALIQ.NRLANCTONF, C_TOTADIFEALIQ.CDFILIAL, V_CODAJUSTE, V_CDAJUSTEITSEF, V_CDITPROCEDENCIA,
                'N', 'N', 'N', 'I', C_TOTADIFEALIQ.CDCFOPPADRAO);

            FOR C_ITEM IN (SELECT IT.NRSEQITPROD, IT.CDIMPOSTO, IT.NRITPROIMPOS
                             FROM ITEMPROIMPOS IT, IMPOSTO IM
                            WHERE IT.CDFILIAL       = C_TOTADIFEALIQ.CDFILIAL
                              AND IT.NRLANCTONF     = C_TOTADIFEALIQ.NRLANCTONF
                              AND IT.NRITPROIMPOS   = '3'
                              AND ((IT.CDFISCOPERIT = C_TOTADIFEALIQ.CDCFOPPADRAO) OR
                                   ((C_TOTADIFEALIQ.CDCFOPPADRAO IS NULL) AND
                                    (IT.CDFISCOPERIT NOT IN (SELECT CDCFOPPADRAO
                                                               FROM PARAMESTSPEDCFOP
                                                              WHERE CDEMPRESA  = P_CDEMPRESA
                                                                AND CDINSCESTA = P_INSCRICAO))))
                              AND IT.CDIMPOSTO     = IM.CDIMPOSTO
                              AND IM.CDIMPOSTONFE  = P_CDIMPOSTO) LOOP

               NOVO_CODIGO('DETITMAPARECUP',V_NRSEQDETITMAPA);
               INSERT INTO DETITMAPARECUP
                  (NRSEQDETITMAPA, NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR,
                   CDFILIAL, NRLANCTONF, NRSEQITPROD, CDIMPOSTO, NRITPROIMPOS)
               VALUES
                  (TO_NUMBER(V_NRSEQDETITMAPA), P_NRSEQUMAPAPU, V_IDDIFEALIQUOTA, LPAD(V_SEQITMAPR,10,'0'),
                   C_TOTADIFEALIQ.CDFILIAL, C_TOTADIFEALIQ.NRLANCTONF, C_ITEM.NRSEQITPROD, C_ITEM.CDIMPOSTO, C_ITEM.NRITPROIMPOS);
            END LOOP;
         ELSE
            INSERT INTO ITMAPARECUP
               (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR, DSITEMMAPR, VRITEMMAPR, CDITEMOCOR, DSITEMOCOR,
                DSFLEGALOCOR, NRLANCTONF, CDFILIAL, CDAJUSTEITMAPA, CDAJUSTEITSEF, CDITPROCEDENCIA,
                IDCREDPRESUMIDO, IDDIFALMANUAL, IDCARGATRIBUTARIA, IDCOMPOEC197, CDCFOPPADRAO)
            VALUES
               (P_NRSEQUMAPAPU, V_IDDIFEALIQUOTA, LPAD(V_SEQITMAPR,10,'0'), V_DSITEMMAPR, C_TOTADIFEALIQ.VRIMPOSTONF, V_CDITEMOCOR, V_DSITEMOCOR,
                V_DSFLEGALOCOR, C_TOTADIFEALIQ.NRLANCTONF, C_TOTADIFEALIQ.CDFILIAL, V_CODAJUSTE, V_CDAJUSTEITSEF, V_CDITPROCEDENCIA,
                'N', 'N', 'N', 'N', C_TOTADIFEALIQ.CDCFOPPADRAO);
         END IF;
      END IF;
   END LOOP;

   V_CODAJUSTE := '';
   /******** Busca o código de ajuste para o diferencial de alíquota que foi
             lançado manualmente e ligado a uma NF ********/
   FOR I IN 1 .. V_CODAJUSTEDANF.COUNT LOOP
       IF V_CODAJUSTEDANF(I).IDNOTADIFAL = 'N' THEN
          IF V_CODAJUSTEDANF(I).NRLANCTONF IS NOT NULL THEN
             V_CODAJUSTE := V_CODAJUSTEDANF(I).CDAJUSTEITMAPA;
             IF (V_CODAJUSTE = '') OR (V_CODAJUSTE IS NULL) THEN
                V_BOCFOP := TRUE;
                /******** Busca o ajuste para os itens do registro E111 do sped por CFOP ********/
                BEGIN
                   SELECT CDAJUSTE, DSAJUSTE
                     INTO V_CDAJUSTECFOP, V_DSAJUSTECFOP
                     FROM PARAMESTSPEDCFOP P, (SELECT DISTINCT CDFISCOPERNF
                                                 FROM IMPOSTONF
                                                WHERE NRLANCTONF    = V_CODAJUSTEDANF(I).NRLANCTONF
                                                  AND CDFILIAL      = V_CODAJUSTEDANF(I).CDFILIAL
                                                  AND CDIMPOSTO     = P_CDIMPOSTO) I
                    WHERE CDEMPRESA      = P_CDEMPRESA
                      AND CDINSCESTA     = P_INSCRICAO
                      AND CDCFOPPADRAO   = I.CDFISCOPERNF;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_CDAJUSTECFOP   := NULL;
                      V_DSAJUSTECFOP := NULL;
                END;

                /******** Verifica se a nota é Extemporânea ********/
                V_NFEXTEMPORANEA := 'N';
                BEGIN
                   SELECT 'S' AS NFEXTEMPORANEA
                     INTO V_NFEXTEMPORANEA
                     FROM NOTAFISCAL N
                    WHERE N.CDFILIAL   = V_CODAJUSTEDANF(I).CDFILIAL
                      AND N.NRLANCTONF = V_CODAJUSTEDANF(I).NRLANCTONF
                      AND NOT N.DTENTRSAID BETWEEN P_DTINICIAL AND P_DTFINAL;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_NFEXTEMPORANEA := 'N';
                END;

                IF (((V_CDAJUSTECFOP IS NULL) AND (V_BOCFOP)) OR (NOT V_BOCFOP)) OR (V_NFEXTEMPORANEA='S') THEN
                   IF V_NFEXTEMPORANEA = 'S' THEN
                      V_CODAJUSTE := V_CDAJUSTENFEXTEMP;
                   ELSE
                      V_CODAJUSTE := V_CDAJUSTE;
                   END IF;
                ELSE
                   V_CODAJUSTE := V_CDAJUSTECFOP;
                END IF;

                UPDATE ITMAPARECUP
                   SET CDAJUSTEITMAPA = V_CODAJUSTE
                 WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                   AND IDTIPOITMAPR = 'DA'
                   AND NRSEQITMAPR  = V_CODAJUSTEDANF(I).NRSEQITMAPR;
             END IF;
          END IF;
       END IF;
       V_BOCFOP := FALSE;
       V_CODAJUSTE := '';
   END LOOP;

   /******** Atualiza os valores nas tabelas MAPARECUP e MAPAAPURAC conforme os valores da ITMAPARECUP ********/
   BEGIN
      SELECT SUM(DECODE(IDTIPOITMAPR,'OD',VRITEMMAPR,0)) AS VROUTRDEBI,
             SUM(DECODE(IDTIPOITMAPR,'EC',VRITEMMAPR,0)) AS VRESTOCRED,
             SUM(DECODE(IDTIPOITMAPR,'OC',VRITEMMAPR,0)) AS VROUTRCRED,
             SUM(DECODE(IDTIPOITMAPR,'ED',VRITEMMAPR,0)) AS VRESTODEBI,
             SUM(DECODE(IDTIPOITMAPR,'DD',VRITEMMAPR,0)) AS VRDEDUCAO,
             SUM(DECODE(IDTIPOITMAPR,'DA',VRITEMMAPR,0)) AS VRDIFALIQU
        INTO V_VROUTRDEBI, V_VRESTOCRED, V_VROUTRCRED, V_VRESTODEBI, V_VRDEDUCAO, V_VRDIFALIQU
        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;
   END;

   BEGIN
      SELECT V_VRIMPOSAID, V_VRIMPOENTR, V_VRSALDOCREDANT
        INTO V_VRIMPOSAID, V_VRIMPOENTR, V_VRSALDOCREDANT
        FROM MAPARECUP
       WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_VRIMPOSAID     := 0;
         V_VRIMPOENTR     := 0;
         V_VRSALDOCREDANT := 0;
   END;

   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_VRSALDODEBI := 0;
      V_VRSALDOCRED := ABS(V_VRSALDODEBI);
   ELSE
      V_VRSALDOCRED := 0;
   END IF;

   /***** Atualiza a tabela MAPARECUP *****/  
   UPDATE MAPARECUP
      SET VROUTRDEBI  = V_VROUTRDEBI,
          VRTOTADEBI  = V_VRTOTADEBI,
          VROUTRCRED  = V_VROUTRCRED,
          VRTOTACRED  = V_VRTOTACRED,
          VRDIFALIQU  = V_VRDIFALIQU,
          VRSALDOCRED = V_VRSALDOCRED,
          VRSALDODEBI = V_VRSALDODEBI
    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

   /***** Atualiza a tabela MAPAAPURAC *****/
   UPDATE MAPAAPURAC
      SET VRTOTAIMPOS  = V_VRSALDODEBI
    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALC_DIFE_ALIQ','0.00.000'); END;
/