create or replace
PROCEDURE CALCULA_QUANTIDADES(
  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_CDSERVICO       IN     SERVPLANO.CDSERVICO%TYPE,
  P_CDCLASSE        IN     CLASSE.CDCLASSE%TYPE,
  P_CDCICLO         IN     CICLOCIA.CDCICLO%TYPE,
  P_QTTOTPAX        IN     PREVISAOPAX.QTTOTPAXAT%TYPE,
  P_IDPROPSERV      IN     SERVPLANO.IDTIPSCBOSP%TYPE,
  P_VRPELOADSE      IN OUT SERVPLANO.VRLOADSESP%TYPE,
  P_NRPROPAXSE      IN OUT SERVPLANO.NRPROPAXSP%TYPE,
  P_QTSERVFIX       IN OUT SERVPLANO.QTSERVFIXSP%TYPE,
  P_QTSESOLICSP     OUT    SERVPLANO.QTSESOLICSP%TYPE,
  P_QTSESBYPRSP     IN OUT SERVPLANO.QTSESBYPRSP%TYPE
)
AS

  V_SGCIA           COMPANHIA.SGCIA%TYPE;
  V_DSSERVICO       SERVICOCIA.DSSERVICO%TYPE;
  V_CDCLASSE        CLASSE.CDCLASSE%TYPE;
  V_SGCLASSE        CLASSE.SGCLASSE%TYPE;
  V_TESTE           NUMBER;
  V_QTSERVICO       PROPSERVICO.QTSERVICO%TYPE;
  V_QTSESOLICSP     SERVPLANO.QTSESOLICSP%TYPE;
  V_CDSERVICO       PRODUTO.CDARVPROD%TYPE;

BEGIN
  SELECT MAX(CDCLASSE)  , MAX(SGCLASSE)
  INTO   V_CDCLASSE, V_SGCLASSE
  FROM   CLASSE
  WHERE  CDCLASSE = P_CDCLASSE;

  SELECT MAX(CO.SGCIA), MAX(SC.DSSERVICO)
  INTO   V_SGCIA, V_DSSERVICO
  FROM  COMPANHIA CO, SERVICOCIA SC
  WHERE SC.CDSERVICO = P_CDSERVICO AND
        SC.CDCIA     = CO.CDCIA;

  SELECT CDARVPROD
  INTO V_CDSERVICO
  FROM PRODUTO
  WHERE
     (CDPRODUTO    = P_CDSERVICO) AND
     (IDPRODCOMISS = '1');

  IF P_IDPROPSERV <> '5' THEN
     IF P_QTTOTPAX IS NULL THEN
        Raise_Application_Error(-20501, 'Eser_N_inf'||'                    '||V_CDSERVICO||'*', True);

        /*{'Geracao interrompida. O servico '||
        V_CDSERVICO||' - '||V_DSSERVICO||' do voo '||V_SGCIA||' - '||P_NRVOO||
        ' pertence a classe '||V_SGCLASSE||' mas a quantidade de passageiros desta classe nao foi informada. '||
        'Verifique a previsao de passageiros informada para esta classe e tente novamente.', True);*/
     END IF;
  END IF;

  IF P_IDPROPSERV = '1' THEN /* 1 POR PAX */
       P_QTSESOLICSP := P_QTTOTPAX;
  END IF;

  IF P_IDPROPSERV = '2' THEN /* PROPORCIONAL FIXA */
    IF (P_NRPROPAXSE IS NULL) OR (P_NRPROPAXSE = 0) THEN
      Raise_Application_Error(-20501, 'Eser_N_Cad'||'                    '||V_CDSERVICO||'*', True);

      /*Geracao interrompida. O servico '||
      V_CDSERVICO||' - '||V_DSSERVICO||' do voo '||V_SGCIA||' - '||P_NRVOO||
      ' possui proporcao fixa, mas o valor da proporcao nao se encontra cadastrado. '||
      'Verifique a funcao Ambiente - Cadastros - Configuracao de Servicos e tente novamente.'*/
    END IF;

    /* Alterado para sempre arredondar para cima quando o valor for
       menor que 1 e maior que 0. */
    /*V_QTSESOLICSP := (P_QTTOTPAX/P_NRPROPAXSE);
    IF (V_QTSESOLICSP > 0) AND (V_QTSESOLICSP < 1) THEN
      P_QTSESOLICSP := 1;
    ELSE
      P_QTSESOLICSP := ROUND(V_QTSESOLICSP);
    END IF;*/

    /* Alterado dia 24/01/2001 por Leonardo Monteiro
       conforme solicitacao 4255 para sempre arredondar para cima. */
    P_QTSESOLICSP := CEIL(P_QTTOTPAX/P_NRPROPAXSE);

    P_QTSESBYPRSP := CEIL(P_QTSESBYPRSP/P_NRPROPAXSE);
  ELSE
    P_NRPROPAXSE := NULL;
  END IF;

  IF P_IDPROPSERV = '3' THEN /* PROPORCIONAL VARIAVEL */
    SELECT COUNT(QTSERVICO)
    INTO   V_TESTE
    FROM   PROPSERVICO
    WHERE (CDFILIAL  = P_CDFILIAL ) AND
          (CDCIA     = P_CDCIA    ) AND
          (CDSERVICO = P_CDSERVICO) AND
		  (NRVOO     = P_NRVOO    ) AND
          (CDTRECHO  = P_CDTRECHO ) AND
          /*(CDCLASSE  = P_CDCLASSE ) AND
          (CDCICLO   = P_CDCICLO  ) AND*/
          (P_QTTOTPAX BETWEEN QTPAXDE AND QTPAXATE);
    IF (V_TESTE <> 0) THEN
     SELECT SUM(QTSERVICO)
     INTO   V_QTSERVICO
     FROM   PROPSERVICO
     WHERE (CDFILIAL  = P_CDFILIAL ) AND
           (CDCIA     = P_CDCIA    ) AND
           (CDSERVICO = P_CDSERVICO) AND
           (NRVOO     = P_NRVOO    ) AND
		   (CDTRECHO  = P_CDTRECHO ) AND
           /*(CDCLASSE  = P_CDCLASSE ) AND
           (CDCICLO   = P_CDCICLO  ) AND*/
           (P_QTTOTPAX BETWEEN QTPAXDE AND QTPAXATE);
    ELSE
      V_QTSERVICO   := NULL;
    END IF;
    IF (V_QTSERVICO IS NOT NULL) THEN
      P_QTSESOLICSP := V_QTSERVICO;
    ELSE
      Raise_Application_Error(-20502, 'Eser_SerPa'||'                    '||V_CDSERVICO||'*', True);

      /*Geracao interrompida. O servico '||
      V_CDSERVICO||' - '||V_DSSERVICO||' do voo '||V_SGCIA||' - '||P_NRVOO||
      ' possui Proporcao Variavel, mas nao  se encontra configurado na Proporcao de Servico por Passageiro. '||
      'Altere seu tipo de proporcao na funcao Ambiente - Cadastros - Configuracao de Servicos ou configure este servico.'*/
    END IF;
  END IF;

  IF P_IDPROPSERV = '4' THEN /* LOADING */
    IF (P_VRPELOADSE IS NULL) OR (P_VRPELOADSE = 0) THEN
      Raise_Application_Error(-20501, 'Eser_Loadn'||'                    '||V_CDSERVICO||'*', True);

      /*Geracao interrompida. O servico '||
      V_CDSERVICO||' - '||V_DSSERVICO||' do voo '||V_SGCIA||' - '||P_NRVOO||
      ' possui proporcao do tipo Loading, mas o valor percentual do Loading nao se encontra cadastrado. '||
      'Verifique a funcao Ambiente - Cadastros - Configuracao de Servicos e tente novamente.', */
    END IF;

    /* Alterado para sempre arredondar para cima quando o valor for
    menor que 1 e maior que 0. */
    V_QTSESOLICSP := ((P_QTTOTPAX * P_VRPELOADSE)/100);
    IF (V_QTSESOLICSP > 0) AND (V_QTSESOLICSP < 1) THEN
      P_QTSESOLICSP := 1;
    ELSE
      P_QTSESOLICSP := ROUND(V_QTSESOLICSP);
    END IF;

    P_QTSESBYPRSP := ((P_QTSESBYPRSP * P_VRPELOADSE)/100);
    IF (P_QTSESBYPRSP > 0) AND (P_QTSESBYPRSP < 1) THEN
      P_QTSESBYPRSP := 1;
    ELSE
      P_QTSESBYPRSP := ROUND(P_QTSESBYPRSP);
    END IF;


  ELSE
    P_VRPELOADSE  := NULL;
  END IF;

  IF P_IDPROPSERV = '5' THEN /* QUANTIDADE FIXA */
    IF (P_QTSERVFIX  IS NULL) OR (P_QTSERVFIX = 0) THEN /* PARA NAO GRAVAR VALOR NULO */
      Raise_Application_Error(-20501, 'Eser_V_zer'||'                    '||V_CDSERVICO||'*', True);

      /*Geracao interrompida. O servico '||
      V_CDSERVICO||' - '||V_DSSERVICO||' do voo '||V_SGCIA||' - '||P_NRVOO||
      ' possui Quantidade Fixa, mas o valor desta nao se encontra cadastrado ou possui valor zero. '||
      'Verifique a funcao Ambiente - Cadastros - Configuracao de Servicos e tente novamente.'*/
    END IF;
    P_QTSESOLICSP  := 0;
  ELSE
    P_QTSERVFIX := 0;
  END IF;
END;

/