CREATE OR REPLACE PROCEDURE GERA_ALIQUOTA_VND(
   P_CDREGRAFISC IN REGRAFISCAL.CDREGRAFISC%TYPE)
AS
   V_ALIQICMS        NUMBER;
   V_VRPERREDBC      NUMBER;
   V_ALIQST          NUMBER;
   V_ALIQPROD        NUMBER;
   V_ALIQPIS         NUMBER;
   V_ALIQCOFINS      NUMBER;
   V_CDFISCAL        VARCHAR2(01);
   V_CDFILIAL        VARCHAR2(04);
   V_CDPRODUTO       VARCHAR2(10);
   V_CDPRODUTORAISE  VARCHAR2(10);
   V_CDIMPOSTO       VARCHAR2(02);
   V_CDISENTO        VARCHAR2(02);
   V_CDNAOINCID      VARCHAR2(02);
   V_CDICMS          VARCHAR2(02);
   V_CDICMSST        VARCHAR2(02);
   V_CDCFOP          VARCHAR2(14);
   V_CDCSTCSOSN      VARCHAR2(04);
   V_CDSITUCRT       VARCHAR2(01);
   V_CDGRUPOFISC     VARCHAR2(03);
   V_CDIMPOSREGRA    VARCHAR2(02);
   V_CDFISCOPERSN    ITEMPRODUTO.CDFISCOPERSN%TYPE;
   V_CDPROD          VARCHAR2(10);
   V_CSTNFE          VARCHAR(5);
   V_IDMODBCNFE      VARCHAR(5);
   V_IDMODBCSTNFE    VARCHAR(5);
   V_CDTPCRPICOSTNFE VARCHAR(10);
   V_CDNATUBCPCSTNFE VARCHAR(10);
   V_IDMOTIDESSTNFE  VARCHAR(10);
   V_BOICMSST        BOOLEAN;
   V_IDTPIMPOSFIS    VARCHAR2(01);
   V_CDCEST          VARCHAR2(09);
   V_IDPAGINA        VARCHAR2(01); /*0 - Produto, 1 - NCM, 2 - Padrao*/
   V_TAMNIVEL        NUMBER;
   V_IDPAGINAST      VARCHAR2(01);
   V_TAMNIVELST      NUMBER;
   V_BOREPLICA       BOOLEAN;
   V_IDCONSVRBCREDZ  VARCHAR2(01);
   V_IDREDUCAOBC     VARCHAR2(01);
   V_CDBENEFFISCAL   VARCHAR2(20);
BEGIN

   /*Busca os codigos parametrizados no Caixa para cada tipo de imposto*/
   BEGIN
      SELECT MAX(DECODE(IDTPIMPOSFIS,'I',CDIMPOSTO,' ')) AS ISENTO,
             MAX(DECODE(IDTPIMPOSFIS,'N',CDIMPOSTO,' ')) AS NAO_INCIDENCIA,
             MAX(DECODE(IDTPIMPOSFIS,'T',CDIMPOSTO,' ')) AS ICMS,
             MAX(DECODE(IDTPIMPOSFIS,'F',CDIMPOSTO,' ')) AS ICMS_ST
        INTO V_CDISENTO, V_CDNAOINCID, V_CDICMS, V_CDICMSST
        FROM IMPOSTO
       WHERE IDTPIMPOSFIS IN ('T','I','N','F');
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDISENTO   := NULL;
         V_CDNAOINCID := NULL;
         V_CDICMS     := NULL;
         V_CDICMSST   := NULL;
   END;

   V_BOICMSST := FALSE;
   V_CDPROD   := NULL;
   V_IDPAGINAST := NULL;
   V_TAMNIVELST := 0;

   /*Verifica a regra a ser replicada. Quando a procedure for chamada pela Centralizada, passara apenas a regra que esta
     sendo ativada, porem, quando for chamada pelo botao de replicacao, o parametro recebera a filial, para a qual serao
     consultadas as regras que atendem a parametrizacao da filial*/
   FOR C_REGRAFISC IN (SELECT SUBSTR(ORDEM, (INSTR(ORDEM, '_')) + 1, 10) AS CDREGRAFISC, MIN(ORDENACAO) AS ORDENACAO
                         FROM (SELECT V.CDIMPOSTONFE, MIN(V.NRORDPRIORIDADE||'_'||R.CDREGRAFISC) AS ORDEM, DECODE(V.CDIMPOSTONFE,'80',1,'00',2,3) AS ORDENACAO
                                 FROM REGRAFISCAL R,
                                      (SELECT MAX(TO_CHAR(R.DTVALREGRAFISC, 'YYYYMMDD')||'_'||R.CDREGRAFISC) NUMERO, V.NRORDPRIORIDADE,
                                              I.CDIMPOSTO, IM.CDIMPOSTONFE, E.CDPAIS, E.SGESTADO, E.CDMUNICIPIO, IM.IDUTMUNIORIG,
                                              IM.IDUTUFORIG, IM.IDUTUFDEST, IM.IDTPIMPOSFIS, F.CDFILIAL, F.CDEMPRESA, F.CDINSCESTA,
                                              PV.CDCLIENTE, PV.CDTPOPERCNTREC AS CDTIPOOPER
                                         FROM VINCULOFISREGRA V, IMPREGRAFISCAL I, REGRAFISCAL R, FILIAL F,
                                              IMPOSTO IM, GRUPOFISCIMPFIL G, ENDEFILI E, PARAVEND PV
                                        WHERE F.CDFILIAL        = P_CDREGRAFISC
                                          AND F.CDEMPRESA       = V.CDEMPRESA
                                          AND V.CDREGRAFISC     = R.CDREGRAFISC
                                          AND R.IDATIVREGRAFISC = 'S'
                                          AND PV.CDFILIAL       = F.CDFILIAL
                                          AND (SYSDATE BETWEEN R.DTVALREGRAFISC AND V.DTVALVINCFISC OR V.DTVALVINCFISC IS NULL)
                                          AND (V.IDENTRSAIDOP   = 'S'               OR V.IDENTRSAIDOP IS NULL)
                                          AND (V.CDINSCESTA     = F.CDINSCESTA      OR V.CDINSCESTA   IS NULL)
                                          AND (V.CDTIPOOPER     = PV.CDTPOPERCNTREC OR V.CDTIPOOPER   IS NULL)
                                          AND I.CDIMPOSTO       = IM.CDIMPOSTO
                                          AND IM.CDIMPOSTONFE   IN ('00','80','50','60')
                                          AND I.CDREGRAFISC     = R.CDREGRAFISC
                                          AND I.IDIMPOBRIGREGRA = 'S'
                                          AND F.CDFILIAL        = E.CDFILIAL
                                          AND E.IDTPENDEFILI    = 'P'
                                          AND G.CDFILIAL(+)     = P_CDREGRAFISC
                                          AND G.CDIMPOSTO(+)    = I.CDIMPOSTO
                                          AND  LENGTH(P_CDREGRAFISC) = 4
                                          AND ((G.CDGRUPOFISC IS NULL     AND NOT EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = R.CDREGRAFISC)) OR
                                               (G.CDGRUPOFISC IS NOT NULL AND     EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = R.CDREGRAFISC   AND GR.CDGRUPOFISC = G.CDGRUPOFISC)))
                                        GROUP BY V.NRORDPRIORIDADE, I.CDIMPOSTO, IM.CDIMPOSTONFE, E.CDPAIS, E.SGESTADO, E.CDMUNICIPIO, IM.IDUTMUNIORIG,
                                              IM.IDUTUFORIG, IM.IDUTUFDEST, IM.IDTPIMPOSFIS, F.CDFILIAL, F.CDEMPRESA, F.CDINSCESTA, PV.CDCLIENTE, PV.CDTPOPERCNTREC) V
                                WHERE R.CDREGRAFISC = SUBSTR(V.NUMERO, (INSTR(V.NUMERO, '_')) + 1, 10)
                                GROUP BY V.CDIMPOSTONFE)
                        GROUP BY SUBSTR(ORDEM, (INSTR(ORDEM, '_')) + 1, 10)
                        UNION
                       SELECT P_CDREGRAFISC, 1 AS ORDENACAO
                         FROM DUAL
                        WHERE LENGTH(P_CDREGRAFISC) = 10
                        ORDER BY ORDENACAO) LOOP

      IF LENGTH(P_CDREGRAFISC) = 4 THEN
         /*Busca a regra fiscal que atende a parametrizacao*/
         FOR C_PRODVENDA IN (SELECT DISTINCT G.CDFILIAL, I.CDPRODUTO, P.CDCLASFISC, P.CDARVPROD, IM.CDIMPOSTO,
                                    IM.CDIMPOSTONFE, E.CDPAIS, E.SGESTADO, E.CDMUNICIPIO, IM.IDUTMUNIORIG,
                                    IM.IDUTUFORIG, IM.IDUTUFDEST, IM.IDTPIMPOSFIS, G.CDINSCESTA, G.CDEMPRESA,
                                    PV.CDCLIENTE, PV.CDTPOPERCNTREC AS CDTIPOOPER,
                                    DECODE(IM.CDIMPOSTONFE,'80',1,'00',2,3) AS ORDENACAO
                               FROM REGRAFISCAL R, VINCULOFISREGRA V, TABEVEND T, ITEMPRECO I, PARAVEND PV,
                                    IMPREGRAFISCAL IR, IMPOSTO IM, PRODUTO P, ENDEFILI E, (SELECT F.CDFILIAL, F.CDINSCESTA, F.CDEMPRESA, H.CDGRUPOFISC, H.CDIMPOSTO, 'ICMS' AS CDIMP
                                                                                             FROM FILIAL F, (SELECT G.CDGRUPOFISC, G.CDIMPOSTO, G.CDFILIAL
                                                                                                               FROM GRUPOFISCIMPFIL G, IMPOSTO I
                                                                                                              WHERE G.CDIMPOSTO    = I.CDIMPOSTO
                                                                                                                AND I.CDIMPOSTONFE IN ('00','80')) H
                                                                                            WHERE F.CDFILIAL = H.CDFILIAL(+)
                                                                                            UNION
                                                                                           SELECT F.CDFILIAL, F.CDINSCESTA, F.CDEMPRESA, H.CDGRUPOFISC, H.CDIMPOSTO, 'CONTR' AS CDIMP
                                                                                             FROM FILIAL F, (SELECT G.CDGRUPOFISC, G.CDIMPOSTO, G.CDFILIAL
                                                                                                               FROM GRUPOFISCIMPFIL G, IMPOSTO I
                                                                                                              WHERE G.CDIMPOSTO    = I.CDIMPOSTO
                                                                                                                AND I.CDIMPOSTONFE IN ('50','60')) H
                                                                                            WHERE F.CDFILIAL = H.CDFILIAL(+)) G
                              WHERE R.CDREGRAFISC   = C_REGRAFISC.CDREGRAFISC
                                AND R.CDREGRAFISC   = V.CDREGRAFISC
                                AND G.CDEMPRESA     = V.CDEMPRESA
                                AND G.CDFILIAL      = T.CDFILIAL
                                AND PV.CDFILIAL     = G.CDFILIAL
                                AND (SYSDATE BETWEEN R.DTVALREGRAFISC AND V.DTVALVINCFISC OR V.DTVALVINCFISC IS NULL)
                                AND SYSDATE BETWEEN T.DTINIVGPREC AND T.DTFINVGPREC
                                AND (V.IDENTRSAIDOP = 'S'               OR V.IDENTRSAIDOP IS NULL)
                                AND (V.CDINSCESTA   = G.CDINSCESTA      OR V.CDINSCESTA   IS NULL)
                                AND (V.CDTIPOOPER   = PV.CDTPOPERCNTREC OR V.CDTIPOOPER   IS NULL)
                                AND T.CDFILIAL      = I.CDFILIAL
                                AND T.CDTABEPREC    = I.CDTABEPREC
                                AND PV.CDFILIAL     =  P_CDREGRAFISC
                                AND NVL(I.VRPRECITEM,0) + NVL(I.VRPRECITEMCL,0) > 0
                                AND IR.CDREGRAFISC  = C_REGRAFISC.CDREGRAFISC
                                AND IR.CDIMPOSTO    = IM.CDIMPOSTO
                                AND IM.CDIMPOSTONFE IN ('00','80','50','60')
                                AND ((G.CDIMP = 'ICMS' AND IM.CDIMPOSTONFE IN ('00','80')) OR (G.CDIMP = 'CONTR' AND IM.CDIMPOSTONFE IN ('50','60')))
                                AND IR.IDIMPOBRIGREGRA = 'S'
                                AND I.CDPRODUTO     = P.CDPRODUTO
                                AND G.CDFILIAL      = E.CDFILIAL
                                AND E.IDTPENDEFILI  = 'P'
                                AND ((G.CDIMPOSTO IS NULL) OR (G.CDIMPOSTO = IR.CDIMPOSTO))
                                AND ((G.CDGRUPOFISC IS NULL     AND NOT EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC AND GR.CDGRUPOFISC = G.CDGRUPOFISC)) OR
                                     (G.CDGRUPOFISC IS NOT NULL AND     EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC AND GR.CDGRUPOFISC = G.CDGRUPOFISC)))
                               ORDER BY CDPRODUTO, DECODE(IM.CDIMPOSTONFE,'80',1,'00',2,3), CDIMPOSTO DESC) LOOP

            V_ALIQICMS      := NULL;
            V_ALIQST        := NULL;
            V_ALIQPIS       := NULL;
            V_ALIQCOFINS    := NULL;
            V_VRPERREDBC    := NULL;
            V_CDCEST        := NULL;
            V_CDBENEFFISCAL := NULL;

            V_CDPRODUTORAISE := C_PRODVENDA.CDPRODUTO;

            /*Verifica a parametrizacao por Produto*/
            BEGIN
               SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DP.VRALIQUOTA, '')) AS ALIQICMS,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DP.VRALIQUOTA, '')) AS ALIQST,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DP.VRALIQUOTA, '')) AS ALIQPIS,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DP.VRALIQUOTA, '')) AS ALIQCOFINS,
                      MAX(DP.CDFISCAL) AS CDFISCAL,
                      MAX(DP.VRPERREDBC) AS VRPERREDBC,
                      MAX(DP.CDCEST) AS CDCEST,
                      0 AS IDPAGINA, MAX(LENGTH(DP.CDPRODUTO)) AS TAMNIVEL,
                      MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                 INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                 FROM DADOSFISCPROD DP, PRODUTO PR
                WHERE DP.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                  AND DP.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                  AND PR.CDPRODUTO      = DP.CDPRODUTO
                  AND (DP.IDCSTINTEREST = 'E' OR IDCSTINTEREST = 'T')
                  AND (DP.IDCSTINTERNA  = 'N' OR IDCSTINTERNA = 'T')
                  AND (((DP.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (DP.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR DP.IDTIPOORIGFISC = 'T')
                  AND (((DP.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (DP.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR DP.IDTIPODESTFISC = 'T')
                  AND (((DP.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DP.IDTIPOORIGFISC = 'T') OR ((DP.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                       ((DP.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DP.IDTIPODESTFISC = 'T') OR ((DP.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                       (C_PRODVENDA.IDUTMUNIORIG = 'N'))
                  AND PR.CDARVPROD      = (SELECT MAX(P.CDARVPROD)
                                             FROM DADOSFISCPROD D, PRODUTO P
                                            WHERE D.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                                              AND D.CDPRODUTO      = P.CDPRODUTO
                                              AND D.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                                              AND INSTR(C_PRODVENDA.CDARVPROD, P.CDARVPROD) = 1
                                              AND (D.IDCSTINTEREST = 'E' OR IDCSTINTEREST = 'T')
                                              AND (D.IDCSTINTERNA  = 'N' OR IDCSTINTERNA = 'T')
                                              AND (((D.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (D.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                              AND (((D.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (D.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                              AND (((D.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                                                   ((D.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                                                   (C_PRODVENDA.IDUTMUNIORIG = 'N')));
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_ALIQICMS      := NULL;
                  V_ALIQST        := NULL;
                  V_ALIQPIS       := NULL;
                  V_ALIQCOFINS    := NULL;
                  V_VRPERREDBC    := NULL;
                  V_CDCEST        := NULL;
                  V_IDPAGINA      := NULL;
                  V_TAMNIVEL      := 0;
                  V_CDBENEFFISCAL := NULL;
            END;

            IF (V_ALIQICMS IS NULL) AND (V_ALIQST IS NULL) AND (V_ALIQPIS IS NULL) AND (V_ALIQCOFINS IS NULL) THEN
               /*Verifica a parametrizacao por NCM*/
               BEGIN
                  SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DN.VRALIQUOTA, '')) AS ALIQICMS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DN.VRALIQUOTA, '')) AS ALIQST,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DN.VRALIQUOTA, '')) AS ALIQPIS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DN.VRALIQUOTA, '')) AS ALIQCOFINS,
                         MAX(DN.CDFISCAL)   AS CDFISCAL,
                         MAX(DN.VRPERREDBC) AS VRPERREDBC,
                         MAX(DN.CDCEST) AS CDCEST,
                         1 AS IDPAGINA, MAX(LENGTH(DN.CDCLASFISC)) AS TAMNIVEL,
                         MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                    INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                    FROM DADOSFISCNCM DN
                   WHERE DN.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                     AND DN.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                     AND (DN.IDCSTINTEREST = 'E' OR DN.IDCSTINTEREST = 'T')
                     AND (DN.IDCSTINTERNA  = 'N' OR DN.IDCSTINTERNA  = 'T')
                     AND (((DN.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (DN.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR DN.IDTIPOORIGFISC = 'T')
                     AND (((DN.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (DN.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR DN.IDTIPODESTFISC = 'T')
                     AND (((DN.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DN.IDTIPOORIGFISC = 'T') OR ((DN.CDMUNIORIG IS NULL) AND  (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                          ((DN.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DN.IDTIPODESTFISC = 'T') OR ((DN.CDMUNIDEST IS NULL) AND  (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                          (C_PRODVENDA.IDUTMUNIORIG = 'N'))
                     AND DN.CDCLASFISC     = (SELECT MAX(D.CDCLASFISC)
                                                FROM DADOSFISCNCM D, PRODUTO P
                                               WHERE D.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                                                 and P.CDARVPROD      = C_PRODVENDA.CDARVPROD
                                                 AND D.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                                                 AND INSTR(P.CDCLASFISC, D.CDCLASFISC)=1
                                                 AND (D.IDCSTINTEREST = 'E' OR D.IDCSTINTEREST = 'T')
                                                 AND (D.IDCSTINTERNA  = 'N' OR D.IDCSTINTERNA  = 'T')
                                                 AND (((D.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (D.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                                 AND (((D.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (D.SGESTADEST = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                                 AND (((D.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                                                      ((D.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                                                       (C_PRODVENDA.IDUTMUNIORIG = 'N')));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_ALIQICMS      := NULL;
                     V_ALIQST        := NULL;
                     V_ALIQPIS       := NULL;
                     V_ALIQCOFINS    := NULL;
                     V_VRPERREDBC    := NULL;
                     V_CDCEST        := NULL;
                     V_IDPAGINA      := NULL;
                     V_TAMNIVEL      := 0;
                     V_CDBENEFFISCAL := NULL;
               END;
            END IF;

            IF (V_ALIQICMS IS NULL) AND (V_ALIQST IS NULL) AND (V_ALIQPIS IS NULL) AND (V_ALIQCOFINS IS NULL) THEN
               /*Verifica a parametrizacao Padrao*/
               BEGIN
                  SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DR.VRALIQUOTA, '')) AS ALIQICMS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DR.VRALIQUOTA, '')) AS ALIQST,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DR.VRALIQUOTA, '')) AS ALIQPIS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DR.VRALIQUOTA, '')) AS ALIQCOFINS,
                         MAX(DR.CDFISCAL)   AS CDFISCAL,
                         MAX(DR.VRPERREDBC) AS VRPERREDBC,
                         MAX(DR.CDCEST) AS CDCEST,
                         2 AS IDPAGINA, 0 AS TAMNIVEL,
                         MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                    INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                    FROM DADOSFISCREGRA DR
                   WHERE DR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC
                     AND DR.CDIMPOSTO   = C_PRODVENDA.CDIMPOSTO
                     AND (DR.IDCSTINTEREST = 'E' OR DR.IDCSTINTEREST = 'T')
                     AND (DR.IDCSTINTERNA  = 'N' OR DR.IDCSTINTERNA = 'T')
                     AND (((DR.CDPAISORIG = C_PRODVENDA.CDPAIS) AND (DR.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR DR.IDTIPOORIGFISC = 'T')
                     AND (((DR.CDPAISDEST = C_PRODVENDA.CDPAIS) AND (DR.SGESTADEST = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR DR.IDTIPODESTFISC = 'T')
                     AND (((DR.CDMUNIORIG = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DR.IDTIPOORIGFISC = 'T') OR ((DR.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                          ((DR.CDMUNIDEST = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DR.IDTIPODESTFISC = 'T') OR ((DR.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                          (C_PRODVENDA.IDUTMUNIORIG = 'N'));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_ALIQICMS      := NULL;
                     V_ALIQST        := NULL;
                     V_ALIQPIS       := NULL;
                     V_ALIQCOFINS    := NULL;
                     V_VRPERREDBC    := NULL;
                     V_CDCEST        := NULL;
                     V_IDPAGINA      := NULL;
                     V_TAMNIVEL      := 0;
                     V_CDBENEFFISCAL := NULL;
               END;
            END IF;

            /*Verifica a parametrizacao da inscricao estadual para utilizar a reducao da base de calculo
             diretamente na reducao Z ou apenas no modulo Fiscal*/
            V_IDCONSVRBCREDZ := 'A';
            BEGIN
               SELECT I.IDCONSVRBCREDZ
                 INTO V_IDCONSVRBCREDZ
                 FROM INSCRESTAD I
                WHERE I.CDINSCESTA = C_PRODVENDA.CDINSCESTA
                  AND I.CDEMPRESA  = C_PRODVENDA.CDEMPRESA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDCONSVRBCREDZ := 'A';
            END;

            /*Verifica se a reducao da base de calculo sera aplicada na aliquota ou diretamente na base de calculo.
              Hoje so pode ser aplicada na base de calculo para NFC-e. Reducao Z e SAT nao possuem campo especifico,
              por isso reduz na aliquota*/
            V_IDREDUCAOBC := 'N';
            BEGIN
               SELECT MAX('S') AS NFCE
                 INTO V_IDREDUCAOBC
                 FROM CAIXA CX
                WHERE CX.CDFILIAL = C_PRODVENDA.CDFILIAL
                  AND CX.IDTPEMISSAOFOS = 'FNC'
                  AND NOT EXISTS (SELECT *
                                    FROM CAIXA C, CAIXAPERS CP
                                   WHERE C.CDFILIAL = C_PRODVENDA.CDFILIAL
                                     AND C.IDTPEMISSAOFOS <> 'FNC'
                                     AND C.CDFILIAL = CP.CDFILIAL
                                     AND C.CDCAIXA  = CP.CDCAIXAPERS);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDREDUCAOBC := 'N';
            END;

            V_IDTPIMPOSFIS := C_PRODVENDA.IDTPIMPOSFIS;
            IF V_ALIQICMS IS NOT NULL THEN
               IF V_CDFISCAL = '2' THEN
                  V_CDIMPOSTO    := V_CDISENTO;
                  V_IDTPIMPOSFIS := 'I';
                  V_ALIQPROD     := 0;
               ELSIF V_CDFISCAL = '3' THEN
                  V_CDIMPOSTO    := V_CDNAOINCID;
                  V_IDTPIMPOSFIS := 'N';
                  V_ALIQPROD     := 0;
               ELSE
                  V_CDIMPOSTO := V_CDICMS;
                  IF V_VRPERREDBC IS NOT NULL THEN
                     IF V_IDREDUCAOBC = 'S' THEN
                        V_ALIQPROD  := V_ALIQICMS;
                     ELSE
                        IF (V_IDCONSVRBCREDZ = 'A' OR V_IDREDUCAOBC = 'N') THEN
                           V_ALIQPROD := (V_ALIQICMS-(ROUND(((V_ALIQICMS*V_VRPERREDBC)/100),2)));
                           V_VRPERREDBC := 0;
                        ELSE
                           V_ALIQPROD  := V_ALIQICMS;
                        END IF;
                     END IF;
                  ELSE
                     V_ALIQPROD   := V_ALIQICMS;
                     V_VRPERREDBC := 0;
                  END IF;
               END IF;
            ELSIF V_ALIQST IS NOT NULL THEN
               V_CDIMPOSTO := V_CDICMSST;
               V_ALIQPROD  := 0;
            ELSE
               V_CDIMPOSTO := NULL;
               V_ALIQPROD  := NULL;
            END IF;

            IF (V_ALIQPIS IS NOT NULL) AND (V_CDFISCAL <> '1') THEN
               V_ALIQPIS := 0;
            END IF;

            IF (V_ALIQCOFINS IS NOT NULL) AND (V_CDFISCAL <> '1') THEN
               V_ALIQCOFINS := 0;
            END IF;

            IF (V_ALIQPROD IS NOT NULL) OR (V_ALIQPIS IS NOT NULL) OR (V_ALIQCOFINS IS NOT NULL) THEN
               V_CDFILIAL    := NULL;
               V_CDPRODUTO   := NULL;
               V_CDCFOP      := NULL;
               V_CDCSTCSOSN  := NULL;

               /*REINICIALIZA AS VARIAVEIS PARA CADA PRODUTO*/
               IF (V_CDPROD IS NULL) OR (V_CDPROD <> C_PRODVENDA.CDPRODUTO) THEN
                  V_CDPROD     := C_PRODVENDA.CDPRODUTO;
                  V_BOICMSST   := FALSE;
                  V_IDPAGINAST := NULL;
                  V_TAMNIVELST := 0;
               END IF;

               /*VERIFICA SE EXISTE PARAMETRIZACAO DO ICMS ST PARA O PRODUTO, NESSE CASO ELA TEM PRIORIDADE SOBRE O ISENTO E NAO INCIDENCIA*/
               IF V_CDIMPOSTO = V_CDICMSST THEN
                  V_CDIMPOSREGRA := V_CDICMSST;
                  V_BOICMSST     := TRUE;
                  V_IDPAGINAST   := V_IDPAGINA;
                  V_TAMNIVELST   := V_TAMNIVEL;
               ELSIF V_CDIMPOSTO IN (V_CDICMS,V_CDISENTO,V_CDNAOINCID) THEN
                  V_CDIMPOSREGRA := V_CDICMS;
               ELSE
                  V_CDIMPOSREGRA := C_PRODVENDA.CDIMPOSTO;
               END IF;

               V_BOREPLICA := FALSE;
               /*VERIFICA AS REGRAS DE PRIORIDADE DO CADASTRO*/
               IF (V_ALIQPIS IS NOT NULL) OR (V_ALIQCOFINS IS NOT NULL) OR (V_CDIMPOSTO IS NOT NULL) THEN
                  /*SE EXISTE IMPOSTO, O PADRAO E REPLICAR*/
                  V_BOREPLICA := TRUE;
                  /*O ICMS TRIBUTADO TEM PRIORIDADE SOBRE O ICMS ST, A NAO SER QUE O CADASTRO DO ST SEJA MAIS ESPECIFICO*/
                  IF (V_CDIMPOSTO =  V_CDICMS) AND (V_BOICMSST) THEN
                     /*VERIFICA A ABA EM QUE ENCONTROU O CADASTRO (PRODUTO, NCM OU PADRAO)*/
                     IF (V_IDPAGINAST <  V_IDPAGINA) THEN
                        V_BOREPLICA := FALSE;
                     /*SE FOR A MESMA PAGINA, VERIFICA O CADASTRO DE NIVEL MAIS COMPLETO*/
                     ELSIF (V_IDPAGINAST = V_IDPAGINA) AND (V_TAMNIVELST > V_TAMNIVEL ) THEN
                        V_BOREPLICA := FALSE;
                     END IF;
                  END IF;
                  /*O ICMS ST TEM PRIORIDADE SOBRE O CADASTRO DE NAO INCIDENCIA E ISENTO, A NAO SER QUE O CADASTRO DE NAO INCIDENCIA OU ISENTO SEJA MAIS ESPECIFICO*/
                  IF (V_CDIMPOSTO IN (V_CDISENTO,V_CDNAOINCID)) AND (V_BOICMSST) THEN
                     /*VERIFICA A ABA EM QUE ENCONTROU O CADASTRO (PRODUTO, NCM OU PADRAO)*/
                     IF (V_IDPAGINAST < V_IDPAGINA) THEN
                        V_BOREPLICA := FALSE;
                     /*SE FOR A MESMA PAGINA, VERIFICA O CADASTRO DE NIVEL MAIS COMPLETO*/
                     ELSIF (V_IDPAGINAST = V_IDPAGINA) AND (V_TAMNIVELST >= V_TAMNIVEL) THEN
                        V_BOREPLICA := FALSE;
                     END IF;
                  END IF;
               END IF;

               IF V_BOREPLICA THEN

                  /*Busca CFOP e CST para os itens*/
                  BEGIN
                     SELECT CFOP_ITEM(V_CDIMPOSREGRA, C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDFILIAL, C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDTIPOOPER,
                                      SYSDATE, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO),
                            CST_ITEM (V_CDIMPOSREGRA, C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDFILIAL, '', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDTIPOOPER,
                                      SYSDATE, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, 0)
                       INTO V_CDCFOP, V_CDCSTCSOSN
                       FROM DUAL;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDCFOP     := NULL;
                        V_CDCSTCSOSN := NULL;
                  END;
                  V_CDCFOP      := TRIM(SUBSTR(V_CDCFOP,3,4));
                  V_CDCSTCSOSN  := SUBSTR(LPAD(V_CDCSTCSOSN,4,'0'),3,2);

                  V_CDGRUPOFISC := NULL;

                  IF V_ALIQPIS IS NOT NULL OR V_ALIQCOFINS IS NOT NULL THEN
                     BEGIN
                        SELECT GR.CDGRUPOFISC
                          INTO V_CDGRUPOFISC
                          FROM GRUPOFISCIMPFIL GR, FILIAL F, IMPOSTO IM
                         WHERE IM.CDIMPOSTONFE = '50'
                           AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                           AND F.CDFILIAL      = C_PRODVENDA.CDFILIAL
                           AND F.CDFILIAL      = GR.CDFILIAL;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDGRUPOFISC := NULL;
                     END;

                     IF V_CDGRUPOFISC IS NULL THEN  /*VERIFICA SE EXISTE GRUPO FISCAL PARA IMPOSTO/IE SELECIONADA*/
                        BEGIN
                           SELECT GR.CDGRUPOFISC
                             INTO V_CDGRUPOFISC
                             FROM GRFISIMPIECLIE GR, FILIAL F, IMPOSTO IM
                            WHERE IM.CDIMPOSTONFE = '50'
                              AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                              AND F.CDINSCESTA    = GR.CDINSCESTA
                              AND F.CDEMPRESA     = GR.CDEMPRESA
                              AND GR.CDCLIENTE    = C_PRODVENDA.CDCLIENTE
                              AND F.CDFILIAL      = C_PRODVENDA.CDFILIAL;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_CDGRUPOFISC := NULL;
                        END;
                     END IF;
                     IF V_CDGRUPOFISC IS NULL THEN  /*VERIFICA SE HA GRUPO FISCAL  PARA A FILIAL*/
                        CONSULTA_GRUPOFISCAL('C', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDFILIAL, 'S', C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC);
                     END IF;

                     CONSULTA_CST_NFE('S', C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC, C_PRODVENDA.CDIMPOSTO, 'N', 'N', '0000', '0000000000', '', V_CSTNFE, V_IDMODBCNFE, V_IDMODBCSTNFE, V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, V_IDMOTIDESSTNFE);
                     V_CDCSTCSOSN := V_CSTNFE;
                  END IF;

                  /*VERIFICA SE A EMPRESA E DO SIMPLES NACIONAL PARA BUSCAR O CSOSN*/
                  SELECT NVL(MAX(CDSITUCRT), '3') CDSITUCRT
                    INTO V_CDSITUCRT
                    FROM PARAMEMPRESA
                   WHERE CDEMPRESA = C_PRODVENDA.CDEMPRESA;

                  IF (NVL(V_CDSITUCRT,'3') <> '3') AND (V_CDIMPOSTO IS NOT NULL) THEN
                     CONSULTA_GRUPOFISCAL('C', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDFILIAL, 'S', C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC);
                     CONSULTA_CSOSN('S', C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDINSCESTA,
                                    C_PRODVENDA.CDTIPOOPER, C_PRODVENDA.CDFILIAL, '', V_CDGRUPOFISC, 'N', V_CDCSTCSOSN);
                     V_CDCSTCSOSN := SUBSTR(LPAD(V_CDCSTCSOSN,4,'0'),2,3);
                  END IF;

                  IF V_CDIMPOSTO IS NOT NULL THEN
                     /*VERIFICA O CADASTRO DO CODIGO CEST NO PRODUTO, CASO O MESMO NAO ESTEJA CADASTRADO NA REGRA*/
                     IF V_CDCEST IS NULL THEN
                        SELECT P.CDCEST
                          INTO V_CDCEST
                          FROM PRODUTO P
                         WHERE P.CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;

                     /*VERIFICA SE O ITEM DEVE SER CRIADO NA ALIQIMPFIS OU APENAS ATUALIZADO*/
                     BEGIN
                        SELECT A.CDFILIAL, A.CDPRODUTO
                          INTO V_CDFILIAL, V_CDPRODUTO
                          FROM ALIQIMPFIS A
                         WHERE A.CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND A.CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDFILIAL  := NULL;
                           V_CDPRODUTO := NULL;
                     END;

                     IF (V_CDPRODUTO IS NULL) OR (V_CDFILIAL IS NULL) THEN
                        INSERT INTO ALIQIMPFIS
                           (CDFILIAL, CDPRODUTO, CDIMPOSTO, VRPEALIMPFIS, VRPERCREDUCAO, IDTPIMPOSFIS, IDINCIDEPISCOF, CDCFOPPFIS, CDCSTICMS, CDREGRAIT, CDCEST, CDCBENEF)
                        VALUES
                           (C_PRODVENDA.CDFILIAL, C_PRODVENDA.CDPRODUTO, V_CDIMPOSTO, TRUNC(V_ALIQPROD,2), NVL(V_VRPERREDBC,0), V_IDTPIMPOSFIS, 'N', V_CDCFOP, V_CDCSTCSOSN, C_REGRAFISC.CDREGRAFISC, V_CDCEST, V_CDBENEFFISCAL);
                     ELSE
                        UPDATE ALIQIMPFIS
                           SET VRPEALIMPFIS  = TRUNC(V_ALIQPROD,2),
                               VRPERCREDUCAO = NVL(V_VRPERREDBC,0),
                               CDIMPOSTO     = V_CDIMPOSTO,
                               CDREGRAIT     = C_REGRAFISC.CDREGRAFISC,
                               CDCFOPPFIS    = V_CDCFOP,
                               CDCSTICMS     = V_CDCSTCSOSN,
                               IDTPIMPOSFIS  = V_IDTPIMPOSFIS,
                               CDCEST        = V_CDCEST,
                               CDCBENEF      = V_CDBENEFFISCAL
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;
                  ELSE
                     IF V_ALIQPIS IS NOT NULL THEN
                        UPDATE ALIQIMPFIS
                           SET IDINCIDEPISCOF = 'S',
                               CDCSTPISCOF    = V_CDCSTCSOSN,
                               VRALIQPIS      = TRIM(TO_CHAR(TRUNC(NVL(V_ALIQPIS,0),2),'90.99')),
                               CDREGRAITPC    = C_REGRAFISC.CDREGRAFISC
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     ELSIF V_ALIQCOFINS IS NOT NULL THEN
                        UPDATE ALIQIMPFIS
                           SET IDINCIDEPISCOF = 'S',
                               CDCSTPISCOF    = V_CDCSTCSOSN,
                               VRALIQCOFINS   = TRIM(TO_CHAR(TRUNC(NVL(V_ALIQCOFINS,0),2),'90.99')),
                               CDREGRAITPC    = C_REGRAFISC.CDREGRAFISC
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      ELSE
         /*Busca a regra fiscal que atende a parametrizacao*/
         FOR C_PRODVENDA IN (SELECT DISTINCT G.CDFILIAL, I.CDPRODUTO, P.CDCLASFISC, P.CDARVPROD, IM.CDIMPOSTO,
                                    IM.CDIMPOSTONFE, E.CDPAIS, E.SGESTADO, E.CDMUNICIPIO, IM.IDUTMUNIORIG,
                                    IM.IDUTUFORIG, IM.IDUTUFDEST, IM.IDTPIMPOSFIS, G.CDINSCESTA, G.CDEMPRESA,
                                    PV.CDCLIENTE, PV.CDTPOPERCNTREC AS CDTIPOOPER,
                                    DECODE(IM.CDIMPOSTONFE,'80',1,'00',2,3) AS ORDENACAO
                               FROM REGRAFISCAL R, VINCULOFISREGRA V, TABEVEND T, ITEMPRECO I, PARAVEND PV,
                                    IMPREGRAFISCAL IR, IMPOSTO IM, PRODUTO P, ENDEFILI E, (SELECT F.CDFILIAL, F.CDINSCESTA, F.CDEMPRESA, H.CDGRUPOFISC, H.CDIMPOSTO, 'ICMS' AS CDIMP
                                                                                             FROM FILIAL F, (SELECT G.CDGRUPOFISC, G.CDIMPOSTO, G.CDFILIAL
                                                                                                               FROM GRUPOFISCIMPFIL G, IMPOSTO I
                                                                                                              WHERE G.CDIMPOSTO    = I.CDIMPOSTO
                                                                                                                AND I.CDIMPOSTONFE IN ('00','80')) H
                                                                                            WHERE F.CDFILIAL = H.CDFILIAL(+)
                                                                                            UNION
                                                                                           SELECT F.CDFILIAL, F.CDINSCESTA, F.CDEMPRESA, H.CDGRUPOFISC, H.CDIMPOSTO, 'CONTR' AS CDIMP
                                                                                             FROM FILIAL F, (SELECT G.CDGRUPOFISC, G.CDIMPOSTO, G.CDFILIAL
                                                                                                               FROM GRUPOFISCIMPFIL G, IMPOSTO I
                                                                                                              WHERE G.CDIMPOSTO    = I.CDIMPOSTO
                                                                                                                AND I.CDIMPOSTONFE IN ('50','60')) H
                                                                                            WHERE F.CDFILIAL = H.CDFILIAL(+)) G
                              WHERE R.CDREGRAFISC   = C_REGRAFISC.CDREGRAFISC
                                AND R.CDREGRAFISC   = V.CDREGRAFISC
                                AND G.CDEMPRESA     = V.CDEMPRESA
                                AND G.CDFILIAL      = T.CDFILIAL
                                AND PV.CDFILIAL     = G.CDFILIAL
                                AND (SYSDATE BETWEEN R.DTVALREGRAFISC AND V.DTVALVINCFISC OR V.DTVALVINCFISC IS NULL)
                                AND SYSDATE BETWEEN T.DTINIVGPREC AND T.DTFINVGPREC
                                AND (V.IDENTRSAIDOP = 'S'               OR V.IDENTRSAIDOP IS NULL)
                                AND (V.CDINSCESTA   = G.CDINSCESTA      OR V.CDINSCESTA   IS NULL)
                                AND (V.CDTIPOOPER   = PV.CDTPOPERCNTREC OR V.CDTIPOOPER   IS NULL)
                                AND T.CDFILIAL      = I.CDFILIAL
                                AND T.CDTABEPREC    = I.CDTABEPREC
                                AND NVL(I.VRPRECITEM,0) + NVL(I.VRPRECITEMCL,0) > 0
                                AND IR.CDREGRAFISC  = C_REGRAFISC.CDREGRAFISC
                                AND IR.CDIMPOSTO    = IM.CDIMPOSTO
                                AND IM.CDIMPOSTONFE IN ('00','80','50','60')
                                AND ((G.CDIMP = 'ICMS' AND IM.CDIMPOSTONFE IN ('00','80')) OR (G.CDIMP = 'CONTR' AND IM.CDIMPOSTONFE IN ('50','60')))
                                AND IR.IDIMPOBRIGREGRA = 'S'
                                AND I.CDPRODUTO     = P.CDPRODUTO
                                AND G.CDFILIAL      = E.CDFILIAL
                                AND E.IDTPENDEFILI  = 'P'
                                AND ((G.CDIMPOSTO IS NULL) OR (G.CDIMPOSTO = IR.CDIMPOSTO))
                                AND ((G.CDGRUPOFISC IS NULL     AND NOT EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC AND GR.CDGRUPOFISC = G.CDGRUPOFISC)) OR
                                     (G.CDGRUPOFISC IS NOT NULL AND     EXISTS (SELECT 1 FROM GRUPOFISCREGRA GR WHERE GR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC AND GR.CDGRUPOFISC = G.CDGRUPOFISC)))
                               ORDER BY CDPRODUTO, DECODE(IM.CDIMPOSTONFE,'80',1,'00',2,3), CDIMPOSTO DESC) LOOP

            V_ALIQICMS   := NULL;
            V_ALIQST     := NULL;
            V_ALIQPIS    := NULL;
            V_ALIQCOFINS := NULL;
            V_VRPERREDBC := NULL;
            V_CDCEST     := NULL;

            V_CDPRODUTORAISE := C_PRODVENDA.CDPRODUTO;

            /*Verifica a parametrizacao por Produto*/
            BEGIN
               SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DP.VRALIQUOTA, '')) AS ALIQICMS,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DP.VRALIQUOTA, '')) AS ALIQST,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DP.VRALIQUOTA, '')) AS ALIQPIS,
                      MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DP.VRALIQUOTA, '')) AS ALIQCOFINS,
                      MAX(DP.CDFISCAL) AS CDFISCAL,
                      MAX(DP.VRPERREDBC) AS VRPERREDBC,
                      MAX(DP.CDCEST) AS CDCEST,
                      0 AS IDPAGINA, MAX(LENGTH(DP.CDPRODUTO)) AS TAMNIVEL,
                      MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                 INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                 FROM DADOSFISCPROD DP, PRODUTO PR
                WHERE DP.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                  AND DP.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                  AND PR.CDPRODUTO      = DP.CDPRODUTO
                  AND (DP.IDCSTINTEREST = 'E' OR IDCSTINTEREST = 'T')
                  AND (DP.IDCSTINTERNA  = 'N' OR IDCSTINTERNA = 'T')
                  AND (((DP.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (DP.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR DP.IDTIPOORIGFISC = 'T')
                  AND (((DP.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (DP.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR DP.IDTIPODESTFISC = 'T')
                  AND (((DP.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DP.IDTIPOORIGFISC = 'T') OR ((DP.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                       ((DP.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DP.IDTIPODESTFISC = 'T') OR ((DP.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                       (C_PRODVENDA.IDUTMUNIORIG = 'N'))
                  AND PR.CDARVPROD      = (SELECT MAX(P.CDARVPROD)
                                             FROM DADOSFISCPROD D, PRODUTO P
                                            WHERE D.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                                              AND D.CDPRODUTO      = P.CDPRODUTO
                                              AND D.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                                              AND INSTR(C_PRODVENDA.CDARVPROD, P.CDARVPROD) = 1
                                              AND (D.IDCSTINTEREST = 'E' OR IDCSTINTEREST = 'T')
                                              AND (D.IDCSTINTERNA  = 'N' OR IDCSTINTERNA = 'T')
                                              AND (((D.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (D.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                              AND (((D.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (D.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                              AND (((D.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                                                   ((D.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                                                   (C_PRODVENDA.IDUTMUNIORIG = 'N')));
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_ALIQICMS      := NULL;
                  V_ALIQST        := NULL;
                  V_ALIQPIS       := NULL;
                  V_ALIQCOFINS    := NULL;
                  V_VRPERREDBC    := NULL;
                  V_CDCEST        := NULL;
                  V_IDPAGINA      := NULL;
                  V_TAMNIVEL      := 0;
                  V_CDBENEFFISCAL := NULL;
            END;

            IF (V_ALIQICMS IS NULL) AND (V_ALIQST IS NULL) AND (V_ALIQPIS IS NULL) AND (V_ALIQCOFINS IS NULL) THEN
               /*Verifica a parametrizacao por NCM*/
               BEGIN
                  SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DN.VRALIQUOTA, '')) AS ALIQICMS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DN.VRALIQUOTA, '')) AS ALIQST,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DN.VRALIQUOTA, '')) AS ALIQPIS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DN.VRALIQUOTA, '')) AS ALIQCOFINS,
                         MAX(DN.CDFISCAL)   AS CDFISCAL,
                         MAX(DN.VRPERREDBC) AS VRPERREDBC,
                         MAX(DN.CDCEST) AS CDCEST,
                         1 AS IDPAGINA, MAX(LENGTH(DN.CDCLASFISC)) AS TAMNIVEL,
                         MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                    INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                    FROM DADOSFISCNCM DN
                   WHERE DN.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                     AND DN.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                     AND (DN.IDCSTINTEREST = 'E' OR DN.IDCSTINTEREST = 'T')
                     AND (DN.IDCSTINTERNA  = 'N' OR DN.IDCSTINTERNA  = 'T')
                     AND (((DN.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (DN.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFORIG = 'N' OR DN.IDTIPOORIGFISC = 'T')
                     AND (((DN.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (DN.SGESTADEST = C_PRODVENDA.SGESTADO)) OR  C_PRODVENDA.IDUTUFDEST = 'N' OR DN.IDTIPODESTFISC = 'T')
                     AND (((DN.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DN.IDTIPOORIGFISC = 'T') OR ((DN.CDMUNIORIG IS NULL) AND  (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                          ((DN.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DN.IDTIPODESTFISC = 'T') OR ((DN.CDMUNIDEST IS NULL) AND  (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                          (C_PRODVENDA.IDUTMUNIORIG = 'N'))
                     AND DN.CDCLASFISC     = (SELECT MAX(D.CDCLASFISC)
                                                FROM DADOSFISCNCM D, PRODUTO P
                                               WHERE D.CDREGRAFISC    = C_REGRAFISC.CDREGRAFISC
                                                 and P.CDARVPROD      = C_PRODVENDA.CDARVPROD
                                                 AND D.CDIMPOSTO      = C_PRODVENDA.CDIMPOSTO
                                                 AND INSTR(P.CDCLASFISC, D.CDCLASFISC)=1
                                                 AND (D.IDCSTINTEREST = 'E' OR D.IDCSTINTEREST = 'T')
                                                 AND (D.IDCSTINTERNA  = 'N' OR D.IDCSTINTERNA  = 'T')
                                                 AND (((D.CDPAISORIG  = C_PRODVENDA.CDPAIS) AND (D.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                                 AND (((D.CDPAISDEST  = C_PRODVENDA.CDPAIS) AND (D.SGESTADEST = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                                 AND (((D.CDMUNIORIG  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                                                      ((D.CDMUNIDEST  = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                                                       (C_PRODVENDA.IDUTMUNIORIG = 'N')));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_ALIQICMS      := NULL;
                     V_ALIQST        := NULL;
                     V_ALIQPIS       := NULL;
                     V_ALIQCOFINS    := NULL;
                     V_VRPERREDBC    := NULL;
                     V_CDCEST        := NULL;
                     V_IDPAGINA      := NULL;
                     V_TAMNIVEL      := 0;
                     V_CDBENEFFISCAL := NULL;
               END;
            END IF;

            IF (V_ALIQICMS IS NULL) AND (V_ALIQST IS NULL) AND (V_ALIQPIS IS NULL) AND (V_ALIQCOFINS IS NULL) THEN
               /*Verifica a parametrizacao Padrao*/
               BEGIN
                  SELECT MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '00', DR.VRALIQUOTA, '')) AS ALIQICMS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '80', DR.VRALIQUOTA, '')) AS ALIQST,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '50', DR.VRALIQUOTA, '')) AS ALIQPIS,
                         MAX(DECODE(C_PRODVENDA.CDIMPOSTONFE, '60', DR.VRALIQUOTA, '')) AS ALIQCOFINS,
                         MAX(DR.CDFISCAL)   AS CDFISCAL,
                         MAX(DR.VRPERREDBC) AS VRPERREDBC,
                         MAX(DR.CDCEST) AS CDCEST,
                         2 AS IDPAGINA, 0 AS TAMNIVEL,
                         MAX(CDBENEFFISCAL) AS CDBENEFFISCAL
                    INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL, V_CDBENEFFISCAL
                    FROM DADOSFISCREGRA DR
                   WHERE DR.CDREGRAFISC = C_REGRAFISC.CDREGRAFISC
                     AND DR.CDIMPOSTO   = C_PRODVENDA.CDIMPOSTO
                     AND (DR.IDCSTINTEREST = 'E' OR DR.IDCSTINTEREST = 'T')
                     AND (DR.IDCSTINTERNA  = 'N' OR DR.IDCSTINTERNA = 'T')
                     AND (((DR.CDPAISORIG = C_PRODVENDA.CDPAIS) AND (DR.SGESTAORIG = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR DR.IDTIPOORIGFISC = 'T')
                     AND (((DR.CDPAISDEST = C_PRODVENDA.CDPAIS) AND (DR.SGESTADEST = C_PRODVENDA.SGESTADO)) OR C_PRODVENDA.IDUTUFORIG = 'N' OR DR.IDTIPODESTFISC = 'T')
                     AND (((DR.CDMUNIORIG = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'O') OR (DR.IDTIPOORIGFISC = 'T') OR ((DR.CDMUNIORIG IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'D'))) AND
                          ((DR.CDMUNIDEST = C_PRODVENDA.CDMUNICIPIO AND C_PRODVENDA.IDUTMUNIORIG = 'D') OR (DR.IDTIPODESTFISC = 'T') OR ((DR.CDMUNIDEST IS NULL) AND (C_PRODVENDA.IDUTMUNIORIG = 'O'))) OR
                          (C_PRODVENDA.IDUTMUNIORIG = 'N'));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_ALIQICMS      := NULL;
                     V_ALIQST        := NULL;
                     V_ALIQPIS       := NULL;
                     V_ALIQCOFINS    := NULL;
                     V_VRPERREDBC    := NULL;
                     V_CDCEST        := NULL;
                     V_IDPAGINA      := NULL;
                     V_TAMNIVEL      := 0;
                     V_CDBENEFFISCAL := NULL;
               END;
            END IF;

            /*Verifica a parametrizacao da inscricao estadual para utilizar a reducao da base de calculo
             diretamente na reducao Z ou apenas no modulo Fiscal*/
            V_IDCONSVRBCREDZ := 'A';
            BEGIN
               SELECT I.IDCONSVRBCREDZ
                 INTO V_IDCONSVRBCREDZ
                 FROM INSCRESTAD I
                WHERE I.CDINSCESTA = C_PRODVENDA.CDINSCESTA
                  AND I.CDEMPRESA  = C_PRODVENDA.CDEMPRESA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDCONSVRBCREDZ := 'A';
            END;

            /*Verifica se a reducao da base de calculo sera aplicada na aliquota ou diretamente na base de calculo.
              Hoje so pode ser aplicada na base de calculo para NFC-e. Reducao Z e SAT nao possuem campo especifico,
              por isso reduz na aliquota*/
            V_IDREDUCAOBC := 'N';
            BEGIN
               SELECT MAX('S') AS NFCE
                 INTO V_IDREDUCAOBC
                 FROM CAIXA CX
                WHERE CX.CDFILIAL = C_PRODVENDA.CDFILIAL
                  AND CX.IDTPEMISSAOFOS = 'FNC'
                  AND NOT EXISTS (SELECT *
                                    FROM CAIXA C, CAIXAPERS CP
                                   WHERE C.CDFILIAL = C_PRODVENDA.CDFILIAL
                                     AND C.IDTPEMISSAOFOS <> 'FNC'
                                     AND C.CDFILIAL = CP.CDFILIAL
                                     AND C.CDCAIXA  = CP.CDCAIXAPERS);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDREDUCAOBC := 'N';
            END;

            V_IDTPIMPOSFIS := C_PRODVENDA.IDTPIMPOSFIS;
            IF V_ALIQICMS IS NOT NULL THEN
               IF V_CDFISCAL = '2' THEN
                  V_CDIMPOSTO    := V_CDISENTO;
                  V_IDTPIMPOSFIS := 'I';
                  V_ALIQPROD     := 0;
               ELSIF V_CDFISCAL = '3' THEN
                  V_CDIMPOSTO    := V_CDNAOINCID;
                  V_IDTPIMPOSFIS := 'N';
                  V_ALIQPROD     := 0;
               ELSE
                  V_CDIMPOSTO := V_CDICMS;
                  IF V_VRPERREDBC IS NOT NULL THEN
                     IF V_IDREDUCAOBC = 'S' THEN
                        V_ALIQPROD  := V_ALIQICMS;
                     ELSE
                        IF (V_IDCONSVRBCREDZ = 'A' OR V_IDREDUCAOBC = 'N') THEN
                           V_ALIQPROD := (V_ALIQICMS-(ROUND(((V_ALIQICMS*V_VRPERREDBC)/100),2)));
                           V_VRPERREDBC := 0;
                        ELSE
                           V_ALIQPROD  := V_ALIQICMS;
                        END IF;
                     END IF;
                  ELSE
                     V_ALIQPROD   := V_ALIQICMS;
                     V_VRPERREDBC := 0;
                  END IF;
               END IF;
            ELSIF V_ALIQST IS NOT NULL THEN
               V_CDIMPOSTO := V_CDICMSST;
               V_ALIQPROD  := 0;
            ELSE
               V_CDIMPOSTO := NULL;
               V_ALIQPROD  := NULL;
            END IF;

            IF (V_ALIQPIS IS NOT NULL) AND (V_CDFISCAL <> '1') THEN
               V_ALIQPIS := 0;
            END IF;

            IF (V_ALIQCOFINS IS NOT NULL) AND (V_CDFISCAL <> '1') THEN
               V_ALIQCOFINS := 0;
            END IF;

            IF (V_ALIQPROD IS NOT NULL) OR (V_ALIQPIS IS NOT NULL) OR (V_ALIQCOFINS IS NOT NULL) THEN
               V_CDFILIAL    := NULL;
               V_CDPRODUTO   := NULL;
               V_CDCFOP      := NULL;
               V_CDCSTCSOSN  := NULL;

               /*REINICIALIZA AS VARIAVEIS PARA CADA PRODUTO*/
               IF (V_CDPROD IS NULL) OR (V_CDPROD <> C_PRODVENDA.CDPRODUTO) THEN
                  V_CDPROD     := C_PRODVENDA.CDPRODUTO;
                  V_BOICMSST   := FALSE;
                  V_IDPAGINAST := NULL;
                  V_TAMNIVELST := 0;
               END IF;

               /*VERIFICA SE EXISTE PARAMETRIZACAO DO ICMS ST PARA O PRODUTO, NESSE CASO ELA TEM PRIORIDADE SOBRE O ISENTO E NAO INCIDENCIA*/
               IF V_CDIMPOSTO = V_CDICMSST THEN
                  V_CDIMPOSREGRA := V_CDICMSST;
                  V_BOICMSST     := TRUE;
                  V_IDPAGINAST   := V_IDPAGINA;
                  V_TAMNIVELST   := V_TAMNIVEL;
               ELSIF V_CDIMPOSTO IN (V_CDICMS,V_CDISENTO,V_CDNAOINCID) THEN
                  V_CDIMPOSREGRA := V_CDICMS;
               ELSE
                  V_CDIMPOSREGRA := C_PRODVENDA.CDIMPOSTO;
               END IF;

               V_BOREPLICA := FALSE;
               /*VERIFICA AS REGRAS DE PRIORIDADE DO CADASTRO*/
               IF (V_ALIQPIS IS NOT NULL) OR (V_ALIQCOFINS IS NOT NULL) OR (V_CDIMPOSTO IS NOT NULL) THEN
                  /*SE EXISTE IMPOSTO, O PADRAO E REPLICAR*/
                  V_BOREPLICA := TRUE;
                  /*O ICMS TRIBUTADO TEM PRIORIDADE SOBRE O ICMS ST, A NAO SER QUE O CADASTRO DO ST SEJA MAIS ESPECIFICO*/
                  IF (V_CDIMPOSTO =  V_CDICMS) AND (V_BOICMSST) THEN
                     /*VERIFICA A ABA EM QUE ENCONTROU O CADASTRO (PRODUTO, NCM OU PADRAO)*/
                     IF (V_IDPAGINAST <  V_IDPAGINA) THEN
                        V_BOREPLICA := FALSE;
                     /*SE FOR A MESMA PAGINA, VERIFICA O CADASTRO DE NIVEL MAIS COMPLETO*/
                     ELSIF (V_IDPAGINAST = V_IDPAGINA) AND (V_TAMNIVELST > V_TAMNIVEL ) THEN
                        V_BOREPLICA := FALSE;
                     END IF;
                  END IF;
                  /*O ICMS ST TEM PRIORIDADE SOBRE O CADASTRO DE NAO INCIDENCIA E ISENTO, A NAO SER QUE O CADASTRO DE NAO INCIDENCIA OU ISENTO SEJA MAIS ESPECIFICO*/
                  IF (V_CDIMPOSTO IN (V_CDISENTO,V_CDNAOINCID)) AND (V_BOICMSST) THEN
                     /*VERIFICA A ABA EM QUE ENCONTROU O CADASTRO (PRODUTO, NCM OU PADRAO)*/
                     IF (V_IDPAGINAST < V_IDPAGINA) THEN
                        V_BOREPLICA := FALSE;
                     /*SE FOR A MESMA PAGINA, VERIFICA O CADASTRO DE NIVEL MAIS COMPLETO*/
                     ELSIF (V_IDPAGINAST = V_IDPAGINA) AND (V_TAMNIVELST >= V_TAMNIVEL) THEN
                        V_BOREPLICA := FALSE;
                     END IF;
                  END IF;
               END IF;

               IF V_BOREPLICA THEN

                  /*Busca CFOP e CST para os itens*/
                  BEGIN
                     SELECT CFOP_ITEM(V_CDIMPOSREGRA, C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDFILIAL, C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDTIPOOPER,
                                      SYSDATE, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO),
                            CST_ITEM (V_CDIMPOSREGRA, C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDFILIAL, '', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDTIPOOPER,
                                      SYSDATE, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, C_PRODVENDA.CDPAIS, C_PRODVENDA.SGESTADO, 0)
                       INTO V_CDCFOP, V_CDCSTCSOSN
                       FROM DUAL;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDCFOP     := NULL;
                        V_CDCSTCSOSN := NULL;
                  END;
                  V_CDCFOP      := TRIM(SUBSTR(V_CDCFOP,3,4));
                  V_CDCSTCSOSN  := SUBSTR(LPAD(V_CDCSTCSOSN,4,'0'),3,2);

                  V_CDGRUPOFISC := NULL;

                  IF V_ALIQPIS IS NOT NULL OR V_ALIQCOFINS IS NOT NULL THEN
                     BEGIN
                        SELECT GR.CDGRUPOFISC
                          INTO V_CDGRUPOFISC
                          FROM GRUPOFISCIMPFIL GR, FILIAL F, IMPOSTO IM
                         WHERE IM.CDIMPOSTONFE = '50'
                           AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                           AND F.CDFILIAL      = C_PRODVENDA.CDFILIAL
                           AND F.CDFILIAL      = GR.CDFILIAL;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDGRUPOFISC := NULL;
                     END;

                     IF V_CDGRUPOFISC IS NULL THEN  /*VERIFICA SE EXISTE GRUPO FISCAL PARA IMPOSTO/IE SELECIONADA*/
                        BEGIN
                           SELECT GR.CDGRUPOFISC
                             INTO V_CDGRUPOFISC
                             FROM GRFISIMPIECLIE GR, FILIAL F, IMPOSTO IM
                            WHERE IM.CDIMPOSTONFE = '50'
                              AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                              AND F.CDINSCESTA    = GR.CDINSCESTA
                              AND F.CDEMPRESA     = GR.CDEMPRESA
                              AND GR.CDCLIENTE    = C_PRODVENDA.CDCLIENTE
                              AND F.CDFILIAL      = C_PRODVENDA.CDFILIAL;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_CDGRUPOFISC := NULL;
                        END;
                     END IF;
                     IF V_CDGRUPOFISC IS NULL THEN  /*VERIFICA SE HA GRUPO FISCAL  PARA A FILIAL*/
                        CONSULTA_GRUPOFISCAL('C', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDFILIAL, 'S', C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC);
                     END IF;

                     CONSULTA_CST_NFE('S', C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDINSCESTA, C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC, C_PRODVENDA.CDIMPOSTO, 'N', 'N', '0000', '0000000000', '', V_CSTNFE, V_IDMODBCNFE, V_IDMODBCSTNFE, V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, V_IDMOTIDESSTNFE);
                     V_CDCSTCSOSN := V_CSTNFE;
                  END IF;

                  /*VERIFICA SE A EMPRESA E DO SIMPLES NACIONAL PARA BUSCAR O CSOSN*/
                  SELECT NVL(MAX(CDSITUCRT), '3') CDSITUCRT
                    INTO V_CDSITUCRT
                    FROM PARAMEMPRESA
                   WHERE CDEMPRESA = C_PRODVENDA.CDEMPRESA;

                  IF (NVL(V_CDSITUCRT,'3') <> '3') AND (V_CDIMPOSTO IS NOT NULL) THEN
                     CONSULTA_GRUPOFISCAL('C', C_PRODVENDA.CDCLIENTE, C_PRODVENDA.CDFILIAL, 'S', C_PRODVENDA.CDTIPOOPER, V_CDGRUPOFISC);
                     CONSULTA_CSOSN('S', C_PRODVENDA.CDEMPRESA, C_PRODVENDA.CDARVPROD, C_PRODVENDA.CDINSCESTA,
                                    C_PRODVENDA.CDTIPOOPER, C_PRODVENDA.CDFILIAL, '', V_CDGRUPOFISC, 'N', V_CDCSTCSOSN);
                     V_CDCSTCSOSN := SUBSTR(LPAD(V_CDCSTCSOSN,4,'0'),2,3);
                  END IF;

                  IF V_CDIMPOSTO IS NOT NULL THEN
                     /*VERIFICA O CADASTRO DO CODIGO CEST NO PRODUTO, CASO O MESMO NAO ESTEJA CADASTRADO NA REGRA*/
                     IF V_CDCEST IS NULL THEN
                        SELECT P.CDCEST
                          INTO V_CDCEST
                          FROM PRODUTO P
                         WHERE P.CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;

                     /*VERIFICA SE O ITEM DEVE SER CRIADO NA ALIQIMPFIS OU APENAS ATUALIZADO*/
                     BEGIN
                        SELECT A.CDFILIAL, A.CDPRODUTO
                          INTO V_CDFILIAL, V_CDPRODUTO
                          FROM ALIQIMPFIS A
                         WHERE A.CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND A.CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDFILIAL  := NULL;
                           V_CDPRODUTO := NULL;
                     END;

                     IF (V_CDPRODUTO IS NULL) OR (V_CDFILIAL IS NULL) THEN
                        INSERT INTO ALIQIMPFIS
                           (CDFILIAL, CDPRODUTO, CDIMPOSTO, VRPEALIMPFIS, VRPERCREDUCAO, IDTPIMPOSFIS, IDINCIDEPISCOF, CDCFOPPFIS, CDCSTICMS, CDREGRAIT, CDCEST, CDCBENEF)
                        VALUES
                           (C_PRODVENDA.CDFILIAL, C_PRODVENDA.CDPRODUTO, V_CDIMPOSTO, TRUNC(V_ALIQPROD,2), NVL(V_VRPERREDBC,0), V_IDTPIMPOSFIS, 'N', V_CDCFOP, V_CDCSTCSOSN, C_REGRAFISC.CDREGRAFISC, V_CDCEST, V_CDBENEFFISCAL);
                     ELSE
                        UPDATE ALIQIMPFIS
                           SET VRPEALIMPFIS  = TRUNC(V_ALIQPROD,2),
                               VRPERCREDUCAO = NVL(V_VRPERREDBC,0),
                               CDIMPOSTO     = V_CDIMPOSTO,
                               CDREGRAIT     = C_REGRAFISC.CDREGRAFISC,
                               CDCFOPPFIS    = V_CDCFOP,
                               CDCSTICMS     = V_CDCSTCSOSN,
                               IDTPIMPOSFIS  = V_IDTPIMPOSFIS,
                               CDCEST        = V_CDCEST,
                               CDCBENEF      = V_CDBENEFFISCAL
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;
                  ELSE
                     IF V_ALIQPIS IS NOT NULL THEN
                        UPDATE ALIQIMPFIS
                           SET IDINCIDEPISCOF = 'S',
                               CDCSTPISCOF    = V_CDCSTCSOSN,
                               VRALIQPIS      = TRIM(TO_CHAR(TRUNC(NVL(V_ALIQPIS,0),2),'90.99')),
                               CDREGRAITPC    = C_REGRAFISC.CDREGRAFISC
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     ELSIF V_ALIQCOFINS IS NOT NULL THEN
                        UPDATE ALIQIMPFIS
                           SET IDINCIDEPISCOF = 'S',
                               CDCSTPISCOF    = V_CDCSTCSOSN,
                               VRALIQCOFINS   = TRIM(TO_CHAR(TRUNC(NVL(V_ALIQCOFINS,0),2),'90.99')),
                               CDREGRAITPC    = C_REGRAFISC.CDREGRAFISC
                         WHERE CDFILIAL  = C_PRODVENDA.CDFILIAL
                           AND CDPRODUTO = C_PRODVENDA.CDPRODUTO;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END IF;
   END LOOP;
   COMMIT;
EXCEPTION
   WHEN OTHERS THEN BEGIN
      RAISE_APPLICATION_ERROR(-20501,V_CDIMPOSTO||'_'||V_CDPRODUTORAISE||SQLERRM(SQLCODE),TRUE);
   END;
END;