create or replace PROCEDURE USR_PROT_EXPORTA_NFSAIDA(
   P_INCDFILIAL    IN VARCHAR2,
   P_INNRLANCTONF  IN VARCHAR2,
   P_INIDINTERFACE IN VARCHAR2
)
IS
   --NOTA--
   V_CDFILIAL          NOTAFISCAL.CDFILIAL%TYPE;
   V_NRLANCTONF        NOTAFISCAL.NRLANCTONF%TYPE;
   V_CDFILIEMIT        NOTAFISCAL.CDFILIEMIT%TYPE;
   V_CDFILIRECE        NOTAFISCAL.CDFILIRECE%TYPE;
   V_NRPEDVENDA        NOTAFISCAL.NRNOTAFISC%TYPE;
   V_CDCLIENTE         NOTAFISCAL.CDCLIENTE%TYPE;
   V_CDCLIENTEPROT     EXPORTCLIE.CDCLIENTE%TYPE;
   V_DTEMISSAO         NOTAFISCAL.DTEMISSAO%TYPE;
   V_DTENTRSAID        NOTAFISCAL.DTENTRSAID%TYPE;
   V_CDTIPOOPER        NOTAFISCAL.CDTIPOOPER%TYPE;

   --PRODUTOS--
   V_CDPRODUTO         ITEMPRODUTO.CDPRODUTO%TYPE;
   V_VRQUANTIDADE      ITEMPRODUTO.QTITEMPROD%TYPE;
   V_VRUNITARIO        ITEMPRODUTO.VRUNITITEM%TYPE;
   V_VRTOTAL           ITEMPRODUTO.VRTOTAITEM%TYPE;
   V_SGUNIDADE         PRODUTO.SGUNIDADE%TYPE;
   V_CODARMAZEM        ITEMPRODUTO.CDALMOXARIFE%TYPE;
   V_NRSEQITPROD       ITEMPRODUTO.NRSEQITPROD%TYPE;
   --ESPECIFICO TABELA INT--
   V_LOG_ERRO          USR_CISPEDIDO_VENDA.LOG_ERRO%TYPE;
   V_DTGRAVACAO    	  USR_CISPEDIDO_VENDA.DTGRAVACAO%TYPE;
   V_HRGRAVACAO    	  USR_CISPEDIDO_VENDA.HRGRAVACAO%TYPE;
   V_DTIMPORTACAO  	  USR_CISPEDIDO_VENDA.DTIMPORTACAO%TYPE;
   V_HRIMPORTACAO  	  USR_CISPEDIDO_VENDA.HRIMPORTACAO%TYPE;
   V_IDINTERFACE   	  USR_CISPEDIDO_VENDA.IDINTERFACE%TYPE;
   V_OLDINTERFACE		  USR_CISPEDIDO_VENDA.IDINTERFACE%TYPE;
   V_CNPJEMPRESA		  USR_CISPEDIDO_VENDA.CNPJEMPRESA%TYPE;
   V_CDLOJA			     USR_CISPEDIDO_VENDA.CDLOJA%TYPE;
   V_ERRO 			  	  VARCHAR2(5000);
   V_OBS			        VARCHAR2(5000);
   V_JOBNAME       	  VARCHAR2(5000);
   V_DSINTERFACE   	  VARCHAR2(100);
   V_COUNTCALLS    	  NUMBER;
   V_NOMEJOBWEB		  VARCHAR2(100) := 'exportaNFS';
   V_COMANDO			  VARCHAR2(100);

   --VARIAVEIS LOCAIS MUTAVEIS--
   V_JAEXPORTADO INTEGER;
   V_CDCENTCUST USR_CISPEDIDO_VENDA.CDCENTCUST%TYPE;
   V_CDCONDPAG  USR_CISPEDIDO_VENDA.CDCONDPAG%TYPE;

   CURSOR C_NOTAS IS
      SELECT NRINSJUREMPR AS CNPJEMPRESA, N.CDFILIAL, N.NRLANCTONF, N.CDFILIEMIT, N.CDFILIRECE, N.NRNOTAFISC AS NRPEDVENDA,
             N.CDCLIENTE, NVL(E.CDCLIEEXPORT, 'C0000201'), NVL(SUBSTR(E.CDCLIEEXPORT, 7, 2), '01') AS CDLOJA, N.DTEMISSAO, N.DTENTRSAID,
             T.CDTIPOOPER
       FROM NOTAFISCAL N JOIN TIPOOPERAC T
                            ON N.IDENTRSAIDOP = T.IDENTRSAIDOP
                           AND N.CDTIPOOPER   = T.CDTIPOOPER
                        JOIN FILIAL FI
                            ON FI.CDFILIAL = N.CDFILIEMIT
                        JOIN EMPRESA EM
                            ON EM.CDEMPRESA = FI.CDEMPRESA
                        LEFT JOIN EXPORTCLIE E
                            ON N.CDCLIENTE = E.CDCLIENTE
      WHERE T.IDENTRSAIDOP = 'S'
        AND T.IDNOTADEVO = 'N'
        AND N.CDFILIAL = P_INCDFILIAL
        AND N.NRLANCTONF = P_INNRLANCTONF
        AND EXISTS(SELECT CDFILIAL
                     FROM ITEMPRODUTO I
                    WHERE I.CDFILIAL = N.CDFILIAL
                      AND I.NRLANCTONF = N.NRLANCTONF);

   CURSOR C_ITEMPRODUTO IS
	   SELECT I.CDPRODUTO, I.QTITEMPROD AS VRQUANTIDADE, I.VRUNITITEM AS VRUNITARIO, I.VRTOTAITEM AS VRTOTAL,
	          P.SGUNIDADE SGUNIDADE, DECODE(I.CDALMOXARIFE, ' ', '01', I.CDALMOXARIFE) AS CODARMAZEM, I.NRSEQITPROD
	     FROM ITEMPRODUTO I, PRODUTO P
	    WHERE I.CDPRODUTO  = P.CDPRODUTO
	      AND I.CDFILIAL   = P_INCDFILIAL
	      AND I.NRLANCTONF = P_INNRLANCTONF;
BEGIN
	--*** CRIA UM NOME COMPOSTO PARA O JOB PARA QUE POSSAM COEXISTIR MULTIPLOS EVIOS SIMULTANEOS ***--
	V_JOBNAME := 'EXPORTANFS'||P_INCDFILIAL||P_INNRLANCTONF;
	V_COMANDO := 'BEGIN Usr_callWebservice('||CHR(39)||V_NOMEJOBWEB||CHR(39)||') END;';

   OPEN C_NOTAS;
   LOOP
    	FETCH C_NOTAS INTO V_CNPJEMPRESA,
                         V_CDFILIAL,
                         V_NRLANCTONF,
                         V_CDFILIEMIT,
                         V_CDFILIRECE,
                         V_NRPEDVENDA,
                         V_CDCLIENTE,
                         V_CDCLIENTEPROT,
                         V_CDLOJA,
                         V_DTEMISSAO,
                         V_DTENTRSAID,
                         V_CDTIPOOPER;
    	EXIT WHEN C_NOTAS%NOTFOUND;

      BEGIN
		   SELECT DISTINCT MAX(TO_NUMBER(SUBSTR(NRPEDVENDA, 2, 5))) AS MAX_SEQPEDVENDA
           INTO V_NRPEDVENDA
           FROM USR_CISPEDIDO_VENDA
          WHERE CDFILIAL   = V_CDFILIAL
            AND NRLANCTONF = V_NRLANCTONF;
	   EXCEPTION
	      WHEN NO_DATA_FOUND THEN
	         V_NRPEDVENDA := NULL;
	   END;

      IF (V_NRPEDVENDA IS NULL) THEN
    	   SELECT NVL(MAX(TO_NUMBER(SUBSTR(NRPEDVENDA, 2, 5))),0)+1 AS MAX_SEQPEDVENDA
           INTO V_NRPEDVENDA
           FROM USR_CISPEDIDO_VENDA;
      END IF;

      V_NRPEDVENDA := 'T'||LPAD(V_NRPEDVENDA, 5, 0);

    	OPEN C_ITEMPRODUTO;
    	LOOP
    		FETCH C_ITEMPRODUTO INTO V_CDPRODUTO,
                                  V_VRQUANTIDADE,
                                  V_VRUNITARIO,
                                  V_VRTOTAL,
                                  V_SGUNIDADE,
                                  V_CODARMAZEM,
                                  V_NRSEQITPROD;
			EXIT WHEN C_ITEMPRODUTO%NOTFOUND;

			BEGIN
         	SELECT COUNT(NRLANCTONF)
              INTO V_JAEXPORTADO
              FROM USR_CISPEDIDO_VENDA
             WHERE CDFILIAL    = V_CDFILIAL
               AND NRLANCTONF  = V_NRLANCTONF
               AND NRSEQITPROD = V_NRSEQITPROD;

				SELECT MAX(IDINTERFACE), MAX(DTIMPORTACAO)
              INTO V_OLDINTERFACE, V_DTIMPORTACAO
              FROM USR_CISPEDIDO_VENDA
             WHERE CDFILIAL    = V_CDFILIAL
               AND NRLANCTONF  = V_NRLANCTONF
               AND NRSEQITPROD = V_NRSEQITPROD;

				SELECT CDEXFILIAL
              INTO V_CDCENTCUST
              FROM PARAMFILIAL
             WHERE CDFILIAL = NVL(V_CDFILIRECE,V_CDFILIEMIT);

				BEGIN
					SELECT NVL(CDFORMPGTO, '06')
                 INTO V_CDCONDPAG
                 FROM CLIENTE
                WHERE CDCLIENTE = V_CDCLIENTE;
				EXCEPTION
				   WHEN NO_DATA_FOUND THEN
				      V_CDCONDPAG := '06';
				END;

				V_IDINTERFACE := P_INIDINTERFACE;

				IF (V_JAEXPORTADO = 0) THEN
            	V_IDINTERFACE := '1';
            ELSE
            	V_IDINTERFACE := '2';
            END IF;

				IF (V_IDINTERFACE = '1') THEN
					BEGIN
						INSERT INTO USR_CISPEDIDO_VENDA
						   (CNPJEMPRESA, IDIMPORTADO, NRPEDVENDA, CDCENTCUST, CDCONDPAG, TES, CDCLIENTE, CDLOJA, DTSAIDA,
						    CODARMAZEM, CDPRODUTO, SGUNIDADE, VRQUANTIDADE, VRUNITARIO, VRTOTAL, IDINTERFACE,
						    DTGRAVACAO, HRGRAVACAO, NRLANCTONF, CDFILIAL, NRSEQITPROD)
						VALUES
						   (V_CNPJEMPRESA, 'S', V_NRPEDVENDA, V_CDCENTCUST, V_CDCONDPAG, '02', V_CDCLIENTEPROT, V_CDLOJA, V_DTENTRSAID,
						    V_CODARMAZEM, V_CDPRODUTO, V_SGUNIDADE, V_VRQUANTIDADE, V_VRUNITARIO, V_VRTOTAL, V_IDINTERFACE,
						    SYSDATE, TO_CHAR(SYSDATE, 'HH:MM'), V_NRLANCTONF, V_CDFILIAL, V_NRSEQITPROD);

						COMMIT; -- ESTE COMMIT TEM QUE FICAR DENTRO DO LOOP LOGO APOS INSERSÃO POIS TELA DE NF CHAMA VARIOS UPDATES SEGUIDOS DISPARANDO A TRIGGER MULTIPLAS VEZES
					EXCEPTION
						WHEN OTHERS THEN
						   V_ERRO := SQLERRM(SQLCODE);
					END;
				END IF;

				IF (V_IDINTERFACE = '2' AND (V_OLDINTERFACE <> '1' OR V_DTIMPORTACAO IS NOT NULL)) THEN
					BEGIN
					   UPDATE USR_CISPEDIDO_VENDA
					      SET CDCENTCUST = V_CDCENTCUST,
					          CDCONDPAG = V_CDCONDPAG,
					          TES = '02',
					          SGUNIDADE = V_SGUNIDADE,
					          VRQUANTIDADE = V_VRQUANTIDADE,
					          VRUNITARIO = V_VRUNITARIO,
					          VRTOTAL = V_VRTOTAL,
					          IDINTERFACE = V_IDINTERFACE,
					          DTGRAVACAO = TRUNC(SYSDATE),
					          HRGRAVACAO = TO_CHAR(SYSDATE, 'HH:MM'),
					          DTIMPORTACAO = NULL,
                         HRIMPORTACAO = NULL
					    WHERE CDFILIAL    = V_CDFILIAL
					      AND NRLANCTONF  = V_NRLANCTONF
					      AND NRSEQITPROD = V_NRSEQITPROD;
					EXCEPTION
						WHEN OTHERS THEN
						   V_ERRO := SQLERRM(SQLCODE);
					END;
				END IF;
			EXCEPTION
				WHEN OTHERS THEN
				   V_ERRO := SQLERRM(SQLCODE);
			END;

    		UPDATE USR_CISPEDIDO_VENDA
				SET LOG_ERRO = V_ERRO,
            	 DTGRAVACAO = TRUNC(SYSDATE),
            	 HRGRAVACAO = TO_CHAR(SYSDATE, 'HH:MM')
		    WHERE CDFILIAL    = V_CDFILIAL
			   AND NRLANCTONF  = V_NRLANCTONF
			   AND NRSEQITPROD = V_NRSEQITPROD;

		END LOOP;
    	CLOSE C_ITEMPRODUTO;
   END LOOP;
   CLOSE C_NOTAS;

   BEGIN
	   IF (P_INIDINTERFACE = '3') THEN
			BEGIN
				UPDATE USR_CISPEDIDO_VENDA
			      SET IDINTERFACE = P_INIDINTERFACE,
			          DTGRAVACAO = TRUNC(SYSDATE),
			          HRGRAVACAO = TO_CHAR(SYSDATE, 'HH:MM'),
			          DTIMPORTACAO = NULL,
	                HRIMPORTACAO = NULL
			    WHERE CDFILIAL   = P_INCDFILIAL
			      AND NRLANCTONF = P_INNRLANCTONF;
			EXCEPTION
				WHEN OTHERS THEN
				   V_ERRO := SQLERRM(SQLCODE);
			END;
		END IF;
   EXCEPTION
		WHEN OTHERS THEN
		   V_ERRO := SQLERRM(SQLCODE);
	END;

	COMMIT;

   SELECT NVL(MAX(SEQLOG),0)+1
     INTO V_COUNTCALLS
     FROM USR_LOG_WEBSERVICE;

   SELECT DECODE(V_IDINTERFACE, 1, 'INCLUSAO', DECODE(V_IDINTERFACE, 2, 'ALTERACAO', 'EXCLUSAO'))
     INTO V_DSINTERFACE
     FROM DUAL;

   INSERT INTO USR_LOG_WEBSERVICE
      (SEQLOG, DSMETODO, IDACAO, IDTIPINTEGR, OBSLOG, NRLANCTONF, DTINCLUSAO)
   VALUES
      (V_COUNTCALLS, 'ProcedureExportaNfs', V_DSINTERFACE, 'ENVIAR', NVL(V_ERRO,'SEM ERROS'), P_INNRLANCTONF, SYSDATE);

	IF V_HRIMPORTACAO IS NOT NULL OR (V_IDINTERFACE = '1' OR P_INIDINTERFACE = '1') THEN
	   BEGIN
	    	Usr_callWebservice('exportaNFS');
	   EXCEPTION
		   WHEN OTHERS THEN
			   V_ERRO := SQLERRM(SQLCODE);
      END;
   END IF;

   -- NOVA TRATATIVA PARA TRATATAR DUPLICAÇÕES ATRAVEZ DE JOB 'ACUMULADOR' PARA EVITAR MULTIPLAS CHAMADAS
   BEGIN
      DBMS_SCHEDULER.DROP_JOB(V_JOBNAME);
   EXCEPTION
      WHEN OTHERS THEN
         NULL;
   END;
EXCEPTION
   WHEN OTHERS THEN BEGIN
      V_ERRO := SQLERRM(SQLCODE);

     SELECT NVL(MAX(SEQLOG),0)+1
       INTO V_COUNTCALLS
       FROM USR_LOG_WEBSERVICE;

     SELECT DECODE(V_IDINTERFACE, 1, 'INCLUSAO', DECODE(V_IDINTERFACE, 2, 'ALTERACAO', 'EXCLUSAO'))
       INTO V_DSINTERFACE
       FROM DUAL;

     INSERT INTO USR_LOG_WEBSERVICE
        (SEQLOG, DSMETODO, IDACAO, IDTIPINTEGR, OBSLOG, NRLANCTONF, DTINCLUSAO)
     VALUES
        (V_COUNTCALLS, 'ProcedureExportaNfs', V_DSINTERFACE, 'ENVIAR', V_ERRO, P_INNRLANCTONF, SYSDATE);
   END;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('USR_PROT_EXPORTA_NFSAIDA','6.35.038'); END;
/
