CREATE OR REPLACE PROCEDURE GERA_NOTAFISCAL_VENDA
   (P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
    P_CDLOJA        IN VENDA.CDLOJA%TYPE,
    P_CDCAIXA       IN VARCHAR2,
    P_LISTAVENDA    IN VARCHAR2,
    P_CDPRODUTO     IN VARCHAR2,
    P_DTINICIAL     IN NOTAFISCAL.DTENTRSAID%TYPE,
    P_DTFINAL       IN NOTAFISCAL.DTENTRSAID%TYPE,
    P_CDCLIENTE     IN NOTAFISCAL.CDCLIENTE%TYPE,
    P_NMFANTCLIE    IN CLIENTE.NMFANTCLIE%TYPE,
    P_DTSAIDA       IN NOTAFISCAL.DTENTRSAID%TYPE,
    P_CDSERIE       IN NOTAFISCAL.CDSERIE%TYPE,
    P_CDTIPOOPER    IN NOTAFISCAL.CDTIPOOPER%TYPE,
    P_CDFILIPROC    IN NOTAFISCAL.CDFILIAL%TYPE,
    P_CDOPERADOR    IN VARCHAR2,
    P_DSMENSAGEM    IN VARCHAR2,
    P_IDTPIJUDESNF  IN DADOSNF.IDTPIJUDESNF%TYPE DEFAULT NULL,
    P_NRINSJUDESNF  IN DADOSNF.NRINSJUDESNF%TYPE DEFAULT NULL,
    P_NMRAZSODESNF  IN DADOSNF.NMRAZSODESNF%TYPE DEFAULT NULL,
    P_DSENDEDESTNF  IN DADOSNF.DSENDEDESTNF%TYPE DEFAULT NULL,
    P_NMBAIRDESTNF  IN DADOSNF.NMBAIRDESTNF%TYPE DEFAULT NULL,
    P_CDPAIS        IN DADOSNF.CDPAIS%TYPE DEFAULT NULL,
    P_SGESTADO      IN DADOSNF.SGESTADO%TYPE DEFAULT NULL,
    P_CDMUNICIPIO   IN DADOSNF.CDMUNICIPIO%TYPE DEFAULT NULL,
    P_NRINSESTDESNF IN DADOSNF.NRINSESTDESNF%TYPE DEFAULT NULL,
	P_VENDACONS     IN VARCHAR2,
	P_CDCLIENVENDA  IN VARCHAR2,
	P_IDSISTEMA     IN VARCHAR2,
   P_CDCONSUMIDOR IN VARCHAR2 DEFAULT NULL)


AS

   V_CDCONTADOR   NUMBER;
   V_DADOSNF      NUMBER;
   V_CDPAIS       ENDEFILI.CDPAIS%TYPE;
   V_SGESTADO     ENDEFILI.SGESTADO%TYPE;
   V_CDMUNICIPIO  ENDEFILI.CDMUNICIPIO%TYPE;

   V_CDEMPRESA    FILIAL.CDEMPRESA%TYPE;
   V_CDINSCESTA   FILIAL.CDINSCESTA%TYPE;
   V_NRMAXITNF    SERIENF.NRMAXITNF%TYPE;
   V_IDCONMAXITEM SERIENF.IDCONMAXITEM%TYPE;

   V_NRLANCTONF   NOTAFISCAL.NRLANCTONF%TYPE;
   V_NRLANCESTQ   LANCTOESTOQ.NRLANCESTQ%TYPE;

   V_IDTIPORECE   TIPORECE.IDTIPORECE%TYPE;
   
   V_NRDADOFISCO DADOSFISCO.NRDADOFISCO%TYPE;

   V_CDALMOXARIFE ITEMPRODUTO.CDALMOXARIFE%TYPE;
   V_CDLOCALESTOQ ITEMPRODUTO.CDLOCALESTOQ%TYPE;

   V_DTSAIDA      NOTAFISCAL.DTENTRSAID%TYPE;
   V_NRCUPOMFIS   VENDA.NRCUPOMFIS%TYPE;

   V_NRACESSONFCE VENDA.NRACESSONFCE%TYPE;
   V_NRSEQCUPOMNF DADOSNF.NRSEQCUPOMNF%TYPE;

   V_NRMD5ARQTXT TURCAIXA.NRMD5ARQTXT%TYPE;
   V_NRMAXCUPOMNF NUMBER;

   CURSOR C_VENDA IS
      SELECT DISTINCT V.CDFILIAL, V.CDLOJA, V.CDCAIXA, V.NRSEQVENDA, V.DTENTRVENDA,
             T.NRMD5ARQTXT,NVL(V.NRNOTAFISCALCE, V.NRCUPOMFIS) AS NRCUPOMFIS,V.NRECFCUPOMVE,V.NRSERIEIMPVND,V.DSMODELOECFVE,V.DSMARCAECFVE, V.NRACESSONFCE, V.IDTPEMISVEND
      FROM VENDA V, ITEMVENDA I, TURCAIXA T
      WHERE (V.CDFILIAL     = P_CDFILIAL)       AND
            (V.CDLOJA       = P_CDLOJA)         AND
			(V.CDCLIENTE    = P_CDCLIENVENDA)   AND
            (V.CDFILIAL     = I.CDFILIAL)       AND
            (V.CDCAIXA      = I.CDCAIXA)        AND
            (V.NRSEQVENDA   = I.NRSEQVENDA)     AND
            (V.CDFILIALTUR  = T.CDFILIAL  )     AND
            (V.CDCAIXATUR   = T.CDCAIXA   )     AND
            (V.DTABERTUR    = T.DTABERCAIX)     AND
            (V.IDSITUVENDA  = 'O')              AND
			   ((P_VENDACONS = 'N') OR (P_VENDACONS = 'S' AND V.CDCONSUMIDOR IS NOT NULL)) AND
            ((P_CDCONSUMIDOR IS NULL) OR (INSTR(P_CDCONSUMIDOR,V.CDCONSUMIDOR)>0) ) AND
			   ((V.IDSTATUSNFCE IS NULL) OR (V.IDSTATUSNFCE = 'A')) AND
            (I.NRLANCTONF   IS NULL)            AND
            (V.DTENTRVENDA BETWEEN P_DTINICIAL  AND P_DTFINAL) AND
            ((INSTR(P_CDCAIXA, V.CDCAIXA) > 0)  OR (P_CDCAIXA IS NULL)) AND
            ((P_LISTAVENDA IS NULL) OR (INSTR(P_LISTAVENDA, V.CDFILIAL||V.CDCAIXA||V.NRSEQVENDA) > 0)) AND
            ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL))
      ORDER BY 1, 2, 7, 12;

   CURSOR C_ITEMDEVOLUCAO IS
      SELECT V.CDFILIAL, V.CDLOJA, V.CDCAIXA, V.NRSEQVENDA, V.DTENTRVENDA, P.CDPRODUTO, P.NMPRODUTO,P.CDARVPROD, P.CDPRODESTO,
             T.NRMD5ARQTXT,NVL(V.NRNOTAFISCALCE, V.NRCUPOMFIS) AS NRCUPOMFIS,V.NRECFCUPOMVE,V.NRSERIEIMPVND,V.DSMODELOECFVE,V.DSMARCAECFVE,
             V.NRACESSONFCE, V.IDTPEMISVEND,
             (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) AS VRUNITVEND,
             SUM(I.QTPRODVEND) AS QTPRODVEND,
             NVL(SUM(I.VRDESITVEND),0) AS VRDESITVEND,
             SUM(TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0)) AS VRTOTAITEM
      FROM VENDA V, ITEMVENDA I, PRODUTO P, TURCAIXA T
      WHERE (V.CDFILIAL     = P_CDFILIAL)       AND
            (V.CDLOJA       = P_CDLOJA)         AND
			(V.CDCLIENTE    = P_CDCLIENVENDA)   AND
            (V.CDFILIAL     = I.CDFILIAL)       AND
            (V.CDCAIXA      = I.CDCAIXA)        AND
            (V.NRSEQVENDA   = I.NRSEQVENDA)     AND
            (V.CDFILIALTUR  = T.CDFILIAL  )     AND
            (V.CDCAIXATUR   = T.CDCAIXA   )     AND
            (V.DTABERTUR    = T.DTABERCAIX)     AND
            (V.IDSITUVENDA  = 'D')              AND
            (I.CDPRODUTO    = P.CDPRODUTO)      AND
            (I.NRLANCTONF   IS NULL)            AND
            (V.DTENTRVENDA BETWEEN P_DTINICIAL  AND P_DTFINAL) AND
            ((INSTR(P_CDCAIXA, V.CDCAIXA) > 0)  OR (P_CDCAIXA IS NULL)) AND
            ((P_LISTAVENDA IS NULL) OR (INSTR(P_LISTAVENDA, V.CDFILIAL||V.CDCAIXA||V.NRSEQVENDA) > 0)) AND
            ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL)) AND
            ((P_CDCONSUMIDOR IS NULL) OR (INSTR(P_CDCONSUMIDOR,V.CDCONSUMIDOR)>0))
      GROUP BY V.CDFILIAL, V.CDLOJA, V.CDCAIXA, V.NRSEQVENDA, V.DTENTRVENDA,
               P.CDPRODUTO,   P.NMPRODUTO,  P.CDARVPROD,
               P.CDPRODESTO,  I.VRUNITVEND, I.VRUNITVENDCL,
               T.NRMD5ARQTXT, V.NRNOTAFISCALCE, 
			   V.NRCUPOMFIS,V.NRECFCUPOMVE,
               V.NRSERIEIMPVND,V.DSMODELOECFVE,V.DSMARCAECFVE,
               V.NRACESSONFCE, V.IDTPEMISVEND
      ORDER BY V.CDFILIAL, V.CDLOJA, NVL(V.NRCUPOMFIS, V.NRACESSONFCE);



BEGIN
   V_NRDADOFISCO := '';
   V_NRMAXCUPOMNF := 500;

   /*Inserir Cliente*/
   SELECT COUNT(*)
   INTO V_CDCONTADOR
   FROM CLIENTE
   WHERE CDCLIENTE = P_CDCLIENTE;

   IF V_CDCONTADOR = 0 THEN
      INSERT INTO CLIENTE
         (CDCLIENTE, IDTPIJURCLIE, NRINSJURCLIE, NMRAZSOCCLIE, NMFANTCLIE)
      VALUES
         (P_CDCLIENTE, SUBSTR(P_CDCLIENTE,1,1), SUBSTR(P_CDCLIENTE,2,20), P_NMFANTCLIE, P_NMFANTCLIE);

      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO
      FROM ENDEFILI
      WHERE CDFILIAL     = P_CDFILIAL AND
            IDTPENDEFILI = 'P';

      INSERT INTO ENDECLIE
         (CDCLIENTE, IDTPENDECLIE, CDPAIS, SGESTADO, CDMUNICIPIO)
      VALUES
         (P_CDCLIENTE, 'P', V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO);
   END IF;

   /*Geração das Notas Fiscais*/
   SELECT MAX(CDEMPRESA), MAX(CDINSCESTA)
   INTO V_CDEMPRESA, V_CDINSCESTA
   FROM FILIAL
   WHERE CDFILIAL = P_CDFILIAL;

   SELECT NVL(MAX(NRMAXITNF),10), NVL(MAX(IDCONMAXITEM),'S')
   INTO V_NRMAXITNF, V_IDCONMAXITEM
   FROM SERIENF
   WHERE CDEMPRESA  = V_CDEMPRESA  AND
         CDINSCESTA = V_CDINSCESTA AND
         CDSERIE    = P_CDSERIE;

   V_CDCONTADOR := 0;
   V_NRCUPOMFIS := 'X';
   V_NRACESSONFCE := 'X';

   FOR C_GERANF IN C_VENDA LOOP

      SELECT NRMD5ARQTXT
        INTO V_NRMD5ARQTXT
        FROM (SELECT NRMD5ARQTXT
                FROM TURCAIXA
               WHERE CDFILIAL = P_CDFILIAL
                 AND CDCAIXA = C_GERANF.CDCAIXA
                 AND NRMD5ARQTXT IS NOT NULL
               ORDER BY DTABERCAIX DESC)
       WHERE ROWNUM = 1;

      IF V_CDCONTADOR = 0 THEN
         V_CDCONTADOR := 1;

         IF P_DTSAIDA IS NULL THEN
            V_DTSAIDA := C_GERANF.DTENTRVENDA;
         ELSE
            V_DTSAIDA := P_DTSAIDA;
         END IF;

         GERA_NOTAFISCAL_CORPO (P_CDFILIPROC, P_CDFILIAL, V_CDEMPRESA,
                                P_CDTIPOOPER, P_CDSERIE, P_CDCLIENTE,
                                V_DTSAIDA, P_IDSISTEMA, V_NRLANCTONF,
                                V_NRLANCESTQ, 'S');

         --PREENCHENDO INFORMAÇÕES DO FISCO
         /*SELECT MAX(NRDADOFISCO)
           INTO V_NRDADOFISCO
           FROM DADOSFISCO
          WHERE (CDFILIAL   = P_CDFILIAL) 
            AND (NRLANCTONF = V_NRLANCTONF);

         IF (V_NRDADOFISCO IS NULL) THEN
            V_NRDADOFISCO := '001';
         ELSE
            V_NRDADOFISCO := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRDADOFISCO) + 1)), 3, 0);
         END IF;
         
         INSERT INTO DADOSFISCO
            (CDFILIAL, NRLANCTONF, NRDADOFISCO, CDDADOFISCO, DSDADOFISCO)
         VALUES
            (P_CDFILIPROC, V_NRLANCTONF, V_NRDADOFISCO, 'CODIGO MD5', C_GERANF.NRMD5ARQTXT);*/

      END IF;

      IF (V_CDCONTADOR > V_NRMAXCUPOMNF) THEN
         V_CDCONTADOR := 1;
		 
		 SELECT MAX(CDALMOXARIFE), MAX(CDLOCALESTOQ)
           INTO V_CDALMOXARIFE, V_CDLOCALESTOQ
           FROM LOJA
          WHERE CDFILIAL = P_CDFILIAL AND
                CDLOJA   = C_GERANF.CDLOJA;
		 
		 FOR C_ITEMVENDA IN
		    (SELECT P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO,
		            CASE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) WHEN 0 THEN NVL(I.VRACRITVEND,0) ELSE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) END AS VRUNITVEND,
                    SUM(I.QTPRODVEND) AS QTPRODVEND,
                    NVL(SUM(I.VRDESITVEND),0) AS VRDESITVEND,
                    SUM(TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0)) AS VRTOTAITEM
		       FROM ITEMVENDA I, VENDATMP V, PRODUTO P
              WHERE (I.CDFILIAL   = V.CDFILIAL  )
		        AND (I.CDCAIXA    = V.CDCAIXA   )
			    AND (I.NRSEQVENDA = V.NRSEQVENDA)
		        AND ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL))
                AND (I.NRLANCTONF IS NULL     )
			    AND (I.CDPRODUTO = P.CDPRODUTO)
				AND (P.IDPESAPROD = 'N'       )
             GROUP BY P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO, I.VRUNITVEND, NVL(I.VRUNITVENDCL,0), NVL(I.VRACRITVEND,0)
			 UNION ALL
			 SELECT P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO,
		            CASE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) WHEN 0 THEN NVL(I.VRACRITVEND,0) ELSE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) END AS VRUNITVEND,
                    I.QTPRODVEND,
                    NVL(I.VRDESITVEND,0) AS VRDESITVEND,
                    TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0) AS VRTOTAITEM
		       FROM ITEMVENDA I, VENDATMP V, PRODUTO P
              WHERE (I.CDFILIAL   = V.CDFILIAL  )
		        AND (I.CDCAIXA    = V.CDCAIXA   )
			    AND (I.NRSEQVENDA = V.NRSEQVENDA)
		        AND ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL))
                AND (I.NRLANCTONF IS NULL     )
			    AND (I.CDPRODUTO = P.CDPRODUTO)
				AND (P.IDPESAPROD = 'S'       )) LOOP
             
			    GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC, V_NRLANCTONF, C_ITEMVENDA.CDPRODUTO,
                                        C_ITEMVENDA.CDARVPROD, C_ITEMVENDA.NMPRODUTO,
                                        C_ITEMVENDA.QTPRODVEND, C_ITEMVENDA.VRUNITVEND, C_ITEMVENDA.VRDESITVEND,
                                        NULL, NULL, NULL, NULL, NULL, NULL, V_CDALMOXARIFE, V_CDLOCALESTOQ);
				
				/*Atualiza o número da nota na itemvenda*/
                UPDATE ITEMVENDA
				   SET CDFILIALNF  = P_CDFILIPROC,
                       NRLANCTONF  = V_NRLANCTONF,
					   NRSEQITPROD = LPAD(TO_CHAR(V_CDCONTADOR),4,'0')
                 WHERE EXISTS(SELECT 1 
				                FROM VENDATMP
							   WHERE CDFILIAL   = ITEMVENDA.CDFILIAL
							     AND CDCAIXA    = ITEMVENDA.CDCAIXA
								 AND NRSEQVENDA = ITEMVENDA.NRSEQVENDA)
				   AND (CDPRODUTO = C_ITEMVENDA.CDPRODUTO);

				V_CDCONTADOR := V_CDCONTADOR + 1;
		 END LOOP;
		 
		 DELETE FROM VENDATMP;
		 
		 V_CDCONTADOR := 1;

         /*Atualização de Estoque*/
         GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF, SYSDATE,
                                    V_NRLANCESTQ, 'S');
         UPDATE NOTAFISCAL
         SET    CDOPERGERA = P_CDOPERADOR
         WHERE (CDFILIAL   = P_CDFILIPROC) AND
               (NRLANCTONF = V_NRLANCTONF);

         ATUALIZA_IDEVOLESTOQ(P_CDFILIPROC, V_NRLANCESTQ);

         ATUALIZA_DADOSADIC(P_CDFILIAL, P_CDCAIXA, P_CDFILIPROC, V_NRLANCTONF, V_NRMD5ARQTXT, P_DSMENSAGEM);

         IF P_DTSAIDA IS NULL THEN
            V_DTSAIDA := C_GERANF.DTENTRVENDA;
         ELSE
            V_DTSAIDA := P_DTSAIDA;
         END IF;

         GERA_NOTAFISCAL_CORPO (P_CDFILIPROC, P_CDFILIAL, V_CDEMPRESA,
                                P_CDTIPOOPER, P_CDSERIE, P_CDCLIENTE,
                                V_DTSAIDA, P_IDSISTEMA, V_NRLANCTONF,
                                V_NRLANCESTQ, 'S');

         --PREENCHENDO INFORMAÇÕES DO FISCO
         /*SELECT MAX(NRDADOFISCO)
           INTO V_NRDADOFISCO
           FROM DADOSFISCO
          WHERE (CDFILIAL   = P_CDFILIAL) 
            AND (NRLANCTONF = V_NRLANCTONF);

         IF (V_NRDADOFISCO IS NULL) THEN
            V_NRDADOFISCO := '001';
         ELSE
            V_NRDADOFISCO := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRDADOFISCO) + 1)), 3, 0);
         END IF;
         
         INSERT INTO DADOSFISCO
            (CDFILIAL, NRLANCTONF, NRDADOFISCO, CDDADOFISCO, DSDADOFISCO)
         VALUES
            (P_CDFILIPROC, V_NRLANCTONF, V_NRDADOFISCO, 'CODIGO MD5', C_GERANF.NRMD5ARQTXT);*/

      END IF;

      /*Atualiza os dados do cliente da nota fiscal*/
      IF (C_GERANF.IDTPEMISVEND IS NULL) OR (C_GERANF.IDTPEMISVEND = 'E') THEN
         SELECT COUNT(*)
           INTO V_DADOSNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF)
            AND (NRCOOCUPOMNF = C_GERANF.NRCUPOMFIS);
      ELSE
         SELECT COUNT(*)
           INTO V_DADOSNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF)
            AND (NRACESSONFCENF = C_GERANF.NRACESSONFCE);
      END IF;

      IF V_DADOSNF = 0 THEN
         SELECT MAX(NRSEQCUPOMNF)
           INTO V_NRSEQCUPOMNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF);

         V_NRSEQCUPOMNF := LPAD(RTRIM(TO_CHAR(TO_NUMBER(NVL(V_NRSEQCUPOMNF, '0')) + 1)), 3, 0);

         IF C_GERANF.IDTPEMISVEND = 'S' THEN
            INSERT INTO DADOSNF
               (CDFILIAL, NRLANCTONF, IDTPIJUDESNF, NRINSJUDESNF, NMRAZSODESNF,
                DSENDEDESTNF, NMBAIRDESTNF, CDPAIS, SGESTADO, CDMUNICIPIO,
                NRMD5ARQTXTNF, NRCOOCUPOMNF, NRECFCUPOMNF, NRSERIEIMPNF, DSMODELOECFNF,
                DSMARCAECFNF, NRINSESTDESNF, NRACESSONFCENF, NRSEQCUPOMNF)
            VALUES
               (P_CDFILIPROC, V_NRLANCTONF, P_IDTPIJUDESNF, P_NRINSJUDESNF, P_NMRAZSODESNF,
                P_DSENDEDESTNF, P_NMBAIRDESTNF, P_CDPAIS, P_SGESTADO, P_CDMUNICIPIO,
                C_GERANF.NRMD5ARQTXT,C_GERANF.NRCUPOMFIS,C_GERANF.NRECFCUPOMVE,C_GERANF.NRSERIEIMPVND,
                C_GERANF.DSMODELOECFVE, C_GERANF.DSMARCAECFVE, P_NRINSESTDESNF, SUBSTR(C_GERANF.NRACESSONFCE,4,44),
                V_NRSEQCUPOMNF);
         ELSE
            INSERT INTO DADOSNF
               (CDFILIAL, NRLANCTONF, IDTPIJUDESNF, NRINSJUDESNF, NMRAZSODESNF,
                DSENDEDESTNF, NMBAIRDESTNF, CDPAIS, SGESTADO, CDMUNICIPIO,
                NRMD5ARQTXTNF, NRCOOCUPOMNF, NRECFCUPOMNF, NRSERIEIMPNF, DSMODELOECFNF,
                DSMARCAECFNF, NRINSESTDESNF, NRACESSONFCENF, NRSEQCUPOMNF)
            VALUES
               (P_CDFILIPROC, V_NRLANCTONF, P_IDTPIJUDESNF, P_NRINSJUDESNF, P_NMRAZSODESNF,
                P_DSENDEDESTNF, P_NMBAIRDESTNF, P_CDPAIS, P_SGESTADO, P_CDMUNICIPIO,
                C_GERANF.NRMD5ARQTXT,C_GERANF.NRCUPOMFIS,C_GERANF.NRECFCUPOMVE,C_GERANF.NRSERIEIMPVND,
                C_GERANF.DSMODELOECFVE, C_GERANF.DSMARCAECFVE, P_NRINSESTDESNF, C_GERANF.NRACESSONFCE,
                V_NRSEQCUPOMNF);
         END IF;
      END IF;

      V_CDCONTADOR := V_CDCONTADOR + 1;
	  
	  INSERT INTO VENDATMP
		 (CDFILIAL, CDCAIXA, NRSEQVENDA)
	  VALUES 
	     (C_GERANF.CDFILIAL, C_GERANF.CDCAIXA, C_GERANF.NRSEQVENDA);
   END LOOP;

   IF (V_CDCONTADOR > 0) THEN
      V_CDCONTADOR := 1;
	  
	  FOR C_ITEMVENDA IN
	     (SELECT P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO,
		         CASE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) WHEN 0 THEN NVL(I.VRACRITVEND,0) ELSE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) END AS VRUNITVEND,
                 SUM(I.QTPRODVEND) AS QTPRODVEND,
                 NVL(SUM(I.VRDESITVEND),0) AS VRDESITVEND,
                 SUM(TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0)) AS VRTOTAITEM
		    FROM ITEMVENDA I, VENDATMP V, PRODUTO P
           WHERE (I.CDFILIAL   = V.CDFILIAL  )
		     AND (I.CDCAIXA    = V.CDCAIXA   )
			 AND (I.NRSEQVENDA = V.NRSEQVENDA)
		     AND ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL))
             AND (I.NRLANCTONF IS NULL     )
			 AND (I.CDPRODUTO = P.CDPRODUTO)
			 AND (P.IDPESAPROD = 'N'       )
          GROUP BY P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO, I.VRUNITVEND, NVL(I.VRUNITVENDCL,0), NVL(I.VRACRITVEND,0)
		  UNION ALL
		  SELECT P.CDPRODUTO, P.NMPRODUTO, P.CDARVPROD, P.CDPRODESTO,
		         CASE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) WHEN 0 THEN NVL(I.VRACRITVEND,0) ELSE (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)) END AS VRUNITVEND,
                 I.QTPRODVEND,
                 NVL(I.VRDESITVEND,0) AS VRDESITVEND,
                 TRUNC(I.QTPRODVEND * (I.VRUNITVEND + NVL(I.VRUNITVENDCL,0)),2) - NVL(I.VRDESITVEND,0) + NVL(I.VRACRITVEND,0) AS VRTOTAITEM
		    FROM ITEMVENDA I, VENDATMP V, PRODUTO P
           WHERE (I.CDFILIAL   = V.CDFILIAL  )
		     AND (I.CDCAIXA    = V.CDCAIXA   )
			 AND (I.NRSEQVENDA = V.NRSEQVENDA)
		     AND ((INSTR(P_CDPRODUTO, I.CDPRODUTO) > 0) OR (P_CDPRODUTO IS NULL))
             AND (I.NRLANCTONF IS NULL     )
			 AND (I.CDPRODUTO = P.CDPRODUTO)
			 AND (P.IDPESAPROD = 'S'       )) LOOP
             
			 GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC, V_NRLANCTONF, C_ITEMVENDA.CDPRODUTO,
                                     C_ITEMVENDA.CDARVPROD, C_ITEMVENDA.NMPRODUTO,
                                     C_ITEMVENDA.QTPRODVEND, C_ITEMVENDA.VRUNITVEND, C_ITEMVENDA.VRDESITVEND,
                                     NULL, NULL, NULL, NULL, NULL, NULL, V_CDALMOXARIFE, V_CDLOCALESTOQ);

			 /*Atualiza o número da nota na itemvenda*/
             UPDATE ITEMVENDA
				SET CDFILIALNF  = P_CDFILIPROC,
                    NRLANCTONF  = V_NRLANCTONF,
					NRSEQITPROD = LPAD(TO_CHAR(V_CDCONTADOR),4,'0')
              WHERE EXISTS(SELECT 1 
				             FROM VENDATMP
							WHERE CDFILIAL   = ITEMVENDA.CDFILIAL
							  AND CDCAIXA    = ITEMVENDA.CDCAIXA
						      AND NRSEQVENDA = ITEMVENDA.NRSEQVENDA)
			    AND (CDPRODUTO = C_ITEMVENDA.CDPRODUTO);
				
			 V_CDCONTADOR := V_CDCONTADOR + 1;
	  END LOOP;
	  
	  DELETE FROM VENDATMP;
	  
	  V_CDCONTADOR := 1;

      /*Atualização de Estoque*/
      GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF, SYSDATE,
                                 V_NRLANCESTQ, 'S');

      UPDATE NOTAFISCAL
      SET    CDOPERGERA = P_CDOPERADOR
      WHERE (CDFILIAL   = P_CDFILIPROC) AND
            (NRLANCTONF = V_NRLANCTONF);

      ATUALIZA_IDEVOLESTOQ(P_CDFILIPROC, V_NRLANCESTQ);

      ATUALIZA_DADOSADIC(P_CDFILIAL, P_CDCAIXA, P_CDFILIPROC, V_NRLANCTONF, V_NRMD5ARQTXT, P_DSMENSAGEM);
   END IF;

   SELECT COUNT(*)
   INTO V_CDCONTADOR
   FROM SERIEENTR
   WHERE CDSERIEENTR = P_CDSERIE;

   IF V_CDCONTADOR = 0 THEN
      INSERT INTO SERIEENTR
         (CDSERIEENTR, DSSERIEENTR)
      VALUES
         (P_CDSERIE, P_CDSERIE);
   END IF;

   V_CDCONTADOR := 0;
   V_NRCUPOMFIS := 'X';
   V_NRACESSONFCE := 'X';

   FOR C_GERANFDEV IN C_ITEMDEVOLUCAO LOOP

      SELECT NRMD5ARQTXT
        INTO V_NRMD5ARQTXT
        FROM (SELECT NRMD5ARQTXT
                FROM TURCAIXA
               WHERE CDFILIAL = P_CDFILIAL
                 AND CDCAIXA = C_GERANFDEV.CDCAIXA
                 AND NRMD5ARQTXT IS NOT NULL
               ORDER BY DTABERCAIX DESC)
       WHERE ROWNUM = 1;

      IF V_CDCONTADOR = 0 THEN
         V_CDCONTADOR := 1;

         IF P_DTSAIDA IS NULL THEN
            V_DTSAIDA := C_GERANFDEV.DTENTRVENDA;
         ELSE
            V_DTSAIDA := P_DTSAIDA;
         END IF;

         GERA_NOTAFISCAL_CORPO_ENTRADA(P_CDFILIPROC, P_CDFILIAL, V_CDEMPRESA,
                                       '13', P_CDSERIE, P_CDCLIENTE,
                                       V_DTSAIDA, P_IDSISTEMA, 0, V_NRLANCTONF,
                                       V_NRLANCESTQ, 'S');

         --PREENCHENDO INFORMAÇÕES DO FISCO
         /*SELECT MAX(NRDADOFISCO)
           INTO V_NRDADOFISCO
           FROM DADOSFISCO
          WHERE (CDFILIAL   = P_CDFILIAL) 
            AND (NRLANCTONF = V_NRLANCTONF);

         IF (V_NRDADOFISCO IS NULL) THEN
            V_NRDADOFISCO := '001';
         ELSE
            V_NRDADOFISCO := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRDADOFISCO) + 1)), 3, 0);
         END IF;
         
         INSERT INTO DADOSFISCO
            (CDFILIAL, NRLANCTONF, NRDADOFISCO, CDDADOFISCO, DSDADOFISCO)
         VALUES
            (P_CDFILIPROC, V_NRLANCTONF, V_NRDADOFISCO, 'CODIGO MD5', C_GERANFDEV.NRMD5ARQTXT);*/

      END IF;

      IF (V_CDCONTADOR > V_NRMAXITNF) AND (V_IDCONMAXITEM = 'S') THEN
         V_CDCONTADOR := 1;

         /*Atualização de Estoque*/
         GERA_FECHAMENTO_NFENTRADA(P_CDFILIPROC, V_NRLANCTONF, SYSDATE,
                                   V_NRLANCESTQ, 'S');
         ATUALIZA_IDEVOLESTOQ(P_CDFILIPROC, V_NRLANCESTQ);

         ATUALIZA_DADOSADIC(P_CDFILIAL, P_CDCAIXA, P_CDFILIPROC, V_NRLANCTONF, V_NRMD5ARQTXT, P_DSMENSAGEM);

         IF P_DTSAIDA IS NULL THEN
            V_DTSAIDA := C_GERANFDEV.DTENTRVENDA;
         ELSE
            V_DTSAIDA := P_DTSAIDA;
         END IF;
         
         GERA_NOTAFISCAL_CORPO_ENTRADA(P_CDFILIPROC, P_CDFILIAL, V_CDEMPRESA,
                                       '13', P_CDSERIE, P_CDCLIENTE,
                                       V_DTSAIDA, P_IDSISTEMA, 0, V_NRLANCTONF,
                                       V_NRLANCESTQ, 'S');
      END IF;

      SELECT MAX(CDALMOXARIFE), MAX(CDLOCALESTOQ)
      INTO V_CDALMOXARIFE, V_CDLOCALESTOQ
      FROM LOJA
      WHERE CDFILIAL = P_CDFILIAL AND
            CDLOJA   = C_GERANFDEV.CDLOJA;

      GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC, V_NRLANCTONF, C_GERANFDEV.CDPRODUTO,
                              C_GERANFDEV.CDARVPROD, C_GERANFDEV.NMPRODUTO,
                              C_GERANFDEV.QTPRODVEND, C_GERANFDEV.VRUNITVEND, C_GERANFDEV.VRDESITVEND,
                              NULL, NULL, NULL, NULL, NULL, NULL, V_CDALMOXARIFE, V_CDLOCALESTOQ);

      /*Atualiza o número da nota na itemvenda*/
      UPDATE ITEMVENDA
         SET CDFILIALNF  = P_CDFILIPROC,
             NRLANCTONF  = V_NRLANCTONF,
             NRSEQITPROD = LPAD(TO_CHAR(V_CDCONTADOR),4,'0')
       WHERE (CDFILIAL   = C_GERANFDEV.CDFILIAL  )
         AND (CDCAIXA    = C_GERANFDEV.CDCAIXA   )
         AND (NRSEQVENDA = C_GERANFDEV.NRSEQVENDA)
         AND (CDPRODUTO  = C_GERANFDEV.CDPRODUTO );

      /*Atualiza os dados do cliente da nota fiscal*/
      IF (C_GERANFDEV.IDTPEMISVEND IS NULL) OR (C_GERANFDEV.IDTPEMISVEND = 'E') THEN
         SELECT COUNT(*)
           INTO V_DADOSNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF)
            AND (NRCOOCUPOMNF = C_GERANFDEV.NRCUPOMFIS);
      ELSE
         SELECT COUNT(*)
           INTO V_DADOSNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF)
            AND (NRACESSONFCENF = C_GERANFDEV.NRACESSONFCE);
      END IF;

      IF V_DADOSNF = 0 THEN
         SELECT MAX(NRSEQCUPOMNF)
           INTO V_NRSEQCUPOMNF
           FROM DADOSNF
          WHERE (CDFILIAL   = P_CDFILIPROC)
            AND (NRLANCTONF = V_NRLANCTONF);

         V_NRSEQCUPOMNF := LPAD(RTRIM(TO_CHAR(TO_NUMBER(NVL(V_NRSEQCUPOMNF, '0')) + 1)), 3, 0);
         
         INSERT INTO DADOSNF
           (CDFILIAL, NRLANCTONF, IDTPIJUDESNF, NRINSJUDESNF, NMRAZSODESNF,
            DSENDEDESTNF, NMBAIRDESTNF, CDPAIS, SGESTADO, CDMUNICIPIO,
            NRMD5ARQTXTNF,NRCOOCUPOMNF,NRECFCUPOMNF,NRSERIEIMPNF,DSMODELOECFNF,DSMARCAECFNF,
            NRINSESTDESNF, NRACESSONFCENF, NRSEQCUPOMNF)
         VALUES
            (P_CDFILIPROC, V_NRLANCTONF, P_IDTPIJUDESNF, P_NRINSJUDESNF, P_NMRAZSODESNF,
             P_DSENDEDESTNF, P_NMBAIRDESTNF, P_CDPAIS, P_SGESTADO, P_CDMUNICIPIO,
             C_GERANFDEV.NRMD5ARQTXT,C_GERANFDEV.NRCUPOMFIS,C_GERANFDEV.NRECFCUPOMVE,C_GERANFDEV.NRSERIEIMPVND,C_GERANFDEV.DSMODELOECFVE,
             C_GERANFDEV.DSMARCAECFVE, P_NRINSESTDESNF, C_GERANFDEV.NRACESSONFCE, V_NRSEQCUPOMNF);
      END IF;

      V_CDCONTADOR := V_CDCONTADOR + 1;

   END LOOP;

   IF (V_CDCONTADOR > 0) THEN
      V_CDCONTADOR := 1;

      /*Atualização de Estoque*/
      GERA_FECHAMENTO_NFENTRADA(P_CDFILIPROC, V_NRLANCTONF, SYSDATE,
                                V_NRLANCESTQ, 'S');
                                
      ATUALIZA_IDEVOLESTOQ(P_CDFILIPROC, V_NRLANCESTQ);

      ATUALIZA_DADOSADIC(P_CDFILIAL, P_CDCAIXA, P_CDFILIPROC, V_NRLANCTONF, V_NRMD5ARQTXT, P_DSMENSAGEM);
   END IF;
END;