CREATE OR REPLACE PROCEDURE PREVCONSUMO_PLANOVOO
(
   P_CDFILIAL       IN FILIAL.CDFILIAL%TYPE,
   P_CDCIA          IN COMPANHIA.CDCIA%TYPE,
   P_NRVOO          IN VOO.NRVOO%TYPE,
   P_CDTRECHO       IN VOOTRECHO.CDTRECHO%TYPE,
   P_DTHRPLAVOOPV   IN PLANOVOO.DTHRPLAVOOPV%TYPE,
   P_DTRELPLAN      IN RELPLANOVOO.DTRELPLAN%TYPE,
   P_NRRELPLAN      IN RELPLANOVOO.NRRELPLAN%TYPE
)
AS
   -- ======================================================== --
   --      VARIAVEL INCREMENTADORA                             --
   -- ======================================================== --
   V_CDRELPLAN       RELPLANOVOO.CDRELPLAN%TYPE;
   -- ======================================================== --
   -- VARIAVEL UTILIZADA P/ TESTAR SE EXISTE DADOS NAS TABELAS --
   -- ======================================================== --
   V_TESTE           NUMBER;
   -- ======================================================== --
   -- VARIAVEL UTILIZADA PARA VERIFICAR SE EXITE CLASSE EM     --
   -- CONFIGVOO OU CONFIGPREF, OU CONFIGEQUIP                  --
   -- ======================================================== --
   V_EXISTECICLO     NUMBER;
   V_CDCLASSE        CLASSE.CDCLASSE%TYPE;
   V_CDCICLO_SE      CICLOCIA.CDCICLO%TYPE;
   V_RETORNA_CDCICLO CICLOCIA.CDCICLO%TYPE;
   V_CICLO_UNICO     CICLOCIA.CDCICLO%TYPE;
   V_CDSERVICO       SERVICOCIA.CDSERVICO%TYPE;
   V_NRPROPAXSE      PADVOOTRE.NRPROPAXVOO%TYPE;
   V_VRPELOADSE      PADVOOTRE.VRLOADSEVOO%TYPE;
   V_QTSERVSTBY      PADVOOTRE.QTSESTBYVOO%TYPE;
   V_QTSESBYPRSP     PADVOOTRE.QTSESTBYVOO%TYPE;
   V_QTSERVFIX       PADVOOTRE.QTSERVOO%TYPE;
   V_VRPESOSE        SERVICOCIA.VRPESOSE%TYPE;
   V_QTTOTPAX        EQUIPCIA.QTTOTPAX%TYPE;
   V_PAXSBY          EQUIPCIA.QTTOTPAX%TYPE;
   V_QTSESOLICSP     SERVPLANO.QTSESOLICSP%TYPE;
   V_IDPROPSERV      PADVOOTRE.IDPROPSEVOO%TYPE;
   V_SGCIA           COMPANHIA.SGCIA%TYPE;
   V_EXISTECIA       NUMBER;

   -- ===================================================================== --
   --                        DECLARACAO DE CURSOR                           --
   -- ===================================================================== --
   --   OS CURSORES C_CONFIGVOO, C_CONFIGPREF, C_CONFIGEQUI E C_CLASSECIA   --
   --   SAO UTILIZADOS PARA RECUPERAR A CLASSE, QTDE DE PASSAGEIROS E       --
   --   QTDE DE STANDBY, COM O OBJETIVO DE ATUALIZAR PREVISAOPAX, NA        --
   --   SEGUINTE ORDEM: PROCURAR EM CONFIGVOO SE NAO EXISTIR PESQUISAR EM   --
   --   CONFIGPREF CASO NAO ECONTRE PROCURAR EM CONFIGEQUI SE NAO ENCONTRAR --
   --   EM NENHUMA DAS TABELAS MENCIONADAS INSERIR PARA CADA CLASSE NA      --
   --   CLASSECIA PARA A COMPANHIA INFORMADA COM 0(ZERO) PARA PAX E STANDBY --
   -- ===================================================================== --
   CURSOR C_SERVICOCIA IS
   SELECT PV.CDSERVICO, PV.CDCLASSE,
          PV.NRPROPAX,  PV.VRLOADSE,
          SC.VRPESOSE,  PV.QTSESTBY,
          PV.QTSERV,    PV.CDCICLO, PV.IDPROPSERV
   FROM   SERVICOCIA SC, VOO V, PAD_VOOPREFEQUI PV
   WHERE (PV.CDFILIAL  = P_CDFILIAL)   AND
         (PV.CDCIA     = P_CDCIA)      AND
         (PV.NRVOO     = P_NRVOO)    	AND
         (PV.CDTRECHO  = P_CDTRECHO) 	AND
         (V.CDFILIAL   = P_CDFILIAL)   AND
         (V.CDCIA      = PV.CDCIA)     AND
         (V.NRVOO      = PV.NRVOO)     AND
         (SC.CDSERVICO = PV.CDSERVICO) AND
         (SC.IDSITSERVICO          = '1');
BEGIN
   SELECT COUNT(*)
   INTO   V_EXISTECIA
   FROM   COMPANHIA CO, CIAFILI CF
   WHERE  (CO.CDCIA    = CF.CDCIA) AND
          (CO.CDCIA    = P_CDCIA)  AND
          (CF.CDFILIAL = P_CDFILIAL);
   IF V_EXISTECIA > 0 THEN
      SELECT CO.SGCIA
      INTO   V_SGCIA
      FROM   COMPANHIA CO, CIAFILI CF
      WHERE  (CO.CDCIA    = CF.CDCIA) AND
             (CO.CDCIA    = P_CDCIA)  AND
             (CF.CDFILIAL = P_CDFILIAL);
   ELSE
      raise_application_error( -20502, 'Companhia '||V_SGCIA||' nao existente.', false);
   END IF;

   SELECT COUNT(DTRELPLAN)
   INTO V_TESTE
   FROM RELPLANOVOO
   WHERE (DTRELPLAN  = P_DTRELPLAN) AND
         (NRRELPLAN  = P_NRRELPLAN) AND
         (CDFILIAL   = P_CDFILIAL);
   IF (V_TESTE <> 0) THEN
      V_TESTE := V_TESTE+1;
   END IF;
   IF (V_TESTE = 0) THEN
      V_TESTE := 1;
   END IF;
   V_CDRELPLAN := V_TESTE;

   -- ========================================================= --
   -- GARANTIR QUE TODAS AS QUANTIDADES NAO ESTEJAM NULAS       --
   -- ========================================================= --
   UPDATE PADVOOTRE
   SET    QTSESTBYVOO = 0
   WHERE (QTSESTBYVOO IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   UPDATE PADPREFIXO
   SET    QTSESTBYPRE = 0
   WHERE (QTSESTBYPRE IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   UPDATE PADEQUIP
   SET    QTSESTBYEQ = 0
   WHERE (QTSESTBYEQ IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   UPDATE PADVOOTRE
   SET    QTSERVOO = 0
   WHERE (QTSERVOO IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   UPDATE PADPREFIXO
   SET    QTSERPRE = 0
   WHERE (QTSERPRE IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   UPDATE PADEQUIP
   SET    QTSERVEQ = 0
   WHERE (QTSERVEQ IS NULL) AND
         (CDFILIAL = P_CDFILIAL);

   -- =========================================================== --
   -- BUSCA O CICLO UNICO DA COMPANHIA                            --
   -- =========================================================== --
   SELECT COUNT(*)
   INTO   V_EXISTECICLO
   FROM   COMPANHIA CO, CIAFILI CF
   WHERE  (CO.CDCIA    = P_CDCIA)  AND
          (CO.CDCIA    = CF.CDCIA) AND
          (CF.CDFILIAL = P_CDFILIAL);
   IF V_EXISTECICLO <> 0 THEN
   BEGIN
      SELECT CF.CDCICLO
      INTO   V_CICLO_UNICO
      FROM   COMPANHIA CO, CIAFILI CF
      WHERE  (CO.CDCIA    = P_CDCIA)  AND
             (CO.CDCIA    = CF.CDCIA) AND
             (CF.CDFILIAL = P_CDFILIAL);
   END;
   END IF;

   OPEN C_SERVICOCIA;
   LOOP
      FETCH
        C_SERVICOCIA
      INTO
        V_CDSERVICO, V_CDCLASSE, V_NRPROPAXSE, V_VRPELOADSE,
        V_VRPESOSE, V_QTSERVSTBY, V_QTSERVFIX,
        V_CDCICLO_SE, V_IDPROPSERV;
      EXIT WHEN C_SERVICOCIA%NOTFOUND;

      -- ============================================================ --
      -- GARANTIR QUE TODAS AS QUANTIDADES, LOADINGS E                --
      -- PROPORCAO NAO ESTEJAM NULAS                                  --
      -- ============================================================ --
      IF (V_VRPESOSE   IS NULL) THEN
         V_VRPESOSE := 0;
      END IF;
      IF (V_QTSERVSTBY IS NULL) THEN
         V_QTSERVSTBY := 0;
      END IF;

      -- ============================================================ --
      -- BUSCAR O CICLO VIGENTE NESTA DATA                            --
      -- ============================================================ --
      V_RETORNA_CDCICLO := V_CDCICLO_SE;
      RETORNA_CICLO(P_CDFILIAL, P_CDCIA, P_NRVOO, P_CDTRECHO, P_DTHRPLAVOOPV,
                    V_CDSERVICO, V_CDCLASSE, V_RETORNA_CDCICLO);

      IF (V_CDCICLO_SE = V_RETORNA_CDCICLO) OR (V_CDCICLO_SE = V_CICLO_UNICO) THEN
      BEGIN
         SELECT COUNT(*)
         INTO   V_TESTE
         FROM   RELPREVPAX
         WHERE (CDFILIAL     = P_CDFILIAL)  AND
               (CDCIAPAX     = P_CDCIA)     AND
               (NRVOOPAX     = P_NRVOO)     AND
               (CDTRECHOPAX  = P_CDTRECHO)  AND
               (CDCLASSEPAX  = V_CDCLASSE)  AND
               (DTRELPLANPAX = P_DTRELPLAN) AND
               (NRRELPLANPAX = P_NRRELPLAN);

         IF (V_TESTE <> 0) THEN   /* SE A CLASSE DO SERVICO EXISTE NA PREVISAO DE PAX */
         BEGIN

            SELECT QTTOPAXATPAX,QTPAXSBYPAX
            INTO   V_QTTOTPAX, V_PAXSBY
            FROM   RELPREVPAX
            WHERE  (CDFILIAL     = P_CDFILIAL)  AND
                   (CDCIAPAX     = P_CDCIA)     AND
                   (NRVOOPAX     = P_NRVOO)     AND
                   (CDTRECHOPAX  = P_CDTRECHO)  AND
                   (CDCLASSEPAX  = V_CDCLASSE)  AND
                   (DTRELPLANPAX = P_DTRELPLAN) AND
                   (NRRELPLANPAX = P_NRRELPLAN);

            -- ============================================================ --
            -- UTILIZO O STANDBY INFORMADO NA GERACAO DO PLANO DE VOO, SE   --
            -- ESTE NAO FOR INFORMADO , PEGO O STANDBY DA VIEW              --
            -- ============================================================ --
            IF (V_PAXSBY <> 0) AND (V_PAXSBY IS NOT NULL) THEN
               V_QTSESBYPRSP := V_PAXSBY;
            ELSE
               V_QTSESBYPRSP := V_QTSERVSTBY;
            END IF;

            -- =========================================================== --
            -- Calculo das quantidades                                     --
            -- =========================================================== --
            CALCULA_QUANTIDADES(P_CDFILIAL, P_CDCIA, P_NRVOO, P_CDTRECHO, V_CDSERVICO, V_CDCLASSE,
                                V_CDCICLO_SE, V_QTTOTPAX, V_IDPROPSERV, V_VRPELOADSE, V_NRPROPAXSE,
                                V_QTSERVFIX, V_QTSESOLICSP, V_QTSESBYPRSP);

            IF (V_QTSERVFIX+V_QTSESOLICSP) > 0 THEN
               INSERT INTO RELPLANOVOO
                (CDFILIAL, DTRELPLAN, NRRELPLAN, CDRELPLAN, CDCIARELP, NRVOOREL, CDTRECHOREL, DTHRPLAREL, CDSERVICORELP,
                 CDCLASSEREL, CDCICLOREL ,TPPROPREL, VRQTDEFIXREL, VRLOADREL, VRPROPAXREL,
                 QTSESBYREL ,QTSERVFIXREL,  QTATUAPROREL,
                 QTSERFATREL)
               VALUES
                (P_CDFILIAL, P_DTRELPLAN, P_NRRELPLAN, LPAD(RTRIM(V_CDRELPLAN),10,'0'), P_CDCIA, P_NRVOO, P_CDTRECHO,
                 P_DTHRPLAVOOPV, V_CDSERVICO, V_CDCLASSE, V_CDCICLO_SE, V_IDPROPSERV, V_QTSERVFIX,
                 V_VRPELOADSE, V_NRPROPAXSE, V_QTSESBYPRSP, V_QTSERVFIX,
                 (V_QTSERVFIX+V_QTSESBYPRSP+V_QTSESOLICSP),
                 (V_QTSERVFIX+V_QTSESOLICSP));
               V_CDRELPLAN:= TO_CHAR(TO_NUMBER(V_CDRELPLAN)+1);
            END IF;
            --raise_application_error( -20502, P_DTRELPLAN||' - '||P_NRRELPLAN||' - '||LPAD(RTRIM(V_CDRELPLAN),10,'0'), false);
         END;    /* END DA CLASSE */
         END IF;
      END;     /* END DO BEGIN DO CICLO */
      END IF;  /* ENDIF DO CICLO */
   END LOOP;
   CLOSE C_SERVICOCIA;
END;
/