CREATE OR REPLACE PROCEDURE SYSTAX_IMPPARAM_FISCCENT(P_ID_CENARIO IN VARCHAR2, P_COD_PROD IN VARCHAR2)
IS
   V_CDGRUPIMPOSTO VARCHAR2(10);
   V_NMGRUPIMPOSTO VARCHAR2(30) := 'GRUPO SYSTAX';
   
   V_APELIDO    VARCHAR2(50);
   V_UF_ORIGEM  VARCHAR2(2);
   V_UF_DESTINO VARCHAR2(2);
   V_DIAS_FUT   VARCHAR2(3);
   
   V_ICMS       VARCHAR2(2);
   V_PIS        VARCHAR2(2);
   V_COFINS     VARCHAR2(2);
   
   V_CDREGRAFISC VARCHAR2(10);
   V_DTVALREGRAFISC DATE;
   
   V_N         VARCHAR2(1) := 'N';  -- VALOR FIXO 'N'
   V_CDFISCAL  VARCHAR2 (1) := '1'; -- VALOR FIXO '1'?
   V_ERRO      VARCHAR2(4000);      -- CAPTURA EXCEAAFO
   V_CONT      INTEGER;
   V_CDPRODUTO VARCHAR2(10);
   
   V_COD_PROD VARCHAR2(120);
   V_CFOP     VARCHAR2(10);
   V_CEST     VARCHAR2(10);
      
   BO_INSERE  BOOLEAN;
   BO_ERRO    BOOLEAN;
   V_NRSEQDADOSFISC INTEGER;
   V_PRODUTO  VARCHAR2(120);
   
   -- INFORMAAAES DO PRODUTO
   V_CST       VARCHAR2(3);
   V_CDCEST    VARCHAR2(10);
   V_BC_COMPOS INTEGER;
   V_ALIQUOTA  FLOAT;
   V_P_RED_BC  VARCHAR2(20);
   V_VIG_DE    DATE;
   V_VIG_ATE   DATE;
   V_CDIMPOSTO VARCHAR2(2);
   
   V_CDSITUTRIB VARCHAR2(2);
   V_IDCSTINTER VARCHAR2(1);
   
   CURSOR C_MATERIAIS(C_COD_PROD IN VARCHAR2) IS
      SELECT COD_PROD, SUBSTR(CFOP, -3) CFOP, CEST
        FROM SYS_MATERIAL
       WHERE ID_CENARIO = P_ID_CENARIO
         AND COD_PROD   = NVL(C_COD_PROD, COD_PROD)
         AND IDIMPORTA IS NULL;
   
   CURSOR C_IMPOSTOS(C_COD_PROD IN VARCHAR2, C_ICMS IN VARCHAR2, C_PIS IN VARCHAR2, C_COFINS IN VARCHAR2) IS
      SELECT CST, BC_COMPOS, ALIQUOTA, P_RED_BC, VIG_DE, VIG_ATE, C_ICMS AS CDIMPOSTO
        FROM SYS_ICMS
       WHERE ID_CENARIO = P_ID_CENARIO
         AND COD_PROD   = C_COD_PROD
       UNION ALL
      SELECT CST, BC_COMPOS, ALIQUOTA, P_RED_BC, VIG_DE, VIG_ATE, C_PIS AS CDIMPOSTO
        FROM SYS_PIS
       WHERE ID_CENARIO = P_ID_CENARIO
         AND COD_PROD   = C_COD_PROD
       UNION ALL
      SELECT CST, BC_COMPOS, ALIQUOTA, P_RED_BC, VIG_DE, VIG_ATE, C_COFINS AS CDIMPOSTO
        FROM SYS_COFINS
       WHERE ID_CENARIO = P_ID_CENARIO
         AND COD_PROD   = C_COD_PROD;
BEGIN
   SELECT SUBSTR(APELIDO, 1, 50) APELIDO, UF_ORIGEM, UF_DESTINO, NVL(DIAS_FUT, '0') DIAS_FUT
     INTO V_APELIDO, V_UF_ORIGEM, V_UF_DESTINO, V_DIAS_FUT
     FROM SYS_CENARIO
    WHERE ID_CENARIO = P_ID_CENARIO;
   
   IF (TO_NUMBER(V_DIAS_FUT) > 0) THEN
      SELECT SYSDATE + '30' 
        INTO V_DTVALREGRAFISC
        FROM DUAL;
   ELSE
      V_DTVALREGRAFISC := SYSDATE;
   END IF;
   
   IF (V_UF_ORIGEM IS NULL) OR (V_UF_DESTINO IS NULL) THEN
      V_IDCSTINTER := 'T';
   ELSIF (V_UF_ORIGEM = V_UF_DESTINO) THEN
      V_IDCSTINTER := 'E';
   ELSE
      V_IDCSTINTER := 'I';
   END IF;
   
   BO_INSERE := FALSE;
   -- IMPOSTO ICMS
   SELECT MIN(CDIMPOSTO)
     INTO V_ICMS
     FROM IMPOSTO
    WHERE CDIMPOSTONFE = '00';
   
   -- IMPOSTO PIS
   SELECT MIN(CDIMPOSTO)
     INTO V_PIS
     FROM IMPOSTO
    WHERE CDIMPOSTONFE = '50';
   
   -- IMPOSTO COFINS
   SELECT MIN(CDIMPOSTO)
     INTO V_COFINS
     FROM IMPOSTO
    WHERE CDIMPOSTONFE = '60';
   
   BEGIN
      SELECT MIN(CDGRUPIMPOSTO) 
        INTO V_CDGRUPIMPOSTO
        FROM (SELECT CDGRUPIMPOSTO, COUNT(1)
                FROM ITAGRUPIMPOSTO
               WHERE (CDIMPOSTO IN (SELECT CDIMPOSTO
                                      FROM IMPOSTO
                                     WHERE CDIMPOSTONFE IN (V_ICMS, V_PIS, V_COFINS)))
              GROUP BY CDGRUPIMPOSTO
              HAVING COUNT(1) = 3);
   EXCEPTION
      WHEN OTHERS THEN
         V_CDGRUPIMPOSTO := NULL;
   END;
   
   -- INSERIR GRUPO DE IMPOSTOS --
   IF (V_CDGRUPIMPOSTO IS NULL) THEN
      SELECT MAX(CDGRUPIMPOSTO)
        INTO V_CDGRUPIMPOSTO
        FROM AGRUPIMPOSTO;
      
      IF (V_CDGRUPIMPOSTO IS NOT NULL) THEN
         SELECT LPAD(TO_NUMBER(V_CDGRUPIMPOSTO)+1, 10,'0') 
           INTO V_CDGRUPIMPOSTO
           FROM DUAL;
      ELSE
         V_CDGRUPIMPOSTO := '0000000001';
      END IF;
      
      -- INSERE AGRUPAMENTO
      INSERT INTO AGRUPIMPOSTO(CDGRUPIMPOSTO, NMGRUPIMPOSTO)
      VALUES(V_CDGRUPIMPOSTO, V_NMGRUPIMPOSTO);      
      -- INSERE IMPOSTO ICMS
      INSERT INTO ITAGRUPIMPOSTO(CDIMPOSTO, CDGRUPIMPOSTO)
      VALUES(V_CDGRUPIMPOSTO, V_ICMS);
      -- INSERE IMPOSTO PIS
      INSERT INTO ITAGRUPIMPOSTO(CDIMPOSTO, CDGRUPIMPOSTO)
      VALUES(V_CDGRUPIMPOSTO, V_PIS);
      -- INSERE IMPOSTO COFINS
      INSERT INTO ITAGRUPIMPOSTO(CDIMPOSTO, CDGRUPIMPOSTO)
      VALUES(V_CDGRUPIMPOSTO, V_COFINS);
      
      COMMIT;
      BO_INSERE := TRUE;
   END IF;
   
   IF NOT(BO_INSERE) THEN
      SELECT MAX(CDREGRAFISC)
        INTO V_CDREGRAFISC
        FROM REGRAFISCAL
       WHERE DSMENSREGRAFISC LIKE '%'||CHR(39)||P_ID_CENARIO||CHR(39);
      
      BO_INSERE := V_CDREGRAFISC IS NULL;
   END IF;
   
   IF BO_INSERE THEN
      SELECT MAX(CDREGRAFISC)
        INTO V_CDREGRAFISC
        FROM REGRAFISCAL;
      
      IF (V_CDREGRAFISC IS NOT NULL) THEN
         SELECT LPAD(TO_NUMBER(V_CDREGRAFISC)+1, 10,'0') 
           INTO V_CDREGRAFISC
           FROM DUAL;
      ELSE
         V_CDREGRAFISC := '0000000001';
      END IF;
      
      INSERT INTO REGRAFISCAL(CDREGRAFISC, NMREGRAFISC, CDGRUPIMPOSTO, DTVALREGRAFISC, IDATIVREGRAFISC, IDUTGRUPOFISCAL, DSMENSREGRAFISC)
      VALUES(V_CDREGRAFISC, V_APELIDO, V_CDGRUPIMPOSTO, TRUNC(V_DTVALREGRAFISC), V_N, V_N, 'Cen'||CHR(225)||'rio '||P_ID_CENARIO);
         
      INSERT INTO IMPREGRAFISCAL(CDREGRAFISC, CDIMPOSTO, IDIMPOBRIGREGRA)
      SELECT V_CDREGRAFISC, CDIMPOSTO, 'S'
        FROM ITAGRUPIMPOSTO
       WHERE CDGRUPIMPOSTO = V_CDGRUPIMPOSTO;
   END IF;
   
   V_PRODUTO := ' ';
   OPEN C_MATERIAIS(P_COD_PROD);
   LOOP
      FETCH C_MATERIAIS INTO V_COD_PROD, V_CFOP, V_CEST;
      EXIT WHEN C_MATERIAIS%NOTFOUND;
      
      V_ERRO := NULL;
      IF (V_COD_PROD <> V_PRODUTO) THEN
         BO_ERRO   := FALSE;
         V_PRODUTO := V_COD_PROD;
      END IF;
      
      SELECT MAX(TO_NUMBER(NRSEQDADOSFISC))
        INTO V_NRSEQDADOSFISC
        FROM DADOSFISCPROD;
      
      BEGIN
         SELECT CDPRODUTO
           INTO V_CDPRODUTO
           FROM PRODUTO
          WHERE CDARVPROD = V_COD_PROD;
      EXCEPTION
         WHEN OTHERS THEN
            V_ERRO := 'Produto '||V_COD_PROD||' n'||CHR(227)||'o cadastrado. ';
            BO_ERRO := TRUE;
      END;
      
      -- VERIFICAR SE EXISTE O CFOP CADASTRADO
      IF (V_CFOP IS NOT NULL) THEN
         SELECT COUNT(1)
           INTO V_CONT
           FROM CFOPPADRAO
          WHERE SUBSTR(CDCFOPPADRAO, 2, 3) = V_CFOP;
         
         IF (V_CONT = 0) THEN
            V_ERRO := 'CFOP '||V_CFOP||' n'||CHR(227)||'o cadastrado. ';
            BO_ERRO := TRUE;
         END IF;
      END IF;
      -- VERIFICA SE EXISTE CEST CADASTRADO
      IF (V_CEST IS NOT NULL) THEN
         BEGIN
            SELECT CDCEST
              INTO V_CDCEST
              FROM CODESPSUBTRI
             WHERE REGEXP_REPLACE(CDCEST, '\D') = V_CEST;
         EXCEPTION
            WHEN OTHERS THEN
               V_ERRO := 'CEST '||V_CEST||' n'||CHR(227)||'o cadastrado. ';
               BO_ERRO := TRUE;
         END;
      END IF;
      
      OPEN C_IMPOSTOS(V_COD_PROD, V_ICMS, V_PIS, V_COFINS);
      LOOP
         FETCH C_IMPOSTOS INTO V_CST, V_BC_COMPOS, V_ALIQUOTA, V_P_RED_BC, V_VIG_DE, V_VIG_ATE, V_CDIMPOSTO;
         EXIT WHEN C_IMPOSTOS%NOTFOUND;
         
         V_ERRO := NULL;
         V_NRSEQDADOSFISC := V_NRSEQDADOSFISC + 1;
         
         IF (V_CST IS NOT NULL) THEN
            BEGIN
               SELECT MAX(CDSITUTRIB)
                 INTO V_CDSITUTRIB
                 FROM PARAMCST
                WHERE CDIMPOSTO = V_CDIMPOSTO
                  AND CDSITUTRIB = V_CST;
            EXCEPTION
               WHEN OTHERS THEN
                  V_ERRO := 'CST '||V_CST||' n'||CHR(227)||'o cadastrado para o imposto '||V_CDIMPOSTO||'. ';
                  BO_ERRO := TRUE;
            END;
         END IF;
         
         IF NOT(BO_ERRO) THEN
            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)
            VALUES(V_CDREGRAFISC, V_CDIMPOSTO, V_CDPRODUTO, LPAD(V_NRSEQDADOSFISC, 10, '0'), V_CDFISCAL,
                   '0055', V_UF_ORIGEM, '0055', V_UF_DESTINO, V_ALIQUOTA,
                   '3', '4', '9', 'N', V_IDCSTINTER,
                   'T', 'T', 'T', 'N', 'N', 'N',
                   V_CDSITUTRIB, V_CFOP, V_CDCEST);
         ELSE
            ROLLBACK;
            IF (V_ERRO IS NOT NULL) THEN
               UPDATE SYS_MATERIAL
                  SET IDIMPORTA = 'E',
                      ERRO = V_ERRO
                WHERE ID_CENARIO = P_ID_CENARIO
                  AND COD_PROD   = V_COD_PROD; 
               
               COMMIT;
            END IF;
         END IF;
      END LOOP;
      CLOSE C_IMPOSTOS;
   END LOOP;
   
   COMMIT;
   CLOSE C_MATERIAIS;
EXCEPTION
   WHEN OTHERS THEN
      V_ERRO := SQLERRM(SQLCODE);
      UPDATE SYS_MATERIAL
         SET IDIMPORTA = 'E',
             ERRO = V_ERRO
       WHERE ID_CENARIO = P_ID_CENARIO;
END;