Regra de Negócio - Model - JSF

Tenho uma classe Movimentacao que o status é definido dependendo de quanto foi pago referente aquela movimentação.

Exemplo:

Se a Movimentacao tem valor 100 e foi quitado 0 ela esta com status NAO QUITADA(N)
Se a Movimentacao tem valor 100 e foi quitado qualquer valor menor que 100 ela esta com status QUITADA PARCIALMENTE ( P )
Se a Movimentacao tem valor 100 e foi quitado 100 ela tem status QUITADA (Q)

A classe esta assim:

public class Movimentacao implements Serializable, Entidade {

	...
	
	@Column(nullable=false)
	@NotNull
	@DecimalMin("0.01")
	private BigDecimal valor;

	@Column(nullable=false)
	@NotNull
	@DecimalMin("0.01")
	private BigDecimal valorQuitado;	
	
	@Enumerated(EnumType.STRING)
	@Column(nullable=false, length=1)
	@NotNull
	private MovimentacaoStatus status;

        ....

        //outros getters e setters

       // aqui tenho o meu setStatus que pode ser privado e nao recebe parâmetro.... pq o status é definido
       // através dos atributos valor e valorQuitdao

        public void setStatus() {
		if(this.valorQuitado.compareTo(BigDecimal.ZERO) == 0){
			this.status = MovimentacaoStatus.N;
		}else{
			if(this.valorQuitado.compareTo(this.valor) == 0){
				this.status = MovimentacaoStatus.Q;
			}else{
				this.status = MovimentacaoStatus.P;
			}
		}
	}       

        ....

}

Não estou sabendo como fazer… pq se deixo exatamente assim… recebo erro do JSF pq o meu xhtml (e depois o bean) de fato não passa nenhum valor para o atributo status…

#{movimentacaoBean.salvar}: javax.ejb.EJBException: javax.validation.ConstraintViolationException: Validation failed for classes [projeto.model.Movimentacao] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='Esta campo não pode estar vazio', propertyPath=status, rootBeanClass=class projeto.model.Movimentacao, messageTemplate='{javax.validation.constraints.NotNull.message}'} ]

mas preciso que o status seja definido assim e nao pelo usuario na tela…

Se for pra gravar, seta por fora no momento certo, na hora de salvar.
Se não precisar gravar o status, então faça essa lógica no getStatus, neste caso nem precisa do set.

Preciso gravar…mas não sei onde fazer… no set? Não gostaria de fazer no bean…

Na classe Service ou algo do tipo que centralize todas as regras de negocio para salvar essa entidade. Em algum momento você manda gravar o registro no banco, certo? Seria antes desse momento.

		if (movimentacao.getValorQuitado().compareTo(BigDecimal.ZERO) == 0) {
		  movimentacao.setStatus(MovimentacaoStatus.N);
		} else {
		if (movimentacao.getValorQuitado()compareTo(movimentacao.getValor()) == 0) {
		  movimentacao.setStatus(MovimentacaoStatus.Q);
		} else {
		  movimentacao.setStatus(MovimentacaoStatus.P);
		}
		
		//Salvar no banco movimentacao...

Sim…

No bean:

public String salvar() throws Exception{
				
		movimentacaoService.salvar(movimentacao);
		this.movimentacao = null;
		this.todos = null;
		
		context.addMessage(null, new FacesMessage("Movimentação salva com sucesso", ""));
		context.getExternalContext().getFlash().setKeepMessages(true);
		
		return "pretty:financeiro-lista";
		
	}

Vou colocar as regras no método salvar do MovimentacaoService como vc falou…pq assim…mesmo que eu precise usar a mesma classe em outra tecnologia que nao JSF nao fica acoplado no bean…

ótimo, valeu!

1 curtida

Se esse bean for a Controller, está certo, nunca deixe regras de negócio lá, para não dificultar reutilização como você mesmo falou. Assim como as entidades, essa classe de serviço também faz parte do Model.