@Test
  public void deveVender1ingressoSeHa2vagas() throws Exception {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(2);

    Assert.assertTrue(sessao.podeReservar(1));
  }
  @Post
  @Path("/sessao/{sessaoId}/reserva")
  public void reserva(Long sessaoId, final Integer quantidade) {
    Sessao sessao = agenda.sessao(sessaoId);
    if (sessao == null) {
      result.notFound();
      return;
    }

    if (quantidade < 1) {
      validator.add(new SimpleMessage("", "Você deve escolher um lugar ou mais"));
    }

    if (!sessao.podeReservar(quantidade)) {
      validator.add(new SimpleMessage("", "Não existem ingressos disponíveis"));
    }

    // em caso de erro, redireciona para a lista de sessao
    validator.onErrorRedirectTo(this).sessao(sessao.getId());

    BigDecimal precoTotal = CalculadoraDePrecos.calcula(sessao, quantidade);

    sessao.reserva(quantidade);

    result.include("message", "Sessão reservada com sucesso por " + CURRENCY.format(precoTotal));

    result.redirectTo(IndexController.class).index();
  }
  @Test
  public void naoDeveVender3ingressoSeHa2vagas() throws Exception {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(2);

    Assert.assertFalse(sessao.podeReservar(3));
  }
  @Test
  public void reservarTodososIngressosDeveFuncionar() {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(3);

    Assert.assertTrue(sessao.podeReservar(3));
  }
  private Sessao sessaoComIngressosSobrando(int quantidade) {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(quantidade * 2);
    sessao.setIngressosReservados(quantidade);

    return sessao;
  }
  @Test
  public void reservarTodosOsIngressoQueEstaoDisponiveis() throws Exception {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(5);

    sessao.reserva(5);
    Assert.assertEquals(0, sessao.getIngressosDisponiveis().intValue());
  }
  @Test
  public void reservarIngressosDeveDiminuirONumeroDeIngressosDisponiveis() throws Exception {
    Sessao sessao = new Sessao();
    sessao.setTotalIngressos(5);

    sessao.reserva(3);
    Assert.assertEquals(2, sessao.getIngressosDisponiveis().intValue());
  }
  /**
   * Esse metodo eh responsavel por criar sessoes para o respectivo espetaculo, dado o intervalo de
   * inicio e fim, mais a periodicidade.
   *
   * <p>O algoritmo funciona da seguinte forma: - Caso a data de inicio seja 01/01/2010, a data de
   * fim seja 03/01/2010, e a periodicidade seja DIARIA, o algoritmo cria 3 sessoes, uma para cada
   * dia: 01/01, 02/01 e 03/01.
   *
   * <p>- Caso a data de inicio seja 01/01/2010, a data fim seja 31/01/2010, e a periodicidade seja
   * SEMANAL, o algoritmo cria 5 sessoes, uma a cada 7 dias: 01/01, 08/01, 15/01, 22/01 e 29/01.
   *
   * <p>Repare que a data da primeira sessao é sempre a data inicial.
   */
  public List<Sessao> criaSessoes(
      LocalDate inicio, LocalDate fim, LocalTime horario, Periodicidade periodicidade) {

    Sessao sessao = new Sessao();
    sessao.setInicio(inicio.toDateTime(horario));
    sessoes.add(sessao);

    return sessoes;
  }
  public boolean Vagas(int qtd) {
    // ALUNO: Não apague esse metodo. Esse sim será usado no futuro! ;)
    int totDisp = 0;

    for (Sessao s : sessoes) {
      totDisp += s.getIngressosDisponiveis();
    }

    if (totDisp >= qtd) return true;
    else return false;
  }
Example #10
0
  @Test
  public void verificaPromocaoFuturaInvalida() {
    Sessao sessao = new Sessao();
    sessao.setInicio(new DateTime());

    Promocao promocao = new Promocao();
    promocao.setInicio(new DateTime().plusMinutes(1));
    promocao.setFim(new DateTime().plusHours(1));

    Util util = new Util();
    Assert.assertFalse(sessao.dentroDoIntervalo(promocao));
  }
  public static BigDecimal calcula(Sessao sessao, Integer quantidade) {
    BigDecimal preco;

    Integer totalIngressos = sessao.getTotalIngressos();

    Integer ingressosReservados = sessao.getIngressosReservados();

    TipoDeEspetaculo tipoEspetaculo = sessao.getEspetaculo().getTipo();

    BigDecimal precoSessao = sessao.getPreco();

    preco = precoSessao;

    int diffIngressos = totalIngressos - ingressosReservados;

    switch (tipoEspetaculo) {
      case CINEMA:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.05) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;

      case SHOW:
        // quando estiver acabando os ingressos...
        if (diffIngressos / totalIngressos.doubleValue() <= 0.05) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;

      case BALLET:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.50) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20)));
        }

        if (sessao.getDuracaoEmMinutos() > 60) {
          preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;
      case ORQUESTRA:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.50) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20)));
        }
        if (sessao.getDuracaoEmMinutos() > 60) {
          preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;
      default:
        // nao aplica aumento para teatro (quem vai é pobretão)
        preco = precoSessao;
        break;
    }

    return preco.multiply(BigDecimal.valueOf(quantidade));
  }
Example #12
0
 @Test
 public void deveVender1ingressoSeHa1vaga() throws Exception {
   sessao.setTotalIngressos(1);
   Assert.assertTrue(sessao.podeReservar(1));
 }
  public static BigDecimal calcula(Sessao sessao, Integer quantidade) {
    BigDecimal preco = sessao.getPreco();

    if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.CINEMA)
        || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.SHOW)) {
      if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.05) {
        double fatorReajuste = 0.10;
        preco = Sessao.reajustarSessao(sessao, fatorReajuste);
      }
    } else if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.BALLET)
        || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.ORQUESTRA)) {
      if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.50) {
        double fatorReajuste = 0.20;
        preco = Sessao.reajustarSessao(sessao, fatorReajuste);
      }

      if (sessao.getDuracaoEmMinutos() > UMA_HORA) {
        double fatorReajuste = 0.10;
        preco = preco.add(sessao.getPreco().multiply(BigDecimal.valueOf(fatorReajuste)));
      }
    }
    return preco.multiply(BigDecimal.valueOf(quantidade));
  }