CREATE OR REPLACE PROCEDURE SYSTAX_IMPPARAM_FISCCENT(
   P_CDGRUPPRODCON IN VARCHAR2)
IS
   BO_OK BOOLEAN := FALSE;
   V_ICMS VARCHAR2(02);
   V_IPI VARCHAR2(02);
   V_PIS VARCHAR2(02);
   V_COFINS VARCHAR2(02);
   V_ICMSST VARCHAR2(02);
   V_NMGRUPIMPOSTO VARCHAR2(30) := 'GRUPO DE IMPOSTOS SYSTAX';
   V_CDREGRAFISC VARCHAR2(10);
   V_DSMENSREGRAFISC VARCHAR2(150);
   V_CDGRUPIMPOSTO VARCHAR2(10);
   V_EXISTEINFORMACAO VARCHAR2(05) := 'FALSE';
   V_CDGRUPPRODCON VARCHAR2(04); 
   V_DSGRUPPRODCON VARCHAR2(50);
   V_ERRO VARCHAR2(4000);
   FUNCTION CONCATENAR_TEXTO(P_TEXTO_01 IN VARCHAR2,
                             P_TEXTO_02 IN VARCHAR2) RETURN VARCHAR2
   IS
      V_TEXTO_CONCATENADO VARCHAR2(4000) := NULL;
   BEGIN
      V_TEXTO_CONCATENADO := P_TEXTO_01 || ' | ' || P_TEXTO_02;
      IF SUBSTR(V_TEXTO_CONCATENADO, 1, 3) = ' | ' THEN
         V_TEXTO_CONCATENADO := SUBSTR(V_TEXTO_CONCATENADO, 4, (LENGTH(V_TEXTO_CONCATENADO) - 3));
      END IF;
      IF SUBSTR(V_TEXTO_CONCATENADO, -3, 3) = ' | ' THEN
         V_TEXTO_CONCATENADO := SUBSTR(V_TEXTO_CONCATENADO, 1, (LENGTH(V_TEXTO_CONCATENADO) - 3));
      END IF;
      RETURN V_TEXTO_CONCATENADO;
   END;
   PROCEDURE ATUALIZA_REGISTRO(P_CDREGRAFISC VARCHAR2,
                               P_ICMS VARCHAR2,
                               P_IPI VARCHAR2,
                               P_PIS VARCHAR2,
                               P_COFINS VARCHAR2,
                               P_ICMSST VARCHAR2)
   IS
      V_ERRO VARCHAR2(4000) := NULL; 
      V_OBSERVACAO VARCHAR2(4000) := NULL;
      V_EXISTEREGISTRO VARCHAR2(05) := 'FALSE';
      V_NRSEQDADOSFISC INTEGER := 0;
      V_NRSEQDADOSFISCEXISTE INTEGER := 0;
      V_IDCSTINTEREST VARCHAR2(01);
   BEGIN
      FOR C_PRODUTO IN (SELECT S.ID_CENARIO, 
                               S.COD_PROD,
                               SUBSTR(S.CFOP, -3) CFOP,
                               S.CEST
                          FROM SYS_MATERIAL S, GRUPPRODCON G, CENARIOGRUP C, 
                               (SELECT PP.CDPRODUTO, PP.CDARVPROD 
                                  FROM PRODUTO PP,
                                       (SELECT P.CDPRODUTO, P.CDARVPROD 
                                          FROM ITGRUPPRODCON I, PRODUTO P
                                         WHERE P.CDPRODUTO = I.CDPRODUTO 
                                           AND I.CDGRUPPRODCON = P_CDGRUPPRODCON) A
                                 WHERE SUBSTR(PP.CDARVPROD, 0, LENGTH(A.CDARVPROD)) = A.CDARVPROD 
                                   AND PP.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) 
                                                           FROM PRODUTO)) A
                         WHERE S.COD_PROD = A.CDARVPROD 
                           AND C.ID_CENARIO = S.ID_CENARIO
                           AND C.CDGRUPPRODCON = G.CDGRUPPRODCON
                           AND G.CDGRUPPRODCON = P_CDGRUPPRODCON
                         GROUP BY S.ID_CENARIO, 
                               S.COD_PROD,
                               CFOP,
                               S.CEST)
      LOOP
         --GRAVANDO INFORMACOES DOS IMPOSTOS
         FOR C_IMPOSTO IN (SELECT *
                             FROM (SELECT C.ID_CENARIO,
                                          PR.CDPRODUTO,
                                          P_ICMS AS CDIMPOSTO,
                                          '00' AS CDIMPOSTONFE,
                                          M.COD_PROD,
                                          '0055' AS PAIS_ORIGEM,
                                          C.UF_ORIGEM,
                                          '0055' AS PAIS_DESTINO,
                                          C.UF_DESTINO,
                                          I.ALIQUOTA,
                                          I.CST,
                                          NRSEQIMP,
                                          VIG_DE,
                                          VIG_ATE,
                                          P_RED_BC AS REDUCAO_BC,
                                          NVL(FCP, 0) FCP,
                                          NULL AS MVA_BC,
                                          NULL AS CENQ,
                                          I.INF_ADICIONAIS
                                     FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                        JOIN SYS_ICMS I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                       AND (M.COD_PROD = I.COD_PROD)
                                                        JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                    WHERE ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                      AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                      AND M.COD_PROD = C_PRODUTO.COD_PROD
                                      AND NVL(I.ALIQUOTA, 0) >= 0
                                      AND LENGTH(I.CST) = 2
                                      AND I.CST IS NOT NULL
                                    UNION ALL
                                   SELECT C.ID_CENARIO,
                                          PR.CDPRODUTO,
                                          P_IPI AS CDIMPOSTO,
                                          '10' AS CDIMPOSTONFE,
                                          M.COD_PROD,
                                          '0055' AS PAIS_ORIGEM,
                                          C.UF_ORIGEM,
                                          '0055' AS PAIS_DESTINO,
                                          C.UF_DESTINO,
                                          I.ALIQUOTA,
                                          I.CST,
                                          NRSEQIMP,
                                          VIG_DE,
                                          VIG_ATE,
                                          P_RED_BC AS REDUCAO_BC,
                                          0 AS FCP,
                                          NULL AS MVA_BC,
                                          I.CENQ AS CENQ,
                                          I.INF_ADICIONAIS
                                     FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                        JOIN SYS_IPI I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                      AND (M.COD_PROD = I.COD_PROD)
                                                        JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                    WHERE ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                      AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                      AND M.COD_PROD = C_PRODUTO.COD_PROD
                                      AND NVL(I.ALIQUOTA, 0) >= 0
                                      AND LENGTH(I.CST) = 2
                                      AND I.CST IS NOT NULL
                                    UNION ALL
                                   SELECT C.ID_CENARIO,
                                          PR.CDPRODUTO,
                                          P_PIS AS CDIMPOSTO,
                                          '50' AS CDIMPOSTONFE,
                                          M.COD_PROD,
                                          '0055' AS PAIS_ORIGEM,
                                          C.UF_ORIGEM,
                                          '0055' AS PAIS_DESTINO,
                                          C.UF_DESTINO,
                                          I.ALIQUOTA,
                                          I.CST,
                                          NRSEQIMP,
                                          VIG_DE,
                                          VIG_ATE,
                                          P_RED_BC AS REDUCAO_BC,
                                          0 AS FCP,
                                          NULL AS MVA_BC,
                                          NULL AS CENQ,
                                          I.INF_ADICIONAIS
                                     FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                        JOIN SYS_PIS I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                      AND (M.COD_PROD = I.COD_PROD)
                                                        JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                    WHERE ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                      AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                      AND M.COD_PROD = C_PRODUTO.COD_PROD
                                      AND NVL(I.ALIQUOTA, 0) >= 0
                                      AND LENGTH(I.CST) = 2
                                      AND I.CST IS NOT NULL
                                    UNION ALL
                                   SELECT C.ID_CENARIO,
                                          PR.CDPRODUTO,
                                          P_COFINS AS CDIMPOSTO,
                                          '60' AS CDIMPOSTONFE,
                                          M.COD_PROD,
                                          '0055' AS PAIS_ORIGEM,
                                          C.UF_ORIGEM,
                                          '0055' AS PAIS_DESTINO,
                                          C.UF_DESTINO,
                                          I.ALIQUOTA,
                                          I.CST,
                                          NRSEQIMP,
                                          VIG_DE,
                                          VIG_ATE,
                                          P_RED_BC AS REDUCAO_BC,
                                          0 AS FCP,
                                          NULL AS MVA_BC,
                                          NULL AS CENQ,
                                          I.INF_ADICIONAIS
                                     FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                        JOIN SYS_COFINS I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                         AND (M.COD_PROD = I.COD_PROD)
                                                        JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                    WHERE ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                      AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                      AND M.COD_PROD = C_PRODUTO.COD_PROD
                                      AND NVL(I.ALIQUOTA, 0) >= 0
                                      AND LENGTH(I.CST) = 2
                                      AND I.CST IS NOT NULL
                                    UNION ALL
                                   SELECT C.ID_CENARIO,
                                          PR.CDPRODUTO,
                                          P_ICMSST AS CDIMPOSTO,
                                          '80' AS CDIMPOSTONFE,
                                          M.COD_PROD,
                                          '0055' AS PAIS_ORIGEM,
                                          C.UF_ORIGEM,
                                          '0055' AS PAIS_DESTINO,
                                          C.UF_DESTINO,
                                          I.ALIQUOTA_ST AS ALIQUOTA,
                                          IC.CST AS CST,
                                          I.NRSEQIMP,
                                          I.VIG_DE,
                                          I.VIG_ATE,
                                          P_RED_BC_ST AS REDUCAO_BC,
                                          NVL(I.FCP, 0) AS FCP,
                                          I.MVA AS MVA_BC,
                                          NULL AS CENQ,
                                          NULL AS INF_ADICIONAIS
                                     FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                        JOIN SYS_ICMSST I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                         AND (M.COD_PROD = I.COD_PROD)
                                                        JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                                        JOIN SYS_ICMS IC ON (M.ID_CENARIO = IC.ID_CENARIO)
                                                                        AND (M.COD_PROD = IC.COD_PROD)
                                    WHERE ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                      AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                      AND M.COD_PROD = C_PRODUTO.COD_PROD
                                      AND NVL(I.ALIQUOTA_ST, 0) >= 0
                                      AND LENGTH(IC.CST) = 2
                                      AND IC.CST IS NOT NULL
                                    UNION ALL
                                    --BUSCANDO INFORMACOES PARA CALCULO DO DIFAL
                                    SELECT   C.ID_CENARIO,
                                             PR.CDPRODUTO,
                                             P_ICMS AS CDIMPOSTO,
                                             '00' AS CDIMPOSTONFE,
                                             M.COD_PROD,
                                             '0055' AS PAIS_ORIGEM,
                                             C.UF_DESTINO AS UF_ORIGEM,
                                             '0055' AS PAIS_DESTINO,
                                             C.UF_DESTINO AS UF_DESTINO,
                                             I.ALIQ_INT_UF_DEST AS ALIQUOTA,
                                             I.CST_UF_DEST AS CST,
                                             NRSEQIMP,
                                             I.VIG_DE_UF_DEST AS VIG_DE,
                                             I.VIG_ATE_UF_DEST AS VIG_ATE,
                                             RED_BC_ST_UF_DEST AS REDUCAO_BC,
                                             NVL(FCP_UF_DEST, 0) AS FCP,
                                             NULL AS MVA_BC,
                                             NULL AS CENQ,
                                             null AS INF_ADICIONAIS
                                       FROM SYS_CENARIO C JOIN SYS_MATERIAL M ON (C.ID_CENARIO = M.ID_CENARIO)
                                                         JOIN SYS_ICMS I ON (M.ID_CENARIO = I.ID_CENARIO)
                                                                        AND (M.COD_PROD = I.COD_PROD)
                                                         JOIN PRODUTO PR ON (M.COD_PROD = PR.CDARVPROD)
                                       WHERE CST_UF_DEST IS NOT   NULL
                                       AND ((I.IDIMPORTA IS NULL) OR (I.IDIMPORTA = 'E'))
                                       AND M.ID_CENARIO = C_PRODUTO.ID_CENARIO
                                       AND M.COD_PROD = C_PRODUTO.COD_PROD
                                       AND NVL(I.ALIQ_INT_UF_DEST, 0) >= 0
                                       AND LENGTH(I.CST_UF_DEST) = 2)
                            ORDER BY ID_CENARIO,
                                  COD_PROD,
                                  NRSEQIMP,
                                  VIG_DE)
         LOOP
            V_ERRO := NULL;
            V_OBSERVACAO := NULL;
            BEGIN
               SELECT NRSEQDADOSFISC,
                      CASE COUNT(*) WHEN 0 THEN 'FALSE' ELSE 'TRUE' END
                 INTO V_NRSEQDADOSFISCEXISTE,
                      V_EXISTEREGISTRO
                 FROM DADOSFISCPROD
                WHERE CDREGRAFISC = P_CDREGRAFISC
                  AND CDIMPOSTO = C_IMPOSTO.CDIMPOSTO
                  AND CDPRODUTO = C_IMPOSTO.CDPRODUTO
                  AND NVL(CDPAISORIG, 'XXXXX') = NVL(C_IMPOSTO.PAIS_ORIGEM, 'XXXXX')
                  AND NVL(SGESTAORIG, 'XXXXX') = NVL(C_IMPOSTO.UF_ORIGEM, 'XXXXX')
                  AND NVL(CDPAISDEST, 'XXXXX') = NVL(C_IMPOSTO.PAIS_DESTINO, 'XXXXX')
                  AND NVL(SGESTADEST, 'XXXXX') = NVL(C_IMPOSTO.UF_DESTINO, 'XXXXX')
                GROUP BY NRSEQDADOSFISC;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_NRSEQDADOSFISCEXISTE := 0;
                  V_EXISTEREGISTRO := 'FALSE';
               END;
            END;
            IF V_EXISTEREGISTRO = 'FALSE' THEN
               V_OBSERVACAO := CONCATENAR_TEXTO(V_OBSERVACAO, 'INFORMACAO ADICIONADA COM SUCESSO NA REGRA FISCAL ' || P_CDREGRAFISC || ' NA TABELA DADOS POR PRODUTO');
            ELSE
               V_OBSERVACAO := CONCATENAR_TEXTO(V_OBSERVACAO, 'INFORMACAO ATUALIZADA PARA O IMPOSTO JA IMPORTADO NA REGRA FISCAL ' || P_CDREGRAFISC || ' NA TABELA DADOS POR PRODUTO');
            END IF;
            IF TRUNC(SYSDATE) < TRUNC(C_IMPOSTO.VIG_DE) THEN
               V_ERRO := CONCATENAR_TEXTO(V_ERRO, 'DATA DO INICIO DA VIGENCIA SUPERIOR A DATA DE IMPORTACAO (VIGENCIA ' || TO_CHAR(TRUNC(C_IMPOSTO.VIG_DE), 'DD/MM/YYYY') || ' - IMPORTACAO ' || TO_CHAR(TRUNC(SYSDATE), 'DD/MM/YYYY') || ')');
            END IF;
            IF C_IMPOSTO.CDIMPOSTONFE = '00' THEN
               UPDATE SYS_ICMS
                  SET IDIMPORTA = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN 'A' ELSE 'E' END,
                      ERRO = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN TRIM(V_OBSERVACAO) ELSE TRIM(V_ERRO) END
                WHERE ID_CENARIO = C_IMPOSTO.ID_CENARIO
                  AND COD_PROD = C_IMPOSTO.COD_PROD
                  AND NRSEQIMP = C_IMPOSTO.NRSEQIMP;
            ELSIF C_IMPOSTO.CDIMPOSTONFE = '10' THEN
               UPDATE SYS_IPI
                  SET IDIMPORTA = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN 'A' ELSE 'E' END,
                      ERRO = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN TRIM(V_OBSERVACAO) ELSE TRIM(V_ERRO) END
                WHERE ID_CENARIO = C_IMPOSTO.ID_CENARIO
                  AND COD_PROD = C_IMPOSTO.COD_PROD
                  AND NRSEQIMP = C_IMPOSTO.NRSEQIMP;
            ELSIF C_IMPOSTO.CDIMPOSTONFE = '50' THEN
               UPDATE SYS_PIS
                  SET IDIMPORTA = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN 'A' ELSE 'E' END,
                      ERRO = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN TRIM(V_OBSERVACAO) ELSE TRIM(V_ERRO) END
                WHERE ID_CENARIO = C_IMPOSTO.ID_CENARIO
                  AND COD_PROD = C_IMPOSTO.COD_PROD
                  AND NRSEQIMP = C_IMPOSTO.NRSEQIMP;
            ELSIF C_IMPOSTO.CDIMPOSTONFE = '60' THEN
               UPDATE SYS_COFINS
                  SET IDIMPORTA = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN 'A' ELSE 'E' END,
                      ERRO = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN TRIM(V_OBSERVACAO) ELSE TRIM(V_ERRO) END
                WHERE ID_CENARIO = C_IMPOSTO.ID_CENARIO
                  AND COD_PROD = C_IMPOSTO.COD_PROD
                  AND NRSEQIMP = C_IMPOSTO.NRSEQIMP;
            ELSIF C_IMPOSTO.CDIMPOSTONFE = '80' THEN
               UPDATE SYS_ICMSST
                  SET IDIMPORTA = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN 'A' ELSE 'E' END,
                      ERRO = CASE NVL(V_ERRO, 'XXXXX') WHEN 'XXXXX' THEN TRIM(V_OBSERVACAO) ELSE TRIM(V_ERRO) END
                WHERE ID_CENARIO = C_IMPOSTO.ID_CENARIO
                  AND COD_PROD = C_IMPOSTO.COD_PROD
                  AND NRSEQIMP = C_IMPOSTO.NRSEQIMP;
            END IF;
            IF V_ERRO IS NULL THEN
               IF (C_IMPOSTO.UF_ORIGEM IS NULL) OR (C_IMPOSTO.UF_DESTINO IS NULL) THEN
                  V_IDCSTINTEREST := 'T';
               ELSIF (C_IMPOSTO.UF_ORIGEM = C_IMPOSTO.UF_DESTINO) THEN
                  V_IDCSTINTEREST := 'E';
               ELSE
                  V_IDCSTINTEREST := 'I';
               END IF;
               IF V_EXISTEREGISTRO = 'FALSE' THEN
                  V_NRSEQDADOSFISC := V_NRSEQDADOSFISC + 1;
                  INSERT INTO DADOSFISCPROD
                     (CDREGRAFISC, 
                      CDIMPOSTO, 
                      CDPRODUTO, 
                      NRSEQDADOSFISC, 
                      CDFISCAL,
                      CDPAISORIG, 
                      SGESTAORIG, 
                      CDPAISDEST, 
                      SGESTADEST, 
                      VRALIQUOTA,
                      IDMODBCNFE, 
                      IDMODBCSTNFE, 
                      IDMOTIDESSTNFE, 
                      IDPMCBASECA, 
                      IDCSTINTEREST,
                      IDCSTINTERNA, 
                      IDTIPODESTFISC, 
                      IDTIPOORIGFISC, 
                      IDDIFEALIQ, 
                      IDDIFALIQCUSPR, 
                      IDORIGEMPRODIMP,
                      CDSITUTRIB,
                      CDFISCOPER, 
                      CDCEST,
                      VRPERREDBC,
                      VRADICALIQFECP,
                      VRPBCSUBTRIB,
                      CDENQLEGALIPI,
                      IDCENARIO)
                  VALUES
                     (P_CDREGRAFISC, 
                      C_IMPOSTO.CDIMPOSTO, 
                      C_IMPOSTO.CDPRODUTO, 
                      LPAD(V_NRSEQDADOSFISC, 10, '0'), 
                      '1',
                      C_IMPOSTO.PAIS_ORIGEM, 
                      C_IMPOSTO.UF_ORIGEM, 
                      C_IMPOSTO.PAIS_DESTINO, 
                      C_IMPOSTO.UF_DESTINO, 
                      C_IMPOSTO.ALIQUOTA,
                      '3', 
                      '4', 
                      '9', 
                      'N', 
                      V_IDCSTINTEREST,
                      'T', 
                      'E', 
                      'E', 
                      'N', 
                      'N', 
                      'N',
                      C_IMPOSTO.CST,
                      C_PRODUTO.CFOP,
                      C_PRODUTO.CEST,
                      C_IMPOSTO.REDUCAO_BC,
                      C_IMPOSTO.FCP,
                      C_IMPOSTO.MVA_BC,
                      C_IMPOSTO.CENQ,
                      C_IMPOSTO.ID_CENARIO);
                  IF C_IMPOSTO.INF_ADICIONAIS IS NOT NULL  AND LENGTH(C_IMPOSTO.INF_ADICIONAIS) <= 500 THEN
                     INSERT INTO MSGFISCPROD
                        (
                           CDREGRAFISC,
                           CDPRODUTO,
                           CDIMPOSTO,
                           NRSEQDADOSFISC,
                           NRSEQMSG,
                           DSMENSAGEM
                        )
                     
                     VALUES 
                        (
                        P_CDREGRAFISC,
                        C_IMPOSTO.CDPRODUTO,
                        C_IMPOSTO.CDIMPOSTO,
                        LPAD(V_NRSEQDADOSFISC, 10, '0'),
                        '0001',
                        C_IMPOSTO.INF_ADICIONAIS
                        );
                  END IF;
               ELSE
                  UPDATE DADOSFISCPROD
                     SET CDFISCAL = '1',
                         CDPAISORIG = C_IMPOSTO.PAIS_ORIGEM, 
                         SGESTAORIG = C_IMPOSTO.UF_ORIGEM, 
                         CDPAISDEST = C_IMPOSTO.PAIS_DESTINO, 
                         SGESTADEST = C_IMPOSTO.UF_DESTINO, 
                         VRALIQUOTA = C_IMPOSTO.ALIQUOTA,
                         IDMODBCNFE = '3', 
                         IDMODBCSTNFE = '4', 
                         IDMOTIDESSTNFE = '9', 
                         IDPMCBASECA = 'N', 
                         IDCSTINTEREST = V_IDCSTINTEREST,
                         IDCSTINTERNA = 'T', 
                         IDTIPODESTFISC = 'E', 
                         IDTIPOORIGFISC = 'E', 
                         IDDIFEALIQ = 'N', 
                         IDDIFALIQCUSPR = 'N', 
                         IDORIGEMPRODIMP = 'N',
                         CDSITUTRIB = C_IMPOSTO.CST,
                         CDFISCOPER = C_PRODUTO.CFOP, 
                         CDCEST = C_PRODUTO.CEST,
                         VRPERREDBC = C_IMPOSTO.REDUCAO_BC,
                         VRADICALIQFECP = C_IMPOSTO.FCP,
                         VRPBCSUBTRIB = C_IMPOSTO.MVA_BC,
                         CDENQLEGALIPI = C_IMPOSTO.CENQ,
                         IDCENARIO = C_IMPOSTO.ID_CENARIO
                   WHERE CDREGRAFISC = P_CDREGRAFISC 
                     AND CDIMPOSTO = C_IMPOSTO.CDIMPOSTO
                     AND CDPRODUTO = C_IMPOSTO.CDPRODUTO
                     AND NRSEQDADOSFISC = V_NRSEQDADOSFISCEXISTE;
                  IF C_IMPOSTO.INF_ADICIONAIS IS NOT NULL AND LENGTH(C_IMPOSTO.INF_ADICIONAIS) <= 500 THEN 
                     UPDATE MSGFISCPROD
                     SET 
                           DSMENSAGEM = C_IMPOSTO.INF_ADICIONAIS
                     WHERE 
                           CDREGRAFISC = P_CDREGRAFISC
                           AND CDPRODUTO = C_IMPOSTO.CDPRODUTO 
                           AND CDIMPOSTO = C_IMPOSTO.CDIMPOSTO
                           AND NRSEQDADOSFISC = LPAD(V_NRSEQDADOSFISC, 10, '0')
                           AND NRSEQMSG = '0001'
                           AND DSMENSAGEM = C_IMPOSTO.INF_ADICIONAIS;
                  END IF;
               END IF;
            END IF;
            COMMIT;
         END LOOP;
      END LOOP;
   END;
BEGIN
   -- IMPOSTO ICMS
   BEGIN
      SELECT MIN(CDIMPOSTO)
        INTO V_ICMS
        FROM IMPOSTO
       WHERE CDIMPOSTONFE = '00';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_ICMS := NULL;
      END;
   END;
   -- IMPOSTO IPI
   BEGIN
      SELECT MIN(CDIMPOSTO)
        INTO V_IPI
        FROM IMPOSTO
       WHERE CDIMPOSTONFE = '10';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_IPI := NULL;
      END;
   END;
   -- IMPOSTO PIS
   BEGIN
      SELECT MIN(CDIMPOSTO)
        INTO V_PIS
        FROM IMPOSTO
       WHERE CDIMPOSTONFE = '50';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_PIS := NULL;
      END;
   END;
   -- IMPOSTO COFINS
   BEGIN
      SELECT MIN(CDIMPOSTO)
        INTO V_COFINS
        FROM IMPOSTO
       WHERE CDIMPOSTONFE = '60';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_COFINS := NULL;
      END;
   END;
   -- IMPOSTO ICMS-ST
   BEGIN
      SELECT MIN(CDIMPOSTO)
        INTO V_ICMSST
        FROM IMPOSTO
       WHERE CDIMPOSTONFE = '80';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_ICMSST := NULL;
      END;
   END;
   V_EXISTEINFORMACAO := 'FALSE';
   BEGIN
      SELECT CASE COUNT(*) WHEN 0 THEN 'FALSE' ELSE 'TRUE' END
        INTO V_EXISTEINFORMACAO
        FROM SYS_REGRAGRUP
       WHERE CDGRUPPRODCON = P_CDGRUPPRODCON;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_EXISTEINFORMACAO := 'FALSE';
      END;
   END;
   IF V_EXISTEINFORMACAO = 'TRUE' THEN
      FOR C_REGRAGRUPO IN (SELECT S.CDREGRA, 
                                  R.CDGRUPIMPOSTO
                             FROM SYS_REGRAGRUP S JOIN REGRAFISCAL R ON (S.CDREGRA = R.CDREGRAFISC)
                            WHERE S.CDGRUPPRODCON = P_CDGRUPPRODCON
                            ORDER BY S.CDREGRA)
      LOOP
         INSERT INTO IMPREGRAFISCAL
            (CDREGRAFISC, 
             CDIMPOSTO)
         (SELECT C_REGRAGRUPO.CDREGRA,
                 I.CDIMPOSTO
            FROM IMPOSTO I
           WHERE I.CDIMPOSTO IN (V_ICMS, V_IPI, V_PIS, V_COFINS, V_ICMSST)
             AND NOT EXISTS (SELECT IP.CDIMPOSTO
                               FROM IMPREGRAFISCAL IP
                              WHERE I.CDIMPOSTO = IP.CDIMPOSTO
                                AND IP.CDREGRAFISC = C_REGRAGRUPO.CDREGRA));
         COMMIT;
         ATUALIZA_REGISTRO(C_REGRAGRUPO.CDREGRA,
                           V_ICMS,
                           V_IPI,
                           V_PIS,
                           V_COFINS,
                           V_ICMSST);
         DELETE
           FROM IMPREGRAFISCAL I
          WHERE I.CDREGRAFISC = C_REGRAGRUPO.CDREGRA
            AND NOT EXISTS(SELECT D.CDIMPOSTO
                             FROM DADOSFISCPROD D
                            WHERE I.CDIMPOSTO = D.CDIMPOSTO
                              AND I.IDORIGEMPRODIMP = D.IDORIGEMPRODIMP
                              AND D.CDREGRAFISC = C_REGRAGRUPO.CDREGRA
                            GROUP BY D.CDIMPOSTO);
         COMMIT;
      END LOOP;
   ELSE
      BEGIN
         SELECT CDGRUPIMPOSTO
           INTO V_CDGRUPIMPOSTO
           FROM AGRUPIMPOSTO
          WHERE NMGRUPIMPOSTO = V_NMGRUPIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_CDGRUPIMPOSTO := NULL;
         END;
      END;
      -- INSERIR GRUPO DE IMPOSTOS --
      IF (V_CDGRUPIMPOSTO IS NULL) THEN
         BEGIN
            SELECT LPAD(NVL(MAX(TO_NUMBER(CDGRUPIMPOSTO)), 0) + 1, 10,'0') 
              INTO V_CDGRUPIMPOSTO
              FROM AGRUPIMPOSTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
               V_CDGRUPIMPOSTO := '0000000001';
            END;
         END;
         -- INSERE AGRUPAMENTO
         INSERT INTO AGRUPIMPOSTO
            (CDGRUPIMPOSTO, NMGRUPIMPOSTO)
         VALUES
            (V_CDGRUPIMPOSTO, V_NMGRUPIMPOSTO);      
         INSERT INTO ITAGRUPIMPOSTO
            (CDGRUPIMPOSTO, 
             CDIMPOSTO)
         (SELECT V_CDGRUPIMPOSTO, 
                 CDIMPOSTO
            FROM IMPOSTO
           WHERE CDIMPOSTO IN (V_ICMS, V_IPI, V_PIS, V_COFINS, V_ICMSST));
         COMMIT;
         BO_OK := TRUE;
      ELSE
         BO_OK := TRUE;
      END IF;
      IF BO_OK THEN
         BO_OK := FALSE;
         BEGIN
            SELECT CDGRUPPRODCON, 
                   DSGRUPPRODCON
              INTO V_CDGRUPPRODCON, 
                   V_DSGRUPPRODCON
              FROM GRUPPRODCON
             WHERE CDGRUPPRODCON = P_CDGRUPPRODCON;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
               V_CDGRUPPRODCON := NULL; 
               V_DSGRUPPRODCON := NULL;
            END;
         END;
         IF V_CDGRUPPRODCON IS NOT NULL THEN
            V_DSMENSREGRAFISC := 'GRUPO DE PRODUTOS PARA CONSULTORIA FISCAL: ' || V_CDGRUPPRODCON;
            BEGIN
               SELECT CDREGRAFISC
                 INTO V_CDREGRAFISC
                 FROM REGRAFISCAL
                WHERE DSMENSREGRAFISC = V_DSMENSREGRAFISC;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_CDREGRAFISC := NULL;
               END;
            END;
            IF V_CDREGRAFISC IS NULL THEN
               BEGIN
                  SELECT LPAD(NVL(MAX(TO_NUMBER(CDREGRAFISC)), 0) + 1, 10, '0')
                    INTO V_CDREGRAFISC
                    FROM REGRAFISCAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_CDREGRAFISC := '0000000001';
                  END;
               END;
               INSERT INTO REGRAFISCAL
                  (CDREGRAFISC, 
                   NMREGRAFISC, 
                   CDGRUPIMPOSTO, 
                   DTVALREGRAFISC, 
                   IDATIVREGRAFISC, 
                   IDUTGRUPOFISCAL, 
                   DSMENSREGRAFISC)
               VALUES
                  (V_CDREGRAFISC, 
                   V_DSGRUPPRODCON, 
                   V_CDGRUPIMPOSTO, 
                   TRUNC(SYSDATE), 
                   'N', 
                   'N', 
                   V_DSMENSREGRAFISC);
               INSERT INTO IMPREGRAFISCAL
                  (CDREGRAFISC, 
                   CDIMPOSTO, 
                   IDIMPOBRIGREGRA)
               (SELECT V_CDREGRAFISC, 
                       CDIMPOSTO, 
                       'S'
                  FROM ITAGRUPIMPOSTO
                 WHERE CDGRUPIMPOSTO = V_CDGRUPIMPOSTO);
               INSERT INTO SYS_REGRAGRUP
                  (CDGRUPPRODCON, 
                   CDREGRA) 
               VALUES 
                  (P_CDGRUPPRODCON, 
                   V_CDREGRAFISC);
               COMMIT;
               BO_OK := TRUE;
            ELSE
               BO_OK := TRUE;
            END IF;
            IF BO_OK THEN
               ATUALIZA_REGISTRO(V_CDREGRAFISC,
                                 V_ICMS,
                                 V_IPI,
                                 V_PIS,
                                 V_COFINS,
                                 V_ICMSST);
            END IF;
         END IF;
      END IF;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('SYSTAX_IMPPARAM_FISCCENT','6.35.033'); END;
/
