CREATE OR REPLACE PROCEDURE GERA_PREVPAXCIA_PROD
(P_CDFILIAL IN VARCHAR2,
 P_CDFILIPROC IN VARCHAR2,
 P_NRPREVISAOPROD IN NUMBER,
 P_SUBSTITUI_JA_GERADOS IN VARCHAR2,
 P_CDCIA IN VARCHAR2,
 P_CDOPERADOR IN VARCHAR2,
 P_NRORG IN NUMBER DEFAULT 1,
 P_NRLISTAERROS IN OUT NUMBER
)
AS
   V_NRVERSAO NUMBER;
   V_DATA DATE;   
   V_CONTADOR NUMBER;
   V_NUM_PREVCIA NUMBER;
BEGIN
   
   /*Busca a previsao existente para o numero informado*/
   SELECT MAX(P.DTPREVISAOPROD), MAX(PC.NRVERSAOPROD)
     INTO V_DATA, V_NRVERSAO
     FROM PREVPAXPRODM P
          LEFT JOIN PREVPAXCIAPRODM PC ON PC.CDFILIAL = P.CDFILIAL AND
                                         PC.NRPREVISAOPROD = P.NRPREVISAOPROD AND
                                         PC.CDCIA = P_CDCIA
    WHERE P.CDFILIAL = P_CDFILIAL
      AND P.NRPREVISAOPROD = P_NRPREVISAOPROD;

   IF V_DATA IS NULL THEN
     /*Operacao bloqueada. Numero de previsao invalido.*/
     INSERE_LISTA_ERROS(P_CDFILIPROC, 'APPERRMSGSTR' || 'APP-00058' || 'APPERRMSGEND',
                         P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
     RETURN;
   END IF;

   IF V_NRVERSAO IS NULL THEN
      /*Insere na tabela PREVPAXCIAPROD*/
      INSERT INTO PREVPAXCIAPRODM
      (CDFILIAL, NRPREVISAOPROD, CDCIA, IDPREVISAOPROD,
      NRVERSAOPROD, DTHRGERACAO, CDOPERGERACAO,
       NRORG, NRORGINCLUSAO, NRORGULTATU,
       CDOPERINCLUSAO, CDOPERULTATU,
       DTINCLUSAO, DTULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, P_NRPREVISAOPROD, P_CDCIA, 'P',
       1, SYSDATE, P_CDOPERADOR,
       P_NRORG, P_NRORG, P_NRORG,
       P_CDOPERADOR, P_CDOPERADOR,
       SYSDATE, SYSDATE, 'S');
   END IF;

   /*Gera a previsao para cada voo ativo da companhia*/
   FOR C_VOOS IN
   (
   SELECT V.NRVOO, VT.CDTRECHO
     FROM VOO V
    INNER JOIN VOOTRECHO VT ON VT.CDFILIAL = V.CDFILIAL AND
                               VT.CDCIA = V.CDCIA AND
                               VT.NRVOO = V.NRVOO
    WHERE V.CDFILIAL = P_CDFILIAL
      AND V.CDCIA = P_CDCIA
      AND VOO_DECOLA_DATA(VT.CDFILIAL, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, V_DATA) = 'S'
      AND V.IDCONSIDERAPLANPROD = 'S'
   ) LOOP
      /*Gera a previsao do voo conforme malha aerea*/
      GERA_PREVPAXVOO_PROD(P_CDFILIAL, P_CDFILIPROC, P_NRPREVISAOPROD, P_SUBSTITUI_JA_GERADOS, P_CDCIA, C_VOOS.NRVOO, C_VOOS.CDTRECHO, P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
   END LOOP;

   /*Verifica se foram incluidos voos para a data*/
   SELECT COUNT(1)
     INTO V_CONTADOR
     FROM PREVPAXVOOPRODM
    WHERE CDFILIAL = P_CDFILIAL
      AND NRPREVISAOPROD = P_NRPREVISAOPROD
      AND CDCIA = P_CDCIA;
   
   /* Apaga o dia caso nao existam previsoes de companhias */
   IF V_CONTADOR <= 0 THEN
      DELETE FROM PREVPAXCIAPRODM
       WHERE CDFILIAL = P_CDFILIAL
         AND NRPREVISAOPROD = P_NRPREVISAOPROD
         AND CDCIA = P_CDCIA;
   END IF;

END;
/