create or replace PROCEDURE REQUISICAO_EXTRA_MYORDER
   (P_CDOPERADOR IN VARCHAR2, /*OPERADOR QUE LANCOU A REQUISICAO*/
    P_LISTAPEDIDO IN NUMBER, /*LISTA DE PEDIDOS*/
    P_NRORG IN NUMBER,
    P_RETORNO OUT NUMBER
   ) IS 
V_NRREQUISICAO VARCHAR2(20);
V_NRRETIRADA VARCHAR2(10);
V_RETORNO VARCHAR2(20) := NULL;
V_IDTIPOCONS VARCHAR2(1);
V_NRDIASEMANA VARCHAR2(1);
V_EXISTE_REQ_EXT NUMBER := 0;
V_SERVOPER NUMBER := 0;
BEGIN
   P_RETORNO := 0;
   FOR C_PEDIDOS IN (
      SELECT IT.NRITEMPEDIDOSERV, P.NRPEDIDOSERV, P.CDFILIAL, IT.CDSERVFILI, S.NMSERVICO, TO_CHAR(P.DTENTREGA, 'DD/MM/YYYY') AS DTENTREGA, 
             TO_CHAR(P.DTENTREGA,'HH24MI') AS HRENTREGA, IT.QTDEPEDIDO, IT.NRREQUEXTR, SO.CDOPERADOR, P.NRORG
        FROM PEDIDOSERV P INNER JOIN LISTA L ON L.NRLISTA = P_LISTAPEDIDO AND 
                                                L.NRORG = P.NRORG AND 
                                                L.CDLISTA = P.NRPEDIDOSERV
                          INNER JOIN ITEMPEDIDOSERV IT ON P.NRPEDIDOSERV = IT.NRPEDIDOSERV AND 
                                                          P.NRORG = IT.NRORG
                          INNER JOIN SERVICO S ON S.CDFILIAL = P.CDFILIAL AND
                                                  S.CDSERVFILI = IT.CDSERVFILI AND
                                                  S.NRORG = P.NRORG
                          LEFT JOIN SERVOPER SO ON SO.CDFILIAL = P.CDFILIAL AND 
                                                   SO.CDSERVFILI = IT.CDSERVFILI AND 
                                                   SO.NRORG = IT.NRORG AND
                                                   SO.CDOPERADOR = P_CDOPERADOR
       WHERE P.IDSTATUS = 'EMPRODUCAO'
   ) LOOP
      V_EXISTE_REQ_EXT := 0;  
      IF (C_PEDIDOS.CDOPERADOR IS NULL) THEN
         BEGIN 
            SELECT COUNT(1) 
              INTO V_SERVOPER
              FROM SERVOPER
             WHERE CDFILIAL = C_PEDIDOS.CDFILIAL AND
                   CDOPERADOR = P_CDOPERADOR;
            EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_SERVOPER := 0; 
         END;

         IF V_SERVOPER > 0 THEN
            /*SE O SERVICO NAO ESTA PARAMETRIZADO PARA GERAR REQUISICAO PELO OPERADOR - GRAVA LOG E PASSA PARA O PROXIMO*/
            INSERE_LISTA_ERROS(C_PEDIDOS.CDFILIAL,  'APPERRMSGSTRMYO_SERVREQEX'|| '$$' ||  C_PEDIDOS.NRPEDIDOSERV || '$$' || C_PEDIDOS.CDSERVFILI || ' - ' || C_PEDIDOS.NMSERVICO ||'APPERRMSGEND', 
                               P_CDOPERADOR, P_NRORG, V_RETORNO); 
            CONTINUE;
         END IF;   
      END IF;

      IF (C_PEDIDOS.NRREQUEXTR IS NULL) THEN
         NOVO_CODIGO('REQUEXTR'||C_PEDIDOS.CDFILIAL, V_NRREQUISICAO, 1, C_PEDIDOS.NRORG);
         V_NRREQUISICAO := SUBSTR(V_NRREQUISICAO,11,10);
      ELSE 
         /*VERIFICA SE A REQUISICAO EXTRA DO PEDIDO JA TEVE RETIRADA LANCADA*/
         BEGIN
            SELECT NRRETIRADA
              INTO V_NRRETIRADA
              FROM RETIRADA R 
             WHERE R.CDFILIAL = C_PEDIDOS.CDFILIAL AND
                   R.DTRETIRADA = C_PEDIDOS.DTENTREGA AND 
                   R.NRREQUEXTRRE = C_PEDIDOS.NRREQUEXTR;
         EXCEPTION
             WHEN NO_DATA_FOUND THEN
                 V_NRRETIRADA := NULL;
         END;
         IF V_NRRETIRADA IS NOT NULL THEN
             /*SE O SERVICO POSSUI REQUISICAO EXTRA GERADA E A REQUISICAO JA TEVE RETIRADA GERADA ENTAO GRAVA LOG E PASSA PARA O PROXIMO*/
             INSERE_LISTA_ERROS(C_PEDIDOS.CDFILIAL, 'APPERRMSGSTRMYO_REQEXRET'|| '$$' ||  C_PEDIDOS.NRPEDIDOSERV || '$$' || C_PEDIDOS.CDSERVFILI || ' - ' || C_PEDIDOS.NMSERVICO || '$$' || C_PEDIDOS.NRREQUEXTR ||'APPERRMSGEND', 
                                P_CDOPERADOR, P_NRORG, V_RETORNO);  
             CONTINUE;
         ELSE

            V_NRREQUISICAO := C_PEDIDOS.NRREQUEXTR;
            /*SE NAO EXISTE RETIRADA ENTAO APAGA A PREVRETI PARA GERAR UMA NOVA*/
            DELETE 
              FROM PREVRETI 
             WHERE CDFILIAL = C_PEDIDOS.CDFILIAL AND 
                   CDSERVFILI = C_PEDIDOS.CDSERVFILI AND
                   DTPREVRETI = C_PEDIDOS.DTENTREGA AND
                   NRREQUEXTR = C_PEDIDOS.NRREQUEXTR;
         END IF;
      END IF;
      V_IDTIPOCONS := CASE WHEN RETORNA_DIA_UTIL(C_PEDIDOS.CDFILIAL, C_PEDIDOS.DTENTREGA, C_PEDIDOS.DTENTREGA) > 0 
                           THEN TO_CHAR(TO_DATE(C_PEDIDOS.DTENTREGA),'D') ELSE '9' END; 

      /*CALCULA A REQUISICAO EXTRA DO SERVICO*/
      FOR C_REQ IN (
         SELECT P.IDQTDECONS, S.IDUTRETIPRAT,
                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDTIPOPRAT ELSE NULL END AS CDTIPOPRAT, 
                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDFILAUXPRAT ELSE NULL END AS CDFILAUXPRAT, 
                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDPRATO ELSE NULL END AS CDPRATO, P.CDPRODUTO, SUM(P.QTBRUTA) AS QTBRUTA,
                LPAD(TO_CHAR(ROW_NUMBER() OVER (PARTITION BY P.IDQTDECONS 
                                                    ORDER BY P.IDQTDECONS, CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDTIPOPRAT ELSE NULL END, 
                                                                           CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDFILAUXPRAT ELSE NULL END, 
                                                                           CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDPRATO ELSE NULL END, P.CDPRODUTO)),4,'0') AS SEQ
         FROM(SELECT CARD.CDFILIAL, CARD.CDSERVFILI, REC.CDPRODUTO, REC.QTPRODUTO * C_PEDIDOS.QTDEPEDIDO AS QTBRUTA, 
                     REC.CDFILAUXPRAT, REC.CDPRATO, CARD.CDTIPOPRAT, 'C' IDQTDECONS
                FROM (SELECT C.CDFILIAL, C.CDSERVFILI, CP.CDTIPOPRAT, CP.CDFILAUXPRAT, CP.CDPRATO
                       FROM CARDADIA C INNER JOIN COMPCARD CP ON C.CDFILIAL = CP.CDFILIAL AND C.NRCARDAPIO = CP.NRCARDAPIO
                      WHERE C.CDFILIAL = C_PEDIDOS.CDFILIAL AND
                            C.CDSERVFILI = C_PEDIDOS.CDSERVFILI AND
                            C.DTCARDAPIO = C_PEDIDOS.DTENTREGA AND
                            NOT EXISTS (SELECT IP.CDPRATO 
                                          FROM PRATOPEDIDOSERV IP
                                         WHERE NRITEMPEDIDOSERV = C_PEDIDOS.NRITEMPEDIDOSERV)
                     UNION ALL
                     SELECT IT.CDFILIAL, IT.CDSERVFILI, IP.CDTIPOPRAT, IP.CDFILAUXPRAT, IP.CDPRATO
                       FROM ITEMPEDIDOSERV IT INNER JOIN PRATOPEDIDOSERV IP ON IT.NRITEMPEDIDOSERV = IP.NRITEMPEDIDOSERV
                      WHERE IP.NRITEMPEDIDOSERV = C_PEDIDOS.NRITEMPEDIDOSERV) CARD,
                       TABLE (RECEITA_UTIL(CARD.CDFILIAL, CARD.CDSERVFILI, CARD.CDPRATO, CARD.CDFILAUXPRAT, '0', 'Z', CARD.CDPRATO, 0, 0, 'N')
               ) REC
               UNION ALL
               SELECT C.CDFILIAL, C.CDSERVFILI,
                      C.CDPRODUTO, CASE WHEN C.IDQTDECONS = 'P' THEN C.QTCONSSERV * C_PEDIDOS.QTDEPEDIDO ELSE C.QTCONSSERV END AS QTBRUTA, 
                                   CASE WHEN C.IDQTDECONS = 'P' THEN P.CDFILCONSPER ELSE P.CDFILCONSFIX END AS CDFILAUXPRAT,
                                   CASE WHEN C.IDQTDECONS = 'P' THEN P.CDPRACONSPER ELSE P.CDPRACONSFIX END AS CDPRATO,
                                   CASE WHEN C.IDQTDECONS = 'P' THEN P.CDTPRCONSPER ELSE P.CDTPRCONSFIX END AS CDTIPOPRAT, C.IDQTDECONS
                 FROM CONSSERV C LEFT JOIN PARAMPLANEJA P ON C.CDFILIAL = P.CDFILIAL
                WHERE (C.CDFILIAL   = C_PEDIDOS.CDFILIAL  )
                  AND (C.CDSERVFILI = C_PEDIDOS.CDSERVFILI)
                  AND (C.IDTIPOCONS = V_IDTIPOCONS)
                  AND (C.DTCONSSERV IN (SELECT MAX(CONSSERV.DTCONSSERV)
                                          FROM CONSSERV
                                         WHERE (CONSSERV.CDFILIAL    = C_PEDIDOS.CDFILIAL  )
                                           AND (CONSSERV.CDSERVFILI  = C_PEDIDOS.CDSERVFILI)
                                           AND (CONSSERV.DTCONSSERV <= C_PEDIDOS.DTENTREGA)
                                           AND (CONSSERV.IDTIPOCONS <> '9')))) P
         INNER JOIN SERVICO S ON S.CDFILIAL = P.CDFILIAL AND S.CDSERVFILI = P.CDSERVFILI
         GROUP BY P.IDQTDECONS, S.IDUTRETIPRAT,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDTIPOPRAT ELSE NULL END,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDFILAUXPRAT ELSE NULL END,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDPRATO ELSE NULL END, P.CDPRODUTO
         ORDER BY P.IDQTDECONS, S.IDUTRETIPRAT,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDTIPOPRAT ELSE NULL END,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDFILAUXPRAT ELSE NULL END,
                                CASE WHEN S.IDUTRETIPRAT = 'S' THEN P.CDPRATO ELSE NULL END, P.CDPRODUTO      

      ) LOOP
         INSERT INTO PREVRETI
             (CDFILIAL     , CDSERVFILI, DTPREVRETI  , NRREQUEXTR  ,
              IDPREVRETI   , CDPRODUTO , DTLIMITERETI, HRLIMITERETI,
              NRPRPREVRETI , QTPREVRETI, CDTIPOPRAT  , CDPRATO     ,
              CDFILAUXPRAT , CDOPERADOR, IDPREVTPPRAT)
         VALUES
             (C_PEDIDOS.CDFILIAL ,C_PEDIDOS.CDSERVFILI, C_PEDIDOS.DTENTREGA, V_NRREQUISICAO,
              C_REQ.IDQTDECONS, C_REQ.CDPRODUTO, C_PEDIDOS.DTENTREGA, C_PEDIDOS.HRENTREGA,
              C_REQ.SEQ, C_REQ.QTBRUTA, C_REQ.CDTIPOPRAT, C_REQ.CDPRATO,
              C_REQ.CDFILAUXPRAT, P_CDOPERADOR, C_REQ.IDUTRETIPRAT);
      END LOOP;
      BEGIN
         SELECT COUNT(NRREQUEXTR)
           INTO V_EXISTE_REQ_EXT
           FROM PREVRETI
          WHERE CDFILIAL = C_PEDIDOS.CDFILIAL
            AND CDSERVFILI = C_PEDIDOS.CDSERVFILI
            AND DTPREVRETI = C_PEDIDOS.DTENTREGA
            AND NRREQUEXTR = V_NRREQUISICAO;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
            V_EXISTE_REQ_EXT := 0;
      END;
      IF V_EXISTE_REQ_EXT > 0 THEN
         UPDATE ITEMPEDIDOSERV
            SET NRREQUEXTR = V_NRREQUISICAO
          WHERE NRITEMPEDIDOSERV = C_PEDIDOS.NRITEMPEDIDOSERV;
      END IF;
   END LOOP;
   P_RETORNO := V_RETORNO;
   COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('REQUISICAO_EXTRA_MYORDER','6.35.021'); END;
/
