CREATE OR REPLACE PROCEDURE PRE_VALIDACAO_REDZ(
   P_CDFILIAL      IN  VENDA.CDFILIAL%TYPE,
   P_CDCAIXA       IN  VENDA.CDCAIXA%TYPE,
   P_DTENTRVENDA   IN  VENDA.DTENTRVENDA%TYPE,
   P_IDORIGEMREDZ  IN  VARCHAR2)
IS
   V_SEQERRO          NUMBER;
   V_STSEQERRO        VARCHAR2(05);
   V_CDEMPRESA        VARCHAR2(02);
   V_CDINSCESTA       VARCHAR2(16);
   V_CDINSCMUNI       VARCHAR2(16);
   V_IDCUMUPISCOFIL   VARCHAR2(01);
   V_IDFORMAPUREMPR   VARCHAR2(01);
   V_CDSITUCRT        VARCHAR2(01);
   V_CDTIPOOPER       VARCHAR2(02);
   V_CDCLIENTE        VARCHAR2(21);
   V_CDSERIE          VARCHAR2(05);
   V_CDMODDOCFISC     VARCHAR2(02);
   V_CDLIVROMAG       VARCHAR2(10);
   V_IDTPAPUFIL       VARCHAR2(01);
   V_IDINTEGRAEEXTRA  VARCHAR2(01);
   V_MOVCONCILIADA    VARCHAR2(01);
   V_IDPREVALIDCUPOM  VARCHAR2(01);
   V_IDGERAFIN        VARCHAR2(01);
   V_RETSANGRIA       NUMBER;
   V_IDCUPOMPEND      VARCHAR2(01);
   V_ERROREDZ         VARCHAR2(01);
   V_VRBCALCIMPRZ     NUMBER;
   V_VRIMPOSTORZ      NUMBER;
   V_VRVENDA          NUMBER;
   V_PRINRCUPOMFIS    VARCHAR2(10);
   V_ULTNRCUPOMFIS    VARCHAR2(10);
   V_BOINTERVALO      BOOLEAN;
   V_PAISDEST         VARCHAR2(04);
   V_ESTADEST         VARCHAR2(02);
   V_CDIMPICMS        VARCHAR2(02);
   V_GRUPOFISC        VARCHAR2(10);
   V_CSTNFE           VARCHAR2(05);
   V_IDMODBCNFE       VARCHAR2(05);
   V_IDMODBCSTNFE     VARCHAR2(05);
   V_CDTPCRPICOSTNFE  VARCHAR2(10);
   V_CDNATUBCPCSTNFE  VARCHAR2(10);
   V_IDMOTIDESSTNFE   VARCHAR2(10);
   V_CDFISCOPERSN     VARCHAR2(04);
   V_BOINCIDEPIS      BOOLEAN;
   V_BOINCIDECOFINS   BOOLEAN;
   V_CDFISCALPIS      VARCHAR2(01);
   V_CDFISCALCOFINS   VARCHAR2(01);
   V_CSTPIS           VARCHAR2(02);
   V_CSTCOFINS        VARCHAR2(02);
   V_VRALIQIMP        NUMBER;
   V_CDTPAJUSANGRACR  VARCHAR2(04);
   V_CDTPAJUSANGRRED  VARCHAR2(04);
   V_CSTCSOSN         VARCHAR2(03);
   V_CDSERIESAT       NUMBER;
   V_VRSANGRIA        NUMBER;
   V_IDCONTTXSERVSEP  VARCHAR2(01);
   V_CDTPAJTXSERV     VARCHAR2(04);
   V_VRTAXAADMISERV   NUMBER;
   V_CDTPAJTXADMSERV  VARCHAR2(04);
   V_IDUTILCONTAB     VARCHAR2(01);
   V_CONTCTBL         VARCHAR2(20);
   V_VRBASECALCREDUZ  NUMBER;
   V_DIAJAAPROV       VARCHAR2(01);
   V_CFOPITEM         VARCHAR2(06);
   V_CSTITEM          VARCHAR2(05);
   V_IDALIQIMPFIS     VARCHAR2(01);
   V_VRMOVCAIXA       NUMBER;
   V_VRIMPOPRODREDUZ  NUMBER;
   V_VRBCREDUZICMS    NUMBER;
   V_VRIMPOPRODIT     NUMBER;
   V_VRIMPPIS         NUMBER;
   V_VRIMPCOFINS      NUMBER;
   V_CFOP             NUMBER; 
   V_DTINIINTCONTDFS  DATE;
   V_DTFININTCONTDFS  DATE;
   V_DTINIINTCONTVEXT DATE;
   V_DTFININTCONTVEXT DATE;
   V_EXTEMPORANEA     BOOLEAN;
BEGIN
   /*Apaga algum erro que possa ter restado de outra validacao*/
   DELETE FROM PREVALIDCUPOM
    WHERE CDFILIAL   = P_CDFILIAL
      AND CDCAIXA    = P_CDCAIXA
      AND DTREDUCAOZ = P_DTENTRVENDA;

   V_SEQERRO := 0;
   V_EXTEMPORANEA := FALSE;

   /*Busca empresa, inscricao estadual e inscricao municipal da filial, para consulta das demais parametrizacoes*/
   BEGIN
      SELECT F.CDEMPRESA, F.CDINSCESTA, F.CDINSCMUNI, F.IDCUMUPISCOFIL, E.IDFORMAPUREMPR
        INTO V_CDEMPRESA, V_CDINSCESTA, V_CDINSCMUNI, V_IDCUMUPISCOFIL, V_IDFORMAPUREMPR
        FROM FILIAL F, EMPRESA E
       WHERE F.CDFILIAL  = P_CDFILIAL
         AND F.CDEMPRESA = E.CDEMPRESA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDEMPRESA      := NULL;
         V_CDINSCESTA     := NULL;
         V_CDINSCMUNI     := NULL;
         V_IDCUMUPISCOFIL := NULL;
         V_IDFORMAPUREMPR := NULL;
   END;

   /*Verifica se a empresa e do simples nacional. '1' e '2' e simples, '3' e regime normal*/
   SELECT NVL(MAX(CDSITUCRT),'3') CDSITUCRT
     INTO V_CDSITUCRT
     FROM PARAMEMPRESA
    WHERE CDEMPRESA = V_CDEMPRESA;

   /*Busca as Parametrizacoes no Gestao de Vendas*/
   V_IDTPAPUFIL      := 'V'; /*Gera os dados com base no valor das vendas ou da sangria*/
   V_IDINTEGRAEEXTRA := 'N'; /*Utiliza integracao com o e-extrato*/
   V_IDPREVALIDCUPOM := 'S'; /*Realiza a Pre-Validacao da Parte Fiscal*/
   V_IDUTILCONTAB    := 'N'; /*Utiliza o modulo de contabil*/
   V_IDCONTTXSERVSEP := 'N'; /*Contabiliza taxa de servicos separada das vendas*/
   V_VRTAXAADMISERV  := 0; /*Percentual da taxa de servico que nao sera destinado ao garcom*/
   BEGIN
      SELECT IDTPAPUFIL, IDINTEGRAEEXTRA, CDCLIENTE, IDPREVALIDCUPOM, IDUTILCONTAB,
             CDTPAJUSANGRACR, CDTPAJUSANGRRED, IDCONTTXSERVSEP, CDTPAJTXSERV, VRTAXAADMISERV, CDTPAJTXADMSERV
        INTO V_IDTPAPUFIL, V_IDINTEGRAEEXTRA, V_CDCLIENTE, V_IDPREVALIDCUPOM, V_IDUTILCONTAB,
             V_CDTPAJUSANGRACR, V_CDTPAJUSANGRRED, V_IDCONTTXSERVSEP, V_CDTPAJTXSERV, V_VRTAXAADMISERV, V_CDTPAJTXADMSERV
        FROM PARAVEND
       WHERE CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDTPAPUFIL      := 'V';
         V_IDINTEGRAEEXTRA := 'N';
         V_CDCLIENTE       := NULL;
         V_IDPREVALIDCUPOM := 'S';
         V_IDUTILCONTAB    := 'N';
         V_CDTPAJUSANGRACR := NULL;
         V_CDTPAJUSANGRRED := NULL;
         V_IDCONTTXSERVSEP := 'N';
         V_CDTPAJTXSERV    := NULL;
         V_VRTAXAADMISERV  := 0;
         V_CDTPAJTXADMSERV := NULL;
   END;

   /*****Validacao do periodo contabil*****/
   BEGIN
      SELECT CO.DTINIINTCONTDFS,  CO.DTFININTCONTDFS,
             CO.DTINIINTCONTVEXT, CO.DTFININTCONTVEXT
        INTO V_DTINIINTCONTDFS, V_DTFININTCONTDFS,
             V_DTINIINTCONTVEXT, V_DTFININTCONTVEXT
        FROM CONTOPECTBL CO, FILIAL FI
       WHERE FI.CDFILIAL   = P_CDFILIAL
         AND CO.CDEMPRESA = FI.CDEMPRESA
       ORDER BY CO.CDEMPRESA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_DTINIINTCONTDFS  := NULL;
         V_DTFININTCONTDFS  := NULL;
         V_DTINIINTCONTVEXT := NULL;
         V_DTFININTCONTVEXT := NULL;
   END;

   IF (P_DTENTRVENDA < V_DTINIINTCONTDFS) OR (P_DTENTRVENDA > V_DTFININTCONTDFS) THEN
      IF (V_DTINIINTCONTVEXT IS NULL) OR (TRUNC(SYSDATE) < V_DTINIINTCONTVEXT) OR (TRUNC(SYSDATE) > V_DTFININTCONTVEXT) OR (NVL(P_IDORIGEMREDZ,'ECF') NOT IN ('SAT','NFCE')) THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E', 'Data de Aprovacao Fora do Periodo Contabil',
            'Verifique a data para Doc. Fiscais de Saida na tela Parametros Contabil');
      ELSE
         IF (TRUNC(SYSDATE) BETWEEN V_DTINIINTCONTVEXT AND V_DTFININTCONTVEXT) THEN
            V_EXTEMPORANEA := TRUE;
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A', 'Aprovacao sera realizada como EXTEMPORANEA',
               'Os dados serao gerados com a data inicial para Doc. Fiscais de Saida na tela Parametros Contabil, nos modulos Fiscal, Financeiro e Contabil');
         END IF;
      END IF;
   END IF;

   /*****Validacao dos parametros obrigatorios para gerar a Nota do Fiscal*****/
   /*Tipo de Operacao*/
   /*Verifica se existe parametrizacao por loja*/
   BEGIN
      SELECT CDTIPOOPER
        INTO V_CDTIPOOPER
        FROM LOJA
       WHERE CDFILIAL = P_CDFILIAL
         AND CDLOJA   = (SELECT CDLOJA
                           FROM CAIXA
                          WHERE CDFILIAL = P_CDFILIAL
                            AND CDCAIXA  = P_CDCAIXA);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDTIPOOPER := NULL;
   END;
   /*Se nao existir por loja, busca da tela Parametros do Gestao de Vendas -> Integracao Contas a Receber*/
   IF V_CDTIPOOPER IS NULL THEN
      BEGIN
         SELECT CDTPOPERCNTREC
           INTO V_CDTIPOOPER
           FROM PARAVEND
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDTIPOOPER := NULL;
      END;
   END IF;
   IF V_CDTIPOOPER IS NULL THEN
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E', 'Tipo de operacao nao informado',
          'Verifique o cadastro na tela Parametros do Gestao de Vendas : Loja -> Gestao de Vendas ou Integracao Contas a Receber -> Filial');
   END IF;

   /*Verifica se o Cliente Padrao esta parametrizado*/
   IF V_CDCLIENTE IS NULL THEN
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E', 'Nao ha Cliente Padrao para vendas cadastrado para a filial',
          'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Filial -> Definicao de Padroes');
   END IF;

   /*Verifica se a Serie esta cadastrada na tela Parametros do Gestao de Vendas, primeiro na aba Filial -> Consolidacao de Vendas,
     e, se nao existir, busca da aba Integracao Contas a Receber -> Filial */
   BEGIN
      SELECT NVL(P.CDSERIECNTREC,P.CDSERIE)
        INTO V_CDSERIE
        FROM PARAVEND P, SERIENF S
       WHERE P.CDFILIAL   = P_CDFILIAL
         AND S.CDEMPRESA  = V_CDEMPRESA
         AND S.CDINSCESTA = V_CDINSCESTA
         AND S.CDINSCMUNI = V_CDINSCMUNI
         AND NVL(P.CDSERIECNTREC,P.CDSERIE) = S.CDSERIE;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDSERIE := NULL;
   END;
   IF V_CDSERIE IS NULL THEN
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E', 'Nao ha serie de documentos fiscais de saida vinculada a filial',
          'Verifique o cadastro na tela Parametros do Gestao de Vendas: Filial -> Consolidacao de Vendas ou Integracao Contas a Receber -> Filial');
   END IF;

   /*Verifica o modelo de documento por Tipo de Operacao*/
   IF V_CDTIPOOPER IS NOT NULL THEN
      BEGIN
         SELECT MIN(CDMODDOCFISC)
           INTO V_CDMODDOCFISC
           FROM MODDOCFISCTPOP
          WHERE CDTIPOOPER   = V_CDTIPOOPER
            AND IDENTRSAIDOP = 'S';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDMODDOCFISC := NULL;
      END;
   ELSE
      V_CDMODDOCFISC := 'ER'; /*Para que a variavel nao fique nula e mostre a mensagem se o tipo de operacao nao estiver cadastrado*/
   END IF;
   IF V_CDMODDOCFISC IS NULL THEN
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'Nao ha modelo de documento fiscal cadastrado para o tipo de operacao',
          'Verifique o cadastro na tela Modelo de Documento Fiscal -> Por Tipo de Operacao');
   END IF;

   /*Verifica se o Livro Magnetico Padrao esta parametrizado para as empresas que apuram por Data de Pagamento*/
   IF V_IDFORMAPUREMPR = 'P' THEN
      BEGIN
         SELECT CDLIVROMAG
           INTO V_CDLIVROMAG
           FROM LIVROMAGNETICO
          WHERE IDPADRAOLIVRO = 'S';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDLIVROMAG := NULL;
      END;
      IF V_CDLIVROMAG IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Para empresas que apuram o imposto por data de pagamento o livro magnetico padrao deve ser informado',
             'Verifique o cadastro do livro padrao em Ambiente -> Cadastros -> Livros Magneticos');
      END IF;
   END IF;

   /*****Validacao dos Parametros do Financeiro*****/
   /*Verifica se os tipos de ajuste estao preenchidos quando utiliza a contabilizacao da taxa de servico separada das vendas*/
   IF V_IDCONTTXSERVSEP = 'S' THEN
      IF V_CDTPAJTXSERV IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Quando estiver marcado o parametro "Contabiliza Taxa de Servicos Separada das Vendas" o Tipo de Ajuste deve ser informado',
             'Verifique o cadastro do tipo de ajuste em Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Filial');
      END IF;
      IF V_VRTAXAADMISERV > 0 THEN
         IF V_CDTPAJTXADMSERV IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Quando houver percentual de taxa administrativa sobre a taxa de servico o Tipo de Ajuste deve ser informado',
                'Verifique o cadastro do tipo de ajuste em Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Filial');
         END IF;
         /*Ajuste da taxa de servicos, quando contabilizada separada das vendas*/
         IF (V_CDTPAJTXSERV = V_CDTPAJTXADMSERV) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'O ajuste para taxa de servico e o mesmo ajuste da taxa administrativa sobre a taxa de servico',
                'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Filial');
         END IF;
      END IF;
   END IF;
   FOR C_VENDA_PARC IN (SELECT SUM(MV.VRPARCRECEB) AS VRPARCELA,
                               MO.CDTIPORECE, MO.NRSEQVENDA
                          FROM MOVCAIXAPAG MV, MOVCAIXA MO
                         WHERE MV.CDFILIAL     = MO.CDFILIAL
                           AND MV.CDCAIXA      = MO.CDCAIXA
                           AND MV.NRSEQVENDA   = MO.NRSEQVENDA
                           AND MV.NRSEQUMOVI   = MO.NRSEQUMOVI
                           AND MV.DTABERCAIX   = MO.DTABERCAIX
                           AND MO.CDFILIAL     = P_CDFILIAL
                           AND MO.CDCAIXA      = P_CDCAIXA
                           AND MO.DTMOVIMCAIXA = P_DTENTRVENDA
                         GROUP BY MO.CDTIPORECE, MO.NRSEQVENDA)LOOP

      IF V_IDTPAPUFIL = 'S' THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Para utilizar a rotina de vendas parceladas a filial deve estar parametrizada para considerar o valor das vendas',
                'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Filial');
      END IF;

      BEGIN
         SELECT SUM(TRUNC(DECODE(MO.IDTIPOMOVIVE,'T',VRMOVIVEND,DECODE(MO.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(MO.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0))),2)) AS VRMOVCAIXA
           INTO V_VRMOVCAIXA
           FROM MOVCAIXA MO
          WHERE MO.CDFILIAL     = P_CDFILIAL
            AND MO.CDCAIXA      = P_CDCAIXA
            AND MO.DTMOVIMCAIXA = P_DTENTRVENDA
            AND MO.CDTIPORECE   = C_VENDA_PARC.CDTIPORECE
            AND MO.NRSEQVENDA   = C_VENDA_PARC.NRSEQVENDA;   
      EXCEPTION
         WHEN NO_DATA_FOUND THEN 
            V_VRMOVCAIXA := 0;
      END;
      IF C_VENDA_PARC.VRPARCELA <> V_VRMOVCAIXA THEN
          V_SEQERRO   := V_SEQERRO + 1;
          V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
          INSERT INTO PREVALIDCUPOM
             (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
          VALUES
             (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
              'Venda '||C_VENDA_PARC.NRSEQVENDA||' com somatorio das parcelas diferente do valor total do recebimento na tabela MOVCAIXA',
              'Entrar em contato com a Teknisa. Tipo de recebimento: '||C_VENDA_PARC.CDTIPORECE);

      END IF;


   END LOOP;
   /*Parametros necessarios por Tipo de Recebimento*/
   FOR C_TIPORECE IN (SELECT DISTINCT M.CDTIPORECE, NVL(TF.CDTPCTRECEB,TP.CDTPCTRECEB) AS CDTPCTRECEB, 
                             NVL(TF.CDCLIENTE, TP.CDCLIENTE) AS CDCLIENTE, 
                             NVL(TF.CDAJTXADMREC,TP.CDAJTXADMREC) AS CDAJTXADMREC,
                             NVL(TF.CDTPAJUSANGRRED,TP.CDTPAJUSANGRRED) AS CDTPAJUSANGRRED,
                             NVL(TF.CDTPAJUSANGRACR, TP.CDTPAJUSANGRACR ) AS CDTPAJUSANGRACR
                        FROM MOVCAIXA M, TIPORECE TP, TIPORECEFILIAL TF 
                       WHERE M.CDFILIAL     = P_CDFILIAL 
                         AND M.CDCAIXA      = P_CDCAIXA
                         AND M.DTMOVIMCAIXA = P_DTENTRVENDA
                         AND M.CDTIPORECE   = TP.CDTIPORECE(+)
                         AND M.CDTIPORECE   = TF.CDTIPORECE(+)
                         AND M.CDFILIAL     = TF.CDFILIAL(+)
                         AND M.IDTIPOMOVIVE IN ('E','S','G')
                         AND M.IDAPROVREDZNFCE = 'P') LOOP

      /*Verifica se gera as informacoes para o financeiro por Filial*/
      BEGIN
         SELECT IDGERAFINFIL
           INTO V_IDGERAFIN
           FROM TIPORECEFILIAL
          WHERE CDFILIAL   = P_CDFILIAL
            AND CDTIPORECE = C_TIPORECE.CDTIPORECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDGERAFIN := NULL;
      END;
      /*Verifica se gera as informacoes para o financeiro na aba geral*/
      IF V_IDGERAFIN IS NULL THEN
         BEGIN
            SELECT IDGERAFIN
              INTO V_IDGERAFIN
              FROM TIPORECE
             WHERE CDTIPORECE = C_TIPORECE.CDTIPORECE;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDGERAFIN := NULL;
         END;
      END IF;
      /*Verifica se o tipo de conta esta cadastrado para o tipo de recebimento*/
      IF (C_TIPORECE.CDTPCTRECEB IS NULL) AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O tipo de recebimento '|| C_TIPORECE.CDTIPORECE || ' nao possui tipo de conta cadastrado',
             'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral');
      END IF;
      /*Verifica se o cliente esta cadastrado para o tipo de recebimento*/
      IF (C_TIPORECE.CDCLIENTE IS NULL) AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O tipo de recebimento '|| C_TIPORECE.CDTIPORECE || ' nao possui cliente cadastrado',
             'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral');
      END IF;

      /*Verifica se existem ajustes parametrizados para sangria diferente do valor das vendas*/
      IF (V_IDTPAPUFIL = 'S') AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         IF (V_CDTPAJUSANGRACR IS NULL) AND (C_TIPORECE.CDTPAJUSANGRACR IS NULL) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Nao ha ajuste de acrescimo parametrizado para as diferencas entre as vendas e a sangria na Filial ou no tipo de recebimento ' ||  C_TIPORECE.CDTIPORECE,
                'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral/Filial');
         END IF;
         IF (V_CDTPAJUSANGRRED IS NULL) AND (C_TIPORECE.CDTPAJUSANGRRED IS NULL) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Nao ha ajuste de reducao parametrizado para as diferencas entre as vendas e a sangria na Filial ou no tipo de recebimento ' ||  C_TIPORECE.CDTIPORECE,
                'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral/Filial');
         END IF;
      END IF;

      /*Verifica se o mesmo tipo de ajuste foi parametrizado em mais de um lugar, evitando erro de PK ao gerar o financeiro*/
      /*Ajuste de Acrescimo de Diferenca entre as vendas e a sangria*/
      IF ((NVL(C_TIPORECE.CDTPAJUSANGRACR,V_CDTPAJUSANGRACR) = V_CDTPAJTXSERV) OR
          (NVL(C_TIPORECE.CDTPAJUSANGRACR,V_CDTPAJUSANGRACR) = V_CDTPAJTXADMSERV)) AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O ajuste para diferenca de acrescimo entre as vendas e a sangria e o mesmo ajuste da taxa de servico ou taxa administrativa sobre a taxa de servico - Recebimento ' ||  C_TIPORECE.CDTIPORECE,
             'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral/Filial');
      END IF;
      /*Ajuste de Reducao de Diferenca entre as vendas e a sangria*/
      IF (NVL(C_TIPORECE.CDTPAJUSANGRRED,V_CDTPAJUSANGRRED) = C_TIPORECE.CDAJTXADMREC) AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O ajuste para diferenca de reducao entre as vendas e a sangria e o mesmo ajuste da taxa administrativa do cartao - Recebimento ' ||  C_TIPORECE.CDTIPORECE,
             'Verifique o cadastro na tela Parametros do Gestao de Vendas -> Integracao Contas a Receber -> Geral/Filial');
      END IF;

      /*Verifica se existe sangria para o tipo de recebimento*/
      V_RETSANGRIA := 0;
      BEGIN
         SELECT MAX(RETSANGRIA), SUM(VRSANGRIA)
           INTO V_RETSANGRIA, V_VRSANGRIA
           FROM (SELECT COUNT(*) AS RETSANGRIA, TRUNC(SUM(VRMOVIVEND),2) AS VRSANGRIA, DTABERCAIX
                   FROM MOVCAIXA
                  WHERE CDFILIAL     = P_CDFILIAL
                    AND CDCAIXA      = P_CDCAIXA
                    AND DTMOVIMCAIXA = P_DTENTRVENDA
                    AND CDTIPORECE   = C_TIPORECE.CDTIPORECE
                    AND IDTIPOMOVIVE = 'G'
                  GROUP BY DTABERCAIX);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_RETSANGRIA := NULL;
      END;
      IF (NVL(V_RETSANGRIA,0) = 0) AND (V_IDTPAPUFIL = 'S') AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
             'Nao existe sangria para o tipo de recebimento '|| C_TIPORECE.CDTIPORECE,
             'Verifique a tela Manutencao dos Lancamentos do Caixa');
      END IF;
      IF (NVL(V_RETSANGRIA,0) > 1) AND (V_IDTPAPUFIL = 'S') AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
             'Existe mais de uma sangria para o tipo de recebimento '|| C_TIPORECE.CDTIPORECE,
             'Verifique a tela Manutencao dos Lancamentos do Caixa');
      END IF;
      IF (NVL(V_RETSANGRIA,0) >= 1) AND (NVL(V_VRSANGRIA,0) = 0) AND (V_IDTPAPUFIL = 'S') AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Sangria com valor zerado para o tipo de recebimento '|| C_TIPORECE.CDTIPORECE,
             'Verifique a tela Manutencao dos Lancamentos do Caixa');
      END IF;

      /*Verifica se existe conta contabil parametrizada para o tipo de recebimento*/
      IF (V_IDUTILCONTAB = 'S') AND (NVL(V_IDGERAFIN,'N') = 'S') THEN
         BEGIN
            SELECT CDCONTCTBL
              INTO V_CONTCTBL
              FROM TIPOCTRECEBER
             WHERE CDTPCTRECEB = C_TIPORECE.CDTPCTRECEB;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CONTCTBL := NULL;
         END;
         IF V_CONTCTBL IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Tipo de conta a receber ' || C_TIPORECE.CDTPCTRECEB || ' sem conta contabil cadastrada',
                'Verifique a tela Parametros para Contabilizacao -> Lancamento FOS/VND -> Tipo de Conta a Receber');
         END IF;
      END IF;
   END LOOP;

   /*Verifica os cadastros se a filial utilizar o modulo contabil*/
   IF (V_IDUTILCONTAB = 'S') AND (V_CDSITUCRT = '3')  THEN
      /*Tipo de Operacao*/
      BEGIN
         SELECT CDCONTPROD
           INTO V_CONTCTBL
           FROM TIPOOPERAC
          WHERE IDENTRSAIDOP = 'S'
            AND CDTIPOOPER   = V_CDTIPOOPER;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CONTCTBL := NULL;
      END;
      IF V_CONTCTBL IS NULL THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Tipo de operacao ' || V_CDTIPOOPER || ' sem conta contabil Produto cadastrada',
             'Verifique a tela Parametros para Contabilizacao -> Lancamento FOS/VND -> Tipo de Operacao');
      END IF;
      /*Impostos*/
      FOR C_CONTIMP IN (SELECT CDIMPOSTO, SGIMPOSTO, CDCCTBLDESP, CDCCTBLPASS
                          FROM IMPOSTO
                         WHERE IDTPIMPOSFIS = 'T'
                            OR CDIMPOSTONFE IN ('50','60')) LOOP
         IF C_CONTIMP.CDCCTBLDESP IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Imposto ' || C_CONTIMP.CDIMPOSTO || ' - ' || C_CONTIMP.SGIMPOSTO || ' sem conta contabil Sobre Vendas cadastrada',
                'Verifique a tela Parametros para Contabilizacao -> Lancamento FOS/VND -> Imposto');
         END IF;
         IF C_CONTIMP.CDCCTBLPASS IS NULL THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Imposto ' || C_CONTIMP.CDIMPOSTO || ' - ' || C_CONTIMP.SGIMPOSTO || ' sem conta contabil A Recolher cadastrada',
                'Verifique a tela Parametros para Contabilizacao -> Lancamento FOS/VND -> Imposto');
         END IF;
      END LOOP;
   END IF;

   /*Verifica se existe mapa do simples nacional bloqueado para a empresa na data da reducao que esta sendo aprovada*/
   FOR C_MAPABLOQSN IN (SELECT MP.NRSEQUMAPAPU||DECODE(MP.NMMAPAAPUR,'','',' - '||NMMAPAAPUR) AS NMMAPAAPUR,
                               MP.DTINIPERIODO, MP.DTFIMPERIODO
                          FROM MAPAAPURACSN MP
                         WHERE MP.CDEMPRESA    = V_CDEMPRESA
                           AND P_DTENTRVENDA BETWEEN MP.DTINIPERIODO AND MP.DTFIMPERIODO
                           AND MP.IDBLOQMAPAPU = 'S') LOOP
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'O item pertence ao mapa de apuracao ' || C_MAPABLOQSN.NMMAPAAPUR ||
          ' bloqueado no periodo de ' || C_MAPABLOQSN.DTINIPERIODO || ' - ' || C_MAPABLOQSN.DTFIMPERIODO,
          'Verifique a tela de Apuracao de Imposto -> Simples Nacional');
   END LOOP;

   /*Verifica se existem vendas sem informacao na tabela MOVCAIXA*/
   FOR C_VENDSMOV IN (SELECT V.NRSEQVENDA
                        FROM VENDA V
                       WHERE V.CDFILIAL    = P_CDFILIAL
                         AND V.CDCAIXA     = P_CDCAIXA
                         AND V.DTENTRVENDA = P_DTENTRVENDA
                         AND V.IDSITUVENDA = 'O'
                         AND NOT EXISTS(SELECT CDFILIAL, CDCAIXA, NRSEQVENDA
                                          FROM MOVCAIXA M
                                         WHERE M.CDFILIAL     = V.CDFILIAL
                                           AND M.CDCAIXA      = V.CDCAIXA
                                           AND M.DTMOVIMCAIXA = V.DTENTRVENDA
                                           AND M.NRSEQVENDA   = V.NRSEQVENDA
                                           AND M.IDTIPOMOVIVE IN ('T','E','S'))) LOOP
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'Venda ('||C_VENDSMOV.NRSEQVENDA||') sem dados na tabela de movimento do caixa',
          'Entrar em contato com a Teknisa');
   END LOOP;

   /*Verifica se existem vendas com valor diferente da tabela MOVCAIXA*/
   FOR C_VENDSMOV IN (SELECT V.VRVENDA, M.VRMOVIVEND, V.NRSEQVENDA
                        FROM (SELECT SUM(TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS VRVENDA,
                                     VE.CDFILIAL, VE.CDCAIXA, VE.NRSEQVENDA
                                FROM VENDA VE, ITEMVENDA IT
                               WHERE VE.CDFILIAL      = P_CDFILIAL
                                 AND VE.CDCAIXA       = P_CDCAIXA
                                 AND VE.DTENTRVENDA   = P_DTENTRVENDA
                                 AND VE.CDFILIAL      = IT.CDFILIAL
                                 AND VE.CDCAIXA       = IT.CDCAIXA
                                 AND VE.NRSEQVENDA    = IT.NRSEQVENDA
                                 AND VE.IDSITUVENDA   = 'O'
                               GROUP BY VE.CDFILIAL, VE.CDCAIXA, VE.NRSEQVENDA) V,
                             (SELECT SUM(DECODE(MO.IDTIPOMOVIVE,'S',-(MO.VRMOVIVEND),MO.VRMOVIVEND)) AS VRMOVIVEND,
                                     MO.CDFILIAL, MO.CDCAIXA, MO.NRSEQVENDA
                                FROM MOVCAIXA MO
                               WHERE MO.CDFILIAL     = P_CDFILIAL
                                 AND MO.CDCAIXA      = P_CDCAIXA
                                 AND MO.DTMOVIMCAIXA = P_DTENTRVENDA
                                 AND MO.IDTIPOMOVIVE IN ('T','E','S')
                               GROUP BY MO.CDFILIAL, MO.CDCAIXA, MO.NRSEQVENDA) M
                        WHERE V.CDFILIAL   = M.CDFILIAL
                          AND V.CDCAIXA    = M.CDCAIXA
                          AND V.NRSEQVENDA = M.NRSEQVENDA
                          AND V.VRVENDA    <> M.VRMOVIVEND) LOOP
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'Venda ('||C_VENDSMOV.NRSEQVENDA||') com valor dos produtos diferente do valor na tabela de movimento do caixa',
          'Entrar em contato com a Teknisa');
   END LOOP;

   /*Verifica se existem informacoes na tabela MOVCAIXA com o campo DTMOVIMCAIXA gravado como Data/Hora*/
   FOR C_MOVDTHR IN (SELECT NRSEQVENDA
                       FROM MOVCAIXA M
                      WHERE M.CDFILIAL = P_CDFILIAL
                        AND M.CDCAIXA  = P_CDCAIXA
                        AND TRUNC(M.DTMOVIMCAIXA) = P_DTENTRVENDA
                        AND TRUNC(M.DTMOVIMCAIXA) <> M.DTMOVIMCAIXA
                        AND M.IDTIPOMOVIVE IN ('T','G','E','S')) LOOP
      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'Venda ('||C_MOVDTHR.NRSEQVENDA||') com campo de data gravado como Data/Hora na tabela de movimento do caixa',
          'Entrar em contato com a Teknisa');
   END LOOP;

   /*Verifica se existem informacoes na tabela MOVCAIXA com o campo DTMOVIMCAIXA divergente da data da venda*/
   FOR C_DATAMOV IN (SELECT VE.NRSEQVENDA
                       FROM VENDA VE, MOVCAIXA MO
                      WHERE VE.CDFILIAL      = P_CDFILIAL
                        AND VE.CDCAIXA       = P_CDCAIXA
                        AND VE.DTENTRVENDA   = P_DTENTRVENDA
                        AND MO.CDFILIAL      = VE.CDFILIAL
                        AND MO.CDCAIXA       = VE.CDCAIXA
                        AND MO.NRSEQVENDA    = VE.NRSEQVENDA
                        AND MO.DTMOVIMCAIXA <> VE.DTENTRVENDA
                        AND MO.IDTIPOMOVIVE IN ('T','E','S')
                        AND VE.IDSITUVENDA   = 'O') LOOP

      V_SEQERRO   := V_SEQERRO + 1;
      V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
      INSERT INTO PREVALIDCUPOM
         (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
      VALUES
         (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
          'Venda ('||C_DATAMOV.NRSEQVENDA||') com campo de data na tabela de movimento do caixa divergente da tabela de venda',
          'Entrar em contato com a Teknisa');
   END LOOP;

   /*Realiza as validacoes de Imposto*/
   IF V_IDPREVALIDCUPOM = 'S' THEN
      /*Verifica se existem dados na tabela ITVENDAIMPOS sem codigo de imposto*/
      FOR C_VENDASIMP IN (SELECT V.NRSEQVENDA
                            FROM VENDA V, ITVENDAIMPOS I
                           WHERE V.CDFILIAL    = P_CDFILIAL
                             AND V.CDCAIXA     = P_CDCAIXA
                             AND V.DTENTRVENDA = P_DTENTRVENDA
                             AND V.CDCAIXA     = I.CDCAIXA
                             AND V.CDFILIAL    = I.CDFILIAL
                             AND V.NRSEQVENDA  = I.NRSEQVENDA
                             AND I.CDIMPOSTO   IS NULL) LOOP

         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Venda ('||C_VENDASIMP.NRSEQVENDA||') sem informacao de imposto por item',
             'Entrar em contato com a Teknisa');
      END LOOP;

      /*Verifica se existem dados na tabela ITVENDAIMPOS com imposto sem relacionamento*/
      FOR C_VENDASIMPRELAC IN (SELECT DISTINCT I.CDIMPOSTO
                                 FROM VENDA V, ITVENDAIMPOS I, IMPOSTO IM
                                WHERE V.CDFILIAL    = P_CDFILIAL
                                  AND V.CDCAIXA     = P_CDCAIXA
                                  AND V.DTENTRVENDA = P_DTENTRVENDA
                                  AND V.CDCAIXA     = I.CDCAIXA
                                  AND V.CDFILIAL    = I.CDFILIAL
                                  AND V.NRSEQVENDA  = I.NRSEQVENDA
                                  AND I.CDIMPOSTO   = IM.CDIMPOSTO
                                  AND (IM.CDIMPOSTONFE IS NULL OR IM.CDIMPOSTONFE NOT IN ('00','80'))) LOOP

         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Foram realizadas vendas com o imposto '||C_VENDASIMPRELAC.CDIMPOSTO||' que nao esta relacionado ao ICMS ou ICMS ST',
             'Favor verificar a tela Relacionamento de Impostos');
      END LOOP;

      /*Verifica se existem itens com valor do produto negativo na venda*/
      FOR C_PRODUTONEGATIV IN (SELECT SUM(TRUNC((I.QTPRODVEND * (I.VRUNITVEND+NVL(I.VRUNITVENDCL,0))),2)-NVL(I.VRDESITVEND,0)+NVL(I.VRACRITVEND,0)) AS VRPRODUTO,
                                      V.CDFILIAL, V.CDCAIXA, V.NRSEQVENDA, I.NRSEQUITVEND
                                 FROM VENDA V, ITEMVENDA I
                                WHERE V.CDFILIAL    = P_CDFILIAL
                                  AND V.CDCAIXA     = P_CDCAIXA
                                  AND V.DTENTRVENDA = P_DTENTRVENDA
                                  AND V.CDFILIAL    = I.CDFILIAL
                                  AND V.CDCAIXA     = I.CDCAIXA
                                  AND V.NRSEQVENDA  = I.NRSEQVENDA
                                  AND V.IDSITUVENDA = 'O'
                                GROUP BY V.CDFILIAL, V.CDCAIXA, V.NRSEQVENDA, I.NRSEQUITVEND
                               HAVING SUM(TRUNC((I.QTPRODVEND * (I.VRUNITVEND+NVL(I.VRUNITVENDCL,0))),2)-NVL(I.VRDESITVEND,0)+NVL(I.VRACRITVEND,0)) < 0) LOOP
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Venda '||C_PRODUTONEGATIV.NRSEQVENDA||'com valor do produto negativo para o item ' || C_PRODUTONEGATIV.NRSEQUITVEND,
             'Entrar em contato com a Teknisa');
      END LOOP;
   END IF;

   /***** Fechamento de Cupom para NFC-e ou SAT *****/
   IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
      /*Verifica se estao sendo aprovados os cupons do dia atual. Para SAT e NFC-e eles so podem ser aprovados no dia seguinte*/
      IF P_DTENTRVENDA = TRUNC(SYSDATE) THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Nao e possivel aprovar as vendas do proprio dia para NFC-e e SAT', '');
      END IF;

      /*Para NFC-e e SAT verifica se ja foi realizada alguma aprovacao no dia, como nao existe a reducao z para unificar
        o mesmo dia pode ser aprovado em partes, o que pode gerar erro de PK, entre outros*/
      BEGIN
         SELECT MAX('S')
           INTO V_DIAJAAPROV
           FROM VENDA
          WHERE CDFILIAL     = P_CDFILIAL
            AND CDCAIXA      = P_CDCAIXA
            AND DTENTRVENDA  = P_DTENTRVENDA
            AND IDTPEMISVEND = DECODE(P_IDORIGEMREDZ,'NFCE','N','SAT','S')
            AND NVL(IDAPROVACAONFCE,'P') <> 'P'
            AND NVL(IDTPAMBNFCE, ' ')    = '1'
            AND NVL(IDSTATUSNFCE,' ')    = 'A'
            AND IDSITUVENDA  = 'O';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DIAJAAPROV := NULL;
      END;

      IF (V_DIAJAAPROV = 'S') AND (NOT(V_EXTEMPORANEA)) THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E', 'Ja foi realizada uma aprovacao de ' || P_IDORIGEMREDZ || ' para essa filial, caixa e data',
             'Cancele a apuracao anterior e faca novamente apos a atualizacao da tela');
      END IF;

      /*Verifica se existem cupons pendentes*/
      BEGIN
         SELECT MAX('S')
           INTO V_IDCUPOMPEND
           FROM VENDA V
          WHERE V.IDTPEMISVEND = 'N'
            AND V.CDFILIAL     = P_CDFILIAL
            AND V.CDCAIXA      = P_CDCAIXA
            AND V.DTENTRVENDA  = P_DTENTRVENDA
            AND V.IDTPAMBNFCE  = '1'
            AND V.IDSTATUSNFCE NOT IN ('A','C')
            AND V.IDSITUVENDA  = 'O';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDCUPOMPEND := NULL;
      END;
      IF V_IDCUPOMPEND = 'S' THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Existem cupom(s) fiscal(is) pendente(s) de transmissao para a filial, caixa e data selecionado',
             'Favor verificar a tela Transmissao de NFC-e');
      END IF;

      /*Verifica se existem cupons duplicados no sistema*/
      FOR C_CUPOMDUPL IN (SELECT COUNT(*), NRACESSONFCE
                            FROM VENDA
                           WHERE CDFILIAL    = P_CDFILIAL
                             AND CDCAIXA     = P_CDCAIXA
                             AND DTENTRVENDA = P_DTENTRVENDA
                             AND IDTPEMISVEND IN ('N','S')
                             AND NRACESSONFCE IS NOT NULL
                           GROUP BY NRACESSONFCE
                          HAVING COUNT(*) > 1) LOOP

         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Venda com chave de acesso '||C_CUPOMDUPL.NRACESSONFCE||' duplicada no sistema','Entrar em contato com a Teknisa');
      END LOOP;

      /*Verifica se existe vendas com numero de serie de sat diferentes, para mesmo dia, caixa e filial*/
      BEGIN
         SELECT COUNT(DISTINCT CDSERIESAT)
           INTO V_CDSERIESAT
           FROM VENDA
          WHERE CDFILIAL     = P_CDFILIAL
            AND CDCAIXA      = P_CDCAIXA
            AND DTENTRVENDA  = P_DTENTRVENDA
            AND IDTPEMISVEND = 'S'
            AND NVL(IDAPROVACAONFCE,'P') = 'P'
            AND IDSTATUSNFCE IN ('A','C')
            AND IDTPAMBNFCE  = '1'
            AND CDSERIESAT   IS NOT NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDSERIESAT := NULL;
      END;

      IF V_CDSERIESAT > 1 THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
             'Existem vendas com serie de SAT diferentes para o mesmo dia, caixa e filial',
             'Entrar em contato com a Teknisa');
      END IF;

      /*Verifica se existem vendas com status da venda diferente do status do NFC-e ou SAT, ou com campos nulos*/
      FOR C_CUPOMINV IN (SELECT NRSEQVENDA, IDTPEMISVEND, IDSITUVENDA, IDSTATUSNFCE, IDTPAMBNFCE, NRACESSONFCE, CDSERIESAT, NRNOTAFISCALCE, DTEMISSAONFCE
                           FROM VENDA
                          WHERE CDFILIAL    = P_CDFILIAL
                            AND CDCAIXA     = P_CDCAIXA
                            AND DTENTRVENDA = P_DTENTRVENDA
                            AND IDTPEMISVEND IN ('N','S')
                            AND NVL(IDAPROVACAONFCE,'P') = 'P'
                            AND NVL(IDTPAMBNFCE, '1') <> '2'
                            AND NVL(IDSTATUSNFCE,'A') <> 'R'
                            AND NVL(IDSITUVENDA,'O') <> 'D'
                            AND ((IDSTATUSNFCE IS NULL OR  IDTPAMBNFCE  IS NULL OR DTEMISSAONFCE IS NULL) OR
                                 (NRACESSONFCE IS NULL AND IDSTATUSNFCE IN ('A','C')) OR
                                 (LPAD(NVL(CDSERIESAT,'0'),10,'0') = '0000000000' AND IDTPEMISVEND = 'S' AND IDSTATUSNFCE IN ('A','C')) OR
                                 (IDSITUVENDA  = 'C'   AND IDSTATUSNFCE IN ('A','P')) OR
                                 (IDSITUVENDA  = 'O'   AND IDSTATUSNFCE <> 'A') OR
                                 (IDTPEMISVEND = 'N'   AND SUBSTR(NRACESSONFCE,1,3) =  'CFe') OR
                                 (IDTPEMISVEND = 'S'   AND SUBSTR(NRACESSONFCE,1,3) <> 'CFe'))) LOOP

         IF (C_CUPOMINV.IDSTATUSNFCE IS NULL) OR (C_CUPOMINV.IDTPAMBNFCE   IS NULL) OR
            (C_CUPOMINV.NRACESSONFCE IS NULL) OR (C_CUPOMINV.DTEMISSAONFCE IS NULL) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Venda ('||C_CUPOMINV.NRSEQVENDA||') com status, ambiente, data de emissao ou chave de acesso NFC-e/SAT nulos',
                'Entrar em contato com a Teknisa');
         END IF;

         IF (LPAD(NVL(C_CUPOMINV.CDSERIESAT,'0'),10,'0') = '0000000000') AND (C_CUPOMINV.IDTPEMISVEND = 'S') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Venda ('||C_CUPOMINV.NRSEQVENDA||') com serie do SAT nula ou zerada',
                'Entrar em contato com a Teknisa');
         END IF;

         IF (C_CUPOMINV.IDSITUVENDA = 'C') AND (C_CUPOMINV.IDSTATUSNFCE = 'A') THEN
            IF (C_CUPOMINV.IDTPEMISVEND = 'S') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Venda ('||C_CUPOMINV.NRSEQVENDA||') com status cancelada e status SAT aceito',
                   'Entrar em contato com a Teknisa');
            ELSE
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Cupom ('||C_CUPOMINV.NRNOTAFISCALCE||') com status cancelado e status NFC-e aceito',
                   'Venda deve ser cancelada pelo gestao de vendas');
            END IF;

         ELSIF (C_CUPOMINV.IDSITUVENDA = 'C') AND (C_CUPOMINV.IDSTATUSNFCE = 'P') AND (C_CUPOMINV.IDTPEMISVEND = 'N')THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Venda ('||C_CUPOMINV.NRSEQVENDA||') com status cancelada e status NFC-e pendente',
                'Entrar em contato com a Teknisa');

         ELSIF (C_CUPOMINV.IDSITUVENDA = 'O') AND (C_CUPOMINV.IDSTATUSNFCE <> 'A') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Venda ('||C_CUPOMINV.NRSEQVENDA||') com status concluida e status NFC-e/SAT diferente de aceito',
                'Entrar em contato com a Teknisa');
         END IF;

         IF (C_CUPOMINV.IDTPEMISVEND = 'N' AND SUBSTR(C_CUPOMINV.NRACESSONFCE,1,3) =  'CFe') OR (C_CUPOMINV.IDTPEMISVEND = 'S' AND SUBSTR(C_CUPOMINV.NRACESSONFCE,1,3) <> 'CFe') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Venda ('||C_CUPOMINV.NRSEQVENDA||') com chave de acesso divergente do tipo de venda NFC-e/SAT',
                'Entrar em contato com a Teknisa');
         END IF;
      END LOOP;

      /*Verifica se existem movimentos sem conciliacao - Rotina de Integracao com o E-Extrato*/
      IF V_IDINTEGRAEEXTRA = 'S' THEN
         BEGIN
            SELECT MAX('S')
              INTO V_MOVCONCILIADA
              FROM MOVCAIXA MV, TIPORECE TR, VENDA VE
             WHERE MV.IDMOVCONCILIADA = 'N'
               AND MV.CDFILIAL     = P_CDFILIAL
               AND MV.CDCAIXA      = P_CDCAIXA
               AND MV.DTMOVIMCAIXA = P_DTENTRVENDA
               AND MV.CDTIPORECE   = TR.CDTIPORECE
               AND TR.IDTIPORECE   IN ('1','2')
               AND MV.CDFILIAL     = VE.CDFILIAL
               AND MV.CDCAIXA      = VE.CDCAIXA
               AND MV.NRSEQVENDA   = VE.NRSEQVENDA
               AND MV.DTMOVIMCAIXA = VE.DTENTRVENDA
               AND VE.IDTPAMBNFCE  = '1'
               AND VE.IDSTATUSNFCE = 'A'
               AND VE.IDTPEMISVEND IN ('N','S')
               AND VE.IDSITUVENDA  = 'O'
               AND TR.IDAPROVREDZEEXT <> 'S';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_MOVCONCILIADA := NULL;
         END;
         IF V_MOVCONCILIADA = 'S' THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Existem movimentos para os tipos de recebimento "Cartao de Credito/Debito" sem conciliacao.(Parametro: Utiliza Integracao e-Extrato)',
                'Verifique a tela Integracao e-Extrato');
         END IF;
      END IF;

      /*Verifica se existe mapa bloqueado para algum imposto na data da reducao que esta sendo aprovada*/
      FOR C_REGBLOQMAPA IN (SELECT DISTINCT MP.NRSEQUMAPAPU||DECODE(MP.NMMAPAAPUR,'','',' - '||NMMAPAAPUR) AS NMMAPAAPUR,
                                    MP.CDIMPOSTO, MP.DTINIPERIODO, MP.DTFIMPERIODO
                              FROM VENDA VE, ITEMVENDA IT, ITVENDAIMPOS II, IMPOSTO IM, MAPAAPURAC MP, IMPOSTO I
                             WHERE VE.CDFILIAL      = P_CDFILIAL
                               AND VE.CDCAIXA       = P_CDCAIXA
                               AND VE.DTENTRVENDA   = P_DTENTRVENDA
                               AND VE.CDFILIAL      = IT.CDFILIAL
                               AND VE.CDCAIXA       = IT.CDCAIXA
                               AND VE.NRSEQVENDA    = IT.NRSEQVENDA
                               AND IT.CDFILIAL      = II.CDFILIAL
                               AND IT.CDCAIXA       = II.CDCAIXA
                               AND IT.NRSEQVENDA    = II.NRSEQVENDA
                               AND IT.NRSEQUITVEND  = II.NRSEQUITVEND
                               AND II.CDIMPOSTO     = IM.CDIMPOSTO
                               AND ((IM.CDIMPOSTONFE  = MP.CDIMPOSTO) OR
                                    ((MP.CDIMPOSTO  = '50' AND II.VRPERCOFINS > 0) OR  (MP.CDIMPOSTO = '60' AND II.VRPERPIS > 0)))
                               AND I.CDIMPOSTONFE   = MP.CDIMPOSTO
                               AND MP.CDEMPRESA     = V_CDEMPRESA
                               AND ((MP.CDINSCESTA  = V_CDINSCESTA AND I.IDORGARRECAD = 'E') OR
                                    (MP.CDINSCMUNI  = V_CDINSCMUNI AND I.IDORGARRECAD = 'F') OR
                                    (MP.CDINSCESTA IS NULL AND MP.CDINSCMUNI IS NULL AND I.IDORGARRECAD = 'F'))
                               AND P_DTENTRVENDA BETWEEN MP.DTINIPERIODO AND MP.DTFIMPERIODO
                               AND MP.IDBLOQMAPAPU  = 'S'
                               AND VE.IDTPAMBNFCE   = '1'
                               AND VE.IDSTATUSNFCE  = 'A'
                               AND VE.IDTPEMISVEND  IN ('N','S')) LOOP
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O item pertence ao mapa de apuracao ' || C_REGBLOQMAPA.NMMAPAAPUR || ' do imposto '|| C_REGBLOQMAPA.CDIMPOSTO ||
             ' bloqueado no periodo de ' || C_REGBLOQMAPA.DTINIPERIODO || ' - ' || C_REGBLOQMAPA.DTFIMPERIODO,
             'Verifique a tela de apuracao correspondente ao imposto (Impostos Gerais, Contribuicoes ou Simples Nacional)');
      END LOOP;

      IF V_IDPREVALIDCUPOM = 'S' THEN
         /*Realiza as validacoes referentes as parametrizacoes de Imposto*/
         FOR C_ITEMVENDA IN (SELECT P.CDARVPROD || ' - ' || P.NMPRODUTO AS PRODUTO, NVL(IP.IDTPIMPOSFIS,'F') AS IDTPIMPOSFIS,
                                    LPAD(IP.CDCSTPRODI,3,'0') AS CDCSTPRODI, IP.CDCSTPRODPC, IP.CDCFOPPROD, IP.VRPERPIS, IP.VRPERCOFINS,
                                    (TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) * (IP.VRPEALPRODIT/100) AS VRIMPCALC,
                                    (TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) * (IP.VRPERPIS/100) AS VRPISCALC,
                                    (TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) * (IP.VRPERCOFINS/100) AS VRCOFINSCALC,
                                    IP.VRIMPOPRODIT, IP.VRIMPPIS, IP.VRIMPCOFINS, VD.IDTPEMISVEND, IP.VRPRBCREDUICMS, IP.VRBASECALCREDUZ, IP.VRIMPOPRODREDUZ, IP.VRBCREDUZICMS,
                                    IP.VRPEALPRODIT, TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0),2) AS VRPRODUTO,
                                    IP.NRSEQVENDA, IP.NRSEQUITVEND, VD.CDCAIXA, VD.CDFILIAL
                               FROM VENDA VD, ITEMVENDA IT, PRODUTO P,
                                    (SELECT IV.CDFILIAL, IV.CDCAIXA, IV.NRSEQVENDA, IV.NRSEQUITVEND, I.IDTPIMPOSFIS,
                                            IV.VRPERPIS, IV.VRPERCOFINS, IV.VRPEALPRODIT, I.CDIMPOSTONFE,
                                            IV.CDCSTPRODI, IV.CDCSTPRODPC, IV.CDCFOPPROD, IV.VRIMPOPRODIT,
                                            IV.VRPRBCREDUICMS, IV.VRBASECALCREDUZ, IV.VRIMPOPRODREDUZ, IV.VRBCREDUZICMS,
                                            IV.VRIMPPIS, IV.VRIMPCOFINS
                                       FROM ITVENDAIMPOS IV, IMPOSTO I
                                      WHERE IV.CDIMPOSTO   = I.CDIMPOSTO
                                        AND I.IDTPIMPOSFIS <> 'S') IP
                              WHERE VD.CDFILIAL      = P_CDFILIAL
                                AND VD.CDCAIXA       = P_CDCAIXA
                                AND VD.IDSITUVENDA   = 'O'
                                AND VD.IDTPAMBNFCE   = '1'
                                AND VD.IDSTATUSNFCE  = 'A'
                                AND VD.IDTPEMISVEND  IN ('N','S')
                                AND VD.DTENTRVENDA   = P_DTENTRVENDA
                                AND VD.CDFILIAL      = IT.CDFILIAL
                                AND VD.CDCAIXA       = IT.CDCAIXA
                                AND VD.NRSEQVENDA    = IT.NRSEQVENDA
                                AND IT.CDPRODUTO     = P.CDPRODUTO
                                AND IT.CDFILIAL      = IP.CDFILIAL
                                AND IT.CDCAIXA       = IP.CDCAIXA
                                AND IT.NRSEQVENDA    = IP.NRSEQVENDA
                                AND IT.NRSEQUITVEND  = IP.NRSEQUITVEND
                                AND VD.IDAPROVACAONFCE = 'P'
                                AND IP.CDIMPOSTONFE  IN ('00','80')) LOOP

            /*Item com valor de ICMS diferente do calculado*/
            /*NFC-e e SAT foram atualizados para usar ROUND_ABNT nos calculos de imposto*/
            V_VRIMPOPRODIT := ROUND_ABNT(C_ITEMVENDA.VRIMPCALC,2);
            IF V_VRIMPOPRODIT <> C_ITEMVENDA.VRIMPOPRODIT THEN
               IF ABS(V_VRIMPOPRODIT - C_ITEMVENDA.VRIMPOPRODIT) <= 0.05 THEN
                  UPDATE ITVENDAIMPOS
                           SET VRIMPOPRODIT    = V_VRIMPOPRODIT
                         WHERE CDFILIAL        = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
               ELSE
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de ICMS diferente do calculado',
                   'Entrar em contato com a Teknisa');
               END IF;
            END IF;

            V_VRIMPPIS := ROUND_ABNT(C_ITEMVENDA.VRPISCALC,2);
            IF V_VRIMPPIS <> C_ITEMVENDA.VRIMPPIS THEN
               IF ABS(V_VRIMPPIS - C_ITEMVENDA.VRIMPPIS) <= 0.05 THEN
                  UPDATE ITVENDAIMPOS
                           SET VRIMPPIS        = V_VRIMPPIS
                         WHERE CDFILIAL        = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
               ELSE
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de PIS diferente do calculado',
                   'Entrar em contato com a Teknisa');
               END IF;
            END IF;

            V_VRIMPCOFINS:= ROUND_ABNT(C_ITEMVENDA.VRCOFINSCALC,2);
            IF V_VRIMPCOFINS <> C_ITEMVENDA.VRIMPCOFINS THEN
               IF ABS(V_VRIMPCOFINS - C_ITEMVENDA.VRIMPCOFINS) <= 0.05 THEN
                  UPDATE ITVENDAIMPOS
                           SET VRIMPCOFINS     = V_VRIMPCOFINS
                         WHERE CDFILIAL        = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
               ELSE
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de COFINS diferente do calculado',
                   'Entrar em contato com a Teknisa');
               END IF;
            END IF;

            /*Valida os campos quando houver reducao da base de calculo - Apenas para NFC-e, SAT nao tem reducao BC*/
            IF C_ITEMVENDA.IDTPEMISVEND = 'N' THEN
               IF C_ITEMVENDA.VRPRBCREDUICMS > 0 THEN
                  V_VRBASECALCREDUZ := NVL(TRUNC(C_ITEMVENDA.VRPRODUTO - (C_ITEMVENDA.VRPRODUTO * C_ITEMVENDA.VRPRBCREDUICMS/100),2),0);
                  IF V_VRBASECALCREDUZ <> C_ITEMVENDA.VRBASECALCREDUZ THEN
                     IF ABS(V_VRBASECALCREDUZ - C_ITEMVENDA.VRBASECALCREDUZ) <= 0.05 THEN
                        UPDATE ITVENDAIMPOS
                           SET VRBASECALCREDUZ = V_VRBASECALCREDUZ
                         WHERE CDFILIAL        = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
                     ELSE
                        V_SEQERRO   := V_SEQERRO + 1;
                        V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                        INSERT INTO PREVALIDCUPOM
                           (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                        VALUES
                           (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                            'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de base de calculo reduzida diferente do calculado',
                            'Entrar em contato com a Teknisa');
                     END IF;
                  END IF;

                  V_VRBCREDUZICMS := C_ITEMVENDA.VRPRODUTO - V_VRBASECALCREDUZ;
                  IF V_VRBCREDUZICMS <> C_ITEMVENDA.VRBCREDUZICMS THEN
                     IF ABS(V_VRBCREDUZICMS - C_ITEMVENDA.VRBCREDUZICMS) <= 0.05 THEN
                        UPDATE ITVENDAIMPOS
                           SET VRBCREDUZICMS   = V_VRBCREDUZICMS
                         WHERE CDFILIAL        = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
                     ELSE
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de reducao de base de calculo diferente do calculado',
                         'Entrar em contato com a Teknisa');
                     END IF;
                  END IF;

                  V_VRIMPOPRODREDUZ := ROUND_ABNT(V_VRBASECALCREDUZ * C_ITEMVENDA.VRPEALPRODIT/100,2);
                  IF V_VRIMPOPRODREDUZ <> C_ITEMVENDA.VRIMPOPRODREDUZ THEN
                     IF ABS(V_VRIMPOPRODREDUZ - C_ITEMVENDA.VRIMPOPRODREDUZ) <= 0.05 THEN
                        UPDATE ITVENDAIMPOS
                           SET VRIMPOPRODREDUZ = V_VRIMPOPRODREDUZ
                          WHERE CDFILIAL       = C_ITEMVENDA.CDFILIAL
                           AND CDCAIXA         = C_ITEMVENDA.CDCAIXA
                           AND NRSEQVENDA      = C_ITEMVENDA.NRSEQVENDA
                           AND NRSEQUITVEND    = C_ITEMVENDA.NRSEQUITVEND;
                     ELSE
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com valor de ICMS diferente do calculado (Base de calculo reduzida)',
                         'Entrar em contato com a Teknisa');
                     END IF;
                  END IF;
               END IF;
            END IF;

            V_CFOP := NULL;
            /*Item com CFOP vazio*/
            IF (C_ITEMVENDA.CDCFOPPROD IS NULL) OR (C_ITEMVENDA.CDCFOPPROD = '') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com CFOP vazio',
                   'Entrar em contato com a Teknisa');
            ELSE
               BEGIN
                  SELECT CDCFOPPADRAO
                    INTO V_CFOP
                    FROM CFOPPADRAO
                   WHERE C_ITEMVENDA.CDCFOPPROD = 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(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Item ' || C_ITEMVENDA.PRODUTO ||
                      ' com CFOP (' || C_ITEMVENDA.CDCFOPPROD || ') Invalido',
                      'Entrar em contato com a Teknisa');
               END IF;
            END IF;

            /*Item com CST ou CSOSN vazio*/
            IF ((C_ITEMVENDA.CDCSTPRODI IS NULL) OR (C_ITEMVENDA.CDCSTPRODI = '')) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com '|| DECODE(V_CDSITUCRT,'3','CST do ICMS','CSOSN') || ' vazio',
                   'Entrar em contato com a Teknisa');
            END IF;

            /*Para empresas do Simples considera CSOSN, com 3 digitos, para as empresas de regime normal considera o CST, com 2 digitos*/
            IF V_CDSITUCRT = '3' THEN
               V_CSTCSOSN := SUBSTR(C_ITEMVENDA.CDCSTPRODI,2,2);
            ELSE
               V_CSTCSOSN := C_ITEMVENDA.CDCSTPRODI;
            END IF;

            /*Item tributado com incidencia do ICMS e CFOP diferente de 5.101, 5.102 ou 5.103 ou CST diferente de '00', '20' ou '90', ou CSOSN diferente de '102' ou '900'*/
            IF C_ITEMVENDA.IDTPIMPOSFIS = 'T' THEN
               IF (C_ITEMVENDA.CDCFOPPROD <> '5101') AND (C_ITEMVENDA.CDCFOPPROD <> '5102') AND (C_ITEMVENDA.CDCFOPPROD <> '5103') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e CFOP diferente de 5.101, 5.102 ou 5.103',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF C_ITEMVENDA.VRPRBCREDUICMS > 0 THEN
                  IF (V_CSTCSOSN <> '20') AND (V_CDSITUCRT = '3') THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e reducao da base de calculo CST diferente de 20',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
                  END IF;
               ELSE
                  IF (V_CSTCSOSN <> '00') AND (V_CSTCSOSN <> '90') AND (V_CDSITUCRT = '3') THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS sem reducao de base de calculo e CST diferente de 00 ou 90',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
                  END IF;
               END IF;
               IF (V_CSTCSOSN <> '102') AND (V_CSTCSOSN <> '900') AND (V_CDSITUCRT <> '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e CSOSN diferente de 102 ou 900',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
            /*Item com incidencia do ICMS ST e CFOP diferente de 5.405 ou CST diferente de '60' ou CSOSN diferente de '500'*/
            ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'F' THEN
               IF C_ITEMVENDA.CDCFOPPROD <> '5405' THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CFOP diferente de 5.405',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '60') AND (V_CDSITUCRT = '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CST diferente de 60',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '500') AND (V_CDSITUCRT <> '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CSOSN diferente de 500',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
            /*Item ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103 ou CST diferente de '40' ou '90' ou CSOSN diferente de '300' ou '900'*/
            ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'I' THEN
               IF (C_ITEMVENDA.CDCFOPPROD <> '5101') AND (C_ITEMVENDA.CDCFOPPROD <> '5102') AND (C_ITEMVENDA.CDCFOPPROD <> '5103') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '40') AND (V_CSTCSOSN <> '90') AND (V_CDSITUCRT = '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CST diferente de 40 ou 90',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '102') AND (V_CSTCSOSN <> '300') AND (V_CSTCSOSN <> '900') AND (V_CDSITUCRT <> '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CSOSN diferente de 102, 300 ou 900',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
            /*Item ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103 ou CST diferente de '41' ou '90' ou CSOSN diferente de '300' ou '900'*/
            ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'N' THEN
               IF (C_ITEMVENDA.CDCFOPPROD <> '5101') AND (C_ITEMVENDA.CDCFOPPROD <> '5102') AND (C_ITEMVENDA.CDCFOPPROD <> '5103') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CFOP diferente de 5.101, 5.102 ou 5.103',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '41') AND (V_CSTCSOSN <> '90') AND (V_CDSITUCRT = '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CST diferente de 41 ou 90',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
               IF (V_CSTCSOSN <> '102') AND (V_CSTCSOSN <> '300') AND (V_CSTCSOSN <> '900') AND (V_CDSITUCRT <> '3') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CSOSN diferente de 102, 300 ou 900',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
               END IF;
            END IF;

            /*Item com CST vazio para o PIS/COFINS*/
            IF (C_ITEMVENDA.CDCSTPRODPC IS NULL) OR (C_ITEMVENDA.CDCSTPRODPC = '') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' sem CST para o PIS/COFINS',
                   'Entrar em contato com a Teknisa');
            END IF;

            /*Item com CST invalido para o PIS/COFINS - Se o campo estiver vazio passa 01 para nao repetir a mensagem*/
            IF NVL(C_ITEMVENDA.CDCSTPRODPC,'01') NOT IN ('01','02','03','04','05','06','07','08','09','49','99') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com CST invalido para o PIS/COFINS',
                   'Entrar em contato com a Teknisa');
            END IF;

            /*Item com CST tributado para o PIS/COFINS mas sem valor de aliquota*/
            IF (NVL(C_ITEMVENDA.CDCSTPRODPC,'00') IN ('01','02','03')) AND ((C_ITEMVENDA.VRPERPIS = 0) OR (C_ITEMVENDA.VRPERCOFINS = 0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com CST tributado (' || C_ITEMVENDA.CDCSTPRODPC || ') para o PIS/COFINS sem valor de aliquota',
                   'Entrar em contato com a Teknisa');
            END IF;

            /*Item com CST nao tributado para o PIS/COFINS e com valor de aliquota*/
            IF (NVL(C_ITEMVENDA.CDCSTPRODPC,'00') IN ('05','06','07','08','09')) AND ((C_ITEMVENDA.VRPERPIS > 0) OR (C_ITEMVENDA.VRPERCOFINS > 0)) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com CST nao tributado (' || C_ITEMVENDA.CDCSTPRODPC || ') para o PIS/COFINS e com valor de aliquota',
                   'Entrar em contato com a Teknisa');
            END IF;

            /*Item com CFOP vazio para o PIS/COFINS*/
            IF (C_ITEMVENDA.CDCFOPPROD IS NULL) OR (C_ITEMVENDA.CDCFOPPROD = '') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' sem CFOP para o PIS/COFINS',
                   'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
            END IF;

            /*Item com tributacao do PIS sem tributacao do COFINS*/
            IF (C_ITEMVENDA.VRPERPIS > 0) AND (C_ITEMVENDA.VRPERCOFINS = 0) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com tributacao de PIS, sem tributacao de COFINS',
                   'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
            END IF;

            /*Item com tributacao do COFINS sem tributacao do PIS*/
            IF (C_ITEMVENDA.VRPERPIS = 0) AND (C_ITEMVENDA.VRPERCOFINS > 0) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com tributacao de COFINS, sem tributacao de PIS',
                   'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto');
            END IF;

            /*Item com aliquota basica diferente do regime da Filial */
            IF (C_ITEMVENDA.CDCSTPRODPC = '01') THEN
               /*Filial do Regime Nao Cumulativo*/
               IF (V_IDCUMUPISCOFIL = 'S') AND (C_ITEMVENDA.VRPERPIS <> 1.65 OR C_ITEMVENDA.VRPERCOFINS <> 7.6) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial nao cumulativa e aliquota do PIS diferente de 1,65% ou do COFINS diferente de 7,6%',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
               END IF;
               /*Filial do Regime Cumulativo*/
               IF (V_IDCUMUPISCOFIL = 'N') AND (C_ITEMVENDA.VRPERPIS <> 0.65 OR C_ITEMVENDA.VRPERCOFINS <> 3.0) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial cumulativa e aliquota do PIS diferente de 0,65% ou do COFINS diferente de 3%',
                      'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
               END IF;
            END IF;
         END LOOP;
      END IF;

   /***** Fechamento de Cupom para Reducao-Z *****/
   ELSE
      /*Verifica se existem movimentos sem conciliacao - Rotina de Integracao com o E-Extrato*/
      IF V_IDINTEGRAEEXTRA = 'S' THEN
         BEGIN
            SELECT MAX('S')
              INTO V_MOVCONCILIADA
              FROM MOVCAIXA MV, TIPORECE TR
             WHERE MV.IDMOVCONCILIADA = 'N'
               AND MV.CDFILIAL     = P_CDFILIAL
               AND MV.CDCAIXA      = P_CDCAIXA
               AND MV.DTMOVIMCAIXA = P_DTENTRVENDA
               AND TR.IDTIPORECE   IN ('1','2')
               AND TR.CDTIPORECE   = MV.CDTIPORECE
               AND TR.IDAPROVREDZEEXT <> 'S';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_MOVCONCILIADA := NULL;
         END;
         IF V_MOVCONCILIADA = 'S' THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Existem movimentos para os tipos de recebimento "Cartao de Credito/Debito" sem conciliacao.(Parametro: Utiliza Integracao e-Extrato)',
                'Verifique a tela Integracao e-Extrato');
         END IF;
      END IF;

      /*Verifica se existe mapa bloqueado para algum imposto na data da reducao que esta sendo aprovada*/
      FOR C_REGBLOQMAPA IN (SELECT MP.CDIMPOSTO, MP.NRSEQUMAPAPU, MP.NMMAPAAPUR, MP.DTINIPERIODO, MP.DTFIMPERIODO
                              FROM IMPOSTOREDZ IR, IMPOSTO IM, MAPAAPURAC MP
                             WHERE IR.CDFILIAL     = P_CDFILIAL
                               AND IR.CDCAIXA      = P_CDCAIXA
                               AND IR.DTREDUCAOZ   = P_DTENTRVENDA
                               AND IR.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTONFE = MP.CDIMPOSTO
                               AND MP.CDEMPRESA    = V_CDEMPRESA
                               AND ((MP.CDINSCESTA = V_CDINSCESTA AND IM.IDORGARRECAD = 'E') OR
                                    (MP.CDINSCMUNI = V_CDINSCMUNI AND IM.IDORGARRECAD = 'F') OR
                                    (MP.CDINSCESTA IS NULL AND MP.CDINSCMUNI IS NULL AND IM.IDORGARRECAD = 'F'))
                               AND P_DTENTRVENDA   BETWEEN MP.DTINIPERIODO AND MP.DTFIMPERIODO
                               AND MP.IDBLOQMAPAPU = 'S'
                             UNION
                            SELECT MP.CDIMPOSTO, MP.NRSEQUMAPAPU, MP.NMMAPAAPUR, MP.DTINIPERIODO, MP.DTFIMPERIODO
                              FROM MAPAAPURAC MP
                             WHERE MP.CDEMPRESA    = V_CDEMPRESA
                               AND ((MP.CDIMPOSTO  = '50') OR (MP.CDIMPOSTO = '60'))
                               AND P_DTENTRVENDA   BETWEEN MP.DTINIPERIODO AND MP.DTFIMPERIODO
                               AND MP.IDBLOQMAPAPU = 'S') LOOP
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'O item selecionado pertence ao mapa de apuracao do imposto '|| C_REGBLOQMAPA.CDIMPOSTO ||
             ' bloqueado no periodo de ' || C_REGBLOQMAPA.DTINIPERIODO || ' - ' || C_REGBLOQMAPA.DTFIMPERIODO,
             'Verifique a tela de apuracao correspondente ao imposto (Impostos Gerais, Contribuicoes ou Simples Nacional)');
      END LOOP;

      /*Venda com numero de cupom fiscal vazio, zerado*/
      V_ERROREDZ := NULL;
      BEGIN
         SELECT MAX('S')
           INTO V_ERROREDZ
           FROM VENDA VE
          WHERE VE.CDFILIAL    = P_CDFILIAL
            AND VE.CDCAIXA     = P_CDCAIXA
            AND VE.DTENTRVENDA = P_DTENTRVENDA
            AND VE.IDSITUVENDA = 'O'
            AND NVL(VE.IDTPEMISVEND,'E') NOT IN ('N','S')
            AND VE.NRCUPOMFIS IS NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_ERROREDZ := NULL;
      END;
      IF V_ERROREDZ = 'S' THEN
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Venda com numero de cupom fiscal vazio, zerado', 'Verifique a Tela de Manutencao da Venda, pagina Venda');
      END IF;

      /*Dia com numero de cupom de repetido*/
      FOR C_CUPOMREPET IN (SELECT COUNT(*) AS CONT, NRCUPOMFIS
                             FROM VENDA
                            WHERE CDFILIAL    = P_CDFILIAL
                              AND CDCAIXA     = P_CDCAIXA
                              AND DTENTRVENDA = P_DTENTRVENDA
                              AND NVL(IDTPEMISVEND,'E') NOT IN ('N','S')
                              AND IDSITUVENDA IN ('C','O')
                            GROUP BY NRCUPOMFIS
                           HAVING COUNT(*) > 1) LOOP
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Venda com o cupom de numero: ' || C_CUPOMREPET.NRCUPOMFIS || ' repetido',
             'Verifique a Tela de Manutencao da Venda, pagina Venda');
      END LOOP;

      /*Reducao Z com mesmo numero de serie e descricao do modelo alterada no periodo*/
      FOR C_DSMODDIF IN (SELECT COUNT(DISTINCT DSMODMARCAECF) AS CONT, NRSERIEREDZ
                           FROM REDUCAOZ
                          WHERE CDFILIAL    = P_CDFILIAL
                            AND CDCAIXA     = P_CDCAIXA
                            AND DTREDUCAOZ BETWEEN FIRST_DAY(P_DTENTRVENDA) AND LAST_DAY(P_DTENTRVENDA)
                            AND DSMODMARCAECF IS NOT NULL
                          GROUP BY NRSERIEREDZ
                         HAVING COUNT(DISTINCT DSMODMARCAECF) > 1) LOOP
         V_SEQERRO   := V_SEQERRO + 1;
         V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
         INSERT INTO PREVALIDCUPOM
            (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
         VALUES
            (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
             'Existe Reducao Z para o numero de serie: ' || C_DSMODDIF.NRSERIEREDZ || ' com descricao do modelo/marca ecf diferentes no periodo',
             'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Marca/Modelo');
      END LOOP;

      /*Busca os dados da Reducao Z. Faz um loop para o caso de existirem duas reducoes para o mesmo caixa, dia e filial (Troca de Impressora)*/
      FOR C_REDZ IN (SELECT RZ.NRULTCFREDZ, RZ.NRPRIMCFREDZ, RZ.NRSERIEREDZ, RZ.DSMODMARCAECF, RZ.NRREINIREDZ,
                            RZ.NRREDREDZ, RZ.NRECFREDZ, NVL(RZ.VRVENBRUREDZ,0) AS VRVENBRUREDZ, RZ.IDORIGEMREDZ,
                            NVL(RZ.VRVENLIQREDZ,0) AS VRVENLIQREDZ, NVL(RZ.VRSTRIBREDZ,0) AS VRSTRIBREDZ,
                            NVL(RZ.VRISENCREDZ,0) AS VRISENCREDZ, NVL(RZ.VRNINCIDREDZ,0) AS VRNINCIDREDZ
                       FROM REDUCAOZ RZ
                      WHERE RZ.CDFILIAL   = P_CDFILIAL
                        AND RZ.CDCAIXA    = P_CDCAIXA
                        AND RZ.DTREDUCAOZ = P_DTENTRVENDA) LOOP

         /*As validacoes de intervalo sao tratadas como aviso devido ao numero do cupom poder ser reinicializado na impressora*/
         /*BEGIN
            SELECT MIN(VE.NRCUPOMFIS) AS PRINRCUPOMFIS, MAX(VE.NRCUPOMFIS) AS ULTNRCUPOMFIS
              INTO V_PRINRCUPOMFIS, V_ULTNRCUPOMFIS
              FROM VENDA VE
             WHERE VE.CDFILIAL      = P_CDFILIAL
               AND VE.CDCAIXA       = P_CDCAIXA
               AND VE.DTENTRVENDA   = P_DTENTRVENDA
               AND VE.NRSERIEIMPVND = C_REDZ.NRSERIEREDZ;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PRINRCUPOMFIS := NULL;
               V_ULTNRCUPOMFIS := NULL;
         END;*/

         V_BOINTERVALO := TRUE;
         /*Numero de cupom inicial esta zerado, invalido ou e diferente do numero de cupom inicial do dia*/
         IF (C_REDZ.NRPRIMCFREDZ = 'ERRO') OR (C_REDZ.NRPRIMCFREDZ IS NULL) OR (LPAD(C_REDZ.NRPRIMCFREDZ,10,'0') = '0000000000') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z com numero de cupom fiscal inicial vazio, zerado ou com erro',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Cupom Fiscal Inicial');
            V_BOINTERVALO := FALSE;
         /*ELSIF (LPAD(V_PRINRCUPOMFIS,10,'0') <> LPAD(C_REDZ.NRPRIMCFREDZ,10,'0')) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                'Reducao Z com numero de cupom fiscal inicial diferente do menor numero de cupom nas vendas do dia',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Cupom Fiscal Inicial'); */
         END IF;

         /*Numero de cupom final esta zerado, invalido ou e diferente do numero de cupom final do dia*/
         IF (C_REDZ.NRULTCFREDZ = 'ERRO') OR (C_REDZ.NRULTCFREDZ IS NULL) OR (LPAD(C_REDZ.NRULTCFREDZ,10,'0') = '0000000000') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z com numero de cupom fiscal final vazio, zerado ou com erro',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Cupom Fiscal Final');
            V_BOINTERVALO := FALSE;
         /*ELSIF (LPAD(V_ULTNRCUPOMFIS,10,'0') <> LPAD(C_REDZ.NRULTCFREDZ,10,'0')) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                'Reducao Z com numero de cupom fiscal final diferente do maior numero de cupom nas vendas do dia',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Cupom Fiscal Final');*/
         END IF;

         /*Verifica se existem cupons com numero fora do intervalo de cupom inicial e final da reducao Z*/
         /*IF V_BOINTERVALO THEN
            FOR C_VALIDINTERV IN (SELECT VE.NRCUPOMFIS, VE.NRSEQVENDA
                                    FROM VENDA VE
                                   WHERE VE.CDFILIAL      = P_CDFILIAL
                                     AND VE.CDCAIXA       = P_CDCAIXA
                                     AND VE.DTENTRVENDA   = P_DTENTRVENDA
                                     AND VE.NRSERIEIMPVND = C_REDZ.NRSERIEREDZ
                                     AND (VE.NRCUPOMFIS IS NOT NULL OR NRCUPOMFIS <> 'ERRO')
                                     AND ((LPAD(VE.NRCUPOMFIS,10,'0') < LPAD(C_REDZ.NRPRIMCFREDZ,10,'0')) OR
                                          (LPAD(VE.NRCUPOMFIS,10,'0') > LPAD(C_REDZ.NRULTCFREDZ, 10,'0')))) LOOP
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'A',
                   'Cupom com o numero ' || C_VALIDINTERV.NRCUPOMFIS || ', venda : ' || C_VALIDINTERV.NRSEQVENDA || ' fora do intervalo do cupom fiscal inicial e cupom fiscal final da reducao z.',
                   'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campos de Cupom Fiscal Inicial e Final');
            END LOOP;
         END IF;*/

         /*Verifica se a reducao Z possui numero de sequencia (serie) Nulo ou Vazio*/
         IF (C_REDZ.NRSERIEREDZ IS NULL) OR (C_REDZ.NRSERIEREDZ = '') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z sem numero de serie',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo N de Serie');
         END IF;

         /*Verifica se a reducao Z esta sem descricao do modelo/marca ECF*/
         IF (C_REDZ.DSMODMARCAECF IS NULL) OR (C_REDZ.DSMODMARCAECF = '') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z sem descricao do modelo/marca ecf',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Marca/Modelo');
         END IF;

         /*Verifica se a reducao Z esta sem numero de reinicio*/
         IF (C_REDZ.NRREINIREDZ IS NULL) OR (C_REDZ.NRREINIREDZ = '') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z sem numero de reinicio',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Reinicio');
         END IF;

         /*Verifica se a reducao Z esta sem codigo*/
         IF (C_REDZ.NRREDREDZ IS NULL) OR (C_REDZ.NRREDREDZ = '') OR (LPAD(C_REDZ.NRREDREDZ,10,'0') = '0000000000') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Reducao Z sem codigo ou com o codigo zerado',
                'Verifique a tela de Manutencao da Venda -> Reducao Z -> Formulario, campo Reducao');
         END IF;

         /*Dia com Reducao Z sem venda*/
         IF C_REDZ.VRVENLIQREDZ > 0 THEN
            V_ERROREDZ := 'S';
            BEGIN
               SELECT MAX('N')
                 INTO V_ERROREDZ
                 FROM VENDA VE
                WHERE VE.CDFILIAL      = P_CDFILIAL
                  AND VE.CDCAIXA       = P_CDCAIXA
                  AND VE.DTENTRVENDA   = P_DTENTRVENDA
                  AND VE.IDSITUVENDA   = 'O'
                  AND VE.NRSERIEIMPVND = C_REDZ.NRSERIEREDZ;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_ERROREDZ := 'S';
            END;

            IF NVL(V_ERROREDZ,'S') = 'S' THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Dia com Reducao Z sem Venda', 'Verifique a Tela de Manutencao da Venda, pagina Venda');
            END IF;
         END IF;

         /*Vendas com numero de serie diferente da reducao*/
         FOR C_SERIEINV IN (SELECT V.NRSEQVENDA, V.CDFILIAL, V.CDCAIXA, V.DTENTRVENDA
                              FROM VENDA V
                             WHERE V.CDFILIAL    = P_CDFILIAL
                               AND V.CDCAIXA     = P_CDCAIXA
                               AND V.DTENTRVENDA = P_DTENTRVENDA
                               AND NVL(V.IDTPEMISVEND,'E') NOT IN ('N','S')
                               AND NOT EXISTS (SELECT *
                                                 FROM REDUCAOZ R
                                                WHERE R.CDFILIAL    = V.CDFILIAL
                                                  AND R.CDCAIXA     = V.CDCAIXA
                                                  AND R.DTREDUCAOZ  = V.DTENTRVENDA
                                                  AND R.NRSERIEREDZ = V.NRSERIEIMPVND)) LOOP
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Venda ('||C_SERIEINV.NRSEQVENDA||') com numero de serie diferente da reducao',
                   'Verifique a Tela de Manutencao da Venda, pagina Venda');
            ELSE
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Venda ('||C_SERIEINV.NRSEQVENDA||') com numero de serie diferente da reducao',
                   'Entrar em contato com a Teknisa');
            END IF;
         END LOOP;

         /*Busca o valor de base de calculo da reducao*/
         BEGIN
            SELECT NVL(SUM(IM.VRBCALCIMPRZ),0) AS VRBCALCIMPRZ
              INTO V_VRBCALCIMPRZ
              FROM IMPOSTOREDZ IM
             WHERE IM.CDFILIAL   = P_CDFILIAL
               AND IM.CDCAIXA    = P_CDCAIXA
               AND IM.DTREDUCAOZ = P_DTENTRVENDA
               AND IM.NRECFREDZ  = C_REDZ.NRECFREDZ;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRBCALCIMPRZ := 0;
         END;

         /*Busca o valor total das vendas*/
         BEGIN
            SELECT SUM(TRUNC(IT.QTPRODVEND * (IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS VRVENDA
              INTO V_VRVENDA
              FROM VENDA VE, ITEMVENDA IT
             WHERE VE.CDFILIAL      = P_CDFILIAL
               AND VE.CDCAIXA       = P_CDCAIXA
               AND VE.DTENTRVENDA   = P_DTENTRVENDA
               AND VE.CDFILIAL      = IT.CDFILIAL
               AND VE.CDCAIXA       = IT.CDCAIXA
               AND VE.NRSEQVENDA    = IT.NRSEQVENDA
               AND VE.IDSITUVENDA   = 'O'
               AND VE.NRSERIEIMPVND = C_REDZ.NRSERIEREDZ;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRVENDA := 0;
         END;

         /*Verifica se o somatorio das vendas difere do valor da Reducao Z*/
         IF V_VRVENDA <> C_REDZ.VRVENLIQREDZ THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Somatorio das vendas difere ao valor da Reducao Z',
                   'Verifique o relatorio de Resumo de Movimentacao de Caixa');
            ELSE
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Somatorio das vendas difere ao valor da Reducao Z',
                   'Entrar em contato com a Teknisa');
            END IF;
         END IF;

         /*Verifica se a Venda liquida da Reducao Z difere do somatorio dos impostos da Reducao Z (ICMS ST, Isento, Nao Tributado e ICMS)*/
         IF C_REDZ.VRVENLIQREDZ <> (NVL(C_REDZ.VRSTRIBREDZ,0) + NVL(C_REDZ.VRISENCREDZ,0) + NVL(C_REDZ.VRNINCIDREDZ,0) + NVL(V_VRBCALCIMPRZ,0)) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Venda Liquida da Reducao Z difere do somatorios dos impostos da Reducao Z (st, isento, nao tributado e icms)',
                   'Verifique a tela Manutencao da Venda, pagina Reducao Z, campo Venda Liquida deve ser igual ao somatorio dos impostos da Reducao Z (Substituicao Tributaria + Isencao + Nao Incidencia + Valor Base do Imposto ICMS)');
            ELSE
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Venda Liquida da Reducao Z difere do somatorios dos impostos da Reducao Z (st, isento, nao tributado e icms)',
                   'Entrar em contato com a Teknisa');
            END IF;
         END IF;
                                   
         /*Verifica se o somatorio dos impostos da venda difere da Reducao Z*/
         FOR C_VRVENDAIMPOS IN (SELECT IM.IDTPIMPOSFIS, P.VRPEALPRODIT,
                                       SUM(TRUNC(I.QTPRODVEND * (I.VRUNITVEND+NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0)) AS VRVENDAIMP,
                                       TRUNC(NVL(SUM((TRUNC(I.QTPRODVEND * (I.VRUNITVEND+NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0)) * (P.VRPEALPRODIT/100)),0),2) AS VRIMPOSTO
                                  FROM ITEMVENDA I, VENDA V, ITVENDAIMPOS P, IMPOSTO IM
                                 WHERE I.CDFILIAL      = V.CDFILIAL
                                   AND I.CDCAIXA       = V.CDCAIXA
                                   AND I.NRSEQVENDA    = V.NRSEQVENDA
                                   AND I.CDFILIAL      = P.CDFILIAL
                                   AND I.CDCAIXA       = P.CDCAIXA
                                   AND I.NRSEQVENDA    = P.NRSEQVENDA
                                   AND I.NRSEQUITVEND  = P.NRSEQUITVEND
                                   AND P.CDIMPOSTO     = IM.CDIMPOSTO
                                   AND V.CDFILIAL      = P_CDFILIAL
                                   AND V.CDCAIXA       = P_CDCAIXA
                                   AND V.DTENTRVENDA   = P_DTENTRVENDA
                                   AND V.IDSITUVENDA   = 'O'
                                   AND V.NRSERIEIMPVND = C_REDZ.NRSERIEREDZ
                                 GROUP BY IM.IDTPIMPOSFIS, P.VRPEALPRODIT) LOOP
            /*Verifica se o valor do ICMS ST nas vendas esta divergente do ICMS ST presente na reducao Z*/
            IF (C_VRVENDAIMPOS.IDTPIMPOSFIS = 'F') AND (C_VRVENDAIMPOS.VRVENDAIMP <> C_REDZ.VRSTRIBREDZ) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens ICMS ST nas vendas difere do valor da Reducao Z',
                      'Verifique a tela de Manutencao da Venda -> Reducao Z -> Dados Adicionais, campo Substituicao Tributaria');
               ELSE
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens ICMS ST nas vendas difere do valor da Reducao Z',
                      'Entrar em contato com a Teknisa');
               END IF;
            /*Verifica se o valor ISENTO nas vendas esta divergente do valor ISENTO presente na reducao Z*/
            ELSIF (C_VRVENDAIMPOS.IDTPIMPOSFIS = 'I') AND (C_VRVENDAIMPOS.VRVENDAIMP <> C_REDZ.VRISENCREDZ) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens ISENTOS nas vendas difere do valor da Reducao Z',
                      'Verifique a tela de Manutencao da Venda -> Reducao Z -> Dados Adicionais, campo Isencao');
               ELSE
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens ISENTOS nas vendas difere do valor da Reducao Z',
                      'Entrar em contato com a Teknisa');
               END IF;
            /*Verifica se o valor NAO INCIDENCIA nas vendas esta divergente do valor NAO INCIDENCIA presente na reducao Z*/
            ELSIF (C_VRVENDAIMPOS.IDTPIMPOSFIS = 'N') AND (C_VRVENDAIMPOS.VRVENDAIMP <> C_REDZ.VRNINCIDREDZ) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens NAO INCIDENCIA nas venda difere do valor da Reducao Z',
                      'Verifique a tela de Manutencao da Venda -> Reducao Z -> Dados Adicionais, campo Nao Incidencia');
               ELSE
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Somatorio dos itens NAO INCIDENCIA nas venda difere do valor da Reducao Z',
                      'Entrar em contato com a Teknisa');
               END IF;
            ELSIF C_VRVENDAIMPOS.IDTPIMPOSFIS = 'T' THEN

               V_VRBCALCIMPRZ := 0;
               V_VRIMPOSTORZ  := 0;
               BEGIN
                 SELECT NVL(SUM(IM.VRBCALCIMPRZ),0) AS VRBCALCIMPRZ, NVL(SUM(IM.VRIMPOSTORZ),0) AS VRIMPOSTORZ
                   INTO V_VRBCALCIMPRZ, V_VRIMPOSTORZ
                   FROM IMPOSTOREDZ IM
                  WHERE IM.CDFILIAL    = P_CDFILIAL
                    AND IM.CDCAIXA     = P_CDCAIXA
                    AND IM.DTREDUCAOZ  = P_DTENTRVENDA
                    AND IM.NRECFREDZ   = C_REDZ.NRECFREDZ
                    AND IM.VRALIQIMPRZ = C_VRVENDAIMPOS.VRPEALPRODIT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_VRBCALCIMPRZ := 0;
                     V_VRIMPOSTORZ  := 0;
               END;

               /*Verifica se o valor do ICMS nas vendas esta divergente do valor do ICMS presente na reducao Z*/
               IF (C_VRVENDAIMPOS.VRVENDAIMP <> NVL(V_VRBCALCIMPRZ,0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Somatorio dos itens ICMS nas vendas difere do valor da Reducao Z',
                         'Verifique a tela de Manutencao da Venda -> Reducao Z -> Imposto, campo Valor Base');
                  ELSE
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Somatorio dos itens ICMS nas vendas difere do valor da Reducao Z',
                         'Entrar em contato com a Teknisa');
                  END IF;
               END IF;
               IF (C_VRVENDAIMPOS.VRIMPOSTO <> NVL(V_VRIMPOSTORZ,0)) THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  IF C_REDZ.IDORIGEMREDZ IN ('FOS','VND') THEN
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Somatorio do ICMS nas vendas difere do valor da Reducao Z',
                         'Verifique a tela de Manutencao da Venda -> Reducao Z -> Imposto, campo Valor Imposto');
                  ELSE
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Somatorio do ICMS nas vendas difere do valor da Reducao Z',
                         'Entrar em contato com a Teknisa');
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;

   IF V_IDPREVALIDCUPOM = 'S' THEN
      /*Realiza as validacoes referentes as parametrizacoes de Imposto*/
      /*Busca o endereco do cliente padrao para consultar CFOP e CST na regra*/
      BEGIN
         SELECT MAX(CDPAIS), MAX(SGESTADO)
           INTO V_PAISDEST, V_ESTADEST
           FROM CLIENTE C, ENDECLIE E
          WHERE C.CDCLIENTE    = V_CDCLIENTE
            AND C.CDCLIENTE    = E.CDCLIENTE
            AND C.IDENDCFOPCLI = E.IDTPENDECLIE;
      EXCEPTION
           WHEN NO_DATA_FOUND THEN
             V_PAISDEST := '0055';
             V_ESTADEST := '';
      END;
      /*Busca o codigo de imposto referente ao ICMS, para consultar as regras dos impostos de Nao Incidencia e Isento*/
      BEGIN
         SELECT MIN(CDIMPOSTO)
           INTO V_CDIMPICMS
           FROM IMPOSTO
          WHERE CDIMPOSTONFE = '00'
            AND IDTPIMPOSFIS = 'T';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDIMPICMS := NULL;
      END;

      /*Consulte Grupo Fiscal para as empresas do Simples Nacional, para buscar o CSOSN*/
      IF V_CDSITUCRT <> '3' THEN
         V_GRUPOFISC := NULL;
         CONSULTA_GRUPOFISCAL('C', V_CDCLIENTE, P_CDFILIAL, 'S', V_CDTIPOOPER, V_GRUPOFISC);
      END IF;

      /*Busca CFOP e CST do ICMS para realizar as validacoes necessarias*/
      FOR C_ITEMVENDA IN (SELECT NVL(IP.IDTPIMPOSFIS,'F') AS IDTPIMPOSFIS, P.CDARVPROD || ' - ' || P.NMPRODUTO AS PRODUTO,
                                 P.CDARVPROD, P.CDPRODUTO, IP.CDCSTPRODI, IP.CDCFOPPROD, IP.CDIMPOSTO, IE.SGESTADO, IE.CDPAIS,
                                 NVL(IT.VRUNITVEND,0)+NVL(IT.VRUNITVENDCL,0) AS VRUNIT
                            FROM VENDA VD, ITEMVENDA IT, PRODUTO P, INSCRESTAD IE,
                                 (SELECT IV.CDFILIAL, IV.CDCAIXA, IV.NRSEQVENDA, IV.NRSEQUITVEND,
                                         I.IDTPIMPOSFIS, IV.VRPEALPRODIT, I.CDIMPOSTO, I.CDIMPOSTONFE,
                                         IV.CDCSTPRODI, IV.CDCFOPPROD
                                    FROM ITVENDAIMPOS IV, IMPOSTO I
                                   WHERE IV.CDIMPOSTO    = I.CDIMPOSTO
                                     AND I.IDTPIMPOSFIS  <> 'S' ) IP
                           WHERE VD.CDFILIAL        = P_CDFILIAL
                             AND VD.CDCAIXA         = P_CDCAIXA
                             AND VD.IDSITUVENDA     = 'O'
                             AND VD.DTENTRVENDA     = P_DTENTRVENDA
                             AND VD.CDFILIAL        = IT.CDFILIAL
                             AND VD.CDCAIXA         = IT.CDCAIXA
                             AND VD.NRSEQVENDA      = IT.NRSEQVENDA
                             AND IT.CDPRODUTO       = P.CDPRODUTO
                             AND IT.CDFILIAL        = IP.CDFILIAL
                             AND IT.CDCAIXA         = IP.CDCAIXA
                             AND IT.NRSEQVENDA      = IP.NRSEQVENDA
                             AND IT.NRSEQUITVEND    = IP.NRSEQUITVEND
                             AND VD.IDAPROVACAONFCE = 'P'
                             AND V_CDINSCESTA       = IE.CDINSCESTA
                             AND (VD.IDTPEMISVEND   NOT IN ('N','S') OR VD.IDTPEMISVEND IS NULL)
                             AND IP.CDIMPOSTONFE    NOT IN ('50','60')
                           GROUP BY NVL(IP.IDTPIMPOSFIS,'F'), P.NMPRODUTO, P.CDARVPROD, P.CDPRODUTO,
                                   IP.CDCSTPRODI, IP.CDCFOPPROD, IP.CDIMPOSTO, IE.SGESTADO,
                                   IE.CDPAIS,  NVL(IT.VRUNITVEND,0)+NVL(IT.VRUNITVENDCL,0)) LOOP

         /*Verifica se existe cadastro para o Produto no gestaod e vendas (Vendas de Integracao)*/
         V_IDALIQIMPFIS := 'N';
         BEGIN
            SELECT 'S'
              INTO V_IDALIQIMPFIS
              FROM ALIQIMPFIS
             WHERE CDFILIAL  = P_CDFILIAL
               AND CDPRODUTO = C_ITEMVENDA.CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDALIQIMPFIS := 'N';
         END;

         IF V_IDALIQIMPFIS = 'N' THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Produto ('|| C_ITEMVENDA.CDPRODUTO || ') sem parametrizacao de imposto para a Filial',
                'Verifique a tela Parametros do Gestao de Vendas -> Imposto do Produto, nos cadastros para a Filial');
         END IF;

         /*Inicializa as variaveis de PIS e COFINS para cada produto*/
         V_BOINCIDEPIS    := FALSE;
         V_BOINCIDECOFINS := FALSE;
         V_CDFISCALPIS    := '';
         V_CDFISCALCOFINS := '';
         V_CSTPIS         := '';
         V_CSTCOFINS      := '';
         V_CDFISCOPERSN   := '';

         IF C_ITEMVENDA.CDCFOPPROD IS NULL THEN
            V_CFOPITEM := SUBSTR(CFOP_ITEM(CASE WHEN C_ITEMVENDA.IDTPIMPOSFIS IN ('N','I') THEN V_CDIMPICMS ELSE C_ITEMVENDA.CDIMPOSTO END,V_CDEMPRESA,V_CDINSCESTA,P_CDFILIAL,V_CDCLIENTE, V_CDTIPOOPER, P_DTENTRVENDA, C_ITEMVENDA.CDARVPROD, C_ITEMVENDA.CDPAIS, C_ITEMVENDA.SGESTADO, V_PAISDEST, V_ESTADEST),3,4);
         ELSE
            V_CFOPITEM := C_ITEMVENDA.CDCFOPPROD;
         END IF;

         IF C_ITEMVENDA.CDCSTPRODI IS NULL THEN
            V_CSTITEM := SUBSTR(LPAD(CST_ITEM (CASE WHEN C_ITEMVENDA.IDTPIMPOSFIS IN ('N','I') THEN V_CDIMPICMS ELSE C_ITEMVENDA.CDIMPOSTO END,V_CDEMPRESA,V_CDINSCESTA,P_CDFILIAL,'',V_CDCLIENTE, V_CDTIPOOPER, P_DTENTRVENDA, C_ITEMVENDA.CDARVPROD, C_ITEMVENDA.CDPAIS, C_ITEMVENDA.SGESTADO, V_PAISDEST, V_ESTADEST, C_ITEMVENDA.VRUNIT),3,'0'),2,2);
         ELSE
            V_CSTITEM := SUBSTR(LPAD(C_ITEMVENDA.CDCSTPRODI,3,'0'),2,2);
         END IF;

         /*Consulta CSOSN para as empresas do Simples Nacional*/
         IF V_CDSITUCRT <> '3' THEN
            IF C_ITEMVENDA.CDCSTPRODI IS NULL THEN
               CONSULTA_CSOSN('S', V_CDEMPRESA, C_ITEMVENDA.CDARVPROD, V_CDINSCESTA, V_CDTIPOOPER, P_CDFILIAL, '0000000000', V_GRUPOFISC, 'N', V_CDFISCOPERSN);
               V_CDFISCOPERSN := SUBSTR(LPAD(V_CDFISCOPERSN,4,'0'),2,3);
            ELSE
               V_CDFISCOPERSN := LPAD(C_ITEMVENDA.CDCSTPRODI,3,'0');
            END IF;

            /*Item com CSOSN vazio*/
            IF ((V_CDFISCOPERSN IS NULL) OR (V_CDFISCOPERSN = '')) THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com CSOSN vazio',
                   'Verifique o cadastro na tela Codigo de Situacao do Simples Nacional em Ambiente -> Tabelas');
            END IF;
         END IF;

         /*Item com CFOP vazio*/
         IF (V_CFOPITEM IS NULL) OR (V_CFOPITEM = '') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' com CFOP vazio',
                'Verifique o cadastro de CFOP na tela Parametrizacao Fiscal Centralizada');

         ELSE
            BEGIN
               SELECT CDCFOPPADRAO
                 INTO V_CFOP
                 FROM CFOPPADRAO
                WHERE V_CFOPITEM = 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(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO ||
                   ' com CFOP (' || V_CFOPITEM || ') Invalido',
                   'Entrar em contato com a Teknisa');
            END IF;
         END IF;

         /*Item com CST vazio*/
         IF ((V_CSTITEM IS NULL) OR (V_CSTITEM = '')) AND (V_CDSITUCRT = '3') THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' com CST do ICMS vazio',
                'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
         END IF;

         /*Item tributado com incidencia do ICMS e CFOP diferente de 5.101, 5.102 ou 5.103, ou CST diferente de '00','20' ou '90', ou CSOSN diferente de 102 ou 900*/
         IF C_ITEMVENDA.IDTPIMPOSFIS = 'T' THEN
            IF (V_CFOPITEM <> '5101') AND (V_CFOPITEM <> '5102') AND (V_CFOPITEM <> '5103') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e CFOP diferente de 5.101, 5.102 ou 5.103',
                   'Verifique o cadastro de CFOP na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CSTITEM <> '00') AND (V_CSTITEM <> '20') AND (V_CSTITEM <> '90') AND (V_CDSITUCRT = '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e CST diferente de 00, 20 ou 90',
                   'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CDFISCOPERSN <> '102') AND (V_CDFISCOPERSN <> '900') AND (V_CDSITUCRT <> '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS e CSOSN diferente de 102 ou 900',
                   'Verifique o cadastro de CSOSN na tela Codigo de Situacao do Simples Nacional');
            END IF;
         /*Item com incidencia do ICMS ST e CFOP diferente de 5.405 ou CST diferente de '060' ou CSOSN diferente de '500'*/
         ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'F' THEN
            IF V_CFOPITEM <> '5405' THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CFOP diferente de 5.405',
                   'Verifique o cadastro de CFOP na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CSTITEM <> '60') AND (V_CDSITUCRT = '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CST diferente de 60',
                   'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CDFISCOPERSN <> '500') AND (V_CDSITUCRT <> '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' com incidencia de ICMS ST e CSOSN diferente de 500',
                   'Verifique o cadastro de CSOSN na tela Codigo de Situacao do Simples Nacional');
            END IF;
         /*Item ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103, ou CST diferente de '040'*/
         ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'I' THEN
            IF (V_CFOPITEM <> '5101') AND (V_CFOPITEM <> '5102') AND (V_CFOPITEM <> '5103') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103',
                   'Verifique o cadastro de CFOP na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CSTITEM <> '40') AND (V_CSTITEM <> '90') AND (V_CDSITUCRT = '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CST diferente de 40 ou 90',
                   'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CDFISCOPERSN <> '102') AND (V_CDFISCOPERSN <> '300') AND (V_CDFISCOPERSN <> '900') AND (V_CDSITUCRT <> '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' ISENTO com CSOSN diferente de 102, 300 ou 900',
                   'Verifique o cadastro de CSOSN na tela Codigo de Situacao do Simples Nacional');
            END IF;
         /*Item ISENTO com CFOP diferente de 5.101, 5.102 ou 5.103, ou CST diferente de '041'*/
         ELSIF C_ITEMVENDA.IDTPIMPOSFIS = 'N' THEN
            IF (V_CFOPITEM <> '5101') AND (V_CFOPITEM <> '5102') AND (V_CFOPITEM <> '5103') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CFOP diferente de 5.101, 5.102 ou 5.103',
                   'Verifique o cadastro de CFOP na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CSTITEM <> '41') AND (V_CSTITEM <> '90') AND (V_CDSITUCRT = '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CST diferente de 41',
                   'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
            END IF;
            IF (V_CDFISCOPERSN <> '102') AND (V_CDFISCOPERSN <> '300') AND (V_CDFISCOPERSN <> '900') AND (V_CDSITUCRT <> '3') THEN
               V_SEQERRO   := V_SEQERRO + 1;
               V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
               INSERT INTO PREVALIDCUPOM
                  (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
               VALUES
                  (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                   'Item ' || C_ITEMVENDA.PRODUTO || ' NAO INCIDENCIA com CSOSN diferente de 102, 300 ou 900',
                   'Verifique o cadastro de CSOSN na tela Codigo de Situacao do Simples Nacional');
            END IF;
         END IF;
         /*Busca as Parametrizacoes dos Impostos PIS e COFINS*/
         FOR C_IMP IN (SELECT CDIMPOSTO, CDIMPOSTONFE
                         FROM IMPOSTO
                        WHERE IDORGARRECAD = 'F'
                          AND CDIMPOSTONFE IN ('50','60')) LOOP
            /*Verifica se existe parametrizacao de Grupo Fiscal*/
            V_GRUPOFISC := NULL;
            /*Verifica se existe grupo fiscal de imposto por filial*/
            BEGIN
               SELECT GR.CDGRUPOFISC
                 INTO V_GRUPOFISC
                 FROM GRUPOFISCIMPFIL GR
                WHERE GR.CDIMPOSTO = C_IMP.CDIMPOSTO
                  AND GR.CDFILIAL  = P_CDFILIAL;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_GRUPOFISC := NULL;
            END;
            /*Verifica se existe grupo fiscal para Imposto/Inscricao Estadual selecionada*/
            IF V_GRUPOFISC IS NULL THEN
               BEGIN
                  SELECT GR.CDGRUPOFISC
                    INTO V_GRUPOFISC
                    FROM GRFISIMPIECLIE GR
                   WHERE GR.CDIMPOSTO  = C_IMP.CDIMPOSTO
                     AND GR.CDINSCESTA = V_CDINSCESTA
                     AND GR.CDEMPRESA  = V_CDEMPRESA
                     AND GR.CDCLIENTE  = V_CDCLIENTE;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_GRUPOFISC := NULL;
               END;
            END IF;
            /*Verifica se ha grupo fiscal para a filial*/
            IF V_GRUPOFISC IS NULL THEN
               BEGIN
                  SELECT CDGRUPOFISC
                    INTO V_GRUPOFISC
                    FROM FILIAL
                   WHERE CDFILIAL = P_CDFILIAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_GRUPOFISC := NULL;
               END;
            END IF;
            /*Verifica se ha grupo fiscal para cliente*/
            IF V_GRUPOFISC IS NULL THEN
               BEGIN
                  SELECT CDGRUPOFISC
                    INTO V_GRUPOFISC
                    FROM CLIENTE
                   WHERE CDCLIENTE = V_CDCLIENTE;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_GRUPOFISC := NULL;
               END;
            END IF;

            /*Consulta incidencia para verificar a parametrizacao dos impostos PIS e COFINS*/
            CONSULTA_INCIDENCIA('S', V_CDEMPRESA, C_ITEMVENDA.CDARVPROD, V_CDINSCESTA, V_CDTIPOOPER, P_CDFILIAL, '0000000000', V_GRUPOFISC, '', '', 'VND');
            FOR CS IN(SELECT CDIMPOTEMP, CDFISCTEMP
                        FROM INCITEMP I
                       WHERE NRINCITEMP = P_CDFILIAL||'0000000000'
                         AND CDIMPOTEMP = C_IMP.CDIMPOSTO) LOOP
               /*Consulta o CST NF-e*/
               CONSULTA_CST_NFE('S', V_CDEMPRESA, C_ITEMVENDA.CDARVPROD, V_CDINSCESTA, V_CDTIPOOPER, V_GRUPOFISC, CS.CDIMPOTEMP, 'N','N', P_CDFILIAL, '0000000000', '', V_CSTNFE, V_IDMODBCNFE, V_IDMODBCSTNFE, V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, V_IDMOTIDESSTNFE);

               IF C_IMP.CDIMPOSTONFE = '50' THEN
                  V_BOINCIDEPIS    := TRUE;
                  V_CDFISCALPIS    := CS.CDFISCTEMP;
                  V_CSTPIS         := V_CSTNFE;
               ELSIF C_IMP.CDIMPOSTONFE = '60' THEN
                  V_BOINCIDECOFINS := TRUE;
                  V_CDFISCALCOFINS := CS.CDFISCTEMP;
                  V_CSTCOFINS      := V_CSTNFE;
               END IF;

               /*Item com CST vazio para o PIS/COFINS*/
               IF (V_CSTNFE IS NULL) OR (V_CSTNFE = '') THEN
                  V_SEQERRO   := V_SEQERRO + 1;
                  V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                  INSERT INTO PREVALIDCUPOM
                     (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                  VALUES
                     (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                      'Item ' || C_ITEMVENDA.PRODUTO || ' sem CST para o ' || CASE WHEN C_IMP.CDIMPOSTONFE = '50' THEN 'PIS' ELSE 'COFINS' END,
                      'Verifique o cadastro de CST na tela Parametrizacao Fiscal Centralizada');
               END IF;

               DELETE ALIQTEMP
               WHERE NRALIQTEMP = P_CDFILIAL||'0000000000';

               CONSULTA_ALIQUOTA(CS.CDIMPOTEMP, 'S', V_CDEMPRESA, C_ITEMVENDA.CDARVPROD, V_CDINSCESTA, '', '', '', '', '', '', P_DTENTRVENDA, P_CDFILIAL, '0000000000', V_GRUPOFISC, V_CDTIPOOPER, 'VND');
               V_VRALIQIMP := NULL;
               SELECT MAX(VRALIQUTMP)
                 INTO V_VRALIQIMP
                 FROM ALIQTEMP
                WHERE NRALIQTEMP = P_CDFILIAL||'0000000000';

               /*Item com aliquota basica diferente do regime da Filial */
               /*Filial do Regime Nao Cumulativo*/
               IF (V_IDCUMUPISCOFIL = 'S') AND (V_CSTNFE = '01') THEN
                  IF (C_IMP.CDIMPOSTONFE = '50') AND (V_VRALIQIMP <> 1.65) THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial nao cumulativa e aliquota do PIS diferente de 1,65%',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
                  END IF;
                  IF (C_IMP.CDIMPOSTONFE = '60') AND (V_VRALIQIMP <> 7.6) THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial nao cumulativa e aliquota do COFINS diferente de 7,6%',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
                  END IF;
               END IF;
               /*Filial do Regime Cumulativo*/
               IF (V_IDCUMUPISCOFIL = 'N') AND (V_CSTNFE = '01') THEN
                  IF (C_IMP.CDIMPOSTONFE = '50') AND (V_VRALIQIMP <> 0.65) THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial cumulativa e aliquota do PIS diferente de 0,65%',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
                  END IF;
                  IF (C_IMP.CDIMPOSTONFE = '60') AND (V_VRALIQIMP <> 3.0) THEN
                     V_SEQERRO   := V_SEQERRO + 1;
                     V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
                     INSERT INTO PREVALIDCUPOM
                        (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
                     VALUES
                        (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                         'Item ' || C_ITEMVENDA.PRODUTO || ' com CST 01 (Operacao Tributavel com Aliquota Basica), filial cumulativa e aliquota do COFINS diferente de 3%',
                         'Verifique a parametrizacao na tela Parametros do Gestao de Vendas -> Imposto do Produto, para a filial e produto e o Regime da Filial');
                  END IF;
               END IF;
            END LOOP;
            DELETE FROM INCITEMP
             WHERE NRINCITEMP = P_CDFILIAL||'0000000000';
         END LOOP;

         /*Item sem incidencia do PIS*/
         IF (NOT V_BOINCIDEPIS) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' sem incidencia do PIS',
                'Verifique o cadastro de incidencia para o produto na tela Parametrizacao Fiscal Centralizada');
         END IF;

         /*Item sem incidencia do COFINS*/
         IF (NOT V_BOINCIDECOFINS) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' sem incidencia do COFINS',
                'Verifique o cadastro de incidencia para o produto na tela Parametrizacao Fiscal Centralizada');
         END IF;

         /*Item com tributacao do PIS diferente da tributacao do COFINS*/
         IF (V_CDFISCALPIS IS NOT NULL) AND (V_CDFISCALCOFINS IS NOT NULL) AND (V_CDFISCALPIS <> V_CDFISCALCOFINS) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' com tributacao do PIS (Cod. Fiscal '|| V_CDFISCALPIS || ') diferente da tributacao do COFINS (Cod. Fiscal ' || V_CDFISCALCOFINS || ')',
                'Verifique o cadastro de incidencia para o produto na tela Parametrizacao Fiscal Centralizada');
         END IF;

         /*Item com CST do PIS diferente do CST do COFINS*/
         IF  (V_CSTPIS IS NOT NULL) AND (V_CSTCOFINS IS NOT NULL) AND (V_CSTPIS <> V_CSTCOFINS) THEN
            V_SEQERRO   := V_SEQERRO + 1;
            V_STSEQERRO := LPAD(V_SEQERRO,5,'0');
            INSERT INTO PREVALIDCUPOM
               (CDFILIAL, CDCAIXA, DTREDUCAOZ, NRSEQERRO, IDTPVALID, DSERRONFPRE, DSAJUDA)
            VALUES
               (P_CDFILIAL, P_CDCAIXA, P_DTENTRVENDA, V_STSEQERRO, 'E',
                'Item ' || C_ITEMVENDA.PRODUTO || ' com CST do PIS (' || V_CSTPIS || ') diferente do CTS do COFINS (' || V_CSTCOFINS || ')',
                'Verifique o cadastro de CST para o produto na tela Parametrizacao Fiscal Centralizada');
         END IF;
      END LOOP;
   END IF;
END;
/