CREATE OR REPLACE PROCEDURE GERA_PREVPAXDATA_PROD
(P_CDFILIAL IN VARCHAR2,
 P_CDFILIPROC IN VARCHAR2,
 P_DATA IN DATE, 
 P_SUBSTITUI_JA_GERADOS IN VARCHAR2,
 P_CDOPERADOR IN VARCHAR2,
 P_NRORG IN NUMBER DEFAULT 1,
 P_NRLISTAERROS IN OUT NUMBER
)
AS
   V_SEQ VARCHAR2(20);   
   V_NRVERSAO NUMBER;   
   V_CONTADOR NUMBER;
   V_NUM_PREVDATA NUMBER;
   V_NRPREVISAO NUMBER;
   V_VOOS_PENDENTES NUMBER;
   V_EXISTE_PREVISAO NUMBER;
BEGIN     

   /*Verifica se existe previsao para a data informada*/
   SELECT MAX(NRPREVISAOPROD), MAX(NRVERSAOPROD)
     INTO V_NRPREVISAO, V_NRVERSAO
     FROM PREVPAXPRODM
    WHERE CDFILIAL = P_CDFILIAL
      AND DTPREVISAOPROD = P_DATA;

   IF P_SUBSTITUI_JA_GERADOS = 'S' THEN
       --Apaga previsao existente para a data         
       APAGA_PREVPAXDATA_PROD(P_CDFILIAL, P_CDFILIPROC, V_NRPREVISAO, P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);       

       SELECT COUNT(1)    
         INTO V_EXISTE_PREVISAO
         FROM PREVPAXPRODM
        WHERE CDFILIAL = P_CDFILIAL
          AND DTPREVISAOPROD = P_DATA;
   
       /*Significa que nao foi apagada a previsao do dia e foi sinalizado na lista de erros pela funcao APAGA_PREV*/
       IF V_EXISTE_PREVISAO > 0 THEN 
          RETURN;
       END IF;

       V_NRPREVISAO := NULL;
   END IF;

   IF V_NRPREVISAO IS NULL THEN
      V_NRVERSAO := 1;
      
      NOVO_CODIGO_NT('PREVPAXPROD' || P_CDFILIAL , V_SEQ);
      V_NRPREVISAO := TO_NUMBER(V_SEQ);

      /*Insere na tabela PREVPAXPROD com o novo numero de versao*/
      INSERT INTO PREVPAXPRODM
      (CDFILIAL, NRPREVISAOPROD, DTPREVISAOPROD, IDPREVISAOPROD,
       NRVERSAOPROD, DTHRGERACAO, CDOPERGERACAO,
       NRORG, NRORGINCLUSAO, NRORGULTATU,
       CDOPERINCLUSAO, CDOPERULTATU,
       DTINCLUSAO, DTULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, V_NRPREVISAO, P_DATA, 'P',
       V_NRVERSAO, SYSDATE, P_CDOPERADOR,
       P_NRORG, P_NRORG, P_NRORG,
       P_CDOPERADOR, P_CDOPERADOR,
       SYSDATE, SYSDATE, 'S');
   ELSE
      UPDATE PREVPAXPRODM
         SET DTHRGERACAO = SYSDATE,
             NRORGULTATU = P_NRORG,
             DTULTATU = SYSDATE,
             CDOPERGERACAO = P_CDOPERADOR,
             CDOPERULTATU = P_CDOPERADOR
       WHERE CDFILIAL = P_CDFILIAL
         AND NRPREVISAOPROD = V_NRPREVISAO;
   END IF;

   /*Insere as companhias que possuem voos nas datas */
   FOR C_CIAS IN 
   (
   SELECT CF.CDCIA
     FROM CIAFILI CF
    WHERE CF.CDFILIAL = P_CDFILIAL
      AND IDATIVO = 'S'
   ) LOOP
      /*Gera a previsao de passageiros para a companhia (se existir)*/
      GERA_PREVPAXCIA_PROD(P_CDFILIAL, P_CDFILIPROC, V_NRPREVISAO, P_SUBSTITUI_JA_GERADOS, C_CIAS.CDCIA, P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
   END LOOP;

   /*Verifica se foram incluidas companhias para a data*/
   SELECT COUNT(1)
     INTO V_CONTADOR
     FROM PREVPAXCIAPRODM
    WHERE CDFILIAL = P_CDFILIAL
      AND NRPREVISAOPROD = V_NRPREVISAO;

   /*Verifica se a previsao do dia deve se tornar pendente*/
   SELECT COUNT(1)
     INTO V_VOOS_PENDENTES
     FROM PREVPAXVOOPRODM
    WHERE CDFILIAL = P_CDFILIAL
      AND NRPREVISAOPROD = V_NRPREVISAO
      AND IDPREVISAOPROD = 'P';
   
   IF V_VOOS_PENDENTES > 0 THEN
      UPDATE PREVPAXPRODM
         SET IDPREVISAOPROD = 'P',
             DTULTATU = SYSDATE,
             CDOPERULTATU = P_CDOPERADOR,
             NRORGULTATU = P_NRORG
       WHERE CDFILIAL = P_CDFILIAL
         AND NRPREVISAOPROD = V_NRPREVISAO;
   END IF;
   /* Apaga o dia caso nao existam previsoes de companhias */
   IF V_CONTADOR <= 0 THEN
      DELETE FROM PREVPAXPRODM
       WHERE CDFILIAL = P_CDFILIAL
         AND NRPREVISAOPROD = V_NRPREVISAO;
   END IF;
END;
/