CREATE OR REPLACE PROCEDURE GERA_REQUIPEDIDO
(P_CDFILIAL VARCHAR2,
 P_NRLISTASERV VARCHAR2,
 P_DATAINI DATE,
 P_DATAFIN DATE,
 P_IDPRODUTOS VARCHAR2,
 P_CDOPERADOR VARCHAR2
)
AS
   V_QTDEREQ NUMBER;
   V_SEQ VARCHAR2(20);
   V_CHAVE_REQUIPEDIDO NUMBER;   
BEGIN   
   --Atualiza informações necessárias na PREVRETI para classificá-la em requisições
   UPDATE PREVRETI
      -- Indica agrupamento de produtos
      SET (CDGRUPPROD, CDSUBGRPROD) = 
      (SELECT MAX(P.CDGRUPPROD), MAX(P.CDSUBGRPROD) 
         FROM PRSUBGRPROD P
              INNER JOIN FILIAL F ON F.CDFILIAL = P_CDFILIAL
              --O grupo é o parametrizado para a central de compras
              INNER JOIN PARASUPRI PS ON PS.CDFILIAL = NVL(F.CDFILCENTCMP, F.CDFILIAL) AND 
                                         PS.CDGRUPPROD = P.CDGRUPPROD
        WHERE P.CDPRODUTO =  PREVRETI.CDPRODUTO),
      -- Indica Operador Logístico
      CDFILIOPELOG = 
      (SELECT MAX(CDFILIOPELOG)
        FROM PARAMPRODSUP P
             --Somente O.L.s que participam da olimpíada
             INNER JOIN USR_FILIOLIMPIADA U ON U.CDFILIALOL = P.CDFILIOPELOG
       WHERE CDPRODUTO = PREVRETI.CDPRODUTO
         AND CDFILIAL = PREVRETI.CDFILIAL)
    WHERE CDFILIAL = P_CDFILIAL
      AND EXISTS (SELECT 1 FROM LISTA L WHERE L.NRLISTA = P_NRLISTASERV AND PREVRETI.CDFILIAL = SUBSTR(L.CDLISTA, 1, 4) AND
                                                                       PREVRETI.CDSERVFILI = SUBSTR(L.CDLISTA, 5, 5))
      AND DTPREVRETI BETWEEN P_DATAINI AND P_DATAFIN
      AND NRREQUEXTR = '0000000000'
      AND INSTR(P_IDPRODUTOS, IDPREVRETI) <> 0;
      
   --Atribui os consumos fixos para o primeiro turno do serviço
   UPDATE PREVRETI
      SET (QTPRERETT1, QTPRERETT2, QTPRERETT3, QTPRERETT4) =
          (
            SELECT CASE WHEN T.CDTURNO = '1' THEN PREVRETI.QTPREVRETI ELSE 0.00 END,
                   CASE WHEN T.CDTURNO = '2' THEN PREVRETI.QTPREVRETI ELSE 0.00 END,
                   CASE WHEN T.CDTURNO = '3' THEN PREVRETI.QTPREVRETI ELSE 0.00 END,
                   CASE WHEN T.CDTURNO = '4' THEN PREVRETI.QTPREVRETI ELSE 0.00 END
              FROM TURNOSERV T
             WHERE T.CDFILIAL = PREVRETI.CDFILIAL
                AND T.CDSERVFILI = PREVRETI.CDSERVFILI
                AND T.CDTURNO = (SELECT MIN(CDTURNO) CDTURNO
                                   FROM TURNOSERV              
                                  WHERE CDFILIAL = T.CDFILIAL
                                    AND CDSERVFILI = T.CDSERVFILI)
          )
    WHERE CDFILIAL = P_CDFILIAL
      AND EXISTS (SELECT 1 FROM LISTA L WHERE L.NRLISTA = P_NRLISTASERV AND PREVRETI.CDFILIAL = SUBSTR(L.CDLISTA, 1, 4) AND
                                                                       PREVRETI.CDSERVFILI = SUBSTR(L.CDLISTA, 5, 5))
      AND DTPREVRETI BETWEEN P_DATAINI AND P_DATAFIN
      AND NRREQUEXTR = '0000000000'
      AND CDGRUPPROD IS NOT NULL 
      AND CDSUBGRPROD IS NOT NULL
      AND CDFILIOPELOG IS NOT NULL      
      AND NVL(QTPRERETT1, 0.00) + NVL(QTPRERETT2, 0.00) + NVL(QTPRERETT3, 0.00) + NVL(QTPRERETT4, 0.00) = 0.00
      AND NVL(QTPREVRETI, 0.00) <> 0.00
      AND INSTR(P_IDPRODUTOS, IDPREVRETI) <> 0;
   
   --Percorre as requisições extraídas da previsão, atribuindo a cada uma um sequencial e gravando na REQUIPEDIDO
   FOR C_REQUISICOES IN
   (
   SELECT DISTINCT P.CDFILIAL, P.CDSERVFILI, P.DTPREVRETI, T.CDTURNO, P.CDGRUPPROD, P.CDSUBGRPROD, P.CDFILIOPELOG
     FROM PREVRETI P
          INNER JOIN TURNOSERV T ON T.CDFILIAL = P.CDFILIAL AND
                                    T.CDSERVFILI = P.CDSERVFILI
    WHERE P.CDFILIAL = P_CDFILIAL
      AND EXISTS (SELECT 1 FROM LISTA L WHERE L.NRLISTA = P_NRLISTASERV AND P.CDFILIAL = SUBSTR(L.CDLISTA, 1, 4) AND
                                                                       P.CDSERVFILI = SUBSTR(L.CDLISTA, 5, 5))
      AND P.DTPREVRETI BETWEEN P_DATAINI AND P_DATAFIN
      AND P.CDGRUPPROD IS NOT NULL 
      AND P.CDSUBGRPROD IS NOT NULL
      AND P.CDFILIOPELOG IS NOT NULL
      AND P.NRREQUEXTR = '0000000000'
      AND INSTR(P_IDPRODUTOS, P.IDPREVRETI) <> 0
      AND CASE WHEN T.CDTURNO = '1' THEN NVL(P.QTPRERETT1, 0.00) 
               WHEN T.CDTURNO = '2' THEN NVL(P.QTPRERETT2, 0.00)
               WHEN T.CDTURNO = '3' THEN NVL(P.QTPRERETT3, 0.00)
               WHEN T.CDTURNO = '4' THEN NVL(P.QTPRERETT4, 0.00)
               ELSE 0.00
          END <> 0.00
    ORDER BY P.CDFILIAL, P.CDSERVFILI, P.DTPREVRETI, T.CDTURNO, P.CDSUBGRPROD, P.CDFILIOPELOG
   ) LOOP
      NOVO_CODIGO_SC('REQUIPEDIDO', V_SEQ);
      V_CHAVE_REQUIPEDIDO := TO_NUMBER(V_SEQ);           
      
      
      INSERT INTO REQUIPEDIDO
      (NRREQUIPEDIDO,
       CDFILIAL, CDSERVFILI, DTREQUIPEDIDO,
       CDTURNO, CDGRUPPROD, CDSUBGRPROD,
       CDFILIOPELOG,
       CDOPERINCLUSAO, DTINCLUSAO,
       CDOPERULTATU, DTULTATU)
      VALUES
      (V_CHAVE_REQUIPEDIDO,
       C_REQUISICOES.CDFILIAL, C_REQUISICOES.CDSERVFILI, C_REQUISICOES.DTPREVRETI,
       C_REQUISICOES.CDTURNO, C_REQUISICOES.CDGRUPPROD, C_REQUISICOES.CDSUBGRPROD,
       C_REQUISICOES.CDFILIOPELOG,
       P_CDOPERADOR, SYSDATE,
       P_CDOPERADOR, SYSDATE);

   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('GERA_REQUIPEDIDO','5.85.xxx'); END;
/