Tenho o seguinte codigo:
@Entity
public class Reserva implements Criptografavel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String nome;
@OneToOne
private Estadia estadia;
@Enumerated(EnumType.STRING)
private ReservaStatus status;
@ManyToOne
private Cliente cliente;
private String contacto;
private String recebidaPor;
private String feitaPor;
private String agencia;
@OneToMany(mappedBy = "reserva", cascade = CascadeType.ALL)
private List<Pagamento> pagamentos;
@Transient
private BigDecimal totalEfetuado;
@Transient
private BigDecimal totalPendente;
public Reserva(String nome, Estadia estadia, String recebidaPor, String feitaPor, String agencia) {
this();
this.nome = nome;
this.estadia = estadia;
this.recebidaPor = recebidaPor;
this.status = ReservaStatus.ESPERA;
this.feitaPor = feitaPor;
this.agencia = agencia;
}
@Deprecated
public Reserva() {
totalEfetuado = calcularPrecoTotal(getPagamentos(PagamentoStatus.PAGO));
totalPendente = calcularPrecoTotal(getPagamentos(PagamentoStatus.PENDENTE));
}
//GETTER E SETTER OCULTADOS
public void estadoAnterior() {
this.status = this.status.anterior();
}
public void proximoEstado() {
this.status = this.status.proximo();
}
public List<Pagamento> getPagamentos() {
return Collections.unmodifiableList(pagamentos);
}
public void setPagamentos(List<Pagamento> pagamentos) {
this.pagamentos = pagamentos;
}
@Override
public void criptografa() {
Criptografador criptografador = new Criptografador();
this.nome = criptografar(criptografador, this.nome);
this.contacto = criptografar(criptografador, this.contacto);
this.feitaPor = criptografar(criptografador, this.feitaPor);
this.recebidaPor = criptografar(criptografador, this.recebidaPor);
}
@Override
public void descriptografa() {
Criptografador criptografador = new Criptografador();
this.nome = descriptografar(criptografador, this.nome);
this.contacto = descriptografar(criptografador, this.contacto);
this.feitaPor = descriptografar(criptografador, this.feitaPor);
this.recebidaPor = descriptografar(criptografador, this.recebidaPor);
}
private boolean textoVazio(String msg) {
return msg.trim().isEmpty();
}
public BigDecimal getTotalEfetuado() {
return totalEfetuado;
}
public BigDecimal getTotalPendente() {
return totalPendente;
}
public void adicionarDivida(BigDecimal quantia, String descricao) {
Pagamento pagamento = new Pagamento(quantia, descricao, this, PagamentoStatus.PENDENTE);
guardarPagamento(pagamento);
this.pagamentos.add(pagamento);
this.totalPendente = this.totalPendente.add(quantia);
}
public void pagar(BigDecimal quantia, String descricao) {
Pagamento pagamento = new Pagamento(quantia, descricao, this, PagamentoStatus.PAGO);
if (getDivida().equals(BigDecimal.ZERO)){
throw new RuntimeException("Não existem dividas");
}else if (this.totalPendente.compareTo(this.totalEfetuado.add(quantia)) == -1){
throw new RuntimeException("Pagamento maior que a divida");
}
this.totalEfetuado = this.totalEfetuado.add(quantia);
guardarPagamento(pagamento);
this.pagamentos.add(pagamento);
}
private void guardarPagamento(Pagamento pagamento) {
PagamentoDao pagamentoDao = new PagamentoDao(new JPAUtil().getEntityManager());
int idPagamento = pagamentoDao.adicionar(pagamento);
pagamento.setId(idPagamento);
}
public BigDecimal getDivida() {
return this.totalPendente.subtract(this.totalEfetuado);
}
private BigDecimal calcularPrecoTotal(List<Pagamento> pagamentos) {
BigDecimal total = BigDecimal.ZERO;
for (Pagamento pagamento : pagamentos) {
total = total.add(pagamento.getQuantia());
}
return total;
}
private List<Pagamento> getPagamentos(PagamentoStatus status) {
List<Pagamento> pays = this.pagamentos.stream().filter(pay -> pay.getStatus() == status)
.collect(Collectors.toList());
return pays;
}
}
A minha duvida é relativamente aos pagamentos, devo utilizar uma classe apenas com a função de gerir os pagamentos? Se sim como? Já tentei fazer, mas para isso teria que quebrar um pouco o encapsulamento
