create or replace PROCEDURE USR_PROT_IMPORTA_PRODUTO(
   P_MENSAGEMERRO OUT VARCHAR2)
IS
   --GERAL
   V_CDPRODUTO 	  USR_CISPROT_PRODUTO.CDPRODPROT%TYPE;
   V_TIPO 			  USR_CISPROT_PRODUTO.TIPO%TYPE;
   V_DESCTIPO 		  USR_CISPROT_PRODUTO.DESCTIPO%TYPE;
   V_GRUPO 		     USR_CISPROT_PRODUTO.GRUPO%TYPE;
   V_DESCGRUPO 	  USR_CISPROT_PRODUTO.DESCGRUPO%TYPE;
   V_SUBGRUPO 		  USR_CISPROT_PRODUTO.SUBGRUPO%TYPE;
   V_DESCSUBGRUPO	  USR_CISPROT_PRODUTO.DESCSUBGRUPO%TYPE;
   V_PASTA 		     USR_CISPROT_PRODUTO.PASTA%TYPE;
   V_DESCPASTA 	  USR_CISPROT_PRODUTO.DESCPASTA%TYPE;
   V_NMPRODUTO 	  USR_CISPROT_PRODUTO.NMPRODUTO%TYPE;
   V_SGUNIDADE 	  USR_CISPROT_PRODUTO.SGUNIDADE%TYPE;
   V_VRFATCORR 	  USR_CISPROT_PRODUTO.VRFATCORR%TYPE;
   V_VRFATOCONV 	  USR_CISPROT_PRODUTO.VRFATOCONV%TYPE;
   V_IDPRODESTO     USR_CISPROT_PRODUTO.IDPRODESTO%TYPE; -- se sim v_cdprodesto = cdproduto
   V_CDPRODESTO	  USR_CISPROT_PRODUTO.CDPRODESTO%TYPE;  -- ADICIONAR ESTE CAMPO NO WSDL E CRAIR UM NOVO CDPRODESTO00 EM VARIAVEIS LOCAIS PARA VALIDACAO
   V_IDPRODATIVO    USR_CISPROT_PRODUTO.IDPRODATIVO%TYPE;

   --ESPECIFICO TABELA INT
   V_IDINTERFACE   VARCHAR2(1);
   V_LOG_ERRO      VARCHAR2(250);
   V_DTGRAVACAO    DATE;
   V_HRGRAVACAO    VARCHAR2(5);
   V_DTIMPORTACAO  DATE;
   V_HRIMPORTACAO  VARCHAR2(5);
   V_ERRO 			 VARCHAR2(5000);
   V_OBS			    VARCHAR2(5000);

   --VARIAVEIS LOCAIS MUTAVEIS
   V_CDFILIAL 		VARCHAR2(4);
   V_IDCTRLESTQ 	VARCHAR2(1);
   V_IDUTILLOTE 	VARCHAR2(1);
   V_PRODFILIATIV VARCHAR2(1);

   V_EXISTENV1 		   NUMBER;
   V_EXISTENV2 	   	NUMBER;
   V_EXISTENV3 	     	NUMBER;
   V_EXISTENV4 		   NUMBER;
   V_EXISTEPRODESTO	   NUMBER;
   V_PRODUTODEESTOQUE	NUMBER;
   V_EXISTEPRODFILI   	NUMBER;
   V_JACADASTRADO       NUMBER;


   CURSOR C_PRODUTO IS
      SELECT CDPRODPROT AS CDPRODUTO, TIPO, DESCTIPO, GRUPO, DESCGRUPO, SUBGRUPO, DESCSUBGRUPO, PASTA,
             DESCPASTA, NMPRODUTO, SGUNIDADE, VRFATCORR, DECODE(VRFATOCONV, 0, 1, VRFATOCONV) VRFATOCONV,
             IDPRODESTO, CDPRODESTO, IDPRODATIVO, IDINTERFACE, LOG_ERRO, DTGRAVACAO,
             HRGRAVACAO, DTIMPORTACAO, HRIMPORTACAO
       FROM USR_CISPROT_PRODUTO
      WHERE DTIMPORTACAO IS NULL;

   CURSOR C_FILIAL IS
      SELECT F.CDFILIAL, IDCTRLESTQ, IDUTILLOTE
        FROM PARAMFILIAL P, FILIAL F
       WHERE P.CDFILIAL = F.CDFILIAL;

BEGIN
   OPEN C_PRODUTO;
   LOOP
      FETCH C_PRODUTO INTO V_CDPRODUTO,
                           V_TIPO,
                           V_DESCTIPO,
                           V_GRUPO,
                           V_DESCGRUPO,
                           V_SUBGRUPO,
                           V_DESCSUBGRUPO,
                           V_PASTA,
                           V_DESCPASTA,
                           V_NMPRODUTO,
                           V_SGUNIDADE,
                           V_VRFATCORR,
                           V_VRFATOCONV,
                           V_IDPRODESTO,
                           V_CDPRODESTO,
                           V_IDPRODATIVO,
                           V_IDINTERFACE,
                           V_LOG_ERRO,
                           V_DTGRAVACAO,
                           V_HRGRAVACAO,
                           V_DTIMPORTACAO,
                           V_HRIMPORTACAO;
      EXIT WHEN C_PRODUTO%NOTFOUND;

      V_ERRO          := NULL;
      V_OBS           := NULL;
      P_MENSAGEMERRO  := NULL;
      V_PRODFILIATIV  := 'A';

      SELECT COUNT(CDPRODUTO) INTO V_EXISTENV1 FROM PRODUTO WHERE CDPRODUTO = V_TIPO;
      SELECT COUNT(CDPRODUTO) INTO V_EXISTENV2 FROM PRODUTO WHERE CDPRODUTO = V_TIPO||V_GRUPO;
      SELECT COUNT(CDPRODUTO) INTO V_EXISTENV3 FROM PRODUTO WHERE CDPRODUTO = V_TIPO||V_GRUPO||V_SUBGRUPO;
      SELECT COUNT(CDPRODUTO) INTO V_EXISTENV4 FROM PRODUTO WHERE CDPRODUTO = V_TIPO||V_GRUPO||V_SUBGRUPO||V_PASTA;
      SELECT COUNT(CDPRODUTO) INTO V_EXISTEPRODESTO FROM PRODUTO WHERE CDPRODUTO = SUBSTR(V_CDPRODUTO, 0, LENGTH(V_CDPRODUTO)-2)||'00';
      SELECT COUNT(CDPRODUTO) INTO V_EXISTEPRODFILI FROM PRODFILI WHERE CDPRODUTO = V_CDPRODUTO;
      SELECT COUNT(CDPRODUTO) INTO V_JACADASTRADO FROM PRODUTO WHERE CDPRODUTO = V_CDPRODUTO;

   	IF (SUBSTR(V_CDPRODUTO, LENGTH(V_CDPRODUTO)-1, 2) = '00') THEN
		   V_PRODUTODEESTOQUE := 1;
	   ELSE
		   V_PRODUTODEESTOQUE := 0;
	   END IF;

      IF (V_IDPRODESTO = 'S') THEN
         V_CDPRODESTO := V_CDPRODUTO;
      ELSE
         IF (V_CDPRODESTO IS NULL) THEN
            V_CDPRODESTO := SUBSTR(V_CDPRODUTO, 0, LENGTH(V_CDPRODUTO)-2)||'00';
         END IF;
      END IF;

      IF (V_IDPRODATIVO = 'N') THEN
         V_PRODFILIATIV  := 'I';
      END IF;

      IF (V_JACADASTRADO > 0) THEN
	       V_IDINTERFACE := '2';
      END IF;

	   IF (V_IDINTERFACE = '1') THEN
		   BEGIN
   			IF(V_EXISTENV1 = 0) THEN
    				INSERT INTO PRODUTO
				      (CDARVPROD, CDPRODUTO, SGUNIDADE, CDNVPRODUTO, NMPRODUTO, CDPRODESTO,
				       VRFATOCONV, VRPEFATOCORR, IDPRODATIVPR, IDSEGMENTOPROD, IDPRODUSOCONS,
				       CDCSTDIG1PROD, IDGERREVPROCFA, IDTEMNUTRIENTE, IDALTERANUTR, IDTEOROBRIG,
				       IDVDANALISE, IDPRODPERIG, IDPRODDIMEVAR, DTULTATUPROD, DTULTATU)
				   VALUES
				      (V_TIPO,  V_TIPO, V_SGUNIDADE,  '1',  V_DESCTIPO, NULL,
				       V_VRFATOCONV, V_VRFATCORR, 'S', 'OUTR', 'N',
				       '0', 'N', 'N', 'N', 'N',
				       '2', 'N', 'N', SYSDATE, SYSDATE);
            END IF;

			   IF (V_EXISTENV2 = 0) THEN
 			      INSERT INTO PRODUTO
				      (CDARVPROD, CDPRODUTO, SGUNIDADE, CDNVPRODUTO, NMPRODUTO, CDPRODESTO,
				       VRFATOCONV, VRPEFATOCORR, IDPRODATIVPR, IDSEGMENTOPROD, IDPRODUSOCONS,
				       CDCSTDIG1PROD, IDGERREVPROCFA, IDTEMNUTRIENTE, IDALTERANUTR, IDTEOROBRIG,
				       IDVDANALISE, IDPRODPERIG, IDPRODDIMEVAR, DTULTATUPROD, DTULTATU)
				   VALUES
				      (V_TIPO||V_GRUPO,  V_TIPO||V_GRUPO, V_SGUNIDADE,  '2',  V_DESCGRUPO, NULL,
				       V_VRFATOCONV, V_VRFATCORR, 'S', 'OUTR', 'N',
				       '0', 'N', 'N', 'N', 'N',
				       '2', 'N', 'N', SYSDATE, SYSDATE);
			   END IF;

			   IF (V_EXISTENV3 = 0) THEN
				   INSERT INTO PRODUTO
				      (CDARVPROD, CDPRODUTO, SGUNIDADE, CDNVPRODUTO, NMPRODUTO, CDPRODESTO,
				       VRFATOCONV, VRPEFATOCORR, IDPRODATIVPR, IDSEGMENTOPROD, IDPRODUSOCONS,
				       CDCSTDIG1PROD, IDGERREVPROCFA, IDTEMNUTRIENTE, IDALTERANUTR, IDTEOROBRIG,
				       IDVDANALISE, IDPRODPERIG, IDPRODDIMEVAR, DTULTATUPROD, DTULTATU)
				   VALUES
				      (V_TIPO||V_GRUPO||V_SUBGRUPO,  V_TIPO||V_GRUPO||V_SUBGRUPO, V_SGUNIDADE,  '3',  V_DESCSUBGRUPO, NULL,
				       V_VRFATOCONV, V_VRFATCORR, 'S', 'OUTR', 'N',
				       '0', 'N', 'N', 'N', 'N',
				       '2', 'N', 'N', SYSDATE, SYSDATE);
			   END IF;

			   IF (V_EXISTENV4 = 0) THEN
   				INSERT INTO PRODUTO
				      (CDARVPROD, CDPRODUTO, SGUNIDADE, CDNVPRODUTO, NMPRODUTO, CDPRODESTO,
				       VRFATOCONV, VRPEFATOCORR, IDPRODATIVPR, IDSEGMENTOPROD, IDPRODUSOCONS,
				       CDCSTDIG1PROD, IDGERREVPROCFA, IDTEMNUTRIENTE, IDALTERANUTR, IDTEOROBRIG,
				       IDVDANALISE, IDPRODPERIG, IDPRODDIMEVAR, DTULTATUPROD, DTULTATU)
				   VALUES
				      (V_TIPO||V_GRUPO||V_SUBGRUPO||V_PASTA,  V_TIPO||V_GRUPO||V_SUBGRUPO||V_PASTA, V_SGUNIDADE,  '4',  V_DESCPASTA, NULL,
				       V_VRFATOCONV, V_VRFATCORR, 'S', 'OUTR', 'N',
				       '0', 'N', 'N', 'N', 'N',
				       '2', 'N', 'N', SYSDATE, SYSDATE);
			   END IF;

			   IF (V_EXISTEPRODESTO > 0 OR V_PRODUTODEESTOQUE = 1) THEN
    				INSERT INTO PRODUTO
				      (CDARVPROD, CDPRODUTO, SGUNIDADE, CDNVPRODUTO, NMPRODUTO, CDPRODESTO,
				       VRFATOCONV, VRPEFATOCORR, IDPRODATIVPR, IDSEGMENTOPROD, IDPRODUSOCONS,
				       CDCSTDIG1PROD, IDGERREVPROCFA, IDTEMNUTRIENTE, IDALTERANUTR, IDTEOROBRIG,
				       IDVDANALISE, IDPRODPERIG, IDPRODDIMEVAR, DTULTATUPROD, DTULTATU)
				   VALUES
				      (V_CDPRODUTO,  V_CDPRODUTO, V_SGUNIDADE,  '5',  V_NMPRODUTO, V_CDPRODESTO,
				       V_VRFATOCONV, V_VRFATCORR, 'S', 'OUTR', 'N',
			     	   '0', 'N', 'N', 'N', 'N',
				      '2', 'N', 'N', SYSDATE, SYSDATE);

				   OPEN C_FILIAL;
				   LOOP
					   FETCH C_FILIAL INTO V_CDFILIAL,
						          			  V_IDCTRLESTQ,
									     	     V_IDUTILLOTE;
                  EXIT WHEN C_FILIAL%NOTFOUND;

                  INSERT INTO PRODFILI (CDFILIAL, CDPRODUTO, IDCNTRESTOQ, IDUTCTRLLOTE)
                  VALUES (V_CDFILIAL, V_CDPRODUTO, V_IDCTRLESTQ, V_IDUTILLOTE);
				   END LOOP;
				   CLOSE C_FILIAL;
			   ELSE
				   V_ERRO:= 'NÃO EXISTE PRODUTO DE ESTOQUE PARA O PRODUTO '||V_CDPRODUTO;
               P_MENSAGEMERRO := V_ERRO;
			   END IF;
		   EXCEPTION
			   WHEN OTHERS THEN
				   V_ERRO  := SQLERRM(SQLCODE);
               P_MENSAGEMERRO := V_ERRO;
		   END;
	   END IF;

	   IF (V_IDINTERFACE = '2') THEN
   		BEGIN
            --UPDATE NIVEL 1
            UPDATE PRODUTO
               SET NMPRODUTO =  V_DESCTIPO
             WHERE CDPRODUTO =  V_TIPO;

            -- UPDATE NIVEL 2
            UPDATE PRODUTO
               SET NMPRODUTO =  V_DESCGRUPO
             WHERE CDPRODUTO =  V_GRUPO;

            -- UPDATE NIVEL 3
            UPDATE PRODUTO
               SET NMPRODUTO =  V_DESCSUBGRUPO
             WHERE CDPRODUTO =  V_SUBGRUPO;

            -- UPDATE NIVEL 4
            UPDATE PRODUTO
               SET NMPRODUTO =  V_PASTA
             WHERE CDPRODUTO =  V_DESCPASTA;

            -- UPDATE NIVEL 5
            UPDATE PRODUTO
               SET NMPRODUTO =  V_NMPRODUTO,
                   IDPRODATIVPR = V_IDPRODATIVO
             WHERE CDPRODUTO =  V_CDPRODUTO;

			   OPEN C_FILIAL;
				LOOP
					FETCH C_FILIAL INTO V_CDFILIAL,
                                   V_IDCTRLESTQ,
                                   V_IDUTILLOTE;
               EXIT WHEN C_FILIAL%NOTFOUND;

					UPDATE PRODFILI
						SET IDPRODATIV = V_PRODFILIATIV
					 WHERE CDFILIAL = V_CDFILIAL
					   AND CDPRODUTO = V_CDPRODUTO;

				END LOOP;
			   CLOSE C_FILIAL;
         EXCEPTION
			   WHEN OTHERS THEN
				   V_ERRO  := SQLERRM(SQLCODE);
               P_MENSAGEMERRO := V_ERRO;
		   END;
	   END IF;

	   IF (V_IDINTERFACE = '3') THEN
		   BEGIN
			   UPDATE PRODUTO
				   SET IDPRODATIVPR = 'N'
			    WHERE CDPRODUTO =  V_CDPRODUTO;

			   OPEN C_FILIAL;
				LOOP
					FETCH C_FILIAL INTO V_CDFILIAL,
                                   V_IDCTRLESTQ,
                                   V_IDUTILLOTE;
               EXIT WHEN C_FILIAL%NOTFOUND;

					UPDATE PRODFILI
						SET IDPRODATIV = V_PRODFILIATIV
					 WHERE CDFILIAL  = V_CDFILIAL
					   AND CDPRODUTO = V_CDPRODUTO;

				END LOOP;
			   CLOSE C_FILIAL;
		   EXCEPTION
			   WHEN OTHERS THEN
				   V_ERRO  := SQLERRM(SQLCODE);
               P_MENSAGEMERRO := V_ERRO;
		   END;
	   END IF;

	   UPDATE USR_CISPROT_PRODUTO
		   SET DTIMPORTACAO = SYSDATE,
			    HRIMPORTACAO = TO_CHAR(SYSDATE, 'HH:MM'),
			    LOG_ERRO = V_ERRO
	    WHERE CDPRODPROT = V_CDPRODUTO;

       COMMIT;
   END LOOP;
   CLOSE C_PRODUTO;

   COMMIT;
END;
/

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