CREATE OR REPLACE TRIGGER ATUALIZA_PROD_IMPOFOS
 AFTER INSERT
    ON ITEMPRECO FOR EACH ROW
DECLARE
   V_CDARVPROD       VARCHAR2(20);
   V_CDREGRAFISC     VARCHAR2(10);
   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_REPLICAPARAMFOS VARCHAR2(01);
   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_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 - Padrão*/
   V_TAMNIVEL        NUMBER;
   V_IDPAGINAST      VARCHAR2(01);
   V_TAMNIVELST      NUMBER;
   V_BOREPLICA       BOOLEAN;
   V_IDCONSVRBCREDZ  VARCHAR(01);
   V_IDREDUCAOBC     VARCHAR2(01);
   V_CDBENEFFISCAL   VARCHAR2(20);
   V_ALIQFECP        NUMBER;
   V_ALIQDESONERADO  NUMBER;
   V_CDNATUREC       VARCHAR2(05);
BEGIN
   BEGIN
      SELECT IDREPPARAMFOS
        INTO V_REPLICAPARAMFOS
        FROM PARAMFISCAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_REPLICAPARAMFOS := 'N';
   END;

   IF V_REPLICAPARAMFOS = 'S' THEN
      /*Verifica a parametrização da inscrição estadual para utilizar a redução da base de cálculo
        diretamente na redução Z ou apenas no módulo Fiscal*/
      SELECT I.IDCONSVRBCREDZ
        INTO V_IDCONSVRBCREDZ
        FROM FILIAL F, INSCRESTAD I
       WHERE F.CDINSCESTA = I.CDINSCESTA
         AND F.CDEMPRESA  = I.CDEMPRESA
         AND F.CDFILIAL   = :NEW.CDFILIAL;

      SELECT CDARVPROD
        INTO V_CDARVPROD
        FROM PRODUTO
       WHERE CDPRODUTO = :NEW.CDPRODUTO;

      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;

      /*Verifica se a redução da base de cálculo será aplicada na alíquota ou diretamente na base de cálculo.
        Hoje só pode ser aplicada na base de cálculo para NFC-e. Redução Z e SAT não possuem campo específico,
        por isso reduz na alíquota*/
      V_IDREDUCAOBC := 'N';
      BEGIN
         SELECT MAX('S') AS NFCE
           INTO V_IDREDUCAOBC
           FROM CAIXA CX
          WHERE CX.CDFILIAL = :NEW.CDFILIAL
            AND CX.IDTPEMISSAOFOS = 'FNC'
            AND NOT EXISTS (SELECT *
                              FROM CAIXA C, CAIXAPERS CP
                             WHERE C.CDFILIAL = :NEW.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_ALIQICMS   := NULL;
      V_ALIQST     := NULL;
      V_ALIQPIS    := NULL;
      V_ALIQCOFINS := NULL;
      V_VRPERREDBC := NULL;
      V_CDCEST     := NULL;
      V_BOICMSST   := FALSE;
      V_IDPAGINAST := NULL;
      V_TAMNIVELST := 0;

      FOR C_REGRAFISCAL IN (SELECT V.CDIMPOSTONFE, V.CDIMPOSTO, MIN(V.NRORDPRIORIDADE||'_'||R.CDREGRAFISC) AS ORDEM, V.CDPAIS,
                                   V.SGESTADO, V.CDMUNICIPIO, V.IDUTMUNIORIG, V.IDUTUFORIG, V.IDUTUFDEST, V.IDTPIMPOSFIS, V.CDFILIAL,
                                   V.CDEMPRESA, V.CDINSCESTA, V.CDCLIENTE, V.CDTIPOOPER, 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        = :NEW.CDFILIAL
                                       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(+)     = :NEW.CDFILIAL
                                       AND G.CDIMPOSTO(+)    = I.CDIMPOSTO
                                       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, V.CDIMPOSTO, V.CDPAIS, V.SGESTADO, V.CDMUNICIPIO, V.IDUTMUNIORIG, V.IDUTUFORIG,
                                   V.IDUTUFDEST, V.IDTPIMPOSFIS, V.CDFILIAL, V.CDEMPRESA, V.CDINSCESTA, V.CDCLIENTE, V.CDTIPOOPER
                             ORDER BY DECODE(V.CDIMPOSTONFE,'80',1,'00',2,3), V.CDIMPOSTO DESC) LOOP

         V_CDREGRAFISC := SUBSTR(C_REGRAFISCAL.ORDEM, (INSTR(C_REGRAFISCAL.ORDEM, '_')) + 1, 10);

         /*Verifica a parametrização por Produto*/
         BEGIN
            SELECT MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DP.VRALIQUOTA, '')) AS ALIQICMS,
                   MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '80', DP.VRALIQUOTA, '')) AS ALIQST,
                   MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '50', DP.VRALIQUOTA, '')) AS ALIQPIS,
                   MAX(DECODE(C_REGRAFISCAL.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(DP.CDBENEFFISCAL) AS CDBENEFFISCAL,
                   MAX(DP.VRADICALIQFECP) AS VRADICALIQFECP,
                   MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DP.VRALIQUOTA+NVL(DP.VRADICALIQFECP,0), '')) AS VRALIQDESONERADO,
                   MAX(DP.CDNATUREC) AS CDNATUREC
              INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL,
                   V_CDBENEFFISCAL, V_ALIQFECP, V_ALIQDESONERADO, V_CDNATUREC
              FROM DADOSFISCPROD DP, PRODUTO PR
             WHERE DP.CDREGRAFISC    = V_CDREGRAFISC
               AND DP.CDIMPOSTO      = C_REGRAFISCAL.CDIMPOSTO
               AND PR.CDPRODUTO      = DP.CDPRODUTO
               AND (DP.IDCSTINTEREST = 'E' OR DP.IDCSTINTEREST = 'T')
               AND (DP.IDCSTINTERNA  = 'N' OR DP.IDCSTINTERNA = 'T')
               AND (((DP.CDPAISORIG  = C_REGRAFISCAL.CDPAIS) AND (DP.SGESTAORIG = C_REGRAFISCAL.SGESTADO)) OR  C_REGRAFISCAL.IDUTUFORIG = 'N' OR DP.IDTIPOORIGFISC = 'T')
               AND (((DP.CDPAISDEST  = C_REGRAFISCAL.CDPAIS) AND (DP.SGESTADEST = C_REGRAFISCAL.SGESTADO)) OR  C_REGRAFISCAL.IDUTUFDEST = 'N' OR DP.IDTIPODESTFISC = 'T')
               AND (((DP.CDMUNIORIG  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'O') OR (DP.IDTIPOORIGFISC = 'T') OR ((DP.CDMUNIORIG IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'D'))) AND
                    ((DP.CDMUNIDEST  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'D') OR (DP.IDTIPODESTFISC = 'T') OR ((DP.CDMUNIDEST IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'O'))) OR
                    (C_REGRAFISCAL.IDUTMUNIORIG = 'N'))
               AND PR.CDARVPROD      = (SELECT MAX(P.CDARVPROD)
                                          FROM DADOSFISCPROD D, PRODUTO P
                                         WHERE D.CDREGRAFISC    = V_CDREGRAFISC
                                           AND D.CDPRODUTO      = P.CDPRODUTO
                                           AND D.CDIMPOSTO      = C_REGRAFISCAL.CDIMPOSTO
                                           AND INSTR(V_CDARVPROD, P.CDARVPROD) = 1
                                           AND (D.IDCSTINTEREST = 'E' OR IDCSTINTEREST = 'T')
                                           AND (D.IDCSTINTERNA  = 'N' OR IDCSTINTERNA = 'T')
                                           AND (((D.CDPAISORIG  = C_REGRAFISCAL.CDPAIS) AND (D.SGESTAORIG = C_REGRAFISCAL.SGESTADO)) OR  C_REGRAFISCAL.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                           AND (((D.CDPAISDEST  = C_REGRAFISCAL.CDPAIS) AND (D.SGESTADEST = C_REGRAFISCAL.SGESTADO)) OR  C_REGRAFISCAL.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                           AND (((D.CDMUNIORIG  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'D'))) AND
                                                ((D.CDMUNIDEST  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'O'))) OR
                                                (C_REGRAFISCAL.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       := NULL;
               V_CDBENEFFISCAL  := NULL;
               V_ALIQFECP       := NULL;
               V_ALIQDESONERADO := NULL;
               V_CDNATUREC      := 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 parametrização por NCM*/
            BEGIN
               SELECT MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DN.VRALIQUOTA, '')) AS ALIQICMS,
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '80', DN.VRALIQUOTA, '')) AS ALIQST,
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '50', DN.VRALIQUOTA, '')) AS ALIQPIS,
                      MAX(DECODE(C_REGRAFISCAL.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(DN.CDBENEFFISCAL) AS CDBENEFFISCAL,
                      MAX(DN.VRADICALIQFECP) AS VRADICALIQFECP,
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DN.VRALIQUOTA+NVL(DN.VRADICALIQFECP,0), '')) AS VRALIQDESONERADO,
                      MAX(DN.CDNATUREC) AS CDNATUREC
                 INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL,
                      V_CDBENEFFISCAL, V_ALIQFECP, V_ALIQDESONERADO, V_CDNATUREC
                 FROM DADOSFISCNCM DN
                WHERE DN.CDREGRAFISC    = V_CDREGRAFISC
                  AND DN.CDIMPOSTO      = C_REGRAFISCAL.CDIMPOSTO
                  AND (DN.IDCSTINTEREST = 'E' OR DN.IDCSTINTEREST = 'T')
                  AND (DN.IDCSTINTERNA  = 'N' OR DN.IDCSTINTERNA  = 'T')
                  AND (((DN.CDPAISORIG  = C_REGRAFISCAL.CDPAIS) AND (DN.SGESTAORIG = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFORIG = 'N' OR DN.IDTIPOORIGFISC = 'T')
                  AND (((DN.CDPAISDEST  = C_REGRAFISCAL.CDPAIS) AND (DN.SGESTADEST = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFDEST = 'N' OR DN.IDTIPODESTFISC = 'T')
                  AND (((DN.CDMUNIORIG  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'O') OR (DN.IDTIPOORIGFISC = 'T') OR ((DN.CDMUNIORIG IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'D'))) AND
                       ((DN.CDMUNIDEST  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'D') OR (DN.IDTIPODESTFISC = 'T') OR ((DN.CDMUNIDEST IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'O'))) OR
                       (C_REGRAFISCAL.IDUTMUNIORIG = 'N'))
                  AND DN.CDCLASFISC     = (SELECT MAX(D.CDCLASFISC)
                                             FROM DADOSFISCNCM D, PRODUTO P
                                            WHERE D.CDREGRAFISC    = V_CDREGRAFISC
                                              and P.CDARVPROD      = V_CDARVPROD
                                              AND D.CDIMPOSTO      = C_REGRAFISCAL.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_REGRAFISCAL.CDPAIS) AND (D.SGESTAORIG = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFORIG = 'N' OR D.IDTIPOORIGFISC = 'T')
                                              AND (((D.CDPAISDEST  = C_REGRAFISCAL.CDPAIS) AND (D.SGESTADEST = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFDEST = 'N' OR D.IDTIPODESTFISC = 'T')
                                              AND (((D.CDMUNIORIG  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'O') OR (D.IDTIPOORIGFISC = 'T') OR ((D.CDMUNIORIG IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'D'))) AND
                                                   ((D.CDMUNIDEST  = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'D') OR (D.IDTIPODESTFISC = 'T') OR ((D.CDMUNIDEST IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'O'))) OR
                                                    (C_REGRAFISCAL.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       := NULL;
                  V_CDBENEFFISCAL  := NULL;
                  V_ALIQFECP       := NULL;
                  V_ALIQDESONERADO := NULL;
                  V_CDNATUREC      := 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 parametrização Padrão*/
            BEGIN
               SELECT MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DR.VRALIQUOTA, '')) AS ALIQICMS,
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '80', DR.VRALIQUOTA, '')) AS ALIQST, 
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '50', DR.VRALIQUOTA, '')) AS ALIQPIS,
                      MAX(DECODE(C_REGRAFISCAL.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(DR.CDBENEFFISCAL) AS CDBENEFFISCAL,
                      MAX(DR.VRADICALIQFECP) AS VRADICALIQFECP,
                      MAX(DECODE(C_REGRAFISCAL.CDIMPOSTONFE, '00', DR.VRALIQUOTA+NVL(DR.VRADICALIQFECP,0), '')) AS VRALIQDESONERADO,
                      MAX(DR.CDNATUREC) AS CDNATUREC
                 INTO V_ALIQICMS, V_ALIQST, V_ALIQPIS, V_ALIQCOFINS, V_CDFISCAL, V_VRPERREDBC, V_CDCEST, V_IDPAGINA, V_TAMNIVEL,
                      V_CDBENEFFISCAL, V_ALIQFECP, V_ALIQDESONERADO, V_CDNATUREC
                 FROM DADOSFISCREGRA DR
                WHERE DR.CDREGRAFISC = V_CDREGRAFISC
                  AND DR.CDIMPOSTO   = C_REGRAFISCAL.CDIMPOSTO
                  AND (DR.IDCSTINTEREST = 'E' OR DR.IDCSTINTEREST = 'T')
                  AND (DR.IDCSTINTERNA  = 'N' OR DR.IDCSTINTERNA = 'T')
                  AND (((DR.CDPAISORIG = C_REGRAFISCAL.CDPAIS) AND (DR.SGESTAORIG = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFORIG = 'N' OR DR.IDTIPOORIGFISC = 'T')
                  AND (((DR.CDPAISDEST = C_REGRAFISCAL.CDPAIS) AND (DR.SGESTADEST = C_REGRAFISCAL.SGESTADO)) OR C_REGRAFISCAL.IDUTUFORIG = 'N' OR DR.IDTIPODESTFISC = 'T')
                  AND (((DR.CDMUNIORIG = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'O') OR (DR.IDTIPOORIGFISC = 'T') OR ((DR.CDMUNIORIG IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'D'))) AND
                       ((DR.CDMUNIDEST = C_REGRAFISCAL.CDMUNICIPIO AND C_REGRAFISCAL.IDUTMUNIORIG = 'D') OR (DR.IDTIPODESTFISC = 'T') OR ((DR.CDMUNIDEST IS NULL) AND (C_REGRAFISCAL.IDUTMUNIORIG = 'O'))) OR
                       (C_REGRAFISCAL.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       := NULL;
                  V_CDBENEFFISCAL  := NULL;
                  V_ALIQFECP       := NULL;
                  V_ALIQDESONERADO := NULL;
                  V_CDNATUREC      := NULL;
            END;
         END IF;

         V_IDTPIMPOSFIS :=  C_REGRAFISCAL.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;

            /*VERIFICA SE EXISTE PARAMETRIZAÇÃO DO ICMS ST PARA O PRODUTO, NESSE CASO ELA TEM PRIORIDADE SOBRE O ISENTO E NÃO INCIDÊNCIA*/
            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_REGRAFISCAL.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 É REPLICAR*/
               V_BOREPLICA := TRUE;
               /*O ICMS TRIBUTADO TEM PRIORIDADE SOBRE O ICMS ST, A NÃO SER QUE O CADASTRO DO ST SEJA MAIS ESPECÍFICO*/
               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 PÁGINA, VERIFICA O CADASTRO DE NÍVEL 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 NÃO INCIDÊNCIA E ISENTO, A NÃO SER QUE O CADASTRO DE NÃO INCIDÊNCIA OU ISENTO SEJA MAIS ESPECÍFICO*/
               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 PÁGINA, VERIFICA O CADASTRO DE NÍVEL 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_REGRAFISCAL.CDEMPRESA, C_REGRAFISCAL.CDINSCESTA, C_REGRAFISCAL.CDFILIAL, C_REGRAFISCAL.CDCLIENTE, C_REGRAFISCAL.CDTIPOOPER,
                                   SYSDATE, V_CDARVPROD, C_REGRAFISCAL.CDPAIS, C_REGRAFISCAL.SGESTADO, C_REGRAFISCAL.CDPAIS, C_REGRAFISCAL.SGESTADO),
                         CST_ITEM (V_CDIMPOSREGRA, C_REGRAFISCAL.CDEMPRESA, C_REGRAFISCAL.CDINSCESTA, C_REGRAFISCAL.CDFILIAL, '', C_REGRAFISCAL.CDCLIENTE, C_REGRAFISCAL.CDTIPOOPER,
                                   SYSDATE, V_CDARVPROD, C_REGRAFISCAL.CDPAIS, C_REGRAFISCAL.SGESTADO, C_REGRAFISCAL.CDPAIS, C_REGRAFISCAL.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_REGRAFISCAL.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_REGRAFISCAL.CDCLIENTE
                           AND F.CDFILIAL      = C_REGRAFISCAL.CDFILIAL;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDGRUPOFISC := NULL; 
                     END;
                  END IF;
                  IF V_CDGRUPOFISC IS NULL THEN  /*VERIFICA SE HÁ GRUPO FISCAL  PARA A FILIAL*/
                     CONSULTA_GRUPOFISCAL('C', C_REGRAFISCAL.CDCLIENTE, C_REGRAFISCAL.CDFILIAL, 'S', C_REGRAFISCAL.CDTIPOOPER, V_CDGRUPOFISC);
                  END IF;

                  CONSULTA_CST_NFE('S', C_REGRAFISCAL.CDEMPRESA, V_CDARVPROD, C_REGRAFISCAL.CDINSCESTA, C_REGRAFISCAL.CDTIPOOPER, V_CDGRUPOFISC, '50', '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 É DO SIMPLES NACIONAL PARA BUSCAR O CSOSN*/
               SELECT NVL(MAX(CDSITUCRT), '3') CDSITUCRT
                 INTO V_CDSITUCRT
                 FROM PARAMEMPRESA
                WHERE CDEMPRESA = C_REGRAFISCAL.CDEMPRESA;

               IF (NVL(V_CDSITUCRT,'3') <> '3') AND (V_CDIMPOSTO IS NOT NULL) THEN
                  CONSULTA_GRUPOFISCAL('C', C_REGRAFISCAL.CDCLIENTE, C_REGRAFISCAL.CDFILIAL, 'S', C_REGRAFISCAL.CDTIPOOPER, V_CDGRUPOFISC);
                  CONSULTA_CSOSN('S', C_REGRAFISCAL.CDEMPRESA, V_CDARVPROD, C_REGRAFISCAL.CDINSCESTA,
                                 C_REGRAFISCAL.CDTIPOOPER, C_REGRAFISCAL.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 CÓDIGO CEST NO PRODUTO, CASO O MESMO NÃO ESTEJA CADASTRADO NA REGRA*/
                  IF V_CDCEST IS NULL THEN
                     SELECT P.CDCEST
                       INTO V_CDCEST
                       FROM PRODUTO P
                      WHERE P.CDPRODUTO = :NEW.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_REGRAFISCAL.CDFILIAL
                        AND A.CDPRODUTO = :NEW.CDPRODUTO;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDFILIAL  := NULL;
                        V_CDPRODUTO := NULL;
                  END;

                  IF V_CDBENEFFISCAL IS NULL THEN 
                     V_ALIQDESONERADO := NULL;
                  END IF;

                  IF (V_CDPRODUTO IS NULL) AND (V_CDFILIAL IS NULL) THEN
                     INSERT INTO ALIQIMPFIS
                        (CDFILIAL, CDPRODUTO, CDIMPOSTO, VRPEALIMPFIS, VRPERCREDUCAO, IDTPIMPOSFIS, IDINCIDEPISCOF, CDCFOPPFIS, CDCSTICMS,
                         CDREGRAIT, CDCEST, CDCBENEF, VRALIQFCP, VRALIQICMSDES)
                     VALUES
                        (C_REGRAFISCAL.CDFILIAL, :NEW.CDPRODUTO, V_CDIMPOSTO, TRUNC(V_ALIQPROD,2), NVL(V_VRPERREDBC,0), V_IDTPIMPOSFIS, 'N', V_CDCFOP, V_CDCSTCSOSN,
                         V_CDREGRAFISC, V_CDCEST, V_CDBENEFFISCAL, V_ALIQFECP, V_ALIQDESONERADO);
                  ELSE
                     UPDATE ALIQIMPFIS
                        SET VRPEALIMPFIS  = TRUNC(V_ALIQPROD,2),
                            VRPERCREDUCAO = NVL(V_VRPERREDBC,0),
                            CDIMPOSTO     = V_CDIMPOSTO,
                            CDREGRAIT     = V_CDREGRAFISC,
                            CDCFOPPFIS    = V_CDCFOP,
                            CDCSTICMS     = V_CDCSTCSOSN,
                            IDTPIMPOSFIS  = V_IDTPIMPOSFIS,
                            CDCEST        = V_CDCEST,
                            CDCBENEF      = V_CDBENEFFISCAL,
                            VRALIQFCP     = V_ALIQFECP,
                            VRALIQICMSDES = V_ALIQDESONERADO
                      WHERE CDFILIAL  = C_REGRAFISCAL.CDFILIAL
                        AND CDPRODUTO = :NEW.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    = V_CDREGRAFISC,
                            CDNATUREC      = V_CDNATUREC
                      WHERE CDFILIAL  = C_REGRAFISCAL.CDFILIAL
                        AND CDPRODUTO = :NEW.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    = V_CDREGRAFISC,
                            CDNATUREC      = V_CDNATUREC
                      WHERE CDFILIAL  = C_REGRAFISCAL.CDFILIAL
                        AND CDPRODUTO = :NEW.CDPRODUTO;
                  END IF;
               END IF;
            END IF;
         END IF;
      END LOOP;
   END IF;
END;
/

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