CREATE OR REPLACE PROCEDURE PRE_VALIDACAO_SPED(
   P_CDIMPOSTO    IN IMPOSTO.CDIMPOSTO%TYPE,
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE,
   P_NRSEQUMAPAPU IN MAPAAPURAC.NRSEQUMAPAPU%TYPE,
   P_INSCRICAO    IN NOTAFISCAL.CDINSCESTA%TYPE,
   P_IDORGARRECAD IN IMPOSTO.IDORGARRECAD%TYPE,
   P_CDLIVROMAG   IN LIVROMAGNETICO.CDLIVROMAG%TYPE)
AS
   V_TOTALITIMP    NUMBER;
   V_TOTALIMPNF    NUMBER;
   V_VRCONTITIMP   NUMBER;
   V_SOMAVRCONT    NUMBER;
   V_VRPERREDBCIT  NUMBER;
   V_VRPARCREDU    NUMBER;
   V_SEQERRO       NUMBER;
   V_STSEQERRO     VARCHAR2(3);
   V_CDARVPROD     VARCHAR2(20);
   V_DTINIMAPA     DATE;
   V_DTFIMMAPA     DATE;
   V_DTVENCGUIA    DATE;
   V_INSJURCLIE    VARCHAR2(20);
   V_INSJURFORN    VARCHAR2(20);
   V_INSJURFILE    VARCHAR2(20);
   V_INSJURFILR    VARCHAR2(20);
   V_DSENDECLIE    ENDECLIE.DSENDECLIE%TYPE;
   V_DSENDEFORN    ENDEFORN.DSENDEFORN%TYPE;
   V_DSENDEFILE    ENDEFILI.DSENDEFILI%TYPE;
   V_DSENDEFILR    ENDEFILI.DSENDEFILI%TYPE;
   V_NOMEPROD      VARCHAR2(100);
   V_VRDIFALIQU    FLOAT;
   V_SEQUENCIAL    NUMBER;
   V_DIFERENCA     FLOAT;
   V_TOTALIMPREC   FLOAT;
   V_IDUTDESCICMS  VARCHAR2(1);
   V_SGESTADOINSC  VARCHAR2(2);
   V_VRRECEITAGUIA FLOAT;
   V_CDRECEITAGUIA VARCHAR2(20);
   V_VENCMAPA      VARCHAR2(1);
   V_RETORNO       VARCHAR2(300);
   V_IDERRO        VARCHAR2(1);
   V_VDDIFAL       VARCHAR2(1);
   V_AJUSTES       VARCHAR2(1);
   V_TIPOOPER_COMPL_S  VARCHAR(02); 
   V_TIPOOPER_COMPL_E  VARCHAR(02);
   V_CFOP          NUMBER;
BEGIN
   V_VENCMAPA  := 'N';
   V_AJUSTES   := 'N';

   DELETE FROM ERRONFPREVALID
   WHERE (CDFILIAL, NRLANCTONF) IN (SELECT CDFILIAL, NRLANCTONF
                                      FROM IMPOSTONF
                                     WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                                       AND DSTIPOVALIDA = 'SPED');

   DELETE FROM NFPREVALIDFIS
   WHERE (CDFILIAL, NRLANCTONF) IN (SELECT CDFILIAL, NRLANCTONF
                                      FROM IMPOSTONF
                                     WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU);

     BEGIN
     SELECT SGESTADO
       INTO V_SGESTADOINSC
       FROM INSCRESTAD
      WHERE CDEMPRESA = P_CDEMPRESA
        AND CDINSCESTA = P_INSCRICAO;
   EXCEPTION 
      WHEN NO_DATA_FOUND THEN
	     V_SGESTADOINSC := '';
   END;


   BEGIN 
      SELECT MAX(TIPOOPER_S), MAX(TIPOOPER_E) 
        INTO V_TIPOOPER_COMPL_S, V_TIPOOPER_COMPL_E 
        FROM (SELECT DECODE(IDENTRSAIDOP,'S',CDTIPOOPER,NULL) AS TIPOOPER_S, 
                     DECODE(IDENTRSAIDOP,'E',CDTIPOOPER,NULL) AS TIPOOPER_E 
                FROM TIPOOPERAC 
               WHERE UPPER(NMTIPOOPER) LIKE '%NF COMPLEMENTO%' 
                 AND CDTIPOOPER <> '03'); 
   EXCEPTION 
      WHEN NO_DATA_FOUND THEN 
         V_TIPOOPER_COMPL_S := NULL; 
         V_TIPOOPER_COMPL_E := NULL; 
   END;

   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, N.CDTIPOOPER
                  FROM NOTAFISCAL N, IMPOSTONF I, IMPOSTO IM
                 WHERE N.CDFILIAL      = I.CDFILIAL
                   AND N.NRLANCTONF    = I.NRLANCTONF
                   AND ((N.IDSISTEMA   <> 'FIS') AND (N.IDSISTEMA   <> 'TMP'))
                   AND ((N.CDINSCESTA  = P_INSCRICAO AND P_IDORGARRECAD = 'E') OR
                        (N.CDINSCMUNI  = P_INSCRICAO AND P_IDORGARRECAD = 'M') OR
                        (P_INSCRICAO IS NULL        AND (P_IDORGARRECAD = 'F' OR P_IDORGARRECAD IS NULL)))
                   AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                   AND IM.CDIMPOSTO    = I.CDIMPOSTO
                   AND I.NRSEQUMAPAPU  = P_NRSEQUMAPAPU
                 ORDER BY N.CDFILIAL, N.NRLANCTONF) LOOP
       VALIDA_CHAVE_NFE(C_NF.CDFILIAL, C_NF.NRLANCTONF, V_IDERRO, V_RETORNO);

      INSERT INTO NFPREVALIDFIS
        (CDFILIAL, NRLANCTONF, DTEMISSAONFPRE, DTENTRSAIDNFPRE, IDENTRSAIDNFPRE, NRNOTAFISCNFPRE, VRNOTAFISCNFPRE,
         NRSEQUMAPAPUNFP, CDFORNECEDNFPRE, CDCLIENTENFPRE, CDFILIEMITNFPRE, CDFILIRECENFPRE)
      VALUES
        (C_NF.CDFILIAL, C_NF.NRLANCTONF, C_NF.DTEMISSAO, C_NF.DTENTRSAID, C_NF.IDENTRSAIDOP, C_NF.NRNOTAFISC, C_NF.VRNOTAFISC,
         P_NRSEQUMAPAPU, C_NF.CDFORNECED, C_NF.CDCLIENTE, C_NF.CDFILIEMIT, C_NF.CDFILIRECE);
      V_SEQERRO := 0;

      BEGIN
         SELECT NVL(MAX(IDUTDESCICMS), 'N')
           INTO V_IDUTDESCICMS
           FROM CLIENTE
          WHERE CDCLIENTE = C_NF.CDCLIENTE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDUTDESCICMS := 'N';
      END;

      BEGIN
         SELECT DTINIPERIODO, DTFIMPERIODO, DTVENCGUIA, VRTOTAIMPOS
           INTO V_DTINIMAPA, V_DTFIMMAPA, V_DTVENCGUIA, V_TOTALIMPREC
           FROM MAPAAPURAC
          WHERE CDIMPOSTO = P_CDIMPOSTO
            AND CDEMPRESA = P_CDEMPRESA
            AND NRSEQUMAPAPU = P_NRSEQUMAPAPU
            AND ((CDINSCESTA = P_INSCRICAO) OR (CDINSCMUNI = P_INSCRICAO) OR (P_INSCRICAO IS NULL));
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DTINIMAPA   := NULL;
            V_DTFIMMAPA   := NULL;
            V_DTVENCGUIA  := NULL;
            V_TOTALIMPREC := NULL;
      END;

      IF C_NF.CDMODDOCFISC IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
             'Modelo de documento vazio', 'MODELO', 'E');
      ELSIF C_NF.CDMODDOCFISC NOT IN ('01','1B','02','2D','2E','04','06','07','08','8B','09','10','11','13','14','15','16','17',
                                      '18','20','21','22','23','24','25','26','27','28','29','30','55','57','59','60','65','67') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Modelo de documento nao aceito no Sped Fiscal', 'MODELO', 'E');
      ELSIF C_NF.CDMODDOCFISC IN ('01','1B','04','21','22','02','55','06','29','28') THEN
         IF C_NF.DTEMISSAO > V_DTFIMMAPA THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'A data de emissao da nota deve ser menor ou igual a data final do mapa de apuracao', 'MODELO', 'A');
         END IF;
         IF (C_NF.DTENTRSAID > V_DTFIMMAPA) AND (C_NF.CDMODDOCFISC NOT IN ('06','29','28')) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'A data de entrada da nota deve ser menor ou igual a data final do mapa de apuracao', 'MODELO', 'A');
         END IF;
      END IF;
      IF nvl(V_RETORNO,'OK') <> 'OK' THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            V_RETORNO, 'CHAVE_NFE', V_IDERRO);
      END IF;
      BEGIN
         IF TO_NUMBER(C_NF.NRNOTAFISC) = 0 THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Numero da nota fiscal deve ser maior que zero', 'NUMERO', 'E');
         END IF;
      EXCEPTION
        WHEN VALUE_ERROR THEN
           V_SEQERRO   := V_SEQERRO + 1;
           V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
           INSERT INTO ERRONFPREVALID
              (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
           VALUES
              (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
              'Numero da nota fiscal possui caracteres invalidos', 'NUMERO', 'E');
      END;
      /*IF C_NF.IDENTRSAIDOP = 'S' AND C_NF.CDMODDOCFISC = '55' THEN
         IF C_NF.NRACESSONFE IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Nota Fiscal de modelo 55 sem chave de Nota Fiscal Eletronica', 'CHAVE_NFE', 'E');
         END IF;
      END IF; */
      IF C_NF.IDENTRSAIDOP = 'S' AND (C_NF.CDSERIE = '' OR C_NF.CDSERIE = '-') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Serie invalida da nota fiscal de saida', 'SERIE', 'A');
      END IF;
      IF (C_NF.IDENTRSAIDOP = 'E') AND (C_NF.CDSERIEENTR = '' OR C_NF.CDSERIEENTR = '-') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Serie invalida da nota fiscal de entrada', 'SERIE', 'A');
      END IF;
      FOR C_ITEMNF IN (SELECT CDSITUTRIBIT, CDFISCOPERIT, CDFISCALIT, VRBASECALCIT, VRALIQITEM, VRIMPOSTOIT,
                              I.NRSEQITPROD, NRITPROIMPOS, P.CDPRODUTO, I.VRCONTITIMP, I.VRPERREDBCIT,
                              PP.CDARVPROD, PP.NMPRODUTO
                         FROM ITEMPROIMPOS I, ITEMPRODUTO P, PRODUTO PP, IMPOSTO IM, NOTAFISCAL N
                        WHERE I.CDFILIAL   = C_NF.CDFILIAL
                          AND I.NRLANCTONF = C_NF.NRLANCTONF
                          AND I.NRLANCTONF = N.NRLANCTONF
                          AND I.CDFILIAL   = N.CDFILIAL
                          AND ((N.IDSISTEMA   <> 'FIS') AND (N.IDSISTEMA   <> 'TMP'))
                          AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                          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
                        ORDER BY I.CDIMPOSTO, I.NRSEQITPROD
                      ) LOOP
         V_SEQUENCIAL := NVL(V_SEQUENCIAL,0)+1;
         IF C_ITEMNF.CDSITUTRIBIT IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Item com CST vazio. (Item: '||V_SEQUENCIAL||')', 'CST', 'E');
         ELSIF LENGTH(C_ITEMNF.CDSITUTRIBIT) <> 3 THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'CST com tamanho invalido. O CST do item deve possuir 3 digitos. (Item '||V_SEQUENCIAL||')', 'CST', 'E');
         END IF;
         IF (C_ITEMNF.CDFISCOPERIT IS NULL) OR (C_ITEMNF.CDFISCOPERIT = '')THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Item da nota fiscal lancado sem CFOP. (Item: '||V_SEQUENCIAL||')', 'CFOP', 'E');
         ELSIF LENGTH(C_ITEMNF.CDFISCOPERIT) <> 4 THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'CFOP com tamanho invalido. O CFOP do item deve ter 4 digitos. (Item: '||V_SEQUENCIAL||')', 'CFOP', 'E');
         END IF;

         IF C_ITEMNF.CDFISCOPERIT IS NOT NULL THEN
            V_CFOP := NULL;
            BEGIN
               SELECT CDCFOPPADRAO
                 INTO V_CFOP
                 FROM CFOPPADRAO
                WHERE C_ITEMNF.CDFISCOPERIT = CDCFOPPADRAO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                    V_CFOP := NULL;
            END;                                     
            IF V_CFOP IS NULL THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'CFOP Invalido. (Item: '||V_SEQUENCIAL||') - ' ||C_ITEMNF.CDFISCOPERIT, 'CFOP', 'E');
            END IF;
         END IF; 

         IF C_ITEMNF.CDSITUTRIBIT = '000' THEN
            IF C_ITEMNF.CDFISCALIT <> '1' THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'CST 000 com codigo fiscal '||C_ITEMNF.CDFISCALIT||'. O codigo fiscal para itens de CST 000 deve ser 1. (Item: '||V_SEQUENCIAL||')', 'CF', 'E');
            END IF;
         END IF;
         IF C_ITEMNF.CDFISCALIT = '1' THEN
            IF C_ITEMNF.VRBASECALCIT = 0 THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'O valor da base de calculo nao pode ser zero para itens de codigo fiscal 1. (Item: '||V_SEQUENCIAL||')', 'CF', 'E');
            END IF;
         END IF;
         IF C_ITEMNF.CDFISCALIT = '2' OR C_ITEMNF.CDFISCALIT = '3' THEN
            IF SUBSTR(C_ITEMNF.CDSITUTRIBIT, 2, 2) <> '20' THEN
               IF SUBSTR(C_ITEMNF.CDSITUTRIBIT, 2, 2) NOT IN ('30', '40', '41', '50', '51', '60', '70', '90') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                    (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                    'Para os itens de codigos fiscais 2 e 3 o final do CST pode ser apenas 20, 30, 40, 41, 50, 51, 60, 70 e 90. (Item: '||V_SEQUENCIAL||')', 'CST', 'E');
               END IF;
            END IF;
         END IF;

         IF SUBSTR(C_ITEMNF.CDSITUTRIBIT,2,2) IN ('20', '70') THEN
            IF NVL(VALOR_REDUCAO(C_NF.CDFILIAL, C_NF.NRLANCTONF, C_ITEMNF.CDSITUTRIBIT, C_ITEMNF.NRSEQITPROD, C_ITEMNF.CDFISCOPERIT, NULL, NULL, NULL),0) <= 0 THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'CST de reducao de base de calculo (' || C_ITEMNF.CDSITUTRIBIT || ') sem valor de base de calculo reduzida. (Item: '||V_SEQUENCIAL||')', 'CST', DECODE(V_SGESTADOINSC,'RS','E','A'));
            END IF;
         END IF;

         IF SUBSTR(C_ITEMNF.CDSITUTRIBIT, 2, 2) NOT IN ('20', '51', '90') AND C_NF.IDENTRSAIDOP = 'S' THEN
            IF SUBSTR(C_ITEMNF.CDSITUTRIBIT, 2, 2) IN ('30', '40', '41', '50') THEN
               IF C_ITEMNF.CDFISCALIT NOT IN ('2', '3') THEN
                  IF C_ITEMNF.VRBASECALCIT > 0 THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'O valor da base de calculo dos itens com CST de final 30, 40, 41 e 50  deve ser igual a zero. (Item: '||V_SEQUENCIAL||')', 'CST', 'E');
                  END IF;
                  IF C_ITEMNF.VRALIQITEM > 0 THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'O valor da aliquota dos itens com CST de final 30, 40, 41 e 50 deve ser igual a zero. (Item: '||V_SEQUENCIAL||')', 'CST', 'E');
                  END IF;
                  IF C_ITEMNF.VRIMPOSTOIT > 0 THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'O valor do icms dos itens com CST de final 30, 40, 41 e 50 deve ser igual a zero. (Item: '||V_SEQUENCIAL||')', 'CST', 'E');
                  END IF;
               END IF;
            ELSE
               IF C_ITEMNF.VRBASECALCIT = 0 THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                     'O valor da base de calculo dos itens com CST de final diferente de 30, 40, 41, 50 e 60 deve ser maior que zero, (Item: '||V_SEQUENCIAL||')', 'CST', 'A');
               END IF;
               IF C_ITEMNF.VRALIQITEM = 0 THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                     'O valor da aliquota dos itens com CST de final diferente de 30, 40, 41, 50 e 60 deve ser maior que zero. (Item: '||V_SEQUENCIAL||')', 'CST', 'A');
               END IF;
               IF C_ITEMNF.VRIMPOSTOIT = 0 THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                     'O valor do icms dos itens com CST de final diferente de 30, 40, 41, 50 e 60 deve ser maior que zero. (Item: '||V_SEQUENCIAL||')', 'CST', 'A');
               END IF;
            END IF;
         END IF;
         /*
         IF C_ITEMNF.NRITPROIMPOS = '1' THEN
            BEGIN
               SELECT VRCONTITIMP
                 INTO V_VRCONTITIMP
                 FROM ITEMPROIMPOS
                WHERE CDFILIAL     = C_NF.CDFILIAL
                  AND NRLANCTONF   = C_NF.NRLANCTONF
                  AND CDIMPOSTO    = P_CDIMPOSTO
                  AND NRSEQITPROD  = C_ITEMNF.NRSEQITPROD
                  AND NRITPROIMPOS = '2';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_VRCONTITIMP := NULL;
            END;
            IF V_VRCONTITIMP IS NOT NULL THEN
               BEGIN
                  SELECT ROUND(SUM(VRCONTITIMP),2)
                    INTO V_SOMAVRCONT
                    FROM ITEMPROIMPOS
                   WHERE CDFILIAL    = C_NF.CDFILIAL
                     AND NRLANCTONF  = C_NF.NRLANCTONF
                     AND CDIMPOSTO   = P_CDIMPOSTO
                     AND NRSEQITPROD = C_ITEMNF.NRSEQITPROD
                   GROUP BY CDFILIAL, NRLANCTONF, NRSEQITPROD, CDIMPOSTO;
               EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                    V_SOMAVRCONT := 0;
               END;
               BEGIN
                  SELECT VRPERREDBCIT
                    INTO V_VRPERREDBCIT
                    FROM ITEMPROIMPOS
                   WHERE CDFILIAL     = C_NF.CDFILIAL
                     AND NRLANCTONF   = C_NF.NRLANCTONF
                     AND CDIMPOSTO    = P_CDIMPOSTO
                     AND NRSEQITPROD  = C_ITEMNF.NRSEQITPROD
                     AND NRITPROIMPOS = '1';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_VRPERREDBCIT := 0;
               END;
               V_VRPARCREDU := ROUND((V_SOMAVRCONT * V_VRPERREDBCIT / 100), 2);
               IF V_VRCONTITIMP <> V_VRPARCREDU THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                  INSERT INTO ERRONFPREVALID
                     (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                  VALUES
                     (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                     'Valor da parcela reduzida diferente do resultado da aplicacao do percentual de reducao da base de calculo sobre o valor contabil do item', 'REDU_BASE_CALC', 'E');
               END IF;
            END IF;
         END IF;
         */
         IF NOT ((C_NF.CDMODDOCFISC IN ('08', '8B', '09', '10', '11', '26', '27','57')) OR (C_NF.CDMODDOCFISC = '07' AND C_NF.IDENTRSAIDOP = 'E')) THEN
            BEGIN
               SELECT P.CDARVPROD, P.NMPRODUTO
                 INTO V_CDARVPROD, V_NOMEPROD
                 FROM RELACPRODITGEN R, PRODUTO P
                WHERE P.CDPRODUTO  = R.CDPRODUTO
                  AND R.CDLIVROMAG = P_CDLIVROMAG
                  AND R.CDPRODUTO  = C_ITEMNF.CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDARVPROD := NULL;
                  V_NOMEPROD  := NULL;
            END;
            IF V_CDARVPROD IS NULL THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'Produto '||C_ITEMNF.CDARVPROD||' - '||C_ITEMNF.NMPRODUTO|| ' sem codigo de genero\item cadastrado. (Item: '||V_SEQUENCIAL||')'  , 'GENERO', 'E');
            END IF;
         END IF;
         IF C_ITEMNF.NRITPROIMPOS = 2 THEN
            IF (C_ITEMNF.VRBASECALCIT > 0) OR (C_ITEMNF.VRIMPOSTOIT > 0) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'Item de reducao de base de calculo com imposto ou base de calculo maiores do que zero. Em caso de reducao estes valores devem ser zero. (Item: '||V_SEQUENCIAL||')', 'REDU_BASE_CALC', 'E');
            END IF;
         END IF;
         IF C_ITEMNF.VRCONTITIMP < 0 THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                'Item com valor contabil negativo. (Item: '||V_SEQUENCIAL||')', 'VR_CONTABIL', 'E');
         END IF;
      END LOOP;
      V_SEQUENCIAL := 0;
      BEGIN
         SELECT ROUND(SUM(VRCONTITIMP),2)
           INTO V_TOTALITIMP
           FROM ITEMPROIMPOS I, IMPOSTO IM
          WHERE CDFILIAL   = C_NF.CDFILIAL
            AND NRLANCTONF = C_NF.NRLANCTONF
            AND IM.CDIMPOSTONFE = P_CDIMPOSTO
            AND NVL(I.NRITPROIMPOS,'3') <> '3'
            AND IM.CDIMPOSTO = I.CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TOTALITIMP := 0;
      END;
      BEGIN
         SELECT ROUND(SUM(VRCONTABILNF),2)
           INTO V_TOTALIMPNF
           FROM IMPOSTONF I, IMPOSTO IM
          WHERE CDFILIAL   = C_NF.CDFILIAL
            AND NRLANCTONF = C_NF.NRLANCTONF
            AND IM.CDIMPOSTONFE = P_CDIMPOSTO
            AND NVL(I.IDIMPOSTONF,'3') <> '3'
            AND IM.CDIMPOSTO = I.CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TOTALIMPNF := 0;
      END;
      IF V_TOTALITIMP <> V_TOTALIMPNF THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Valor contabil dos itens da nota e diferente do valor contabil do analitico por imposto. (Valor do analitico R$'||V_TOTALITIMP||'. Valor dos itens da nota R$'||V_TOTALIMPNF||')', 'VR_CONTABIL', 'E');
      END IF;

      IF (V_IDUTDESCICMS = 'N') AND (C_NF.CDTIPOOPER <> '03') AND (C_NF.IDENTRSAIDOP||C_NF.CDTIPOOPER <> 'E'||V_TIPOOPER_COMPL_E) AND (C_NF.IDENTRSAIDOP||C_NF.CDTIPOOPER <> 'S'||V_TIPOOPER_COMPL_S) THEN
         IF V_TOTALITIMP <> ROUND(C_NF.VRNOTAFISC,2) THEN
            /* DIFERENCA DE VALORES */
            V_DIFERENCA := ROUND(C_NF.VRNOTAFISC,2) - V_TOTALITIMP;
            IF V_DIFERENCA > 0.10 THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
               INSERT INTO ERRONFPREVALID
                  (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
               VALUES
                  (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                  'A soma dos itens do analitico por imposto nao e igual ao valor do documento. (Valor do documento R$'||C_NF.VRNOTAFISC||'. Soma dos analiticos R$'||V_TOTALITIMP||')', 'VR_CONTABIL', 'E');
            END IF;
         END IF;
         V_DIFERENCA := 0;
      END IF;

      IF V_TOTALIMPNF < 0 THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Nota com valor contabil negativo', 'VR_CONTABIL', 'E');
      END IF;
      IF NOT((C_NF.DTEMISSAO BETWEEN V_DTINIMAPA AND V_DTFIMMAPA)) AND (NOT(C_NF.DTENTRSAID BETWEEN V_DTINIMAPA AND V_DTFIMMAPA)) THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Nota Fiscal com data fora do periodo do Mapa Fiscal. Nota Fiscal extemporanea', 'DATA_NOTA', 'A');
      END IF;
      IF V_VENCMAPA = 'N' THEN
         IF V_DTVENCGUIA IS NULL AND V_TOTALIMPREC > 0 THEN
            V_VENCMAPA  := 'S';
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Mapa de apuracao com data de vencimento vazia. A data de vencimento do mapa deve ser preenchida', 'DATA_MAPA', 'E');
         ELSIF V_DTVENCGUIA < V_DTFIMMAPA AND V_TOTALIMPREC > 0 THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
            INSERT INTO ERRONFPREVALID
               (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
            VALUES
               (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
               'Mapa de apuracao com data de vencimento menor que a data final do periodo. Data de vencimento deve ser maior que a data final do periodo do mapa', 'DATA_MAPA', 'E');
         END IF;
      END IF;
      BEGIN
         SELECT DISTINCT C.NRINSJURCLIE, E.DSENDECLIE
           INTO V_INSJURCLIE, V_DSENDECLIE
           FROM CLIENTE C, ENDECLIE E
          WHERE C.CDCLIENTE = C_NF.CDCLIENTE
            AND E.CDCLIENTE = C_NF.CDCLIENTE
            AND E.IDTPENDECLIE = 'P';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DSENDECLIE := NULL;
            V_INSJURCLIE := NULL;
      END;
      BEGIN
         SELECT DISTINCT F.NRINSJURFORN, E.DSENDEFORN
           INTO V_INSJURFORN, V_DSENDEFORN
           FROM FORNECEDOR F, ENDEFORN E
          WHERE F.CDFORNECED = C_NF.CDFORNECED
            AND E.CDFORNECED = C_NF.CDFORNECED
            AND E.IDTPENDEFORN = 'P';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_INSJURFORN := NULL;
            V_DSENDEFORN := NULL;
      END;
      BEGIN
         SELECT DISTINCT F.NRINSJURFILI, E.DSENDEFILI
           INTO V_INSJURFILE, V_DSENDEFILE
           FROM FILIAL F, ENDEFILI E
          WHERE F.CDFILIAL = C_NF.CDFILIEMIT
            AND E.CDFILIAL = C_NF.CDFILIEMIT
            AND E.IDTPENDEFILI = 'P';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_INSJURFILE := NULL;
            V_DSENDEFILE := NULL;
      END;
      BEGIN
         SELECT DISTINCT F.NRINSJURFILI, E.DSENDEFILI
           INTO V_INSJURFILR, V_DSENDEFILR
           FROM FILIAL F, ENDEFILI E
          WHERE F.CDFILIAL = C_NF.CDFILIRECE
            AND E.CDFILIAL = C_NF.CDFILIRECE
            AND E.IDTPENDEFILI = 'P';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_INSJURFILR := NULL;
            V_DSENDEFILR := NULL;
      END;
      IF ((LENGTH(V_INSJURCLIE) <> 11) AND (LENGTH(V_INSJURCLIE) <> 14) AND (V_INSJURCLIE IS NOT NULL)) OR
         ((LENGTH(V_INSJURFORN) <> 11) AND (LENGTH(V_INSJURFORN) <> 14) AND (V_INSJURFORN IS NOT NULL)) OR
         ((LENGTH(V_INSJURFILE) <> 11) AND (LENGTH(V_INSJURFILE) <> 14) AND (V_INSJURFILE IS NOT NULL)) OR
         ((LENGTH(V_INSJURFILR) <> 11) AND (LENGTH(V_INSJURFILR) <> 14) AND (V_INSJURFILR IS NOT NULL)) THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Nota Fiscal com CPF ou CNPJ invalidos', 'CPF_CNPJ_INV', 'A');
      END IF;
      IF C_NF.CDCLIENTE IS NOT NULL AND V_DSENDECLIE IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Cliente com endereco nao preenchido', 'ENDERECO_CLIE', 'E');
      END IF;
      IF C_NF.CDFORNECED IS NOT NULL AND V_DSENDEFORN IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Fornecedor com endereco nao preenchido', 'ENDERECO_FORN', 'E');
      END IF;
      IF C_NF.CDFILIEMIT IS NOT NULL AND V_DSENDEFILE IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Filial de emissao com endereco nao preenchido', 'ENDERECO_FILI_E', 'E');
      END IF;
      IF C_NF.CDFILIRECE IS NOT NULL AND V_DSENDEFILR IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
         INSERT INTO ERRONFPREVALID
            (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
         VALUES
            (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
            'Filial de recebimento com endereco nao preenchido', 'ENDERECO_FILI_R', 'E');
      END IF;

      IF V_AJUSTES = 'N' THEN
         BEGIN
            SELECT ROUND(VRDIFALIQU,2) AS VRDIFALIQU
              INTO V_VRDIFALIQU
              FROM MAPARECUP
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRDIFALIQU    := 0;
         END;

         IF V_SGESTADOINSC <> 'PE' THEN

            FOR C_ITMAPARECUP IN (SELECT IDTIPOITMAPR, CDAJUSTEITMAPA
                                    FROM ITMAPARECUP I, NOTAFISCAL N
                                   WHERE NRSEQUMAPAPU     = P_NRSEQUMAPAPU
                                     AND N.CDFILIAL(+)    = I.CDFILIAL
                                     AND N.NRLANCTONF(+)  = I.NRLANCTONF
                                     AND ((N.IDSISTEMA(+) <> 'FIS') AND (N.IDSISTEMA(+) <> 'TMP'))) LOOP

               IF C_ITMAPARECUP.IDTIPOITMAPR = 'OD' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para outros debitos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'EC' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para estorno de creditos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'OC' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para outros creditos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'ED' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para estorno de debitos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'DD' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para deducoes deve ser informado.', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'DE' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para debito especial deve ser informado.', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'VI' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para valores informativos deve ser informado.', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'DA' THEN
                  V_VDDIFAL := 'N';
                  BEGIN
                    SELECT IDGERDIFALIQ
                      INTO V_VDDIFAL
                      FROM DADOSGERSPED
                     WHERE CDEMPRESA  = P_CDEMPRESA
                       AND CDINSCESTA = P_INSCRICAO;
                  EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_VDDIFAL := 'N';
                  END;
                  IF V_VRDIFALIQU > 0 AND C_ITMAPARECUP.CDAJUSTEITMAPA IS NULL AND V_VDDIFAL = 'S' THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste para diferencial de aliquota deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               END IF;
            END LOOP;
         ELSE
            /* VALIDA O CODIGO DE AJUSTE DO SEF II-PE */
            BEGIN
               SELECT SUM(VRRECEITAGUIA), MAX(CDRECEITAGUIA)
                INTO V_VRRECEITAGUIA, V_CDRECEITAGUIA
                FROM GUIACOMPLMAPA
               WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                 V_VRRECEITAGUIA := 0;
                 V_CDRECEITAGUIA := '';
            END;

            FOR C_ITMAPARECUP IN (SELECT IDTIPOITMAPR, CDAJUSTEITSEF
                                    FROM ITMAPARECUP I, NOTAFISCAL N
                                   WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                                     AND N.CDFILIAL(+) = I.CDFILIAL
                                     AND N.NRLANCTONF(+) = I.NRLANCTONF
                                     AND ((N.IDSISTEMA(+) <> 'FIS') AND (N.IDSISTEMA(+) <> 'TMP'))) LOOP

               IF C_ITMAPARECUP.IDTIPOITMAPR = 'OD' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste (SEF-PE) para outros debitos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'EC' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste (SEF-PE) para estorno de creditos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'OC' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste (SEF-PE) para outros creditos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'ED' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                         'Codigo de ajuste (SEF-PE) para estorno de debitos deve ser informado', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'DD' THEN
                  IF C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                     INSERT INTO ERRONFPREVALID
                        (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                     VALUES
                        (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                        'Codigo de ajuste (SEF-PE) para deducoes deve ser informado.', 'COD_AJUSTE', 'E');
                  END IF;
               ELSIF C_ITMAPARECUP.IDTIPOITMAPR = 'DA' THEN
                  IF V_VRRECEITAGUIA <> V_VRDIFALIQU THEN
                     IF V_VRDIFALIQU > 0 AND C_ITMAPARECUP.CDAJUSTEITSEF IS NULL THEN
                        V_SEQERRO   := V_SEQERRO + 1;
                        V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                        INSERT INTO ERRONFPREVALID
                           (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSTIPOVALIDA, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                        VALUES
                           (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO, 'SPED',
                           'Codigo de ajuste (SEF-PE) para diferencial de aliquota deve ser informado', 'COD_AJUSTE', 'E');
                     END IF;
                  ELSE
                     IF V_CDRECEITAGUIA IS NULL THEN
                        V_SEQERRO   := V_SEQERRO + 1;
                        V_STSEQERRO := LPAD(TO_CHAR(V_SEQERRO), 3, '0');
                        INSERT INTO ERRONFPREVALID
                           (CDFILIAL, NRLANCTONF, NRSEQERRONFPRE, DSERRONFPRE, IDERRONFPRE, IDERROAVISNFPRE)
                        VALUES
                           (C_NF.CDFILIAL, C_NF.NRLANCTONF, V_STSEQERRO,
                           'Codigo da receita (SEF-PE) para diferencial de aliquota deve ser informado', 'COD_AJUSTE', 'E');
                     END IF;
                  END IF;
               END IF;
            END LOOP;
         END IF;
         V_AJUSTES := 'S';
      END IF;
   END LOOP;
   V_SGESTADOINSC := '';
END;
/