create or replace
PROCEDURE GERA_REQUI_PROD(
   P_CDFILIAL      IN VARCHAR2, --Codigo da Filial
   P_TCDCIA        IN VARCHAR2, --se for 'T', utiliza todas as Cias
   P_LISTACIA      IN VARCHAR2, --Lista todas as CIAS a serem utilizadas (apenas dse P_TCDCIA <> '')
   P_TNRPROGSERV   IN VARCHAR2, --se for 'T', utiliza todas as programacoes de servico das companhias utilizadas
   P_LISTAPROGSERV IN VARCHAR2, --Lista todas as CIAS-Num.Programacao  a serem utilizados (apenas dse P_TNRPROGSERV <> '')
   P_DATAINI       IN DATE,     --Data Inicial para consideracao das Programacoes de servicos
   P_DATAFIN       IN DATE,     --Data Final para consideracao das programacoes de servicos
   P_REQUI_GERADAS OUT VARCHAR2 --Retorna concatenadas as requisicoes geradas, com o formato: CDCIA||'-'||NRREQUIPROD   
   
)AS
   /*----------------------------------------
          Declaracao de Variaveis
   ----------------------------------------*/
    V_DATA_ATUAL  DATE;
    V_COUNT_MAPA  INTEGER;
    
    V_FILI_ANTERIOR    MAPAPROD.CDFILIAL%TYPE;
    V_MAPA_ANTERIOR    MAPAPROD.NRMAPAPROD%TYPE;
    V_SETOR_ANTERIOR   PRODRECSUBGRU.CDSETORPRODREC%TYPE;
    V_NRSEQUENCIAL     VARCHAR2(20);
         
    V_NRREQUIPROD      REQUIPROD.NRREQUIPROD%TYPE;
    V_CDFILIAL         MAPAPROD.CDFILIAL%TYPE;
    V_CDCIA            MAPAPROD.CDCIA%TYPE;    
    V_NRMAPAPROD       MAPAPROD.NRMAPAPROD%TYPE;
    V_DTMAPAPROD       MAPAPROD.DTMAPAPROD%TYPE;
    V_NRTURNOMAPAPROD  MAPAPROD.NRTURNOMAPAPROD%TYPE;
    V_NRPROGSERV       MAPAPROD.NRPROGSERV%TYPE;
    V_CDSETORPRODREC   PRODRECSUBGRU.CDSETORPRODREC%TYPE;
    V_CDPRODUTO        PRODRECSUBGRU.CDPRODREC%TYPE;
    V_QTREQPROD        PRODRECSUBGRU.QTPRODRECTOT%TYPE;    
    V_CDARVPROD        PRODUTO.CDARVPROD%TYPE;
    V_NMPRODUTO        PRODUTO.NMPRODUTO%TYPE;
    
    /*----------------------------------------
          Declaracao de Cursores
    ----------------------------------------*/
    
    --Cursor para buscar os mapas da producao gerados a partir das programacoes filtradas
    --Considera apenas Mapas "Pendentes" (status 'P') de programacoes com "Mapa Gerado" (Status 'G')
    CURSOR C_MAPAPROD IS
    SELECT MP.CDFILIAL,MP.CDCIA,MP.NRMAPAPROD,MP.DTMAPAPROD,MP.NRTURNOMAPAPROD,PR.CDSETORPRODREC,
       PR.CDPRODREC AS CDPRODUTO,P.CDARVPROD,P.NMPRODUTO,SUM(PR.QTPRODRECTOT) AS QTREQPROD
    FROM MAPAPROD MP, PROGSERVICO PS, PRODRECSUBGRU PR, PRODUTO P
    WHERE
      (MP.NRPROGSERV = PS.NRPROGSERV ) AND
      (MP.CDFILIAL   = PS.CDFILIAL   ) AND
      (MP.CDCIA      = PS.CDCIA      ) AND
      (PS.IDSITPROGSERV = 'G'        ) AND
      (MP.IDSITMAPAPROD = 'P'        ) AND 
      (P_CDFILIAL = PS.CDFILIAL      ) AND
      (PR.CDCIA    = MP.CDCIA        ) AND
      (PR.CDFILIAL = MP.CDFILIAL     ) AND
      (PR.NRMAPAPROD = MP.NRMAPAPROD ) AND
      (PR.IDORIGPRODREC IN ('P','PR')) AND
      (PR.CDPRODREC = P.CDPRODUTO    ) AND
      (PS.DTDECOLINI BETWEEN P_DATAINI AND P_DATAFIN) AND
      ((P_TCDCIA = 'T')OR(INSTR(P_LISTACIA,PS.CDCIA) > 0)) AND
      ((P_TNRPROGSERV = 'T')OR(INSTR(P_LISTAPROGSERV,PS.CDCIA||'-'||PS.NRPROGSERV) > 0)) 
      GROUP BY MP.CDFILIAL, MP.CDCIA, MP.NRMAPAPROD, MP.DTMAPAPROD, MP.NRTURNOMAPAPROD, PR.CDSETORPRODREC, PR.CDPRODREC, P.CDARVPROD, P.NMPRODUTO   
      ORDER BY  MP.CDFILIAL,MP.CDCIA,MP.DTMAPAPROD,MP.NRTURNOMAPAPROD,PR.CDSETORPRODREC,P.CDARVPROD;
   
BEGIN
   SELECT SYSDATE INTO V_DATA_ATUAL FROM DUAL; --Busca a Data Atual
   
   V_COUNT_MAPA := 0;
   P_REQUI_GERADAS  := '';
   V_FILI_ANTERIOR  := ' ';
   V_MAPA_ANTERIOR  := ' ';
   V_SETOR_ANTERIOR := ' ';    
   
   OPEN C_MAPAPROD;
   LOOP
      --Busca os mapas de producao gerados a partir das Programacoes filtradas
      FETCH C_MAPAPROD INTO V_CDFILIAL,V_CDCIA,V_NRMAPAPROD,V_DTMAPAPROD,V_NRTURNOMAPAPROD,
                            V_CDSETORPRODREC,V_CDPRODUTO,V_CDARVPROD,V_NMPRODUTO,V_QTREQPROD;
      EXIT WHEN C_MAPAPROD%NOTFOUND;
      
      V_COUNT_MAPA := V_COUNT_MAPA + 1; --Conta quantas vezes entrou no Loop
      
      IF (V_CDFILIAL <> V_FILI_ANTERIOR)OR(V_NRMAPAPROD <> V_MAPA_ANTERIOR)OR(V_CDSETORPRODREC <> V_SETOR_ANTERIOR) THEN 
      BEGIN
           V_FILI_ANTERIOR  := V_CDFILIAL;
           V_MAPA_ANTERIOR  := V_NRMAPAPROD;
           V_SETOR_ANTERIOR := V_CDSETORPRODREC;   
                         
           NOVO_CODIGO_SC('REQUIPROD'||V_CDFILIAL||V_CDCIA,V_NRSEQUENCIAL,1); --Gera novao codigo de requisicao em V_NRREQUIPROD
           V_NRREQUIPROD := SUBSTR(V_NRSEQUENCIAL,11,10);
           
           --====================================CADASTRA NOVA REQUISICAO===========================================
           INSERT INTO REQUIPROD(CDFILIAL,CDCIA,NRREQUIPROD,CDSETOR,DTPRODUCAO,DTREQUIPRD,NRTURNO,IDSITREQUI)
           VALUES (V_CDFILIAL,V_CDCIA,V_NRREQUIPROD,V_CDSETORPRODREC,V_DTMAPAPROD,TO_CHAR(V_DATA_ATUAL,'DD/MM/YYYY'),V_NRTURNOMAPAPROD,'P');
           --=======================================================================================================
           P_REQUI_GERADAS := P_REQUI_GERADAS || '_' ||V_CDCIA||'-'||V_NRREQUIPROD;
      END;     
      END IF;
      
      --==============================CADASTRA OS PRODUTOS DA REQUISICAO==================================
      INSERT INTO PRODREQUI (CDFILIAL,CDCIA,NRREQUIPROD,CDPRODUTO,QTREQUIPROD,IDPRODBAIXADO)
      VALUES (V_CDFILIAL,V_CDCIA,V_NRREQUIPROD,V_CDPRODUTO,V_QTREQPROD,'N');
      --==================================================================================================
            
   END LOOP;   
   
   IF V_COUNT_MAPA = 0 THEN 
       RAISE_APPLICATION_ERROR( -20502, '*?ProgrSemMapa', false);  
       --Nao ha Programacao de servicos com mapa de producao gerado para as CIAS no periodo informado.
   END IF;
   
   --===================ALTERAR A SITUACAO DOS MAPAS UTILIZADOS PARA "REQUISICAO GERADA"==============
   UPDATE MAPAPROD MP
   SET IDSITMAPAPROD = 'G'
   WHERE 
      (IDSITMAPAPROD = 'P'       ) AND 
      (CDFILIAL   = P_CDFILIAL) AND
      ((P_TCDCIA = 'T') OR (INSTR(P_LISTACIA,CDCIA) > 0)) AND
      ((P_TNRPROGSERV = 'T') OR (INSTR(P_LISTAPROGSERV,CDCIA||'-'||NRPROGSERV) > 0));
    --================================================================================================
      
   COMMIT;
END;
/