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,
   P_IDPROCESSO   IN VARCHAR2 DEFAULT NULL, /*"CO"-Item de Cotacao / "AF"-Item de AF /"AP"-Item de Apuracao / "CL" Item de Coleta de Preco*/
   P_VRPRECO      IN FLOAT    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_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);
   V_CDCLIENTE         VARCHAR2(21);

   V_IDCALCDIFENTFISC  VARCHAR2(01);
   V_ALIQDIFE          NUMBER;
   V_ALIQDEST          NUMBER;
   V_IMPOSTODIFE       NUMBER;
   V_BCALCDIFCOMP      NUMBER;
   V_NRITMAPURPRECIMPO_TMP       NUMBER := SEQ_TMP_ITMAPURPRECIMPO.NEXTVAL;
   V_PRODUTO_NRSEQITMAP          ITMAPURPRECIMPO.NRSEQITMAP%TYPE;
   V_PRODUTO_CDREGITMAP          ITMAPURPRECIMPO.CDREGITMAP%TYPE;
   V_PRODUTO_CDFORNITMAP         ITMAPURPRECIMPO.CDFORNITMAP%TYPE;
   V_PRODUTO_NRCOLEITMAP         ITMAPURPRECIMPO.NRCOLEITMAP%TYPE;
   V_PRODUTO_DTENTRAPUT          ITMAPURPRECIMPO.DTENTRAPUT%TYPE;
   V_PRODUTO_CDFILIAP            ITMAPURPRECIMPO.CDFILIAP%TYPE;
   V_PRODUTO_CDPRODITMAP         ITMAPURPRECIMPO.CDPRODITMAP%TYPE;
   V_PRODUTO_CDMARCITMAP         ITMAPURPRECIMPO.CDMARCITMAP%TYPE;
   V_PRODUTO_QTACOMP             FLOAT;
   V_PRODUTO_IDTIPOFRETAP        ITMAPURPREC.IDTIPOFRETAP%TYPE;
   V_PRODUTO_VRTOTAITEM          FLOAT;
   V_PRODUTO_CDARVPROD           PRODUTO.CDARVPROD%TYPE;
   V_PRODUTO_CDINSCESTA          VARCHAR2(30);
   V_PRODUTO_IDORIGDESTOP        TIPOOPERAC.IDORIGDESTOP%TYPE;
   V_PRODUTO_IDNFPRESTSERV       TIPOOPERAC.IDNFPRESTSERV%TYPE;
   V_PRODUTO_IDUTLOCPRESTSERV    TIPOOPERAC.IDUTLOCPRESTSERV%TYPE;
   V_PRODUTO_CDTIPOOPER          TIPOOPERAC.CDTIPOOPER%TYPE;
   V_PRODUTO_CDGRUPOFISC         GRUPOFISCAL.CDGRUPOFISC%TYPE;
   V_CDFILIAL                    FILIAL.CDFILIAL%TYPE;
   TYPE CURTYPE                  IS REF CURSOR;
   C_PRODUTO                     CURTYPE;

BEGIN
   IF NVL(P_IDPROCESSO, 'AP') = 'AP' THEN
      OPEN C_PRODUTO FOR
         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);
   ELSIF NVL(P_IDPROCESSO, 'AP') = 'AF' THEN
      OPEN C_PRODUTO FOR
         SELECT I.NRAUTOFORN, FILIAL.CDREGIAO, AUTOFORNE.CDFORNECED, '9999999999' NRCOLEITMAP, MAX(I.DTPROGENTAF) DTPROGENTAF, I.CDFILDEST, P.CDPRODUTO,
                MAX(I.CDMARCA) CDMARCITMAP, 1 QTACOMP, AUTOFORNE.IDTIPOFRETAF, I.VRPREUNIAF VRTOTAITEM,
                P.CDARVPROD,
                FUN_CONSULTA_CDINSCESTA(I.CDFILDEST, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, FILIAL.CDEMPRESA) 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'), AUTOFORNE.CDFORNECED, I.CDFILDEST,
                                        P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER) CDGRUPOFISC
           FROM ITEMAUTF I, AUTOFORNE, PRODUTO P, FILIAL, PARCMPSUP, TIPOOPERAC, PARASUPRI
          WHERE I.CDFILDEST       = AUTOFORNE.CDFILDEST
            AND I.CDFILLANC       = AUTOFORNE.CDFILLANC
            AND I.NRAUTOFORN      = AUTOFORNE.NRAUTOFORN
            AND I.CDFILLANC       = P_CDCENTITMAP
            AND I.NRAUTOFORN      = P_NRSEQITMAP
            AND I.CDFILDEST       = FILIAL.CDFILIAL
            AND FILIAL.CDREGIAO   = NVL(P_CDREGITMAP, FILIAL.CDREGIAO)
            AND AUTOFORNE.CDFORNECED = NVL(P_CDFORNITMAP, AUTOFORNE.CDFORNECED)
            AND P.CDPRODUTO       = NVL(P_CDPRODITMAP, P.CDPRODUTO)
            AND I.CDMARCA         = NVL(P_CDMARCITMAP, I.CDMARCA)
            AND I.CDFILDEST       = PARCMPSUP.CDFILIAL
            AND I.CDPRODUTO       = 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.NRAUTOFORN, FILIAL.CDREGIAO, AUTOFORNE.CDFORNECED, I.CDFILDEST, P.CDPRODUTO,
                AUTOFORNE.IDTIPOFRETAF, I.VRPREUNIAF, P.CDARVPROD,
                FUN_CONSULTA_CDINSCESTA(I.CDFILDEST, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, FILIAL.CDEMPRESA),
                NVL(TIPOOPERAC.IDORIGDESTOP,'F'), NVL(TIPOOPERAC.IDNFPRESTSERV, 'N'),
                NVL(TIPOOPERAC.IDUTLOCPRESTSERV, 'N'), TIPOOPERAC.CDTIPOOPER,
                FUN_CONSULTA_GRUPOFISCAL(NVL(TIPOOPERAC.IDORIGDESTOP,'F'), AUTOFORNE.CDFORNECED, I.CDFILDEST,
                                        P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER);
   ELSIF NVL(P_IDPROCESSO, 'AP') = 'CO' THEN
      SELECT MAX(ENDEFILI.CDFILIAL) CDFILIAL
        INTO V_CDFILIAL
        FROM ENDEFILI, FILIAL, REGIAO
       WHERE ENDEFILI.CDFILIAL     = FILIAL.CDFILIAL
         AND FILIAL.CDREGIAO       = REGIAO.CDREGIAO
         AND ENDEFILI.IDTPENDEFILI = 'P'
         AND ENDEFILI.CDPAIS       = REGIAO.CDPAIS
         AND ENDEFILI.SGESTADO     = REGIAO.SGESTADO
         AND REGIAO.CDREGIAO       = P_CDREGITMAP
         AND NVL(FILIAL.IDCNTRRESC, 'N') = 'N'
         AND FILIAL.CDREGIAO IS NOT NULL;
      OPEN C_PRODUTO FOR
         SELECT I.NRCOLEPRECO, I.CDREGIAO, I.CDFORNECED, I.NRCOLEPRECO, TO_DATE(TRUNC(COLETAPR.DTCOLEPREC)) DTENTRAPUT, FILIAL.CDFILIAL, I.CDPRODUTO,
                I.CDMARCA CDMARCITMAP, 1 QTACOMP, I.IDTIPFREITM, I.VRPRECUNIITM VRTOTAITEM,
                P.CDARVPROD,
                FUN_CONSULTA_CDINSCESTA(FILIAL.CDFILIAL, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, FILIAL.CDEMPRESA) 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.CDFORNECED, FILIAL.CDFILIAL,
                                        P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER) CDGRUPOFISC
           FROM ITEMCOLE I, COLETAPR, PRODUTO P, FILIAL, PARCMPSUP, TIPOOPERAC, PARASUPRI
          WHERE I.CDFILIAL          = COLETAPR.CDFILIAL
            AND I.NRCOLEPRECO       = COLETAPR.NRCOLEPRECO
            AND I.CDFILIAL          = P_CDCENTITMAP
            AND I.NRCOLEPRECO       = P_NRSEQITMAP
            AND V_CDFILIAL          = FILIAL.CDFILIAL
            AND I.CDREGIAO          = P_CDREGITMAP
            AND I.CDFORNECED        = P_CDFORNITMAP
            AND I.CDPRODUTO         = P_CDPRODITMAP
            AND I.CDMARCA           = P_CDMARCITMAP
            AND FILIAL.CDFILIAL     = PARCMPSUP.CDFILIAL
            AND I.CDPRODUTO         = P.CDPRODUTO
            AND NVL(I.VRPRECUNIITM, 0) > 0
            AND NVL(PARCMPSUP.CDTIPOOPER, '01') = TIPOOPERAC.CDTIPOOPER
            AND TIPOOPERAC.IDENTRSAIDOP         =  P_IDENTRSAID
            AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
   ELSIF NVL(P_IDPROCESSO, 'AP') = 'CL' THEN
      SELECT MAX(ENDEFILI.CDFILIAL) CDFILIAL
        INTO V_CDFILIAL
        FROM ENDEFILI, FILIAL, REGIAO
       WHERE ENDEFILI.CDFILIAL     = FILIAL.CDFILIAL
         AND FILIAL.CDREGIAO       = REGIAO.CDREGIAO
         AND ENDEFILI.IDTPENDEFILI = 'P'
         AND ENDEFILI.CDPAIS       = REGIAO.CDPAIS
         AND ENDEFILI.SGESTADO     = REGIAO.SGESTADO
         AND REGIAO.CDREGIAO       = P_CDREGITMAP
         AND NVL(FILIAL.IDCNTRRESC, 'N') = 'N'
         AND FILIAL.CDREGIAO IS NOT NULL;
      OPEN C_PRODUTO FOR
         SELECT P_NRSEQITMAP NRPEDCOLETA, P_CDREGITMAP CDREGIAO, P_CDFORNITMAP CDFORNECED,  P_NRSEQITMAP NRPEDCOLETA, TO_DATE(TRUNC(PEDCOLETA.DTPEDCOLETA)) DTENTRAPUT, FILIAL.CDFILIAL, P_CDPRODITMAP CDPRODUTO,
                P_CDMARCITMAP CDMARCITMAP, 1 QTACOMP, FORNECEDOR.IDTPFRETFORN, NVL(P_VRPRECO, 0) VRTOTAITEM,
                P.CDARVPROD,
                FUN_CONSULTA_CDINSCESTA(FILIAL.CDFILIAL, FILIAL.CDINSCESTA, FILIAL.CDEMPRESA, FILIAL.CDEMPRESA) 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'), P_CDFORNITMAP, FILIAL.CDFILIAL,
                                        P_IDENTRSAID, TIPOOPERAC.CDTIPOOPER) CDGRUPOFISC
           FROM PEDCOLETA, PRODUTO P, FILIAL, PARCMPSUP, TIPOOPERAC, PARASUPRI, FORNECEDOR
          WHERE P_CDCENTITMAP     = PEDCOLETA.CDFILIAL
            AND P_NRSEQITMAP      = PEDCOLETA.NRPEDCOLETA
            AND V_CDFILIAL        = FILIAL.CDFILIAL
            AND P_CDFORNITMAP     = FORNECEDOR.CDFORNECED
            AND P_CDFORNITMAP     = PEDCOLETA.CDFORNECED
            AND FILIAL.CDFILIAL   = PARCMPSUP.CDFILIAL
            AND P_CDPRODITMAP     = P.CDPRODUTO
            AND NVL(P_VRPRECO, 0) > 0
            AND NVL(PARCMPSUP.CDTIPOOPER, '01') = TIPOOPERAC.CDTIPOOPER
            AND TIPOOPERAC.IDENTRSAIDOP         =  P_IDENTRSAID
            AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
   END IF;
   LOOP
   FETCH C_PRODUTO INTO V_PRODUTO_NRSEQITMAP, V_PRODUTO_CDREGITMAP, V_PRODUTO_CDFORNITMAP,
                        V_PRODUTO_NRCOLEITMAP, V_PRODUTO_DTENTRAPUT, V_PRODUTO_CDFILIAP,
                        V_PRODUTO_CDPRODITMAP, V_PRODUTO_CDMARCITMAP, V_PRODUTO_QTACOMP,
                        V_PRODUTO_IDTIPOFRETAP, V_PRODUTO_VRTOTAITEM, V_PRODUTO_CDARVPROD,
                        V_PRODUTO_CDINSCESTA, V_PRODUTO_IDORIGDESTOP, V_PRODUTO_IDNFPRESTSERV,
                        V_PRODUTO_IDUTLOCPRESTSERV, V_PRODUTO_CDTIPOOPER, V_PRODUTO_CDGRUPOFISC;
   EXIT WHEN C_PRODUTO%NOTFOUND;
      /*********************************INICIO BLOCO DF *******************************************/
      BEGIN
         SELECT CDPAIS, SGESTADO, CDMUNICIPIO, IDCALCDIFENTFISC
           INTO V_PAISDEST, V_ESTADEST, V_MUNIDEST, V_IDCALCDIFENTFISC
           FROM INSCRESTAD
          WHERE CDEMPRESA  = SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2)
            AND CDINSCESTA = SUBSTR(V_PRODUTO_CDINSCESTA, 5, 25);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_PAISDEST := NULL;
            V_ESTADEST := NULL;
            V_MUNIDEST := NULL;
            V_IDCALCDIFENTFISC := 'N';
         END;
      END;

      IF V_PRODUTO_IDORIGDESTOP = 'F' THEN
         BEGIN
            SELECT CDPAIS, SGESTADO, CDMUNICIPIO
              INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
              FROM ENDEFORN
             WHERE CDFORNECED = V_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 LANÇAMENTO 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 = V_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 = V_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 endereço parametrização CFOP
      BEGIN
         SELECT NVL(IDENDCFOPFOR,'P')
           INTO V_IDENDCFOP
           FROM FORNECEDOR
          WHERE (CDFORNECED = V_PRODUTO_CDFORNITMAP);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDCFOP := 'P';
      END;

      SELECT MAX(CDINSCESTAST)
        INTO V_CDINSCESTAST
        FROM INSCRESTADST
       WHERE CDEMPRESA  = SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2)
         AND CDINSCESTA = SUBSTR(V_PRODUTO_CDINSCESTA, 5, 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(V_PRODUTO_CDINSCESTA, 2, 2)
              AND CDINSCESTA = SUBSTR(V_PRODUTO_CDINSCESTA, 5, 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   = V_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 indidência dos impostos conforme regra fiscal */
      FOR C_INCID IN (SELECT I.CDIMPOSTONFE, V_PRODUTO_CDREGITMAP CDREGITMAP, V_PRODUTO_CDFORNITMAP CDFORNITMAP, V_PRODUTO_NRCOLEITMAP NRCOLEITMAP,
                             V_PRODUTO_DTENTRAPUT DTENTRAPUT, V_PRODUTO_CDFILIAP CDFILIAP, V_PRODUTO_CDPRODITMAP CDPRODITMAP, V_PRODUTO_CDMARCITMAP CDMARCITMAP,
                             I.CDIMPOSTO, I.IDTRATIMPO, I.IDIMPORECUP, I.IDORGARRECAD, I.CDCCTBLATIV, I.CDCCTBLPASS,
                             NVL(I.IDCONTAIMPADIC, 'N') AS IDCONTAIMPADIC
                        FROM IMPOSTO I, IMPOSTONFE A
                       WHERE A.CDIMPOSTONFE IN ('00', '10', '30', '50', '60', '20', '80', '85', '90')
                         AND A.CDIMPOSTONFE = I.CDIMPOSTONFE
                       ORDER BY I.CDIMPOSTO)
      LOOP
         V_CDGRUPOFISCAUX := NULL;

         IF SUBSTR(V_PRODUTO_CDINSCESTA, 1, 1) <> '3' THEN
            SELECT NVL(MAX(G.CDGRUPOFISC), V_PRODUTO_CDGRUPOFISC)
              INTO V_CDGRUPOFISCAUX
              FROM GRUPOFISCIMPFIL G
             WHERE G.CDFILIAL  = V_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 = V_PRODUTO_CDFORNITMAP
               AND G.CDEMPRESA  = SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2)
               AND G.CDINSCESTA = SUBSTR(V_PRODUTO_CDINSCESTA, 5, 25)
               AND G.CDIMPOSTO  = C_INCID.CDIMPOSTO
               AND G.CDGRUPOFISC IS NOT NULL;
         ELSE
            SELECT NVL(MAX(G.CDGRUPOFISC), V_PRODUTO_CDGRUPOFISC)
              INTO V_CDGRUPOFISCAUX
              FROM GRUPOFISCIMPFIL G
             WHERE G.CDFILIAL  = V_PRODUTO_CDFILIAP
               AND G.CDIMPOSTO = C_INCID.CDIMPOSTO
               AND G.CDGRUPOFISC IS NOT NULL;

            SELECT NVL(MAX(CLIENTE.CDGRUPOFISC), V_CDGRUPOFISCAUX), MAX(CLIENTE.CDCLIENTE)
              INTO V_CDGRUPOFISCAUX, V_CDCLIENTE
              FROM CLIENFILIAL, CLIENTE
             WHERE CLIENFILIAL.CDCLIENTE = CLIENTE.CDCLIENTE
               AND CLIENFILIAL.CDFILIAL = V_PRODUTO_CDFILIAP
               AND NVL(CLIENFILIAL.IDCLIENPRIN, 'N') = 'S';

            SELECT NVL(MAX(G.CDGRUPOFISC), V_CDGRUPOFISCAUX)
              INTO V_CDGRUPOFISCAUX
              FROM GRFISIMPIECLIE G
             WHERE G.CDCLIENTE  = V_CDCLIENTE
               AND G.CDEMPRESA  = SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2)
               AND G.CDINSCESTA = SUBSTR(V_PRODUTO_CDINSCESTA, 5, 25)
               AND G.CDIMPOSTO  = C_INCID.CDIMPOSTO
               AND G.CDGRUPOFISC IS NOT NULL;
         END IF;

         /* Verifica alíquota, cfop, cst dos impostos conforme regra fiscal */
         FOR C_ITEM IN (SELECT CDFISCOPER, CDSITUTRIB,
                               R.CDIMPOSTO, R.CDREGRAFISC, R.CDFISCAL, V_CDGRUPOFISCAUX AS CDGRUPOFISC,
                               ((V_PRODUTO_VRTOTAITEM - (V_PRODUTO_VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                               ((V_PRODUTO_VRTOTAITEM - (V_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,
                               ((V_PRODUTO_VRTOTAITEM - (V_PRODUTO_VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) +
                               ((V_PRODUTO_VRTOTAITEM - (V_PRODUTO_VRTOTAITEM * ((NVL(R.VRPERREDBC, 0))/100))) * (NVL(R.VRPBCSUBTRIB, 0)/100))) AS VRBASECALC,
                               NVL(IDDIFEALIQ, 'N') AS IDDIFEALIQ, NVL(IDDIFALIQCUSPR, 'N') AS IDDIFALIQCUSPR
                          FROM TABLE(CONSULTA_REGRA_FISCAL(C_INCID.CDIMPOSTO, SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2), V_CDGRUPOFISCAUX, P_IDENTRSAID,
                                                           V_PRODUTO_CDTIPOOPER, SUBSTR(V_PRODUTO_CDINSCESTA, 5, 25), V_PRODUTO_CDARVPROD,
                                                           V_PRODUTO_DTENTRAPUT, V_PAISORIG, V_ESTAORIG, V_MUNIORIG, V_PAISDEST, V_ESTADEST, V_MUNIDEST,
                                                           V_PRODUTO_VRTOTAITEM, 'N', NULL, P_CDCENTITMAP||V_PRODUTO_NRCOLEITMAP, V_PRODUTO_CDFORNITMAP)) R
                         WHERE R.VRALIQUOTA IS NOT NULL)
         LOOP
            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;

            V_ADIMPOSTOIT := 0;

            IF (C_INCID.IDTRATIMPO = 'A') THEN
               V_ADIMPOSTOIT := V_IMPOSTOIT;
            ELSIF (C_INCID.IDTRATIMPO = 'D') THEN
               V_ADIMPOSTOIT := - V_IMPOSTOIT;
            ELSIF (C_INCID.IDTRATIMPO = 'V') THEN
               IF (C_INCID.IDIMPORECUP = 'S') THEN
                  IF (C_ITEM.CDFISCAL = '1') THEN
                     IF (C_INCID.CDCCTBLATIV IS NOT NULL) THEN
                        V_ADIMPOSTOIT := - V_IMPOSTOIT;
                     END IF;
                  END IF;
               ELSE
                  IF NOT(C_INCID.CDCCTBLPASS IS NULL) THEN
                     IF C_INCID.IDCONTAIMPADIC = 'N' THEN
                        V_ADIMPOSTOIT := - V_IMPOSTOIT;
                     END IF;
                  END IF;
               END IF;
            END IF;

            -- Cálculo DIFAL com imposto por dentro
            IF C_INCID.CDIMPOSTONFE = '00' THEN
               IF (C_ITEM.IDDIFEALIQ = 'S') AND (C_ITEM.IDDIFALIQCUSPR = 'S') AND
                  (C_INCID.IDIMPORECUP = 'S') AND (C_INCID.IDORGARRECAD = 'E') THEN

                  V_ALIQDIFE    := 0;
                  V_ALIQDEST    := 0;
                  V_IMPOSTODIFE := 0;

                  CONSULTA_ALIQUOTA(C_INCID.CDIMPOSTO, P_IDENTRSAID, SUBSTR(V_PRODUTO_CDINSCESTA, 2, 2), V_PRODUTO_CDARVPROD, SUBSTR(V_PRODUTO_CDINSCESTA, 5, 25), V_PAISDEST,
                                    V_ESTADEST, V_PAISDEST, V_ESTADEST, V_MUNIORIG, V_PRODUTO_VRTOTAITEM, C_INCID.DTENTRAPUT, C_INCID.CDFILIAP, '0000000000', V_CDGRUPOFISCAUX, V_PRODUTO_CDTIPOOPER,
                                    NULL, NULL, NULL, NULL, V_PRODUTO_CDFORNITMAP, NULL, 'N');

                  SELECT MAX(VRALIQUTMP)
                    INTO V_ALIQDEST
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = C_INCID.CDFILIAP||'0000000000';

                  IF V_ALIQDEST IS NULL THEN
                     V_ALIQDEST := 0;
                  END IF;

                  IF C_ITEM.VRALIQUOTA < V_ALIQDEST THEN
                     V_ALIQDIFE     := V_ALIQDEST - C_ITEM.VRALIQUOTA;
                     V_BCALCDIFCOMP := 0;

                     IF (V_IDCALCDIFENTFISC = 'S') THEN
                        V_BCALCDIFCOMP := ROUND(((C_ITEM.VRBASECALC - V_IMPOSTOIT) / ((100 - V_ALIQDEST)/100)) , 2);
                        V_IMPOSTODIFE  := ROUND(((V_BCALCDIFCOMP * (V_ALIQDEST/100)) - V_IMPOSTOIT), 2);
                        V_ADIMPOSTOIT  := V_ADIMPOSTOIT + V_IMPOSTODIFE;
                     ELSE
                        V_IMPOSTODIFE  := ROUND((C_ITEM.VRBASECALC * (V_ALIQDIFE/100)), 2);
                        V_BCALCDIFCOMP := C_ITEM.VRBASECALC;
                        V_ADIMPOSTOIT  := V_ADIMPOSTOIT + V_IMPOSTODIFE;
                     END IF;
                     INSERT INTO TMP_ITMAPURPRECIMPO
                        (NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                         CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                         CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                         VRIMPOSTO, NRREGRAFISCAL, CDFISCAL,
                         VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                         VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC, IDPROCESSO)
                     VALUES
                        (V_NRITMAPURPRECIMPO_TMP, 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, NVL(P_IDPROCESSO, 'AP'));

                     DELETE FROM ALIQTEMP
                      WHERE NRALIQTEMP = C_INCID.CDFILIAP||'0000000000';
                  END IF;
               ELSE
                  INSERT INTO TMP_ITMAPURPRECIMPO
                     (NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                      CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                      CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                      VRIMPOSTO, NRREGRAFISCAL, CDFISCAL,
                      VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                      VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC, IDPROCESSO)
                  VALUES
                     (V_NRITMAPURPRECIMPO_TMP, 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, NVL(P_IDPROCESSO, 'AP'));
               END IF;
            ELSE
               INSERT INTO TMP_ITMAPURPRECIMPO
                  (NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                   CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                   CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                   VRIMPOSTO, NRREGRAFISCAL, CDFISCAL,
                   VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                   VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC, IDPROCESSO)
               VALUES
                  (V_NRITMAPURPRECIMPO_TMP, 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, NVL(P_IDPROCESSO, 'AP'));
            END IF;
         END LOOP;
      END LOOP;

      --Cálculo do Valor dos Impostos que contém outros impostos na sua Base de Cálculo
      FOR C_PRODUTO_BASE IN (SELECT TMP_ITMAPURPRECIMPO.CDIMPOSTO, TMP_ITMAPURPRECIMPO.CDFISCAL, TMP_ITMAPURPRECIMPO.VRREDUBASECALC,
                                    TMP_ITMAPURPRECIMPO.VRPERCALIQUOTA, TMP_ITMAPURPRECIMPO.IDTRATAMENTO, TMP_ITMAPURPRECIMPO.VRMAJOBASECALC
                               FROM TMP_ITMAPURPRECIMPO, IMPOSTO
                              WHERE TMP_ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                                AND TMP_ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                                AND TMP_ITMAPURPRECIMPO.CDREGITMAP   = V_PRODUTO_CDREGITMAP
                                AND TMP_ITMAPURPRECIMPO.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
                                AND TMP_ITMAPURPRECIMPO.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
                                AND TMP_ITMAPURPRECIMPO.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
                                AND TMP_ITMAPURPRECIMPO.CDFILIAP     = V_PRODUTO_CDFILIAP
                                AND TMP_ITMAPURPRECIMPO.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
                                AND TMP_ITMAPURPRECIMPO.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP
                                AND TMP_ITMAPURPRECIMPO.CDIMPOSTO    = IMPOSTO.CDIMPOSTO)
      LOOP
         /* A VARIÁVEL 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 TMP_ITMAPURPRECIMPO II, BASECALCTPOPER BC, IMPOSTO
          WHERE (BC.IDENTRSAIDOP = 'E')
            AND (BC.CDTIPOOPER  = V_PRODUTO_CDTIPOOPER)
            AND (BC.CDIMPOSTO   = C_PRODUTO_BASE.CDIMPOSTO)
            AND II.CDCENTITMAP  = P_CDCENTITMAP
            AND II.NRSEQITMAP   = P_NRSEQITMAP
            AND II.CDREGITMAP   = V_PRODUTO_CDREGITMAP
            AND II.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
            AND II.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
            AND II.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
            AND II.CDFILIAP     = V_PRODUTO_CDFILIAP
            AND II.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
            AND II.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP
            AND (II.CDIMPOSTO   = BC.CDIMPOBCALC)
            AND (IMPOSTO.CDIMPOSTO = BC.CDIMPOBCALC)
            AND ((V_SITUTRIBPR = BC.CDCSTIMPOTPOP)  OR (BC.CDCSTIMPOTPOP  IS NULL))
            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 TMP_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   = V_PRODUTO_CDREGITMAP
               AND II.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
               AND II.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
               AND II.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
               AND II.CDFILIAP     = V_PRODUTO_CDFILIAP
               AND II.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
               AND II.CDMARCITMAP  = V_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.VRREDUBASECALC)/100;
            IF C_PRODUTO_BASE.VRMAJOBASECALC > 0 THEN
               V_TAXABASECALC := V_TAXABASECALC + (C_PRODUTO_BASE.VRMAJOBASECALC/100);
            END IF;

            V_TAXAALIQUOTA := (C_PRODUTO_BASE.VRPERCALIQUOTA/100);

            IF C_PRODUTO_BASE.IDTRATAMENTO = 'A' THEN
               UPDATE TMP_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)
                WHERE TMP_ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                  AND TMP_ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                  AND TMP_ITMAPURPRECIMPO.CDREGITMAP   = V_PRODUTO_CDREGITMAP
                  AND TMP_ITMAPURPRECIMPO.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
                  AND TMP_ITMAPURPRECIMPO.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
                  AND TMP_ITMAPURPRECIMPO.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
                  AND TMP_ITMAPURPRECIMPO.CDFILIAP     = V_PRODUTO_CDFILIAP
                  AND TMP_ITMAPURPRECIMPO.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
                  AND TMP_ITMAPURPRECIMPO.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP
                  AND TMP_ITMAPURPRECIMPO.CDIMPOSTO    = C_PRODUTO_BASE.CDIMPOSTO;
            ELSIF C_PRODUTO_BASE.IDTRATAMENTO = 'D' THEN
                 UPDATE TMP_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))
                  WHERE TMP_ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                    AND TMP_ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                    AND TMP_ITMAPURPRECIMPO.CDREGITMAP   = V_PRODUTO_CDREGITMAP
                    AND TMP_ITMAPURPRECIMPO.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
                    AND TMP_ITMAPURPRECIMPO.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
                    AND TMP_ITMAPURPRECIMPO.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
                    AND TMP_ITMAPURPRECIMPO.CDFILIAP     = V_PRODUTO_CDFILIAP
                    AND TMP_ITMAPURPRECIMPO.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
                    AND TMP_ITMAPURPRECIMPO.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP
                    AND TMP_ITMAPURPRECIMPO.CDIMPOSTO    = C_PRODUTO_BASE.CDIMPOSTO;
            ELSE
               UPDATE TMP_ITMAPURPRECIMPO
                  SET VRBASECALC    = VRBASECALC + (V_TOTAIMPBCALC * V_TAXABASECALC),
                      VRIMPOSTO     = ROUND(VRIMPOSTO + ((V_TOTAIMPBCALC * V_TAXABASECALC) * V_TAXAALIQUOTA), 2)
                WHERE TMP_ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                  AND TMP_ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                  AND TMP_ITMAPURPRECIMPO.CDREGITMAP   = V_PRODUTO_CDREGITMAP
                  AND TMP_ITMAPURPRECIMPO.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
                  AND TMP_ITMAPURPRECIMPO.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
                  AND TMP_ITMAPURPRECIMPO.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
                  AND TMP_ITMAPURPRECIMPO.CDFILIAP     = V_PRODUTO_CDFILIAP
                  AND TMP_ITMAPURPRECIMPO.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
                  AND TMP_ITMAPURPRECIMPO.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP
                  AND TMP_ITMAPURPRECIMPO.CDIMPOSTO    = C_PRODUTO_BASE.CDIMPOSTO;
            END IF;
         END IF;
      END LOOP;
      /*INICIO IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
      FOR C_SUBSTITUICAO IN (SELECT TMP_ITMAPURPRECIMPO.CDREGITMAP, TMP_ITMAPURPRECIMPO.CDFORNITMAP, TMP_ITMAPURPRECIMPO.NRCOLEITMAP,
                                    TMP_ITMAPURPRECIMPO.DTENTRAPUT, TMP_ITMAPURPRECIMPO.CDFILIAP, TMP_ITMAPURPRECIMPO.CDPRODITMAP,
                                    TMP_ITMAPURPRECIMPO.CDMARCITMAP, TMP_ITMAPURPRECIMPO.CDIMPOSTO, TMP_ITMAPURPRECIMPO.VRIMPOSTO,
                                    TMP_ITMAPURPRECIMPO.IDTRATAMENTO
                               FROM TMP_ITMAPURPRECIMPO
                              WHERE TMP_ITMAPURPRECIMPO.CDCENTITMAP  = P_CDCENTITMAP
                                AND TMP_ITMAPURPRECIMPO.NRSEQITMAP   = P_NRSEQITMAP
                                AND TMP_ITMAPURPRECIMPO.CDREGITMAP   = V_PRODUTO_CDREGITMAP
                                AND TMP_ITMAPURPRECIMPO.CDFORNITMAP  = V_PRODUTO_CDFORNITMAP
                                AND TMP_ITMAPURPRECIMPO.NRCOLEITMAP  = V_PRODUTO_NRCOLEITMAP
                                AND TMP_ITMAPURPRECIMPO.DTENTRAPUT   = V_PRODUTO_DTENTRAPUT
                                AND TMP_ITMAPURPRECIMPO.CDFILIAP     = V_PRODUTO_CDFILIAP
                                AND TMP_ITMAPURPRECIMPO.CDPRODITMAP  = V_PRODUTO_CDPRODITMAP
                                AND TMP_ITMAPURPRECIMPO.CDMARCITMAP  = V_PRODUTO_CDMARCITMAP)
      LOOP
         V_IMPOSTOIT   := C_SUBSTITUICAO.VRIMPOSTO;
         V_CDIMPOSTRIB := '';

         FOR C_ICMSST IN (SELECT CDIMPOSTO
                            FROM IMPOSTO
                           WHERE CDIMPOSTRIB = C_SUBSTITUICAO.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 TMP_ITMAPURPRECIMPO I
                WHERE (I.CDCENTITMAP   = P_CDCENTITMAP)
                  AND (I.NRSEQITMAP    = P_NRSEQITMAP)
                  AND (I.CDREGITMAP    = C_SUBSTITUICAO.CDREGITMAP)
                  AND (I.CDFORNITMAP  =  C_SUBSTITUICAO.CDFORNITMAP)
                  AND (I.NRCOLEITMAP   = C_SUBSTITUICAO.NRCOLEITMAP)
                  AND (I.DTENTRAPUT    = C_SUBSTITUICAO.DTENTRAPUT)
                  AND (I.CDFILIAP      = C_SUBSTITUICAO.CDFILIAP)
                  AND (I.CDPRODITMAP   = C_SUBSTITUICAO.CDPRODITMAP)
                  AND (I.CDMARCITMAP   = C_SUBSTITUICAO.CDMARCITMAP)
                  AND (INSTR(V_CDIMPOSTRIB, I.CDIMPOSTO) > 0);
            END IF;

            V_IMPOSTOIT := V_IMPOSTOIT - V_VRIMPOSTO;

            /*FIM IMPOSTO DE SUBSTITUICAO TRIBUTARIA*/
            IF (V_IMPOSTOIT < 0) THEN
               V_IMPOSTOIT := 0;
            END IF;

            V_ADIMPOSTOIT := 0;

            IF (C_SUBSTITUICAO.IDTRATAMENTO = 'A') THEN
               V_ADIMPOSTOIT := V_IMPOSTOIT;
            ELSIF (C_SUBSTITUICAO.IDTRATAMENTO = 'D') THEN
               V_ADIMPOSTOIT := - V_IMPOSTOIT;
            END IF;

            UPDATE TMP_ITMAPURPRECIMPO
               SET VRIMPOSTO     = V_IMPOSTOIT,
                   VRADIMPOSTOIT = V_ADIMPOSTOIT
             WHERE CDCENTITMAP  = P_CDCENTITMAP
               AND NRSEQITMAP   = P_NRSEQITMAP
               AND CDREGITMAP   = C_SUBSTITUICAO.CDREGITMAP
               AND CDFORNITMAP  = C_SUBSTITUICAO.CDFORNITMAP
               AND NRCOLEITMAP  = C_SUBSTITUICAO.NRCOLEITMAP
               AND DTENTRAPUT   = C_SUBSTITUICAO.DTENTRAPUT
               AND CDFILIAP     = C_SUBSTITUICAO.CDFILIAP
               AND CDPRODITMAP  = C_SUBSTITUICAO.CDPRODITMAP
               AND CDMARCITMAP  = C_SUBSTITUICAO.CDMARCITMAP
               AND CDIMPOSTO    = C_SUBSTITUICAO.CDIMPOSTO;
         END IF;
      END LOOP;
      /*********************************FIM BLOCO DF *******************************************/
   END LOOP;
   /*********************************INICIO BLOCO CMP *******************************************/
   FOR C_INSERT_PRODUTO IN (SELECT NRITMAPURPRECIMPO, CDCENTITMAP, NRSEQITMAP, CDREGITMAP,
                                   CDFORNITMAP, NRCOLEITMAP, DTENTRAPUT,
                                   CDFILIAP, CDPRODITMAP, CDMARCITMAP, CDIMPOSTO,
                                   VRIMPOSTO, NRREGRAFISCAL, CDFISCAL,
                                   VRREDUBASECALC, VRMAJOBASECALC, VRPERCALIQUOTA,
                                   VRBASECALC, IDTRATAMENTO, VRADIMPOSTOIT, CDGRUPOFISC, IDPROCESSO
                             FROM  TMP_ITMAPURPRECIMPO
                            WHERE  NRITMAPURPRECIMPO = V_NRITMAPURPRECIMPO_TMP)
   LOOP
      IF C_INSERT_PRODUTO.IDPROCESSO = 'AP' THEN  /*INSERE IMPOSTO DE ITEM DE APURAÇÃO*/
         DELETE
           FROM ITMAPURPRECIMPO
          WHERE CDCENTITMAP  = P_CDCENTITMAP
            AND NRSEQITMAP   = P_NRSEQITMAP
            AND CDREGITMAP   = C_INSERT_PRODUTO.CDREGITMAP
            AND CDFORNITMAP  = C_INSERT_PRODUTO.CDFORNITMAP
            AND NRCOLEITMAP  = C_INSERT_PRODUTO.NRCOLEITMAP
            AND DTENTRAPUT   = C_INSERT_PRODUTO.DTENTRAPUT
            AND CDFILIAP     = C_INSERT_PRODUTO.CDFILIAP
            AND CDPRODITMAP  = C_INSERT_PRODUTO.CDPRODITMAP
            AND CDMARCITMAP  = C_INSERT_PRODUTO.CDMARCITMAP
            AND CDIMPOSTO    = C_INSERT_PRODUTO.CDIMPOSTO;
         V_NRITMAPURPRECIMPO := SEQ_ITMAPURPRECIMPO.NEXTVAL;
         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, C_INSERT_PRODUTO.CDCENTITMAP, C_INSERT_PRODUTO.NRSEQITMAP, C_INSERT_PRODUTO.CDREGITMAP,
                 C_INSERT_PRODUTO.CDFORNITMAP, C_INSERT_PRODUTO.NRCOLEITMAP, C_INSERT_PRODUTO.DTENTRAPUT,
                 C_INSERT_PRODUTO.CDFILIAP, C_INSERT_PRODUTO.CDPRODITMAP, C_INSERT_PRODUTO.CDMARCITMAP, C_INSERT_PRODUTO.CDIMPOSTO,
                 C_INSERT_PRODUTO.VRIMPOSTO, C_INSERT_PRODUTO.NRREGRAFISCAL, C_INSERT_PRODUTO.CDFISCAL,
                 C_INSERT_PRODUTO.VRREDUBASECALC, C_INSERT_PRODUTO.VRMAJOBASECALC, C_INSERT_PRODUTO.VRPERCALIQUOTA,
                 C_INSERT_PRODUTO.VRBASECALC, C_INSERT_PRODUTO.IDTRATAMENTO, C_INSERT_PRODUTO.VRADIMPOSTOIT, C_INSERT_PRODUTO.CDGRUPOFISC);
      ELSIF C_INSERT_PRODUTO.IDPROCESSO = 'AF' THEN /*INSERE IMPOSTO DE ITEM DE AF*/
         DELETE
           FROM IMPITMAF
          WHERE CDFILDEST     = C_INSERT_PRODUTO.CDFILIAP
            AND CDFILLANC     = P_CDCENTITMAP
            AND NRAUTOFORN    = C_INSERT_PRODUTO.NRSEQITMAP
            AND CDPRODUTO     = C_INSERT_PRODUTO.CDPRODITMAP
            AND DTPROGENTAF   = C_INSERT_PRODUTO.DTENTRAPUT
            AND CDMARCA       = C_INSERT_PRODUTO.CDMARCITMAP
            AND CDIMPOSTO     = C_INSERT_PRODUTO.CDIMPOSTO;
         INSERT  
           INTO IMPITMAF
                (CDFILDEST, CDFILLANC, NRAUTOFORN, CDPRODUTO, CDMARCA, DTPROGENTAF,
                 CDIMPOSTO, VRIMPITMAF, VRPERREDBCAF, VRBASECALCAF,
                 VRALIQITMAF, VRPARCDEDAF, CDFISCITMAF, VRADIMPAF)
         VALUES (C_INSERT_PRODUTO.CDFILIAP, C_INSERT_PRODUTO.CDCENTITMAP, C_INSERT_PRODUTO.NRSEQITMAP, C_INSERT_PRODUTO.CDPRODITMAP, C_INSERT_PRODUTO.CDMARCITMAP, C_INSERT_PRODUTO.DTENTRAPUT,
                 C_INSERT_PRODUTO.CDIMPOSTO, ROUND(C_INSERT_PRODUTO.VRIMPOSTO, 2), C_INSERT_PRODUTO.VRREDUBASECALC, V_ALIQDEST,
                 C_INSERT_PRODUTO.VRPERCALIQUOTA, C_INSERT_PRODUTO.VRBASECALC, C_INSERT_PRODUTO.IDTRATAMENTO, ROUND(C_INSERT_PRODUTO.VRADIMPOSTOIT, 2));
      ELSIF C_INSERT_PRODUTO.IDPROCESSO = 'CO' THEN /*INSERE IMPOSTO DE ITEM DE COTAÇÃO*/
         DELETE
           FROM IMPCOLET
          WHERE CDFILIAL     = C_INSERT_PRODUTO.CDCENTITMAP
            AND NRCOLEPRECO  = C_INSERT_PRODUTO.NRSEQITMAP
            AND CDFORNECED   = C_INSERT_PRODUTO.CDFORNITMAP
            AND CDREGIAO     = C_INSERT_PRODUTO.CDREGITMAP
            AND CDPRODUTO    = C_INSERT_PRODUTO.CDPRODITMAP
            AND CDMARCA      = C_INSERT_PRODUTO.CDMARCITMAP
            AND CDIMPOSTO    = C_INSERT_PRODUTO.CDIMPOSTO;
         INSERT
           INTO IMPCOLET
                (CDFILIAL, NRCOLEPRECO, CDFORNECED, CDREGIAO, CDPRODUTO,
                 CDMARCA, CDIMPOSTO, VRALIQIMPCOL, VRPERRBCALCO, VRIMPCOLETA,
                 VRBASECALCOL, VRPARCDEDCOL, CDFISCITMCOL, VRADIMPCOL, IDIMPDIGCOL)
         VALUES (C_INSERT_PRODUTO.CDCENTITMAP, C_INSERT_PRODUTO.NRSEQITMAP, C_INSERT_PRODUTO.CDFORNITMAP, C_INSERT_PRODUTO.CDREGITMAP, C_INSERT_PRODUTO.CDPRODITMAP,
                 C_INSERT_PRODUTO.CDMARCITMAP, C_INSERT_PRODUTO.CDIMPOSTO, C_INSERT_PRODUTO.VRIMPOSTO, C_INSERT_PRODUTO.VRREDUBASECALC, C_INSERT_PRODUTO.VRMAJOBASECALC,
                 C_INSERT_PRODUTO.VRPERCALIQUOTA, C_INSERT_PRODUTO.VRBASECALC, C_INSERT_PRODUTO.IDTRATAMENTO, C_INSERT_PRODUTO.VRADIMPOSTOIT, 'N');
      ELSIF C_INSERT_PRODUTO.IDPROCESSO = 'CL' THEN /*INSERE IMPOSTO DE ITEM DE PEDIDO DE COLETA DE PREÇO*/
         DELETE
           FROM IMPPEDCOLETA
          WHERE CDFILIAL     = C_INSERT_PRODUTO.CDCENTITMAP
            AND NRPEDCOLETA  = C_INSERT_PRODUTO.NRSEQITMAP
            AND CDFORNECED   = C_INSERT_PRODUTO.CDFORNITMAP
            AND CDREGIAO     = C_INSERT_PRODUTO.CDREGITMAP
            AND CDPRODUTO    = C_INSERT_PRODUTO.CDPRODITMAP
            AND CDMARCA      = C_INSERT_PRODUTO.CDMARCITMAP
            AND CDIMPOSTO    = C_INSERT_PRODUTO.CDIMPOSTO;
         INSERT
           INTO IMPPEDCOLETA (CDFILIAL, NRPEDCOLETA, CDFORNECED, CDREGIAO, CDPRODUTO,
                 CDMARCA, CDIMPOSTO, VRBASECALPEDCOL, VRPERRBCALPEDCO, VRALIQIMPPEDCOL,
                 VRPARCDEDPEDCOL, VRIMPPEDCOL , CDFISCITMPEDCOL, VRADIMPPEDCOL, IDIMPDIGPEDCOL)
         VALUES (C_INSERT_PRODUTO.CDCENTITMAP, C_INSERT_PRODUTO.NRSEQITMAP, C_INSERT_PRODUTO.CDFORNITMAP, C_INSERT_PRODUTO.CDREGITMAP, C_INSERT_PRODUTO.CDPRODITMAP,
                 C_INSERT_PRODUTO.CDMARCITMAP, C_INSERT_PRODUTO.CDIMPOSTO, C_INSERT_PRODUTO.VRPERCALIQUOTA, C_INSERT_PRODUTO.VRREDUBASECALC, C_INSERT_PRODUTO.VRIMPOSTO,
                 C_INSERT_PRODUTO.VRBASECALC, C_INSERT_PRODUTO.VRMAJOBASECALC, C_INSERT_PRODUTO.IDTRATAMENTO, C_INSERT_PRODUTO.VRADIMPOSTOIT, 'N');
      END IF;
   END LOOP;
   DELETE
     FROM TMP_ITMAPURPRECIMPO
    WHERE NRITMAPURPRECIMPO = V_NRITMAPURPRECIMPO_TMP;
   /*********************************FIM BLOCO CMP *******************************************/
END;
/