create or replace PROCEDURE VALIDA_PLANEJAMENTO_PRODUCAO (
P_CDCENTRAL IN FILIAL.CDFILIAL%TYPE,
P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE,
P_DTPRODUCAO IN PLANPRODUCAO.DTPRODUCAO%TYPE,
P_NRLISTA IN LISTA.NRLISTA%TYPE,
P_VALIDA_ESTOQUE VARCHAR2,
P_NRORG IN PLANPRODUCAO.NRORG%TYPE,
P_RETORNO OUT VARCHAR2
) AS


V_PRIMEIROLOOP NUMBER;
V_NRLISTA VARCHAR2(20);
V_RETORNO VARCHAR2(50);
V_NMPRODACABADO VARCHAR2(4000);
V_NMPRODACABADO_AUX VARCHAR2(4000);

BEGIN
   V_PRIMEIROLOOP := 0;
   V_NRLISTA := '';
   V_RETORNO := '';
   
   /*PROCURA PRODUTOS JA PRODUZIDOS EM OUTRO PLANEJAMENTO DA PRODUCAO COM A MESMA DATA DE PRODU��O, SE ENCONTRAR INSERE NA TABELA LISTA*/
   FOR C_PROD_JA_PRODUZIDOS IN (SELECT DISTINCT PD.CDPRODACABADO||SUBSTR(PD.IDCOOKCHILL,1,1)||SUBSTR(PD.IDFINALIZACAO,1,1)
                                      ||SUBSTR(PD.IDTPPRODCHILL,1,1)||SUBSTR(PD.IDESTADO,1,1) || PD.NRPLANPROD AS PRODUTO  
                                  FROM PLANPRODFILIAGREGA PD INNER JOIN (SELECT NRPLANPROD, DTPRODUCAO 
                                                                        FROM PLANPRODUCAO 
                                                                       WHERE CDFILIAL = P_CDCENTRAL 
                                                                         AND DTPRODUCAO = P_DTPRODUCAO) PP ON (PP.NRPLANPROD = PD.NRPLANPROD)
                                                           INNER JOIN PLANPRODFILIAGREGA PPA ON (PPA.CDPRODACABADO = PD.CDPRODACABADO AND
                                                                                  PPA.IDCOOKCHILL = PD.IDCOOKCHILL AND
                                                                                  PPA.IDFINALIZACAO = PD.IDFINALIZACAO AND
                                                                                  PPA.IDTPPRODCHILL = PD.IDTPPRODCHILL AND
                                                                                  PPA.IDESTADO = PD.IDESTADO AND
                                                                                  PPA.CDFILIAGREG = PD.CDFILIAGREG AND
                                                                                  PPA.CDSERVFILIAGREG = PD.CDSERVFILIAGREG AND
                                                                                  PPA.DTCONSUMO = PD.DTCONSUMO AND 
                                                                                  PPA.NRPLANPROD = P_NRPLANPROD)
                                                           INNER JOIN LISTA L ON (L.NRLISTA = P_NRLISTA AND
                                                                                  SUBSTR(L.CDLISTA,1,10) = PD.CDPRODACABADO AND
                                                                                  SUBSTR(L.CDLISTA,11,1) = SUBSTR(PD.IDCOOKCHILL,1,1)   AND
                                                                                  SUBSTR(L.CDLISTA,12,1) = SUBSTR(PD.IDFINALIZACAO,1,1) AND
                                                                                  SUBSTR(L.CDLISTA,13,1) = SUBSTR(PD.IDTPPRODCHILL,1,1) AND
                                                                                  SUBSTR(L.CDLISTA,14,1) = SUBSTR(PD.IDESTADO,1,1) AND
                                                                                  PD.IDESTADO <> 'FINALIZACAO')
                                 WHERE PD.NRPLANPROD <> P_NRPLANPROD
                                   AND PD.IDPRODUZIR = 'S'
   )LOOP
      
      IF V_PRIMEIROLOOP = 0 THEN
         NOVO_CODIGO('LISTA', V_NRLISTA, 1);
         V_NRLISTA := SUBSTR(V_NRLISTA, 11, 10);
         V_PRIMEIROLOOP := 1;
      END IF;
  
      INSERT INTO LISTA(CDLISTA, NRLISTA) VALUES (C_PROD_JA_PRODUZIDOS.PRODUTO,  V_NRLISTA);
      
      DELETE FROM LISTA WHERE NRLISTA = P_NRLISTA AND SUBSTR(CDLISTA,1,14) = SUBSTR(C_PROD_JA_PRODUZIDOS.PRODUTO, 1, 14);
      
   END LOOP;
   
   V_RETORNO := V_NRLISTA;
   
   /*SE VALIDA POSICAO DE ESTOQUE DA MATERIA PRIMA, PROCURA SE EXISTE PRODUTO COM SALDO INSUFICIENTE NO ESTOQUE, SE SIM INSERE NO LOGMAT_PRIMA*/ 
   IF (P_VALIDA_ESTOQUE = 'S') THEN 
      V_PRIMEIROLOOP := 0;
	  V_NMPRODACABADO_AUX := ' ';
      FOR POS_ESTOQUE IN(
      SELECT PROD.CDPRODUTO, PROD.QTAPRODUZIR + PROD.QTRESERVADA AS QTNECESSARIA, PROD.QTRESERVADA, NVL(PS.QTESTDIACON,0) AS QTESTDIACON FROM
      (SELECT SUM(QTLIBERADA) AS QTAPRODUZIR, SUM(QTRESERVADA) AS QTRESERVADA, CDPRODUTO, NRORG FROM (
         SELECT QTLIBERADA, 0 AS QTRESERVADA, CDPRODUTO, PR.NRORG
           FROM PLANRECPROD PR INNER JOIN LISTA L ON (L.NRLISTA = P_NRLISTA AND
                                                      SUBSTR(L.CDLISTA,1,10) = PR.CDPRODACABADO AND
                                                      SUBSTR(L.CDLISTA,11,1) = SUBSTR(IDCOOKCHILL,1,1)   AND
                                                      SUBSTR(L.CDLISTA,12,1) = SUBSTR(IDFINALIZACAO,1,1) AND
                                                      SUBSTR(L.CDLISTA,13,1) = SUBSTR(IDTPPRODCHILL,1,1) AND
                                                      SUBSTR(L.CDLISTA,14,1) = SUBSTR(IDESTADO,1,1) AND
                                                      SUBSTR(L.CDLISTA, 15)  = PR.NRSEQPRODACABADO AND
                                                      PR.IDESTADO <> 'FINALIZACAO' AND
                                                      PR.NRPLANPROD = P_NRPLANPROD AND
                                                      PR.CDFILIAL = P_CDCENTRAL)
         UNION ALL
         SELECT 0 AS QTAPRODUZIR, PR.QTLIBERADA AS QTRESERVADA, CDPRODUTO, PR.NRORG
           FROM PLANRECPROD PR INNER JOIN LISTA L ON (L.NRLISTA = P_NRLISTA AND
                                                      SUBSTR(L.CDLISTA,1,10) = PR.CDPRODACABADO AND
                                                      SUBSTR(L.CDLISTA,11,1) = SUBSTR(IDCOOKCHILL,1,1)   AND
                                                      SUBSTR(L.CDLISTA,12,1) = SUBSTR(IDFINALIZACAO,1,1) AND
                                                      SUBSTR(L.CDLISTA,13,1) = SUBSTR(IDTPPRODCHILL,1,1) AND
                                                      SUBSTR(L.CDLISTA,14,1) = SUBSTR(IDESTADO,1,1) AND
                                                      SUBSTR(L.CDLISTA, 15)  = PR.NRSEQPRODACABADO AND
                                                      PR.IDESTADO <> 'FINALIZACAO' AND
                                                      PR.CDFILIAL = P_CDCENTRAL)
                               INNER JOIN (SELECT CDFILIAL, NRPLANPROD, DTPRODUCAO 
                                             FROM PLANPRODUCAO 
                                            WHERE CDFILIAL = P_CDCENTRAL 
                                              AND DTPRODUCAO = P_DTPRODUCAO
                                              AND NRPLANPROD <> P_NRPLANPROD) PP ON (PP.NRPLANPROD = PR.NRPLANPROD AND PR.CDFILIAL = PP.CDFILIAL)
                               INNER JOIN PLANPRODFILIAGREGA PF ON PF.NRPLANPROD = PR.NRPLANPROD AND
                                                                   PF.CDPRODACABADO = PR.CDPRODACABADO AND
                                                                   PF.NRSEQPRODACABADO = PR.NRSEQPRODACABADO AND
                                                                   PF.CDFILIAGREG = PR.CDFILIAGREG AND
                                                                   PF.CDSERVFILIAGREG = PR.CDSERVFILIAGREG AND
                                                                   PF.DTCONSUMO = PR.DTCONSUMO AND
                                                                   PF.IDCOOKCHILL = PR.IDCOOKCHILL AND
                                                                   PF.IDTPPRODCHILL = PR.IDTPPRODCHILL AND
                                                                   PF.IDESTADO = PR.IDESTADO AND
                                                                   PF.IDFINALIZACAO = PR.IDFINALIZACAO AND
                                                                   PF.IDPRODUZIR = 'S' AND PF.IDCONCLUIDO = 'N' AND
                                                                   PF.NRPLANPROD = PP.NRPLANPROD)
         GROUP BY CDPRODUTO, NRORG) PROD LEFT JOIN (SELECT PC.CDPRODUTO, PC.QTESTDIACON
                                                      FROM POSESTCONS PC
                                                     WHERE PC.NRORG = P_NRORG
                                                       AND PC.CDFILIAL = P_CDCENTRAL
                                                       AND PC.DTPOSESTCON = (SELECT MAX(P.DTPOSESTCON)
                                                                               FROM POSESTCONS P
                                                                              WHERE P.CDFILIAL = P_CDCENTRAL
                                                                                AND P.CDPRODUTO = PC.CDPRODUTO
                                                                                AND P.DTPOSESTCON <= TO_DATE(P_DTPRODUCAO) + 1
                                                                                AND P.NRORG = P_NRORG
                                                                             )
                                                    ) PS ON (PS.CDPRODUTO = PROD.CDPRODUTO)   
      WHERE PROD.QTAPRODUZIR >  NVL(PS.QTESTDIACON,0) - PROD.QTRESERVADA
      ) LOOP
      
         IF V_PRIMEIROLOOP = 0 THEN
            DELETE FROM LOGMATPRIMA WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG AND DSORIGEM = 'PLANEJAMENTO' AND DSJUSTIFICATIVA IS NULL;
            
            NOVO_CODIGO('LOGMATPRIMA', V_NRLISTA, 1);
            V_NRLISTA := SUBSTR(V_NRLISTA, 11, 10);
            V_PRIMEIROLOOP := 1;
         END IF;
         
         FOR C_PRODACABADO IN (SELECT DISTINCT CDPRODACABADO, NMPRODUTO 
                                 FROM PLANRECPROD R INNER JOIN PRODUTO P ON R.CDPRODACABADO = P.CDPRODUTO 
                                                    INNER JOIN LISTA L ON (L.NRLISTA = P_NRLISTA AND
                                                                           SUBSTR(L.CDLISTA,1,10) = R.CDPRODACABADO AND
                                                                           SUBSTR(L.CDLISTA,11,1) = SUBSTR(R.IDCOOKCHILL,1,1)   AND
                                                                           SUBSTR(L.CDLISTA,12,1) = SUBSTR(R.IDFINALIZACAO,1,1) AND
                                                                           SUBSTR(L.CDLISTA,13,1) = SUBSTR(R.IDTPPRODCHILL,1,1) AND
                                                                           SUBSTR(L.CDLISTA,14,1) = SUBSTR(R.IDESTADO,1,1) AND
                                                                           R.IDESTADO <> 'FINALIZACAO')
                                WHERE R.NRPLANPROD = P_NRPLANPROD AND
                                      R.CDFILIAL = P_CDCENTRAL AND 
                                      R.CDPRODUTO = POS_ESTOQUE.CDPRODUTO AND
                                      ROWNUM < 10)
                                    
        LOOP 
			IF INSTR(V_NMPRODACABADO_AUX, C_PRODACABADO.CDPRODACABADO) <= 0 THEN 
				V_NMPRODACABADO_AUX := V_NMPRODACABADO_AUX || C_PRODACABADO.CDPRODACABADO || ' - ';
				V_NMPRODACABADO := V_NMPRODACABADO || C_PRODACABADO.CDPRODACABADO || ' - ' || C_PRODACABADO.NMPRODUTO || ' | ';
			END IF;
        END LOOP;

        INSERT INTO LOGMATPRIMA (NRLOGMATPRIMA, CDPRODUTO, NRORG, NRPLANPROD, QTREQUERIDA, QTESTOQUE, DTVALIDACAO, DSORIGEM, DSSTRPRODACAB) VALUES
                                (V_NRLISTA,POS_ESTOQUE.CDPRODUTO, P_NRORG, P_NRPLANPROD, POS_ESTOQUE.QTNECESSARIA, POS_ESTOQUE.QTESTDIACON, 
                                 SYSDATE, 'PLANEJAMENTO', SUBSTR(V_NMPRODACABADO, 0, LENGTH(V_NMPRODACABADO) -3));
         V_NMPRODACABADO := '';
         
      END LOOP;
      IF V_PRIMEIROLOOP = 1 THEN
         V_RETORNO := V_RETORNO || '_' || V_NRLISTA;
         DBMS_OUTPUT.PUT_LINE(V_RETORNO);
         P_RETORNO := V_RETORNO;
         RETURN;
      END IF;
   END IF;
   
   /*UPDATE PARA PRODUZIR OS PRODUTOS QUE N�O POSSUEM PLOBLEMAS DE ESTOQUE NEM PLANEJAMENTO DIFERENTE JA PRODUZIDO*/
   UPDATE PLANPRODACABADO 
      SET IDPRODUZIR = 'S'
    WHERE CDPRODACABADO||SUBSTR(IDCOOKCHILL,1,1)||SUBSTR(IDFINALIZACAO,1,1)||SUBSTR(IDTPPRODCHILL,1,1)||SUBSTR(IDESTADO,1,1)||NRSEQPRODACABADO IN 
         (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA)
      AND NRPLANPROD = P_NRPLANPROD;
      
   UPDATE PLANPRODFILIAGREGA 
      SET IDPRODUZIR = 'S'
    WHERE CDPRODACABADO||SUBSTR(IDCOOKCHILL,1,1)||SUBSTR(IDFINALIZACAO,1,1)||SUBSTR(IDTPPRODCHILL,1,1)||SUBSTR(IDESTADO,1,1)||NRSEQPRODACABADO IN 
         (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA)
      AND NRPLANPROD = P_NRPLANPROD;
      
   DELETE FROM LISTA WHERE NRLISTA = P_NRLISTA;
      
   COMMIT;
   P_RETORNO := V_RETORNO;
    --DBMS_OUTPUT.PUT_LINE(V_RETORNO);
END;
/
	
-- VERSAO --
BEGIN ATUVEROBJ('VALIDA_PLANEJAMENTO_PRODUCAO','0.00.000'); END;
/