CREATE OR REPLACE PROCEDURE PREV_IMPOSTO
  (P_CDCENTITMAP  IN VARCHAR2,
   P_NRSEQITMAP   IN VARCHAR2,
   P_IDENTRSAID   IN VARCHAR2,
   P_CDREGITMAP   IN VARCHAR2 DEFAULT NULL,
   P_CDFORNITMAP  IN VARCHAR2 DEFAULT NULL,
   P_NRCOLEITMAP  IN VARCHAR2 DEFAULT NULL,
   P_CDPRODITMAP  IN VARCHAR2 DEFAULT NULL,
   P_CDMARCITMAP  IN VARCHAR2 DEFAULT NULL)
IS
   V_PAISDEST          VARCHAR2(04);
   V_ESTADEST          VARCHAR2(02);
   V_MUNIDEST          VARCHAR2(04);
   V_PAISORIG          VARCHAR2(04);
   V_ESTAORIG          VARCHAR2(02);
   V_MUNIORIG          VARCHAR2(04);
   V_PAISCFOP          VARCHAR2(04);
   V_ESTACFOP          VARCHAR2(02);
   V_NRITMAPURPRECIMPO VARCHAR2(20);
   V_IDVRIMPSTRIB      VARCHAR2(01);
   V_IMPOSTOIT         FLOAT;
   V_ADIMPOSTOIT       FLOAT;
   V_VRIMPOSTO         FLOAT;
   V_CDIMPOSTRIB       VARCHAR2(2000);
   V_IDCSTINTEREST     VARCHAR2(1);
   V_IDCSTINTERNA      VARCHAR2(1);
   V_FISOPEITEM        VARCHAR2(10);
   V_SITUTRIBPR        VARCHAR2(02);
   V_CDIMPOBCALTPOP    BASECALCTPOPER.CDIMPOBCALC%TYPE;
   V_TOTAIMPBCALC      ITMAPURPRECIMPO.VRIMPOSTO%TYPE;
   V_IDTRATIMPBC       IMPOSTO.IDTRATIMPO%TYPE;
   V_IDIMPORECUPBC     IMPOSTO.IDIMPORECUP%TYPE;

   V_TAXABASECALC      ITMAPURPRECIMPO.VRBASECALC%TYPE;
   V_TAXAALIQUOTA      ITMAPURPRECIMPO.VRPERCALIQUOTA%TYPE;
   V_ADIMPAF           FLOAT;
   V_CDSITTRIBTMP      CODSITUTRIBNFE.CDSITUTRIBNFE%TYPE;
   V_IDMODBCNFE        CODSITUTRIBNFE.IDMODBCNFE%TYPE;
   V_IDMODBCSTNFE      CODSITUTRIBNFE.IDMODBCSTNFE%TYPE;
   V_CDTPCRPICOSTNFE   CODSITUTRIBNFE.CDTPCRPICOSTNFE%TYPE;
   V_CDNATUBCPCSTNFE   CODSITUTRIBNFE.CDNATUBCPCSTNFE%TYPE;
   V_IDMOTIDESSTNFE    CODSITUTRIBNFE.IDMOTIDESSTNFE%TYPE;
   V_CDGRUPOFISCAUX    VARCHAR2(03);

   V_IDENDCFOP         VARCHAR2(01);
   V_CDINSCESTAST      VARCHAR2(16);
   V_CST1DIGT          VARCHAR2(1);
BEGIN
   FOR C_PRODUTO IN (SELECT I.NRSEQITMAP, I.CDREGITMAP, I.CDFORNITMAP, I.NRCOLEITMAP, MAX(I.DTENTRAPUT) DTENTRAPUT, I.CDFILIAP, I.CDPRODITMAP,
                            MAX(I.CDMARCITMAP) CDMARCITMAP, 1 QTACOMP, I.IDTIPOFRETAP, I.VRPRECUNIAP VRTOTAITEM,
                            P.CDARVPROD,
                            FUN_CONSULTA_CDINSCESTA(I.CDFILIAP, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, I.CDEMPRESAAP) CDINSCESTA,
                            NVL(TIPOOPERAC.IDORIGDESTOP,'F') IDORIGDESTOP, NVL(TIPOOPERAC.IDNFPRESTSERV, 'N') IDNFPRESTSERV,
                            NVL(TIPOOPERAC.IDUTLOCPRESTSERV, 'N') IDUTLOCPRESTSERV, TIPOOPERAC.CDTIPOOPER,
                            FUN_CONSULTA_GRUPOFISCAL(NVL(TIPOOPERAC.IDORIGDESTOP,'F'), I.CDFORNITMAP, I.CDFILIAP,
                                                    P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER) CDGRUPOFISC
                       FROM ITMAPURPREC I, PRODUTO P, FILIAL, PARCMPSUP, TIPOOPERAC, PARASUPRI
                      WHERE I.CDCENTITMAP = P_CDCENTITMAP
                        AND I.NRSEQITMAP  = P_NRSEQITMAP
                        AND I.CDFILIAP    = FILIAL.CDFILIAL
                        AND I.CDREGITMAP  = NVL(P_CDREGITMAP, I.CDREGITMAP)
                        AND I.CDFORNITMAP = NVL(P_CDFORNITMAP, I.CDFORNITMAP)
                        AND I.NRCOLEITMAP = NVL(P_NRCOLEITMAP, I.NRCOLEITMAP)
                        AND I.CDPRODITMAP = NVL(P_CDPRODITMAP, I.CDPRODITMAP)
                        AND I.CDMARCITMAP = NVL(P_CDMARCITMAP, I.CDMARCITMAP)
                        AND I.CDFILIAP    = PARCMPSUP.CDFILIAL
                        AND I.CDPRODITMAP = P.CDPRODUTO
                        AND NVL(PARCMPSUP.CDTIPOOPER, '01') = TIPOOPERAC.CDTIPOOPER
                        AND TIPOOPERAC.IDENTRSAIDOP         =  P_IDENTRSAID
                        AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                      GROUP BY I.NRSEQITMAP, I.CDREGITMAP, I.CDFORNITMAP, I.NRCOLEITMAP, I.CDFILIAP, I.CDPRODITMAP,
                            I.IDTIPOFRETAP, I.VRPRECUNIAP, P.CDARVPROD,
                            FUN_CONSULTA_CDINSCESTA(I.CDFILIAP, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, I.CDEMPRESAAP),
                            NVL(TIPOOPERAC.IDORIGDESTOP,'F'), NVL(TIPOOPERAC.IDNFPRESTSERV, 'N'),
                            NVL(TIPOOPERAC.IDUTLOCPRESTSERV, 'N'), TIPOOPERAC.CDTIPOOPER,
                            FUN_CONSULTA_GRUPOFISCAL(NVL(TIPOOPERAC.IDORIGDESTOP,'F'), I.CDFORNITMAP, I.CDFILIAP,
                                                    P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER)) LOOP
      BEGIN
         SELECT CDPAIS, SGESTADO, CDMUNICIPIO
           INTO V_PAISDEST, V_ESTADEST, V_MUNIDEST
           FROM INSCRESTAD
          WHERE CDEMPRESA  = SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2)
            AND CDINSCESTA = SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_PAISDEST := NULL;
            V_ESTADEST := NULL;
            V_MUNIDEST := NULL;
         END;
      END;

      IF C_PRODUTO.IDORIGDESTOP = 'F' THEN
         BEGIN
            SELECT CDPAIS, SGESTADO, CDMUNICIPIO
              INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
              FROM ENDEFORN
             WHERE CDFORNECED = C_PRODUTO.CDFORNITMAP
               AND IDTPENDEFORN = 'P';
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_PAISORIG := NULL;
                V_ESTAORIG := NULL;
                V_MUNIORIG := NULL;
             END;
          END;
      ELSE
         -- SE O IDENTIFICADOR DE ORIGEM DO LANCAMENTO FOR IGUAL A LICENCA DE USO OU OUTRO VALOR DIFERENTE DE L,C,F
         IF P_IDENTRSAID = 'E' THEN
            BEGIN
               SELECT CDPAIS, SGESTADO, CDMUNICIPIO
                 INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
                 FROM ENDEFORN
                WHERE CDFORNECED = C_PRODUTO.CDFORNITMAP
                  AND IDTPENDEFORN = 'P';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_PAISORIG := NULL;
                  V_ESTAORIG := NULL;
                  V_MUNIORIG := NULL;
               END;
            END;
         ELSIF P_IDENTRSAID = 'S' THEN
            BEGIN
               SELECT CDPAIS, SGESTADO, CDMUNICIPIO
                 INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
                 FROM ENDECLIE
                WHERE CDCLIENTE = C_PRODUTO.CDFORNITMAP
                  AND IDTPENDECLIE = 'P';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_PAISORIG := NULL;
                  V_ESTAORIG := NULL;
                  V_MUNIORIG := NULL;
               END;
            END;
         END IF;
      END IF;

      -- verificar endereco parametrizacao CFOP
      BEGIN
         SELECT NVL(IDENDCFOPFOR,'P')
         INTO   V_IDENDCFOP
         FROM FORNECEDOR
         WHERE (CDFORNECED = C_PRODUTO.CDFORNITMAP);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDCFOP := 'P';
      END;

      SELECT MAX(CDINSCESTAST)
        INTO V_CDINSCESTAST
        FROM INSCRESTADST
       WHERE CDEMPRESA  = SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2)
         AND CDINSCESTA = SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25)
         AND CDPAIS     = V_PAISORIG
         AND SGESTADO   = V_ESTAORIG;

      IF V_IDENDCFOP = 'I' THEN
         BEGIN
            SELECT CDPAIS    , SGESTADO
              INTO V_PAISCFOP, V_ESTACFOP
              FROM INSCRESTAD
            WHERE CDEMPRESA  = SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2)
              AND CDINSCESTA = SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISCFOP := NULL; V_ESTACFOP := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDPAIS, SGESTADO
              INTO V_PAISCFOP, V_ESTACFOP
              FROM ENDEFORN
             WHERE CDFORNECED   = C_PRODUTO.CDFORNITMAP
               AND IDTPENDEFORN = V_IDENDCFOP;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISCFOP := NULL; V_ESTACFOP := NULL;
         END;
      END IF;

      V_IDCSTINTEREST := 'N';
      V_IDCSTINTERNA  := 'N';
      IF (V_PAISDEST = V_PAISORIG) AND (V_ESTADEST <> V_ESTAORIG) THEN
         V_IDCSTINTEREST := 'S';
      ELSIF (V_PAISDEST <> V_PAISORIG) THEN
         V_IDCSTINTERNA := 'S';
      END IF;

      /* Retorna a indidencia dos impostos conforme regra fiscal */
      FOR C_INCID IN (SELECT I.CDIMPOSTONFE, CDFISCOPER, CDSITUTRIB,
                             C_PRODUTO.CDREGITMAP, C_PRODUTO.CDFORNITMAP, C_PRODUTO.NRCOLEITMAP, C_PRODUTO.DTENTRAPUT,
                             C_PRODUTO.CDFILIAP, C_PRODUTO.CDPRODITMAP, C_PRODUTO.CDMARCITMAP, R.CDIMPOSTO, I.IDTRATIMPO
                        FROM TABLE(CONSULTA_REGRA_FISCAL(NULL, SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2), C_PRODUTO.CDGRUPOFISC, P_IDENTRSAID, C_PRODUTO.CDTIPOOPER, SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25), C_PRODUTO.CDARVPROD,
                                                         C_PRODUTO.DTENTRAPUT, V_PAISORIG, V_ESTAORIG, V_MUNIORIG, V_PAISDEST, V_ESTADEST, V_MUNIDEST,
                                                         C_PRODUTO.VRTOTAITEM, 'N', NULL, P_CDCENTITMAP||C_PRODUTO.NRCOLEITMAP, C_PRODUTO.CDFORNITMAP)) R, IMPOSTO I,
                             IMPOSTONFE A
                       WHERE I.CDIMPOSTO = R.CDIMPOSTO
                         AND R.VRALIQUOTA IS NOT NULL
                         AND A.CDIMPOSTONFE = I.CDIMPOSTONFE
                       ORDER BY R.CDIMPOSTO)


      LOOP
         V_CDGRUPOFISCAUX := NULL;

         SELECT NVL(MAX(G.CDGRUPOFISC), C_PRODUTO.CDGRUPOFISC)
           INTO V_CDGRUPOFISCAUX
           FROM GRUPOFISCIMPFIL G
          WHERE G.CDFILIAL  = C_PRODUTO.CDFILIAP
            AND G.CDIMPOSTO = C_INCID.CDIMPOSTO
            AND G.CDGRUPOFISC IS NOT NULL;

         SELECT NVL(MAX(G.CDGRUPOFISC), V_CDGRUPOFISCAUX)
           INTO V_CDGRUPOFISCAUX
           FROM GRFISIMPIEFORN G
          WHERE G.CDFORNECED = C_PRODUTO.CDFORNITMAP
            AND G.CDEMPRESA  = SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2)
            AND G.CDINSCESTA = SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25)
            AND G.CDIMPOSTO  = C_INCID.CDIMPOSTO
            AND G.CDGRUPOFISC IS NOT NULL;

         /* Verifica aliquota, cfop, cst dos impostos conforme regra fiscal */
         FOR C_ITEM IN (SELECT CDFISCOPER, CDSITUTRIB,
                               R.CDIMPOSTO, R.CDREGRAFISC, R.CDFISCAL, V_CDGRUPOFISCAUX AS CDGRUPOFISC,
                               ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                               ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (NVL(R.VRPBCSUBTRIB, 0)/100))) * (R.VRALIQUOTA/100) AS VRIMPOSTO,
                               (NVL(R.VRPERREDBC, 0)) VRPERREDBC, R.VRPBCSUBTRIB, R.VRALIQUOTA,
                               ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                               ((C_PRODUTO.VRTOTAITEM - (C_PRODUTO.VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (NVL(R.VRPBCSUBTRIB, 0)/100))) AS VRBASECALC
                          FROM TABLE(CONSULTA_REGRA_FISCAL(C_INCID.CDIMPOSTO, SUBSTR(C_PRODUTO.CDINSCESTA, 1, 2), V_CDGRUPOFISCAUX, P_IDENTRSAID, C_PRODUTO.CDTIPOOPER, SUBSTR(C_PRODUTO.CDINSCESTA, 4, 25), C_PRODUTO.CDARVPROD,
                                                           C_PRODUTO.DTENTRAPUT, V_PAISORIG, V_ESTAORIG, V_MUNIORIG, V_PAISDEST, V_ESTADEST, V_MUNIDEST,
                                                           C_PRODUTO.VRTOTAITEM, 'N', NULL, P_CDCENTITMAP||C_PRODUTO.NRCOLEITMAP, C_PRODUTO.CDFORNITMAP)) R
                         WHERE R.VRALIQUOTA IS NOT NULL)
         LOOP
            NOVO_CODIGO_NT('ITMAPURPRECIMPO', V_NRITMAPURPRECIMPO);
            V_NRITMAPURPRECIMPO :=  SUBSTR(V_NRITMAPURPRECIMPO, 11, 10);

            V_IMPOSTOIT := C_ITEM.VRIMPOSTO;

            /* Verifica cst e CFOP do ICMS */
            IF C_INCID.CDIMPOSTONFE = '00' THEN
               V_SITUTRIBPR := C_ITEM.CDSITUTRIB;
               V_FISOPEITEM := C_ITEM.CDFISCOPER;
            END IF;

            /*INICIIO IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
            V_CDIMPOSTRIB := '';
            FOR C_ICMSST IN (SELECT CDIMPOSTO
                               FROM IMPOSTO
                              WHERE CDIMPOSTRIB = C_ITEM.CDIMPOSTO)
            LOOP
               V_CDIMPOSTRIB := V_CDIMPOSTRIB||'_'||C_ICMSST.CDIMPOSTO;
            END LOOP;

            IF V_CDIMPOSTRIB IS NOT NULL THEN
               SELECT NVL(MAX(IDVRIMPSTRIB), 'N')
                 INTO V_IDVRIMPSTRIB
                 FROM IMPOSTO
                WHERE (INSTR(V_CDIMPOSTRIB, CDIMPOSTO) > 0)
                  AND NVL(IDVRIMPSTRIB, 'N') <> 'N';

               IF (NVL(V_IDVRIMPSTRIB,'N') = 'N') THEN
                  V_VRIMPOSTO := 0;
               ELSE
                  SELECT NVL(MAX(VRIMPOSTO), 0)
                    INTO V_VRIMPOSTO
                    FROM ITMAPURPRECIMPO I
                   WHERE (I.CDCENTITMAP   = P_CDCENTITMAP)
                     AND (I.NRSEQITMAP    = P_NRSEQITMAP)
                     AND (I.CDREGITMAP    = C_INCID.CDREGITMAP)
                     AND (I.NRCOLEITMAP   = C_INCID.NRCOLEITMAP)
                     AND (I.DTENTRAPUT    = C_INCID.DTENTRAPUT)
                     AND (I.CDFILIAP      = C_INCID.CDFILIAP)
                     AND (I.CDMARCITMAP   = C_INCID.CDMARCITMAP)
                     AND (I.CDPRODITMAP   = C_INCID.CDPRODITMAP)
                     AND (INSTR(V_CDIMPOSTRIB, I.CDIMPOSTO) > 0);
               END IF;
               V_IMPOSTOIT := V_IMPOSTOIT - V_VRIMPOSTO;
            END IF;
            /*FIM IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
            IF (V_IMPOSTOIT < 0) THEN
               V_IMPOSTOIT := 0;
            END IF;

            V_ADIMPOSTOIT := 0;

            IF (C_INCID.IDTRATIMPO = 'A') THEN
               V_ADIMPOSTOIT := V_IMPOSTOIT;
            ELSIF (C_INCID.IDTRATIMPO = 'D') THEN
               V_ADIMPOSTOIT := - V_IMPOSTOIT;
            END IF;
            IF LENGTH(P_CDMARCITMAP) > 0 THEN
               DELETE
                 FROM ITMAPURPRECIMPO
                WHERE CDCENTITMAP  = P_CDCENTITMAP
                  AND NRSEQITMAP   = P_NRSEQITMAP
                  AND CDREGITMAP   = C_INCID.CDREGITMAP
                  AND CDFORNITMAP  = C_INCID.CDFORNITMAP
                  AND NRCOLEITMAP  = C_INCID.NRCOLEITMAP
                  AND DTENTRAPUT   = C_INCID.DTENTRAPUT
                  AND CDFILIAP     = C_INCID.CDFILIAP
                  AND CDPRODITMAP  = C_INCID.CDPRODITMAP
                  AND CDMARCITMAP  = C_INCID.CDMARCITMAP
                  AND CDIMPOSTO    = C_INCID.CDIMPOSTO;
            END IF;
            INSERT
              INTO ITMAPURPRECIMPO (NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                   CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                   CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                   VRIMPOSTO, NRREGRAFISCAL, CDFISCAL,
                   VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                   VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC)
            VALUES (V_NRITMAPURPRECIMPO, P_CDCENTITMAP, P_NRSEQITMAP, C_INCID.CDREGITMAP,
                    C_INCID.CDFORNITMAP, C_INCID.NRCOLEITMAP, C_INCID.DTENTRAPUT,
                    C_INCID.CDFILIAP, C_INCID.CDPRODITMAP, C_INCID.CDMARCITMAP, C_INCID.CDIMPOSTO,
                    V_IMPOSTOIT, C_ITEM.CDREGRAFISC, C_ITEM.CDFISCAL,
                    C_ITEM.VRPERREDBC, C_ITEM.VRPBCSUBTRIB, C_ITEM.VRALIQUOTA,
                    C_ITEM.VRBASECALC, C_INCID.IDTRATIMPO, V_ADIMPOSTOIT, C_ITEM.CDGRUPOFISC);
         END LOOP;
      END LOOP;
            ---------------------------------------------------------------------------------------------------------
      --Calculo do Valor dos Impostos que contem outros impostos na sua Base de Calculo
      FOR C_PRODUTO_BASE IN (SELECT ITMAPURPRECIMPO.CDCENTITMAP, ITMAPURPRECIMPO.NRSEQITMAP, ITMAPURPRECIMPO.CDREGITMAP,
                                    ITMAPURPRECIMPO.CDFORNITMAP, ITMAPURPRECIMPO.NRCOLEITMAP, ITMAPURPRECIMPO.DTENTRAPUT,
                                    ITMAPURPRECIMPO.CDFILIAP, ITMAPURPRECIMPO.CDPRODITMAP, ITMAPURPRECIMPO.CDMARCITMAP,
                                    ITMAPURPRECIMPO.CDIMPOSTO, ITMAPURPRECIMPO.VRIMPOSTO, ITMAPURPRECIMPO.NRREGRAFISCAL,
                                    ITMAPURPRECIMPO.VRREDUBASECALC, ITMAPURPRECIMPO.VRMAJOBASECALC, ITMAPURPRECIMPO.VRPERCALIQUOTA,
                                    ITMAPURPRECIMPO.VRBASECALC, ITMAPURPRECIMPO.IDTRATAMENTO, ITMAPURPRECIMPO.VRADIMPOSTOIT,
                                    ITMAPURPRECIMPO.CDGRUPOFISC, ITMAPURPRECIMPO.CDFISCAL
                               FROM ITMAPURPRECIMPO, IMPOSTO
                              WHERE ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                                AND ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                                AND ITMAPURPRECIMPO.CDREGITMAP   = C_PRODUTO.CDREGITMAP
                                AND ITMAPURPRECIMPO.CDFORNITMAP  = C_PRODUTO.CDFORNITMAP
                                AND ITMAPURPRECIMPO.NRCOLEITMAP  = C_PRODUTO.NRCOLEITMAP
                                AND ITMAPURPRECIMPO.DTENTRAPUT   = C_PRODUTO.DTENTRAPUT
                                AND ITMAPURPRECIMPO.CDFILIAP     = C_PRODUTO.CDFILIAP
                                AND ITMAPURPRECIMPO.CDPRODITMAP  = C_PRODUTO.CDPRODITMAP
                                AND ITMAPURPRECIMPO.CDMARCITMAP  = C_PRODUTO.CDMARCITMAP
                                AND ITMAPURPRECIMPO.CDIMPOSTO    = IMPOSTO.CDIMPOSTO)
      LOOP

         /* A VARIAVEL V_SITUTRIBPR FICA VAZIA*/
         V_CDIMPOBCALTPOP := NULL;
         SELECT MAX(BC.CDIMPOBCALC), SUM(II.VRIMPOSTO) AS VRIMPOBCALC, MAX(IMPOSTO.IDTRATIMPO), MAX(IMPOSTO.IDIMPORECUP)
           INTO V_CDIMPOBCALTPOP, V_TOTAIMPBCALC, V_IDTRATIMPBC, V_IDIMPORECUPBC
           FROM ITMAPURPRECIMPO II, BASECALCTPOPER BC, IMPOSTO
          WHERE (BC.IDENTRSAIDOP = 'E')
            AND (BC.CDTIPOOPER  = C_PRODUTO.CDTIPOOPER)
            AND (BC.CDIMPOSTO   = C_PRODUTO_BASE.CDIMPOSTO)
            AND II.CDCENTITMAP  = P_CDCENTITMAP
            AND II.NRSEQITMAP   = P_NRSEQITMAP
            AND II.CDREGITMAP   = C_PRODUTO.CDREGITMAP
            AND II.CDFORNITMAP  = C_PRODUTO.CDFORNITMAP
            AND II.NRCOLEITMAP  = C_PRODUTO.NRCOLEITMAP
            AND II.DTENTRAPUT   = C_PRODUTO.DTENTRAPUT
            AND II.CDFILIAP     = C_PRODUTO.CDFILIAP
            AND II.CDPRODITMAP  = C_PRODUTO.CDPRODITMAP
            AND II.CDMARCITMAP  = C_PRODUTO.CDMARCITMAP
            AND (II.CDIMPOSTO   = BC.CDIMPOBCALC)
            AND (IMPOSTO.CDIMPOSTO = BC.CDIMPOBCALC)
            AND ((V_SITUTRIBPR = BC.CDCSTIMPOTPOP)  OR (BC.CDCSTIMPOTPOP  IS NULL))      --alterar
            AND ((V_FISOPEITEM = BC.CDCFOPIMPOTPOP) OR (BC.CDCFOPIMPOTPOP IS NULL))
            AND ((C_PRODUTO_BASE.CDFISCAL = BC.CDFISCIMPOTPOP) OR (BC.CDFISCIMPOTPOP IS NULL));

         IF V_CDIMPOBCALTPOP IS NULL THEN
            SELECT SUM(II.VRIMPOSTO) AS VRIMPOBCALC, MAX(IMPOSTO.IDTRATIMPO), MAX(IMPOSTO.IDIMPORECUP)
              INTO V_TOTAIMPBCALC, V_IDTRATIMPBC, V_IDIMPORECUPBC
              FROM ITMAPURPRECIMPO II, BASECALC BC, IMPOSTO
             WHERE (BC.CDIMPOSTO   = C_PRODUTO_BASE.CDIMPOSTO)
               AND II.CDCENTITMAP  = P_CDCENTITMAP
               AND II.NRSEQITMAP   = P_NRSEQITMAP
               AND II.CDREGITMAP   = C_PRODUTO.CDREGITMAP
               AND II.CDFORNITMAP  = C_PRODUTO.CDFORNITMAP
               AND II.NRCOLEITMAP  = C_PRODUTO.NRCOLEITMAP
               AND II.DTENTRAPUT   = C_PRODUTO.DTENTRAPUT
               AND II.CDFILIAP     = C_PRODUTO.CDFILIAP
               AND II.CDPRODITMAP  = C_PRODUTO.CDPRODITMAP
               AND II.CDMARCITMAP  = C_PRODUTO.CDMARCITMAP
               AND (II.CDIMPOSTO  = BC.CDIMPOBCALC)
               AND (IMPOSTO.CDIMPOSTO = BC.CDIMPOBCALC)
               AND ((V_SITUTRIBPR = BC.CDCSTIMPO)  OR (BC.CDCSTIMPO  IS NULL))
               AND ((V_FISOPEITEM = BC.CDCFOPIMPO) OR (BC.CDCFOPIMPO IS NULL))
               AND ((C_PRODUTO_BASE.CDFISCAL = BC.CDFISCIMPO) OR (BC.CDFISCIMPO IS NULL))
               AND (BC.IDTIPOBCALC  = 'I');
         END IF;

         DELETE FROM CFOPTEMP
         WHERE NRCFOPTEMP = P_CDCENTITMAP||P_NRSEQITMAP;

         DELETE FROM CSTTEMP
         WHERE NRCSTTEMP = P_CDCENTITMAP||P_NRSEQITMAP;

         IF NOT (V_TOTAIMPBCALC IS NULL) THEN
            V_TAXABASECALC := (100 - C_PRODUTO_BASE.VRBASECALC)/100;
            V_TAXAALIQUOTA := (C_PRODUTO_BASE.VRPERCALIQUOTA/100);

            V_ADIMPAF := 0;

            IF (V_IDTRATIMPBC = 'A') THEN
               V_ADIMPAF := ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA);

            ELSIF (V_IDTRATIMPBC = 'D') THEN
               V_ADIMPAF := - ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA);

            ELSIF (V_IDTRATIMPBC  = 'R') THEN
               IF (V_IDIMPORECUPBC = 'S') THEN
                  IF (C_PRODUTO_BASE.CDFISCAL <> '1') THEN
                     V_ADIMPAF := - ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA);
                  END IF;
               ELSE
                  V_ADIMPAF := - ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA);
               END IF;
            END IF;

            IF (C_PRODUTO_BASE.IDTRATAMENTO = 'V') THEN
               V_ADIMPAF := 0;
            END IF;

            UPDATE ITMAPURPRECIMPO
               SET VRBASECALC     = VRBASECALC + (V_TOTAIMPBCALC * V_TAXABASECALC),
                   VRIMPOSTO      = ROUND(VRIMPOSTO + ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA), 2),
                   VRADIMPOSTOIT  = ROUND(VRIMPOSTO + ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA), 2)
                   /*VRADIMPOSTOIT  = ROUND(VRADIMPOSTOIT + V_ADIMPAF, 2)*/
            WHERE ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
              AND ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
              AND ITMAPURPRECIMPO.CDREGITMAP   = C_PRODUTO.CDREGITMAP
              AND ITMAPURPRECIMPO.CDFORNITMAP  = C_PRODUTO.CDFORNITMAP
              AND ITMAPURPRECIMPO.NRCOLEITMAP  = C_PRODUTO.NRCOLEITMAP
              AND ITMAPURPRECIMPO.DTENTRAPUT   = C_PRODUTO.DTENTRAPUT
              AND ITMAPURPRECIMPO.CDFILIAP     = C_PRODUTO.CDFILIAP
              AND ITMAPURPRECIMPO.CDPRODITMAP  = C_PRODUTO.CDPRODITMAP
              AND ITMAPURPRECIMPO.CDMARCITMAP  = C_PRODUTO.CDMARCITMAP
              AND ITMAPURPRECIMPO.CDIMPOSTO    = C_PRODUTO_BASE.CDIMPOSTO;

         END IF;
      END LOOP;
   END LOOP;
END;
/