CREATE OR REPLACE PROCEDURE PRE_VALIDACAO_SPED_CONTRIB(
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE,
   P_DTINICIAL    IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_DTFINAL      IN MAPAAPURAC.DTFIMPERIODO%TYPE,
   P_CDLIVROMAG   IN LIVROMAGNETICO.CDLIVROMAG%TYPE)
AS
   V_SEQERRO          NUMBER;
   V_STSEQERRO        VARCHAR2(3);
   V_SEQUENCIAL       VARCHAR2(4);
   V_EXISTE           VARCHAR2(1);
   V_CDNATUREC        VARCHAR2(5);
   V_CDSITUTRIBITNFE  VARCHAR2(2);
   V_CDFISCOPERIT     VARCHAR2(11);
   V_CDTPCREDPICOITE  VARCHAR2(3);
   V_CDNATUBCALPCIT   VARCHAR2(2);
   V_CDCFOPICMS       VARCHAR2(11);
   V_VALIDANATUREC    VARCHAR2(500);
   V_RETORNO          VARCHAR2(300);
   V_IDERRO           VARCHAR2(1);
   CURSOR C_ERROSPREVALID IS SELECT NRSEQERRO, DSERRO, IDVALIDA, CDTIPOOPER
                               FROM PARAMPREVALID
                              ORDER BY NRSEQERRO;
   TYPE ERROSPREVALID IS TABLE OF C_ERROSPREVALID%ROWTYPE;
   V_ERROSPREVALID    ERROSPREVALID;
BEGIN

/*
==VALIDACOES DA PROCEDURE==
        > ALIQUOTA - ALIQUOTAS BASICAS PARA FILIAL CUMULATIVA 1,65 E 7,6
        > ALIQUOTA - ALIQUOTAS BASICAS PARA FILIAL NAO CUMULATIVA 0,65 E 3
        > ALIQUOTA X CST - VERIFICA SE A ALIQUOTA E VALIDA PARA O CST INFORMADO
        > CST - NAO SE DEVE TER CST NFE NULL
        > CST - CST 50 A 99 SOMENTE PARA ENTRADAS.
        > CST - CST 98 E 99 PARA DEVOLUCOES DE VENDA.
        > CST - CST 01 A 49 SOMENTE PARA SAIDAS.
        > CST - CST 49 PARA DEVOLUCOES DE COMPRA.
        > CST X CF - CST 01,02 E 03 DEVEM TER CODIGO FISCAL 1.
        > CST X CF - CODIGO FISCAL DEVE SER DIFERENTE DE 1 PARA OS CSTS 04, 06, 07, 08 E 09
        > CST X CF - CST'S 50,51,52,53,54,55,56,60,61,63,64,65,66,67 DEVEM TER CODIGO FISCAL IGUAL A 1
        > CST X CF - CST'S 70,71,72,73,74,75 DEVEM TER CODIGO FISCAL DIFERENTE DE 1.
        > CST X TIPO DE CRED. X NATUR. BC - CST 50,51,52,53,54,55,56,60,61,62,63,64,65,66,67 DEVEM TER TIPO DE CRED. E NATUR. BC.
        > CFOP - VERIFICA CFOP VAZIO
        > CFOP - VERIFICA CFOP INVALIDO
        > CFOP X NATUREZA BC - VERIFICA SE A NATUREZA DA BASE DE CALCULO EQUIVALE AO CFOP
        > --RETIRADO-- CFOP X CST - CFOP COM DIREITO A CREDITO DEVE TER CST RELATIVO A OPERACAO TRIBUTAVEL
        > CFOP X CST - CFOP SEM DIREITO A CREDITO DEVE TER CST RELATIVO A OPERACAO NAO GERADORA DE CREDITO
        > TIPO CREDITO X CST - GRUPO 100 PARA CST 50, GRUPO 200 PARA CST 51 E GRUPO 300 PARA CST 52
        > TIPO CREDITO X CST- 106,206,306,107,207 E 307 PARA CST'S DE 60 A 66
        > TIPO CREDITO X CST - 106 deve ter CST 60,63,64
        > TIPO DE CREDITO X CST - CST 67 DEVE TER TIPO DE CREDITO 107,207 OU 307
        > TIPO DE CREDITO X CFOP - CFOP DE IMPORTACAO DEVE TER TIPO DE CREDITO 108,208 OU 308
        > TIPO DE CREDITO X ALIQUOTA - 101 PARA ALIQUOTAS BASICAS, 102 PARA ALIQUOTAS DIFERENCIADAS
        > NATUREZA BC - NOTAS FISCAIS DE SERVICO GERADORAS DE CREDITO DEVEM TER NATUREZA DE BASE DE CALCULO 03,05,06,07,13 OU 15
        > INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO ICMS OU DO ISS
        > INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO PIS
        > INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO COFINS
        > CST - ITENS DEVEM TER O MESMO CST PARA PIS E COFINS
        > CFOP - VERIFICA SE O CFOP DO PIS E DO COFINS E O MESMO DO ICMS
        > TIPO DE CREDITO - OS ITENS DE PIS E COFINS DEVEM TER O MESMO TIPO DE CREDITO
        > NATUREZA DE BC - OS ITENS DE PIS E COFINS DEVEM TER A MESMA NATUREZA DA BASE DE CALCULO
        > NATUREZA DE BC - AS AQUISICOES DE ENERGIA ELETRICA DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 04.
        > NATUREZA DE BC - AS AQUISICOES DE SERVICO DE TRANSPORTE DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 07.
        > NATUREZA DE BC - OS CREDITOS PARA ATIVO IMOBILIZADO DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 10
        > GENERO/TIPO DE ITEM - PRODUTO NAO CADASTRADO NO LIVRO MAGNETICO
        > NATUREZA DA RECEITA DEVE SER INFORMADA PARA OS CST'S (04,05 - COM ALIQUOTA ZERO, 06, 07, 08, 09)
        > OPERACOES DE AQUISICAO/FORNECIMENTO DE ENERGIA ELETRICA DEVEM TER MODELO 06.
        > CHAVE DE ACESSO - VERIFICA SE A CHAVE DEVE EXISTIR DE ACORDO COM O MODELO E SE ESTA EM CONFORMIDADE COM AS INFORMACOES DA NF
        > NATUREZA DE BC - NATUREZA DA BASE DE CALCULO INFORMADA SEM VALOR DE IMPOSTO
===========================
*/
   /*Apaga os registros antigos na tabela*/
   DELETE FROM ERRONFPREVALID
    WHERE (CDFILIAL, NRLANCTONF) IN (SELECT N.CDFILIAL, N.NRLANCTONF
                                       FROM IMPOSTONF I, NOTAFISCAL N
                                      WHERE DSTIPOVALIDA = 'SPED_CONTRIB'
                                        AND I.CDFILIAL   = N.CDFILIAL
                                        AND I.NRLANCTONF = N.NRLANCTONF
                                        AND N.CDEMPRESA  = P_CDEMPRESA);

   /*Busca as parametrizacoes por erro*/
   OPEN  C_ERROSPREVALID;
   FETCH C_ERROSPREVALID BULK COLLECT INTO V_ERROSPREVALID;
   CLOSE C_ERROSPREVALID;

   FOR C_NF IN (SELECT DISTINCT N.CDFILIAL, N.NRLANCTONF, N.CDMODDOCFISC, N.NRNOTAFISC, N.IDENTRSAIDOP, N.NRACESSONFE, N.VRNOTAFISC,
                       N.DTEMISSAO, N.DTENTRSAID, N.CDFORNECED, N.CDCLIENTE, N.CDFILIEMIT, N.CDFILIRECE, N.CDSERIEENTR, N.CDSERIE,
                       F.IDCUMUPISCOFIL, P.IDDEVOLNCUMUSPED, N.CDTIPOOPER,
                       BUSCA_CNPJ_ESTAB('00','30','31','35','36',N.NRLANCTONF,N.CDFILIAL,N.CDINSCESTA,N.CDINSCMUNI,N.CDFILIEMIT,N.CDFILIRECE,N.IDENTRSAIDOP) AS CNPJ_ESTAB
                  FROM ITEMPROIMPOS IT, NOTAFISCAL N, IMPOSTO IM, FILIAL F, TIPOOPERAC T, PARAMFISCAL P
                 WHERE N.CDEMPRESA      = P_CDEMPRESA
                   AND DECODE(N.IDENTRSAIDOP,'S',N.DTEMISSAO, N.DTENTRSAID) BETWEEN P_DTINICIAL AND P_DTFINAL
                   AND IT.NRLANCTONF    = N.NRLANCTONF
                   AND IT.CDFILIAL      = N.CDFILIAL
                   AND IM.CDIMPOSTO     = IT.CDIMPOSTO
                   AND IM.CDIMPOSTONFE  IN ('00','50','60')
                   AND DECODE(N.IDENTRSAIDOP,'S',N.CDFILIEMIT, N.CDFILIRECE) = F.CDFILIAL
                   AND ((N.IDENTRSAIDOP = 'E' AND F.IDCUMUPISCOFIL = 'S') OR (N.IDENTRSAIDOP = 'S'))
                   AND N.CDTIPOOPER     = T.CDTIPOOPER
                   AND N.IDENTRSAIDOP   = T.IDENTRSAIDOP
                   AND T.IDTPFATAPURA   IS NOT NULL
                   AND N.IDSTATUS  IN ('A','E')
                   AND N.IDSISTEMA <> 'PAG'
                   AND N.IDSISTEMA <> 'REC'
                   AND N.IDSISTEMA <> 'FIS'
                   AND N.IDSISTEMA <> 'TMP'
                 ORDER BY N.CDFILIAL, N.NRLANCTONF) LOOP

      V_SEQERRO := 0;

      V_EXISTE := NULL;
      BEGIN
         SELECT MAX('S')
           INTO V_EXISTE
           FROM IMPOSTONF P, IMPOSTO IP, IMPOSTONF C, IMPOSTO IC
          WHERE P.CDFILIAL      = C_NF.CDFILIAL
            AND P.NRLANCTONF    = C_NF.NRLANCTONF
            AND P.CDFILIAL      = C.CDFILIAL
            AND P.NRLANCTONF    = C.NRLANCTONF
            AND P.CDIMPOSTO     = IP.CDIMPOSTO
            AND IP.CDIMPOSTONFE = '50'
            AND C.CDIMPOSTO     = IC.CDIMPOSTO
            AND IC.CDIMPOSTONFE = '60';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_EXISTE := NULL;
      END;

      /*VERIFICA SE A NOTA POSSUI A INCIDENCIA DE PIS E COFINS*/
      IF (V_EXISTE IS NULL) THEN
         IF (V_ERROSPREVALID(42).IDVALIDA = 'S') AND ((V_ERROSPREVALID(42).CDTIPOOPER IS NULL) OR
            (INSTR(V_ERROSPREVALID(42).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE, DTVALIDACAO, DSTIPOVALIDA)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'NF sem incidencia do PIS e/ou do COFINS.', 'INCID', 'A', SYSDATE, 'SPED_CONTRIB');
         END IF;
      ELSE
         /*CHAVE DE ACESSO - VERIFICA SE A CHAVE DEVE EXISTIR DE ACORDO COM O MODELO E SE ESTA EM CONFORMIDADE COM AS INFORMACOES DA NF*/
         VALIDA_CHAVE_NFE(C_NF.CDFILIAL, C_NF.NRLANCTONF, V_IDERRO, V_RETORNO);
         IF (NVL(V_RETORNO,'OK') <> 'OK') AND (V_ERROSPREVALID(1).IDVALIDA = 'S') AND ((V_ERROSPREVALID(1).CDTIPOOPER IS NULL) OR
            (INSTR(V_ERROSPREVALID(1).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE, DTVALIDACAO, DSTIPOVALIDA)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, V_RETORNO, 'CHAVE_NFE', V_IDERRO, SYSDATE, 'SPED_CONTRIB');
         END IF;
      END IF;

      V_SEQUENCIAL :=  NULL;

      FOR C_ITEMNF IN (SELECT I.NRSEQITPROD, I.NRITPROIMPOS, P.CDPRODUTO, PP.CDARVPROD, PP.NMPRODUTO,
                              I.CDFISCALIT, I.VRIMPOSTOIT, I.VRALIQITEM, I.CDSITUTRIBITNFE,
                              I.CDTPCREDPICOITE, I.CDNATUBCALPCIT, I.CDFISCOPERIT, C.IDTIPOCFOP,
                              IM.CDIMPOSTONFE, PP.CDCLASFISC, I.CDNATUREC
                         FROM ITEMPROIMPOS I, ITEMPRODUTO P, PRODUTO PP, IMPOSTO IM, CFOPPADRAO C
                        WHERE I.CDFILIAL      = C_NF.CDFILIAL
                          AND I.NRLANCTONF    = C_NF.NRLANCTONF
                          AND IM.CDIMPOSTONFE IN ('50','60')
                          AND IM.CDIMPOSTO    = I.CDIMPOSTO
                          AND P.CDFILIAL      = I.CDFILIAL
                          AND P.NRLANCTONF    = I.NRLANCTONF
                          AND P.NRSEQITPROD   = I.NRSEQITPROD
                          AND PP.CDPRODUTO    = P.CDPRODUTO
                          AND I.CDFISCOPERIT  = C.CDCFOPPADRAO(+)
                        ORDER BY I.CDIMPOSTO, I.NRSEQITPROD) LOOP

         V_SEQUENCIAL := LPAD((NVL(TO_NUMBER(V_SEQUENCIAL),0)+1), 4, '0');

         /*ALIQUOTA - ALIQUOTAS BASICAS PARA FILIAL CUMULATIVA 1,65 E 7,6*/
         IF ((C_NF.IDCUMUPISCOFIL = 'N') AND  (C_ITEMNF.CDSITUTRIBITNFE IN ('01','50')) AND
             (C_ITEMNF.VRALIQITEM = CASE WHEN C_ITEMNF.CDIMPOSTONFE = '50' THEN 1.65 ELSE 7.6 END)) AND
             (V_ERROSPREVALID(2).IDVALIDA = 'S') AND ((V_ERROSPREVALID(2).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(2).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Aliquota basica invalida para filial cumulativa. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQUOTA', 'E');
         END IF;

         /*ALIQUOTA - ALIQUOTAS BASICAS PARA FILIAL NAO CUMULATIVA 0,65 E 3*/
         IF ((C_NF.IDCUMUPISCOFIL = 'S') AND  (C_ITEMNF.CDSITUTRIBITNFE IN ('01','50')) AND
             (C_ITEMNF.VRALIQITEM = CASE WHEN C_ITEMNF.CDIMPOSTONFE = '50' THEN 0.65 ELSE 3 END)) AND
             (V_ERROSPREVALID(3).IDVALIDA = 'S') AND ((V_ERROSPREVALID(3).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(3).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Aliquota basica invalida para filial nao cumulativa. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQUOTA', 'E');
         END IF;

         /*ALIQUOTA X CST - VERIFICA SE A ALIQUOTA E VALIDA PARA O CST INFORMADO*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE NOT IN ('49','99','98')) AND (C_ITEMNF.CDSITUTRIBITNFE IS NOT NULL) AND
             ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) THEN

            V_EXISTE := NULL;
            BEGIN
               SELECT MAX('S')
                 INTO V_EXISTE
                 FROM ALIQUOTACSTNFE
                WHERE CDIMPOSTO     = C_ITEMNF.CDIMPOSTONFE
                  AND CDSITUTRIBNFE = C_ITEMNF.CDSITUTRIBITNFE
                  AND VRALIQUOTA    = C_ITEMNF.VRALIQITEM;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXISTE := NULL;
            END;
            IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(4).IDVALIDA = 'S') AND ((V_ERROSPREVALID(4).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(4).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Aliquota invalida para o cst informado. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQUOTA_CST', 'E');
            END IF;
         END IF;

         /*CST - NAO SE DEVE TER CST NFE NULL*/
         IF (C_ITEMNF.CDSITUTRIBITNFE IS NULL) AND (V_ERROSPREVALID(5).IDVALIDA = 'S') AND
            ((V_ERROSPREVALID(5).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(5).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Item com cst nfe vazio. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
         END IF;

         /*CST - CST 50 A 99 SOMENTE PARA ENTRADAS.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('50','51','52','53','54','55','56','60','61','62','63','64','65','66','67','70','71','72','73','74','75','98','99')) AND
             (C_NF.IDENTRSAIDOP = 'S') AND ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) AND
             (V_ERROSPREVALID(6).IDVALIDA = 'S') AND ((V_ERROSPREVALID(6).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(6).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST invalido para nota fiscal de saida. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
         END IF;

         /*CST - CST 98 E 99 PARA DEVOLUCOES DE VENDA.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE NOT IN ('98','99')) AND (C_NF.IDENTRSAIDOP = 'E') AND
             (C_ITEMNF.IDTIPOCFOP = 'D') AND (C_NF.IDDEVOLNCUMUSPED = 'A') AND (C_ITEMNF.VRALIQITEM > 0)) AND
             (V_ERROSPREVALID(7).IDVALIDA = 'S') AND ((V_ERROSPREVALID(7).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(7).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Nota fiscal de devolucao de venda de ter cst 98 ou 99. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
         END IF;

         /*CST - CST 01 A 49 SOMENTE PARA SAIDAS.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('01','02','03','04','05','06','07','08','09','49')) AND
             (C_NF.IDENTRSAIDOP = 'E') AND ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) AND
             (V_ERROSPREVALID(8).IDVALIDA = 'S') AND ((V_ERROSPREVALID(8).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(8).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST invalido para nota fiscal de entrada. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
         END IF;

         /*CST - CST 49 PARA DEVOLUCOES DE COMPRA.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE <> '49') AND (C_NF.IDENTRSAIDOP = 'S') AND (C_ITEMNF.IDTIPOCFOP = 'D') AND (C_ITEMNF.VRALIQITEM > 0)) AND
             (V_ERROSPREVALID(9).IDVALIDA = 'S') AND ((V_ERROSPREVALID(9).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(9).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST 49 para devolucoes de compra. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
         END IF;

         /*CST X CF - CST 01, 02 E 03 DEVEM TER CODIGO FISCAL 1.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('01','02','03')) AND (C_ITEMNF.CDFISCALIT <> '1') AND (C_ITEMNF.NRITPROIMPOS <> '2') AND
             ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) AND
             (V_ERROSPREVALID(10).IDVALIDA = 'S') AND ((V_ERROSPREVALID(10).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(10).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST 01, 02, 03 devem ter codigo fiscal 1. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_CF', 'E');
         END IF;

         /*CST X CF - CODIGO FISCAL DEVE SER DIFERENTE DE 1 PARA OS CSTS 04, 06, 07, 08 E 09 */
          IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('04','06','07','08','09')) AND (C_ITEMNF.CDFISCALIT = '1') AND
              ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) AND
             (V_ERROSPREVALID(11).IDVALIDA = 'S') AND ((V_ERROSPREVALID(11).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(11).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST 04,06,07,08,09 devem ter codigo fiscal diferente de 1. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_CF', 'E');
         END IF;

         /*CST X CF - CST'S 70,71,72,73,74,75 DEVEM TER CODIGO FISCAL DIFERENTE DE 1.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('70','71','72','73','74','75')) AND (C_ITEMNF.CDFISCALIT = '1') AND
              ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) AND
             (V_ERROSPREVALID(12).IDVALIDA = 'S') AND ((V_ERROSPREVALID(12).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(12).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CST 70,71,72,73,74 e 75 devem ter codigo fiscal diferente de 1. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_CF', 'E');
         END IF;

         /*CST X TIPO DE CRED. X NATUR. BC - CST 50,51,52,53,54,55,56,60,61,62,63,64,65,66,67 DEVEM TER TIPO DE CRED. E NATUR. BC.*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('50','51','52','53','54','55','56','60','61','62','63','64','65','66','67')) AND
             ((C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL))) THEN
            IF (C_ITEMNF.CDTPCREDPICOITE IS NULL)  AND (V_ERROSPREVALID(13).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(13).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(13).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Para cst 50,51,52,53,54,55,56,60,61,63,64,65,66 e 67 deve ser informado o codigo do tipo do credito. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_TPCRED', 'E');
            END IF;
            IF (C_ITEMNF.CDNATUBCALPCIT IS NULL) AND (V_ERROSPREVALID(14).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(14).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(14).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Para cst 50,51,52,53,54,55,56,60,61,63,64,65,66 e 67 deve ser informado o codigo da natureza da base de calculo. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_NATUBC', 'E');
            END IF;
            /*CST X CF - CST'S 50,51,52,53,54,55,56,60,61,63,64,65,66,67 DEVEM TER CODIGO FISCAL IGUAL A 1*/
            IF ((C_ITEMNF.CDFISCALIT  <> '1') AND (C_ITEMNF.NRITPROIMPOS <> '2')) AND (V_ERROSPREVALID(15).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(15).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(15).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'CST 50,51,52,53,54,55,56,60,61,63,64,65,66 e 67 devem ter codigo fiscal 1. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST_CF', 'E');
            END IF;

            IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) NOT IN ('252','253','254','255','256','257','258')) /*CFOP ENERGIA ELETRICA*/ AND
                (SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) NOT IN ('352','353','354','355','356','932')) /*CFOP SERVICO DE TRANSPORTE*/  AND
                (SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) NOT IN ('406','551','552','553','554','555','604')) /*CFOP ATIVO*/            AND
                (C_ITEMNF.CDFISCOPERIT IS NOT NULL) AND (INSTR(C_NF.CNPJ_ESTAB,'ISS') = 0)) THEN
               /*CFOP X NATUREZA BC - VERIFICA SE A NATUREZA DA BASE DE CA?LCULO EQUIVALE AO CFOP*/
               V_EXISTE := NULL;
               BEGIN
                  SELECT MAX('S')
                    INTO V_EXISTE
                    FROM NATUBCALCCFOP
                   WHERE CDFISCOPER      = C_ITEMNF.CDFISCOPERIT
                     AND CDNATUBCPCSTNFE = C_ITEMNF.CDNATUBCALPCIT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_EXISTE := NULL;
               END;
               IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(16).IDVALIDA = 'S') AND ((V_ERROSPREVALID(16).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(16).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Natureza da base de calculo invalida para o cfop ou cfop nao da? direito a credito. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CFOP_NATUBC', 'E');
               END IF;

               /*CFOP X CST - CFOP SEM DIREITO A CREDITO DEVE TER CST RELATIVO A OPERACAO NAO GERADORA DE CREDITO*/
               V_EXISTE := NULL;
               BEGIN
                  SELECT MAX('S')
                    INTO V_EXISTE
                    FROM NATUBCALCCFOP
                   WHERE CDFISCOPER = C_ITEMNF.CDFISCOPERIT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_EXISTE := NULL;
               END;
               IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(17).IDVALIDA = 'S') AND ((V_ERROSPREVALID(17).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(17).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'CFOP sem direito a credito deve ter CST relativo a operacao nao geradora de credito. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CFOP_CST', 'E');
               END IF;
            END IF;
         END IF;
         /*CFOP - VERIFICA CFOP VAZIO*/
         IF ((INSTR(C_NF.CNPJ_ESTAB,'ISS') = 0) AND (C_ITEMNF.CDFISCOPERIT IS NULL)) AND
             (V_ERROSPREVALID(18).IDVALIDA = 'S') AND ((V_ERROSPREVALID(18).CDTIPOOPER IS NULL) OR
             (INSTR(V_ERROSPREVALID(18).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Item com cfop vazio. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CFOP', 'E');
         END IF;

         /*CFOP - VERIFICA CFOP INVALIDO*/
         IF (C_ITEMNF.CDFISCOPERIT IS NOT NULL) THEN
            V_EXISTE := NULL;
            BEGIN
               SELECT MAX('S')
                 INTO V_EXISTE
                 FROM CFOPPADRAO
                WHERE CDCFOPPADRAO = C_ITEMNF.CDFISCOPERIT;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXISTE := NULL;
            END;
            IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(19).IDVALIDA = 'S') AND ((V_ERROSPREVALID(19).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(19).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item com cfop invalido. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CFOP', 'E');
            END IF;
         END IF;

         IF (C_ITEMNF.IDTIPOCFOP <> 'D') OR (C_ITEMNF.IDTIPOCFOP IS NULL) THEN

            /*GENERO/TIPO DE ITEM - PRODUTO NAO CADASTRADO NO LIVRO MAGNETICO*/
            V_CDNATUREC := NULL;
            V_EXISTE    := NULL;
            BEGIN
               SELECT MAX('S'), MAX(CDNATUREC)
                 INTO V_EXISTE, V_CDNATUREC
                 FROM RELACPRODITGEN
                WHERE CDPRODUTO   = C_ITEMNF.CDPRODUTO
                  AND CDLIVROMAG = P_CDLIVROMAG;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXISTE := NULL;
                  V_CDNATUREC := NULL;
            END;
            V_CDNATUREC := NVL(C_ITEMNF.CDNATUREC,V_CDNATUREC);

            IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(20).IDVALIDA = 'S') AND ((V_ERROSPREVALID(20).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(20).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item sem genero e tipo cadastrados. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'GEN_TPITEM', 'E');
            ELSE
               /*NATUREZA DA RECEITA X CST - NATUREZA DA RECEITA DEVE SER INFORMADA E VALIDA PARA OS CST'S 04,05 - COM ALIQUOTA ZERO, 06, 07, 08 E 09*/
               V_VALIDANATUREC := VALIDA_NATUREC_SPED(C_ITEMNF.CDSITUTRIBITNFE, V_CDNATUREC, C_NF.DTEMISSAO, C_ITEMNF.VRALIQITEM);
               IF ((V_VALIDANATUREC <> 'Valida') AND (V_VALIDANATUREC <> 'CST nao exige cadastro de Natureza da Receita')) AND (V_ERROSPREVALID(21).IDVALIDA = 'S') AND
                  ((V_ERROSPREVALID(21).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(21).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                     V_VALIDANATUREC||' (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUREC', 'E');
               END IF;
            END IF;

            /*TIPO CREDITO X CST - GRUPO 100 PARA CST 50, GRUPO 200 PARA CST 51 E GRUPO 300 PARA CST 52*/
            IF ((C_ITEMNF.CDSITUTRIBITNFE = '50' AND SUBSTR(C_ITEMNF.CDTPCREDPICOITE,1,1) <> '1') OR
                (C_ITEMNF.CDSITUTRIBITNFE = '51' AND SUBSTR(C_ITEMNF.CDTPCREDPICOITE,1,1) <> '2') OR
                (C_ITEMNF.CDSITUTRIBITNFE = '52' AND SUBSTR(C_ITEMNF.CDTPCREDPICOITE,1,1) <> '3')) AND
                (V_ERROSPREVALID(22).IDVALIDA = 'S') AND ((V_ERROSPREVALID(22).CDTIPOOPER IS NULL) OR
                (INSTR(V_ERROSPREVALID(22).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'CST invalido para o tipo de ceedito informado. Tipo de credito do grupo 100 para CST 50, 200 para CST 51 e 300 para CST 52. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_CST', 'E');
            END IF;

            /*TIPO CREDITO X CST- 106,206,306,107,207 E 307 PARA CST'S DE 60 A 66*/
            IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('61','62','63','64','65','66')) AND
                (C_ITEMNF.CDTPCREDPICOITE NOT IN ('106','206','306','107','207','307'))) AND
                (V_ERROSPREVALID(23).IDVALIDA = 'S') AND ((V_ERROSPREVALID(23).CDTIPOOPER IS NULL) OR
                (INSTR(V_ERROSPREVALID(23).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'CST invalido para o tipo de credito informado. CST de 60 a 66 devem ter tipo de credito 106, 206, 306, 107, 207 ou 307. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_CST', 'E');
            END IF;

            /*TIPO CREDITO X CST - 106 deve ter CST 60, 63, 64*/
            IF ((C_ITEMNF.CDSITUTRIBITNFE NOT IN ('60','63','64')) AND (C_ITEMNF.CDTPCREDPICOITE = '106')) AND
               (V_ERROSPREVALID(24).IDVALIDA = 'S') AND ((V_ERROSPREVALID(24).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(24).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'CST invalido para o tipo de credito informado. Tipo de credito 106 deve ser usado para CST 60, 63 e 64. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_CST', 'E');
            END IF;

           /*TIPO DE CREDITO X CST - CST 67 DEVE TER TIPO DE CREDITO 107, 207 OU 307*/
           IF ((C_ITEMNF.CDSITUTRIBITNFE = '67') AND (C_ITEMNF.CDTPCREDPICOITE NOT IN ('107','207','307'))) AND
              (V_ERROSPREVALID(25).IDVALIDA = 'S') AND ((V_ERROSPREVALID(25).CDTIPOOPER IS NULL) OR
              (INSTR(V_ERROSPREVALID(25).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'CST invalido para o tipo de credito informado. Para o cst 67 o tipo de credito deve ser 107, 207 ou 307. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_CST', 'E');
            END IF;
         END IF;

         /*TIPO DE CREDITO X CFOP - CFOP DE IMPORTACAO DEVE TER TIPO DE CREDITO 108, 208 OU 308*/
         IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,1,1) = '3') AND (C_ITEMNF.CDTPCREDPICOITE NOT IN ('108','208','308'))) AND
            (V_ERROSPREVALID(26).IDVALIDA = 'S') AND ((V_ERROSPREVALID(26).CDTIPOOPER IS NULL) OR
            (INSTR(V_ERROSPREVALID(26).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'CFOP invalido para o tipo de credito informado. CFOP de importacao deve ter tipo de credito 108, 208 ou 308. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_CFOP', 'E');
         END IF;

         /*TIPO DE CREDITO X ALIQUOTA - 101 PARA ALIQUOTAS BASICAS*/
         IF ((C_ITEMNF.VRALIQITEM NOT IN (0.65,3,1.65,7.6)) AND (C_ITEMNF.CDTPCREDPICOITE = '101') AND (C_ITEMNF.CDFISCALIT = '1')) AND
             (V_ERROSPREVALID(27).IDVALIDA = 'S') AND ((V_ERROSPREVALID(27).CDTIPOOPER IS NULL) OR
             (INSTR(V_ERROSPREVALID(27).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Aliquota invalida para o tipo de credito. Tipo de credito 101 deve ter aliquotas basicas. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_ALIQ', 'E');
         END IF;

         /*TIPO DE CREDITO X ALIQUOTA - 102 PARA ALIQUOTAS DIFERENCIADAS*/
         IF ((C_ITEMNF.VRALIQITEM IN (0.65,3,1.65,7.6)) AND (C_ITEMNF.CDTPCREDPICOITE = '102') AND (C_ITEMNF.CDFISCALIT = '1')) AND
             (V_ERROSPREVALID(28).IDVALIDA = 'S') AND ((V_ERROSPREVALID(28).CDTIPOOPER IS NULL) OR
             (INSTR(V_ERROSPREVALID(28).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Aliquota invalida para o tipo de credito. Tipo de credito 102 deve ter aliquotas diferenciadas. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED_ALIQ', 'E');
         END IF;

         /*NATUREZA BC - NOTAS FISCAIS DE SERVICO GERADORAS DE CREDITO DEVEM TER NATUREZA DE BASE DE CALCULO 03, 05, 06, 07, 13 OU 15*/
         IF ((C_ITEMNF.CDSITUTRIBITNFE IN ('50', '51', '52', '53', '54', '55', '56', '60', '61', '62', '63', '64', '65', '66', '67')) AND
             (C_ITEMNF.CDNATUBCALPCIT NOT IN ('03','05','06','07','13','15')) AND (INSTR(C_NF.CNPJ_ESTAB,'ISS') > 0)) AND
             (V_ERROSPREVALID(29).IDVALIDA = 'S') AND ((V_ERROSPREVALID(29).CDTIPOOPER IS NULL) OR
             (INSTR(V_ERROSPREVALID(29).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Notas fiscais de servico com direito a credito devem ter natureza de base de calculo 03, 05, 06, 07, 13 ou 15. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
         END IF;

         /*INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO ICMS OU DO ISS*/
         V_EXISTE := NULL;
         BEGIN
            SELECT MAX('S')
              INTO V_EXISTE
              FROM ITEMPROIMPOS I, IMPOSTO IM
             WHERE I.CDFILIAL    = C_NF.CDFILIAL
               AND I.NRLANCTONF  = C_NF.NRLANCTONF
               AND I.NRSEQITPROD = C_ITEMNF.NRSEQITPROD
               AND I.CDIMPOSTO   = IM.CDIMPOSTO
               AND IM.CDIMPOSTONFE IN ('00','30','31','35','36');
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_EXISTE := NULL;
         END;
         IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(30).IDVALIDA = 'S') AND ((V_ERROSPREVALID(30).CDTIPOOPER IS NULL) OR
            (INSTR(V_ERROSPREVALID(30).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Item nao possui incidencia para o icms ou iss (A nota podera ser tratada no Bloco F do SPED). (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'INCID', 'A');
         END IF;

         /*INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO PIS*/
         IF C_ITEMNF.CDIMPOSTONFE = '60' THEN
            V_EXISTE := NULL;
            BEGIN
               SELECT MAX('S')
                 INTO V_EXISTE
                 FROM ITEMPROIMPOS I, IMPOSTO IM
                WHERE I.CDFILIAL    = C_NF.CDFILIAL
                  AND I.NRLANCTONF  = C_NF.NRLANCTONF
                  AND I.NRSEQITPROD = C_ITEMNF.NRSEQITPROD
                  AND I.CDIMPOSTO   = IM.CDIMPOSTO
                  AND IM.CDIMPOSTONFE = '50';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXISTE := NULL;
            END;
            IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(31).IDVALIDA = 'S') AND ((V_ERROSPREVALID(31).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(31).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item nao possui incidencia para o PIS. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'INCID', 'E');
            END IF;
         END IF;

         /*INCIDENCIA - TODOS OS ITENS DEVEM TER INCIDENCIA DO COFINS*/
         IF C_ITEMNF.CDIMPOSTONFE = '50' THEN
            V_EXISTE := NULL;
            BEGIN
               SELECT MAX('S')
                 INTO V_EXISTE
                 FROM ITEMPROIMPOS I, IMPOSTO IM
                WHERE I.CDFILIAL    = C_NF.CDFILIAL
                  AND I.NRLANCTONF  = C_NF.NRLANCTONF
                  AND I.NRSEQITPROD = C_ITEMNF.NRSEQITPROD
                  AND I.CDIMPOSTO   = IM.CDIMPOSTO
                  AND IM.CDIMPOSTONFE = '60';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXISTE := NULL;
            END;
            IF (V_EXISTE IS NULL) AND (V_ERROSPREVALID(32).IDVALIDA = 'S') AND ((V_ERROSPREVALID(32).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(32).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item nao possui incidencia para o COFINS. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'INCID', 'E');
            END IF;
         END IF;

         /*NATUREZA DA BASE DE CALCULO NOS VALORES DE CREDITO*/
         IF ((C_NF.IDENTRSAIDOP  = 'E')  AND (C_ITEMNF.CDFISCALIT = '1') AND (C_ITEMNF.VRIMPOSTOIT  > 0) AND
             (C_ITEMNF.CDSITUTRIBITNFE IN ('50', '51', '52', '53', '54', '55', '56', '60', '61', '62', '63', '64', '65', '66', '67'))) THEN

            /*NATUREZA DE BC - AS AQUISICOES DE ENERGIA ELETRICA DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 04.*/
            IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) IN ('252','253','254','255','256','257','258')) AND
                ((C_ITEMNF.CDNATUBCALPCIT <> '04') OR (C_ITEMNF.CDNATUBCALPCIT IS NULL))) AND
                (V_ERROSPREVALID(33).IDVALIDA = 'S') AND ((V_ERROSPREVALID(33).CDTIPOOPER IS NULL) OR
                (INSTR(V_ERROSPREVALID(33).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'As aquisicoes de energia eletrica devem ter codigo da natureza de base de calculo 04. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
            END IF;

            /*NATUREZA DE BC - AS AQUISICOES DE SERVICO DE TRANSPORTE DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 07.*/
            IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) IN ('352','353','354','355','356','932')) AND
               ((C_ITEMNF.CDNATUBCALPCIT <> '07') OR (C_ITEMNF.CDNATUBCALPCIT IS NULL))) AND
               (V_ERROSPREVALID(34).IDVALIDA = 'S') AND ((V_ERROSPREVALID(34).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(34).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'As aquisicoes de servico de transporte devem ter codigo da natureza de base de calculo 07. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
            END IF;

            /*NATUREZA DE BC - OS CREDITOS PARA ATIVO IMOBILIZADO DEVEM TER CODIGO DA NATUREZA DE BASE DE CALCULO 10.*/
            IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) IN ('406','551','552','553','554','555','604')) AND
               ((C_ITEMNF.CDNATUBCALPCIT <> '10') OR (C_ITEMNF.CDNATUBCALPCIT IS NULL))) AND
               (V_ERROSPREVALID(35).IDVALIDA = 'S') AND ((V_ERROSPREVALID(35).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(35).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Os creditos para ativo imobilizado devem ter codigo da natureza de base de calculo 10. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
            END IF;
         END IF;

         /*OPERACOES DE AQUISICAO/FORNECIMENTO DE ENERGIA ELETRICA DEVEM TER MODELO 06.*/
         IF ((SUBSTR(C_ITEMNF.CDFISCOPERIT,2,3) IN ('252','253','254','255','256','257','258')) AND (C_NF.CDMODDOCFISC <> '06')) AND
            (V_ERROSPREVALID(36).IDVALIDA = 'S') AND ((V_ERROSPREVALID(36).CDTIPOOPER IS NULL) OR
            (INSTR(V_ERROSPREVALID(36).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0))THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
               'Operacoes de aquisicao/fornecimento de energia eletrica devem ter modelo 06. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
         END IF;

         IF C_ITEMNF.CDIMPOSTONFE = '50' THEN
            V_CDSITUTRIBITNFE := NULL;
            V_CDFISCOPERIT    := NULL;
            V_CDTPCREDPICOITE := NULL;
            V_CDNATUBCALPCIT  := NULL;
            V_CDCFOPICMS      := NULL;

            BEGIN
               SELECT MAX(I.CDSITUTRIBITNFE) AS CDSITUTRIBITNFE, MAX(I.CDFISCOPERIT) AS CDFISCOPERIT,
			          MAX(I.CDTPCREDPICOITE) AS CDTPCREDPICOITE, MAX(I.CDNATUBCALPCIT) AS CDNATUBCALPCIT
                 INTO V_CDSITUTRIBITNFE, V_CDFISCOPERIT, V_CDTPCREDPICOITE, V_CDNATUBCALPCIT
                 FROM ITEMPROIMPOS I, IMPOSTO IM
                WHERE I.CDIMPOSTO     = IM.CDIMPOSTO
                  AND IM.CDIMPOSTONFE = '60'
                  AND I.CDFILIAL      = C_NF.CDFILIAL
                  AND I.NRLANCTONF    = C_NF.NRLANCTONF
                  AND I.NRSEQITPROD   = C_ITEMNF.NRSEQITPROD;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDSITUTRIBITNFE := NULL;
                  V_CDFISCOPERIT    := NULL;
                  V_CDTPCREDPICOITE := NULL;
                  V_CDNATUBCALPCIT  := NULL;
            END;

            BEGIN
               SELECT MAX(I.CDFISCOPERIT)
                 INTO V_CDCFOPICMS
                 FROM ITEMPROIMPOS I, IMPOSTO IM
                WHERE I.CDIMPOSTO     = IM.CDIMPOSTO
                  AND IM.CDIMPOSTONFE = '00'
                  AND I.CDFILIAL      = C_NF.CDFILIAL
                  AND I.NRLANCTONF    = C_NF.NRLANCTONF
                  AND I.NRSEQITPROD   = C_ITEMNF.NRSEQITPROD;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDCFOPICMS := NULL;
            END;

            /*CST - ITENS DEVEM TER O MESMO CST PARA PIS E COFINS*/
            IF (C_ITEMNF.CDFISCOPERIT <> V_CDFISCOPERIT) AND (V_ERROSPREVALID(37).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(37).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(37).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item com CST NFE diferente para o PIS e COFINS. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CST', 'E');
            END IF;

            /*CFOP - VERIFICA SE O CFOP DO PIS E DO COFINS E O MESMO DO ICMS*/
            IF (C_ITEMNF.CDFISCOPERIT <> V_CDCFOPICMS) OR (V_CDFISCOPERIT <> V_CDCFOPICMS) AND (V_ERROSPREVALID(38).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(38).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(38).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'O CFOP do ICMS, do PIS e do COFINS devem ser iguais para o mesmo item. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CFOP', 'E');
            END IF;

            /*TIPO DE CREDITO - OS ITENS DE PIS E COFINS DEVEM TER O MESMO TIPO DE CREDITO*/
            IF (C_ITEMNF.CDTPCREDPICOITE <> V_CDTPCREDPICOITE) AND (V_ERROSPREVALID(39).IDVALIDA = 'S') AND
               ((V_ERROSPREVALID(39).CDTIPOOPER IS NULL) OR (INSTR(V_ERROSPREVALID(39).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Codigo do tipo de credito diferente para o PIS e o COFINS no mesmo item. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'TPCRED', 'E');
            END IF;

            /*NATUREZA DE BC - OS ITENS DE PIS E COFINS DEVEM TER A MESMA NATUREZA DA BASE DE CALCULO*/
            IF (C_ITEMNF.CDNATUBCALPCIT <> V_CDNATUBCALPCIT) AND (V_ERROSPREVALID(40).IDVALIDA = 'S') AND ((V_ERROSPREVALID(40).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(40).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Codigo da natureza da base de calculo diferente para o PIS e o COFINS no mesmo item. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
            END IF;

            /*NATUREZA DE BC - NATUREZA DA BASE DE CALCULO INFORMADA SEM VALOR DE IMPOSTO*/
            IF (C_ITEMNF.CDNATUBCALPCIT IS NOT NULL) AND (C_ITEMNF.CDFISCALIT <> '1' OR C_ITEMNF.VRIMPOSTOIT = 0) AND
               (V_ERROSPREVALID(41).IDVALIDA = 'S') AND ((V_ERROSPREVALID(41).CDTIPOOPER IS NULL) OR
               (INSTR(V_ERROSPREVALID(41).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                  'Item com Natureza da base de calculo informada, sem valor de imposto. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'NATUBC', 'E');
            END IF;
         END IF;
         FOR C_VALIDA_NATUREZA IN (SELECT CS.CDTABELASPED
                                     FROM CODNATURECSPEDCONTR CR, CODTABELASPED CS, CODNCMNATUREC CM
                                    WHERE CR.CDTABELASPED = CS.CDTABELASPED
                                      AND CR.CDTABELASPED = CM.CDTABELASPED
                                      AND CS.CDTABELASPED = CM.CDTABELASPED
                                      AND CR.CDNATUREC    = CM.CDNATUREC
                                      AND CR.DTINIVALID   <= C_NF.DTENTRSAID
                                      AND (CR.DTFINVALID  <= C_NF.DTENTRSAID OR DTFINVALID IS NULL)
                                      AND CM.CDCLASFISC  = C_ITEMNF.CDCLASFISC
                                      AND C_NF.IDENTRSAIDOP = 'E')LOOP


            IF (C_VALIDA_NATUREZA.CDTABELASPED = '439') THEN -- Credito Presumido
               IF (V_ERROSPREVALID(43).IDVALIDA = 'S') AND ((V_ERROSPREVALID(43).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(43).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Deve ser informado CST referente a Credito Presumido (60 a 66) para Operacoes de Credito Presumido relativas a revenda cujo codigo NCM pertenca aos grupos 0201, 0202, 020620, 020621,020629,1502001 ou seja igual a 02061000, 05069000, 05100010, 41012010, 41041124 e 41044130. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'CRED_PRES', 'A');

               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = ('4310') AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Incidencia Monofasica
               IF (V_ERROSPREVALID(44).IDVALIDA = 'S') AND ((V_ERROSPREVALID(44).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(44).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                     'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para Operacoes Geradoras de Credito, referente a Aquisicao de Bens para a Revenda de Produtos Sujeitos a Incidencia Monofasica da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_MONO', 'A');


               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4311' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Incidencia Monofasica Aliquota Unidade de Medida
               IF (V_ERROSPREVALID(45).IDVALIDA = 'S') AND ((V_ERROSPREVALID(45).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(45).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                     'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para Operacoes Geradoras de Credito, referente a Aquisicao de Bens para a Revenda de Produtos Sujeitos a Incidencia Monofasica da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_UN', 'A');


               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED IN ('4312') AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Substituicao tributaria
               IF (V_ERROSPREVALID(46).IDVALIDA = 'S') AND ((V_ERROSPREVALID(46).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(46).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN 
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                     'Nao deve ser informado CST referenta a Operacoes com Direito a Credito (50 a 56) ou CST referente a Credito Presumido (60 a 66) para Operacoes Geradoras de Credito referentes a Aquisicao de Bens para a Revenda com Produtos Sujeitos a Substituicao Tributaria da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_ST', 'A');


               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4313' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Aliquota Zero
               IF (V_ERROSPREVALID(47).IDVALIDA = 'S') AND ((V_ERROSPREVALID(47).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(47).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para Operacoes com Produtos Sujeitos a Aliquota Zero da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_ZERO', 'A');


               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4314' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Isencao
               IF (V_ERROSPREVALID(48).IDVALIDA = 'S') AND ((V_ERROSPREVALID(48).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(48).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para Operacoes com Produtos Sujeitos a Isencao da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_ISEN', 'A');

               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4315' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Sem Incidencia
               IF (V_ERROSPREVALID(49).IDVALIDA = 'S') AND ((V_ERROSPREVALID(49).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(49).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para Operacoes com Produtos Sujeitos a Nao Incidencia da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_INC', 'A');

               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4316' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Suspencao
               IF (V_ERROSPREVALID(50).IDVALIDA = 'S') AND ((V_ERROSPREVALID(50).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(50).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para operacoes cujo NCM do Item esteja relacionado na Tabela de Operacoes com Suspensao da Contribuicao Social. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_SUSP', 'A');

               END IF;
            END IF;
            IF (C_VALIDA_NATUREZA.CDTABELASPED = '4317' AND C_ITEMNF.CDFISCALIT = '1' AND C_ITEMNF.VRIMPOSTOIT > 0) THEN -- Outros Aliquota Diferenciada
               IF (V_ERROSPREVALID(51).IDVALIDA = 'S') AND ((V_ERROSPREVALID(51).CDTIPOOPER IS NULL) OR
                  (INSTR(V_ERROSPREVALID(51).CDTIPOOPER,'_'||C_NF.IDENTRSAIDOP||'_'||C_NF.CDTIPOOPER)>0)) THEN
                   V_SEQERRO   := V_SEQERRO + 1;
                   V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                   INSERT INTO ERRONFPREVALID
                      (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DTVALIDACAO, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                   VALUES
                      (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, SYSDATE, 'SPED_CONTRIB',
                      'Nao deve ser informado CST referente a Operacoes com Direito a Credito (50 a 56) para operacoes com Produtos Sujeitos a Aliquotas Diferenciadas. (Item '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO||')', 'ALIQ_DIF', 'A');

               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END LOOP;
END;
/