create or replace PROCEDURE REQUISICAO_POR_SERVICO_PLA
  (P_CDFILIAL     IN VARCHAR2,
   P_SERVICOS     IN VARCHAR2,
   P_DTINICIAL    IN DATE,
   P_DTFINAL      IN DATE,
   P_PEACRESCIMO  IN NUMBER,
   P_CDOPERADOR   IN VARCHAR2,
   P_DTHRCALCPR   IN DATE,
   P_NRCONSPLAN   IN VARCHAR2,
   P_STDTINICIAL  IN VARCHAR2 DEFAULT NULL,
   P_STDTFINAL    IN VARCHAR2 DEFAULT NULL,
   P_IDARREDOND   IN VARCHAR2,
   P_IDPRODUTOS   IN VARCHAR2) IS

   V_CDSERVFILI   VARCHAR2(5);

   V_TODOS_SERV   VARCHAR2(1);
   
   V_IDSERVTRAN   VARCHAR2(1);
   V_LISTA_SERV   VARCHAR2(4000);
   V_LISTA_SERV_TRANS VARCHAR2(4000);
   V_NRPRPREVRETI VARCHAR2(4);
   V_NRCONSPLAN VARCHAR2(20);
   V_NRLISTA VARCHAR2(20);
   V_POSSUI_DIST NUMBER;

   /* - Declarao de cursores ---------------------------------------------- */

   CURSOR C_SERVICOS IS
      SELECT
         CDSERVFILI, IDSERVTRAN
      FROM
         SERVICO
      WHERE
         (CDFILIAL = P_CDFILIAL) AND
         ((INSTR(P_SERVICOS, CDSERVFILI) > 0) OR (V_TODOS_SERV = 'T'));

BEGIN

    V_LISTA_SERV := NULL;
    V_LISTA_SERV_TRANS := NULL;
    
    NOVO_CODIGO('LISTA'||P_CDFILIAL, V_NRLISTA);
    V_NRLISTA := SUBSTR(V_NRLISTA, 11, 10);
   
   /*Comando criado por que campos do tipo CLOB no podem ser comparados a valor em consultas SQL*/
   IF P_SERVICOS = 'T' THEN
      V_TODOS_SERV := 'T';
   END IF;
   
   /* REGISTRA O CALCULO NA TABELA DE LOG */

   OPEN C_SERVICOS;
   LOOP
      FETCH C_SERVICOS INTO V_CDSERVFILI, V_IDSERVTRAN;
      EXIT WHEN C_SERVICOS%NOTFOUND;

      INSERT INTO LOGPREVRETI
        (CDFILIAL,
         CDOPERADOR,
         DTHRCALCPR,
         NRCONSPLANPR,
         CDSERVFILI,
         DTINICIALPR,
         DTFINALPR,
         CDPRODINICPR,
         CDPRODFINAPR,
         PEACRESCIMPR)
      VALUES
        (P_CDFILIAL,
         P_CDOPERADOR,
         P_DTHRCALCPR,
         P_NRCONSPLAN,
         V_CDSERVFILI,
         P_DTINICIAL,
         P_DTFINAL,
         ' ',
         ' ',
         P_PEACRESCIMO);
        
        /*Separa servicos que sao transportada*/
        IF (V_IDSERVTRAN <> 'S') THEN 
            V_LISTA_SERV :=  V_LISTA_SERV || V_CDSERVFILI || '_';
        ELSE   
            BEGIN 
              SELECT COUNT(*) AS DADOS 
                INTO V_POSSUI_DIST
                FROM (SELECT C.DTCARDAPIO
                        FROM CARDADIA C
                       INNER JOIN CARDDISTPROD P ON C.NRCARDAPIO = P.NRCARDAPIO AND C.CDFILIAL = P.CDFILIAL AND C.CDSERVFILI = P.CDSERVFILI
                       INNER JOIN CNFDISTCARD CC ON CC.NRDISTCARD = P.NRDISTCARD AND CC.IDEFETIVADA = 'S'
                       WHERE C.CDFILIAL = P_CDFILIAL
                         AND C.CDSERVFILI = V_CDSERVFILI
                         AND C.DTCARDAPIO BETWEEN P_DTINICIAL AND P_DTFINAL
                         AND INSTR(P_IDPRODUTOS, 'C') > 0
                        
                       UNION  ALL
                         
                      SELECT DTCARDAPIO
                        FROM PRODDISTPROD
                       WHERE CDFILIAL = P_CDFILIAL
                         AND CDSERVFILI = V_CDSERVFILI
                         AND DTCARDAPIO BETWEEN P_DTINICIAL AND P_DTFINAL
                         AND INSTR(P_IDPRODUTOS, IDCONSPLAN) > 0
                         AND NVL(IDEFETIVADA, 'N') = 'S');
            EXCEPTION
              WHEN NO_DATA_FOUND THEN BEGIN
                V_POSSUI_DIST := 0;
              END;
            END;
    
            IF (V_POSSUI_DIST = 0) THEN 
                V_LISTA_SERV :=  V_LISTA_SERV || V_CDSERVFILI || '_';
            ELSE 
                V_LISTA_SERV_TRANS := V_LISTA_SERV_TRANS || V_CDSERVFILI || '_';
                INSERT INTO LISTA (NRLISTA, CDLISTA) VALUES (V_NRLISTA, P_CDFILIAL||V_CDSERVFILI);
                
                 DELETE FROM PREVRETI
                  WHERE CDFILIAL   = P_CDFILIAL            
                    AND CDSERVFILI = V_CDSERVFILI
                    AND DTPREVRETI BETWEEN P_DTINICIAL AND P_DTFINAL
                    AND NRREQUEXTR = '0000000000'
                    AND INSTR(P_IDPRODUTOS, IDPREVRETI) > 0;
            END IF;
        END IF;

   END LOOP; /* LOOP DOS SERVIOS */
   CLOSE C_SERVICOS;
        
    /*INICIO - Para servicos transportada e verificado se houve distribuicao efetivada dos itens*/       
    IF (V_LISTA_SERV_TRANS IS NOT NULL) THEN
        /*gera consplan para buscar pratos que nao sao representados por um produto de producao*/ 
        CONSPLAN_GERAL(V_NRLISTA, P_DTINICIAL, P_DTFINAL, P_IDPRODUTOS, 'P', 0, 'N', '0', 'ZZZZZZZZZZ',
                       P_CDOPERADOR, 'GERANOVCOD', V_NRCONSPLAN);
            
        V_NRPRPREVRETI := '0000';
        
        FOR C_SERVTRANS IN 
            (SELECT
             CDSERVFILI, HRINICATEN, IDUTRETIPRAT
          FROM
             SERVICO
          WHERE
             (CDFILIAL = P_CDFILIAL) AND
             ((INSTR(V_LISTA_SERV_TRANS, CDSERVFILI) > 0)))
        LOOP   
            
            FOR C_PRAT_EFET IN
                    (-- CARREGA PRATOS EFETIVADOS
                     SELECT C.CDFILIAL, C.CDSERVFILI, C.DTCARDAPIO AS DTPREVRETI, C.DTCARDAPIO AS DTLIMITERETI, CC.CDPRODPRODUCAO AS CDPRODUTO, 
                           SUM(CC.QTTOTPRATO) AS QTPREVRETI,                    
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CC.CDPRATO, NULL) CDPRATO, 
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CC.CDFILAUXPRAT, NULL) CDFILAUXPRAT,
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CC.CDTIPOPRAT, NULL) CDTIPOPRAT,
                           'C' AS IDPREVRETI, C_SERVTRANS.HRINICATEN AS HRLIMITERETI
                      FROM CARDADIA C
                     INNER JOIN CARDDISTPROD P ON C.NRCARDAPIO = P.NRCARDAPIO AND C.CDFILIAL = P.CDFILIAL AND C.CDSERVFILI = P.CDSERVFILI
                     INNER JOIN CNFDISTCARD CC ON CC.NRDISTCARD = P.NRDISTCARD AND CC.IDEFETIVADA = 'S'
                     WHERE C.CDFILIAL = P_CDFILIAL
                       AND C.CDSERVFILI = C_SERVTRANS.CDSERVFILI
                       AND C.DTCARDAPIO BETWEEN P_DTINICIAL AND P_DTFINAL
                       AND INSTR(P_IDPRODUTOS, 'C') > 0
                     GROUP BY C.CDFILIAL, C.CDSERVFILI, C.DTCARDAPIO, C.DTCARDAPIO, CC.CDPRODPRODUCAO, 
                           CC.CDPRATO, CC.CDFILAUXPRAT, CC.CDTIPOPRAT)
                LOOP
                    INSERT INTO PREVRETI (NRPRPREVRETI, CDFILIAL, CDSERVFILI, DTPREVRETI, 
                                          DTLIMITERETI, CDPRODUTO, QTPREVRETI, QTPREVRETISA,
                                          CDPRATO, CDFILAUXPRAT, CDTIPOPRAT, 
                                          NRREQUEXTR, IDPREVRETI, HRLIMITERETI, CDOPERADOR, IDPREVTPPRAT)
                    VALUES (V_NRPRPREVRETI, C_PRAT_EFET.CDFILIAL, C_PRAT_EFET.CDSERVFILI, C_PRAT_EFET.DTPREVRETI, 
                            C_PRAT_EFET.DTLIMITERETI, C_PRAT_EFET.CDPRODUTO, C_PRAT_EFET.QTPREVRETI, C_PRAT_EFET.QTPREVRETI, 
                            C_PRAT_EFET.CDPRATO, C_PRAT_EFET.CDFILAUXPRAT, C_PRAT_EFET.CDTIPOPRAT, '0000000000', 
                            C_PRAT_EFET.IDPREVRETI, C_PRAT_EFET.HRLIMITERETI, P_CDOPERADOR, C_SERVTRANS.IDUTRETIPRAT);
                            
                    DELETE FROM CONSPLAN 
                     WHERE NRCONSPLAN = V_NRCONSPLAN
                       AND DTCONSPLAN = C_PRAT_EFET.DTPREVRETI
                       AND CDFILICPLA = C_PRAT_EFET.CDFILIAL
                       AND CDSERVCPLA = C_PRAT_EFET.CDSERVFILI
                       AND CDPRATCONSPL = C_PRAT_EFET.CDPRATO
                       AND CDFAPRATCPLA = C_PRAT_EFET.CDFILAUXPRAT
                       AND NVL(IDTPREQPROD, 'P') = 'P';

                    V_NRPRPREVRETI := LPAD(V_NRPRPREVRETI + 1, 4, 0);
                END LOOP;
          
            FOR C_PROD_EFET IN
                    (-- CARREGA PRODUTOS EFETIVADOS
                     SELECT P.CDFILIAL, P.CDSERVFILI, P.DTCARDAPIO AS DTPREVRETI, P.DTCARDAPIO AS DTLIMITERETI, P.CDPRODUTO, 
                           SUM(P.QTTOTPRODUTO) AS QTPREVRETI, 
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', P.CDPRATO, NULL) CDPRATO, 
                           P.CDPRATO AS CDPRATO_AUX,
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', P.CDFILAUXPRAT, NULL) CDFILAUXPRAT,
                           P.CDFILAUXPRAT AS CDFILAUXPRAT_AUX,
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', P.CDTIPOPRAT, NULL) CDTIPOPRAT, 
                           P.IDCONSPLAN AS IDPREVRETI, C_SERVTRANS.HRINICATEN AS HRLIMITERETI, 
                           DECODE(SUBSTR(P.IDTIPOPROD, 1, 1), 'F', 'D', SUBSTR(P.IDTIPOPROD, 1, 1)) AS IDTIPOPROD,
                           C.SGCONSUNIADIC
                      FROM PRODDISTPROD P
                     INNER JOIN CONSPLAN C ON C.NRCONSPLAN = V_NRCONSPLAN
                                          AND C.DTCONSPLAN = P.DTCARDAPIO
                                          AND C.CDFILICPLA = P.CDFILIAL
                                          AND C.CDSERVCPLA = P.CDSERVFILI
                                          AND C.CDPRATCONSPL = P.CDPRATO
                                          AND C.CDFAPRATCPLA = P.CDFILAUXPRAT
                                          AND C.CDPRODCPLA = P.CDPRODUTO
                     WHERE P.CDFILIAL = P_CDFILIAL
                       AND P.CDSERVFILI = C_SERVTRANS.CDSERVFILI
                       AND P.DTCARDAPIO BETWEEN P_DTINICIAL AND P_DTFINAL
                       AND P.IDEFETIVADA = 'S'
                       AND INSTR(P_IDPRODUTOS, P.IDCONSPLAN) > 0
                     GROUP BY P.CDFILIAL, P.CDSERVFILI, P.DTCARDAPIO, P.DTCARDAPIO, P.CDPRODUTO, 
                           P.CDPRATO, P.CDFILAUXPRAT, P.CDTIPOPRAT, P.IDCONSPLAN, P.IDTIPOPROD,
                           C.SGCONSUNIADIC)
                LOOP
                    INSERT INTO PREVRETI (NRPRPREVRETI, CDFILIAL, CDSERVFILI, DTPREVRETI, 
                                          DTLIMITERETI, CDPRODUTO, QTPREVRETI, QTPREVRETISA,
                                          CDPRATO, CDFILAUXPRAT, CDTIPOPRAT, 
                                          NRREQUEXTR, IDPREVRETI, HRLIMITERETI, CDOPERADOR, IDPREVTPPRAT,
                                          SGPREVUNIADIC)
                    VALUES (V_NRPRPREVRETI, C_PROD_EFET.CDFILIAL, C_PROD_EFET.CDSERVFILI, C_PROD_EFET.DTPREVRETI, 
                            C_PROD_EFET.DTLIMITERETI, C_PROD_EFET.CDPRODUTO, C_PROD_EFET.QTPREVRETI, C_PROD_EFET.QTPREVRETI, 
                            C_PROD_EFET.CDPRATO, C_PROD_EFET.CDFILAUXPRAT, C_PROD_EFET.CDTIPOPRAT, '0000000000', 
                            C_PROD_EFET.IDPREVRETI, C_PROD_EFET.HRLIMITERETI, P_CDOPERADOR, C_SERVTRANS.IDUTRETIPRAT,
                            C_PROD_EFET.SGCONSUNIADIC);
                          
                    DELETE FROM CONSPLAN 
                     WHERE NRCONSPLAN = V_NRCONSPLAN
                       AND DTCONSPLAN = C_PROD_EFET.DTPREVRETI
                       AND CDFILICPLA = C_PROD_EFET.CDFILIAL
                       AND CDSERVCPLA = C_PROD_EFET.CDSERVFILI
                       AND CDPRATCONSPL = C_PROD_EFET.CDPRATO_AUX
                       AND CDFAPRATCPLA = C_PROD_EFET.CDFILAUXPRAT_AUX
                       AND CDPRODCPLA = C_PROD_EFET.CDPRODUTO
                       AND NVL(IDTPREQPROD, 'P') = C_PROD_EFET.IDTIPOPROD;

                    V_NRPRPREVRETI := LPAD(V_NRPRPREVRETI + 1, 4, 0);
                END LOOP; 
            
            FOR C_ITENS_CONS IN 
                    (-- CARREGA INSUMO DOS PRATOS/PRODUTOS QUE NAO FORAM EFETIVADOS + CONSUMO
                    SELECT CP.CDFILICPLA AS CDFILIAL, CP.CDSERVCPLA AS CDSERVFILI, CP.DTCONSPLAN AS DTPREVRETI, CP.DTLIMITECPLA AS DTLIMITERETI, 
                           CP.CDPRODCPLA AS CDPRODUTO, CP.QTCONSPLAN AS QTPREVRETI,                    
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CP.CDPRATCONSPL, NULL) CDPRATO, 
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CP.CDFAPRATCPLA, NULL) CDFILAUXPRAT,
                           DECODE(C_SERVTRANS.IDUTRETIPRAT, 'S', CP.CDTPPRATCPLA, NULL) CDTIPOPRAT,
                           CP.IDCONSPLAN AS IDPREVRETI, C_SERVTRANS.HRINICATEN AS HRLIMITERETI
                      FROM CONSPLAN CP
                     WHERE CP.NRCONSPLAN = V_NRCONSPLAN
                       AND CP.CDFILICPLA = P_CDFILIAL
                       AND CP.CDSERVCPLA = C_SERVTRANS.CDSERVFILI
                       AND INSTR(P_IDPRODUTOS, CP.IDCONSPLAN) > 0 
                       )
            LOOP     
                INSERT INTO PREVRETI (NRPRPREVRETI, CDFILIAL, CDSERVFILI, DTPREVRETI, 
                                      DTLIMITERETI, CDPRODUTO, QTPREVRETI, QTPREVRETISA,
                                      CDPRATO, CDFILAUXPRAT, CDTIPOPRAT, 
                                      NRREQUEXTR, IDPREVRETI, HRLIMITERETI, CDOPERADOR, IDPREVTPPRAT)
                VALUES (V_NRPRPREVRETI, C_ITENS_CONS.CDFILIAL, C_ITENS_CONS.CDSERVFILI, C_ITENS_CONS.DTPREVRETI, 
                        C_ITENS_CONS.DTLIMITERETI, C_ITENS_CONS.CDPRODUTO, C_ITENS_CONS.QTPREVRETI, C_ITENS_CONS.QTPREVRETI, 
                        C_ITENS_CONS.CDPRATO, C_ITENS_CONS.CDFILAUXPRAT, C_ITENS_CONS.CDTIPOPRAT, '0000000000', 
                        C_ITENS_CONS.IDPREVRETI, C_ITENS_CONS.HRLIMITERETI, P_CDOPERADOR, C_SERVTRANS.IDUTRETIPRAT);

                V_NRPRPREVRETI := LPAD(V_NRPRPREVRETI + 1, 4, 0);

            END lOOP;    
        
        END LOOP;
    
        DELETE FROM LISTA WHERE NRLISTA = V_NRLISTA;
        DELETE FROM CONSPLAN WHERE NRCONSPLAN = V_NRCONSPLAN;
    /*FIM - Para servicos transportada e verificado se houve distribuicao efetivada dos itens*/    
	END IF;
   
    IF (V_LISTA_SERV IS NOT NULL) THEN      
        CONSUMO_PLANEJADO_PLA(P_CDFILIAL,
                             V_LISTA_SERV,
                             P_DTINICIAL,
                             P_DTFINAL,
                             'A',
                             P_IDPRODUTOS,
                             'P',
                             P_PEACRESCIMO,
                             P_IDARREDOND,
                             P_NRCONSPLAN,
                             ' ',
                             'zzzzzzzzzz',
                             P_CDOPERADOR,
                             NULL,
                             NULL);
    END IF;
END;
/