Boa tarde moçada, estou com um problema e alguns dias não consigo resolver, criei um processo de devolução de compra, vou tentar simular o problema aqui pra vocês: Tenho uma compra com um item de saldo 10, faço uma devolução desse item com a mesma quantidade 10. Na próxima devolução desse mesmo item ele tem que estar com saldo 0, certo?! Certo… Até ai tudo bem, porém quando cancelo essa mesma devolução o saldo deverá voltar para 10. No meu pick list ele aparece o saldo 10 corretamente, porém ao passar para o Target do pick list que vou devolver novamente ele ainda está 0 zerado. Creio que esteja ficando em cache algum objeto. Alguém poderia me ajudar? Qualquer dúvida estou a disposição.
package br.com.rfsolutionit.web.controller.comercial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.lang3.StringUtils;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DualListModel;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import br.com.rfsolutionit.business.comercial.model.Compra;
import br.com.rfsolutionit.business.comercial.model.DevolucaoCompra;
import br.com.rfsolutionit.business.comercial.model.ItemCompra;
import br.com.rfsolutionit.business.comercial.model.ItemDevolucaoCompra;
import br.com.rfsolutionit.business.comercial.model.type.StatusDevolucaoCompra;
import br.com.rfsolutionit.comercial.client.DevolucaoCompraService;
import br.com.rfsolutionit.commons.utils.DateTimeUtils;
import br.com.rfsolutionit.commons.utils.FacesUtil;
import br.com.rfsolutionit.commons.utils.NegocioException;
import br.com.rfsolutionit.web.controller.security.Seguranca;
@Controller(value=“devolucaoCompraController”)
@Scope(“session”)
public class DevolucaoCompraController implements Serializable {
private static final long serialVersionUID = 1L;
@Autowired
private DevolucaoCompraService devolucaoCompraService;
@Autowired
private Seguranca seguranca;
private DevolucaoCompra devolucaoCompra = new DevolucaoCompra();
private Compra compra = new Compra();
private LazyDataModel<DevolucaoCompra> devolucoesCompras;
private List<ItemDevolucaoCompra> itensDevolucaoCompra = new ArrayList<ItemDevolucaoCompra>();
private DualListModel<ItemCompra> itensCompraDevolucao;
private List<ItemCompra> itensCompraDevolucaoSource;
private List<ItemCompra> itensCompraDevolucaoTarget;
private Date searchDataIni = DateTimeUtils.getLowerMonthDate(new Date());
private Date searchDataFim = DateTimeUtils.getUpperDate(new Date());
private boolean devolvidos;
private boolean cancelados;
@PostConstruct
public void init() {
devolucoesCompras = new LazyDataModel<DevolucaoCompra>() {
private static final long serialVersionUID = 1L;
@Override
public List<DevolucaoCompra> load(int first, int pageSize, String sortField, SortOrder sortOrder,
Map<String, Object> filters) {
setPageSize(pageSize);
List<DevolucaoCompra> result;
Specification<DevolucaoCompra> specs = null;
specs = new Specification<DevolucaoCompra>() {
@Override
public Predicate toPredicate(Root<DevolucaoCompra> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
if (searchDataIni != null) {
predicates.add(cb.greaterThanOrEqualTo(root.get("dataDevolucao").as(Date.class),
DateTimeUtils.getLowerDate(searchDataIni)));
}
if (searchDataFim != null) {
predicates.add(cb.lessThanOrEqualTo(root.get("dataDevolucao").as(Date.class),
DateTimeUtils.getUpperDate(searchDataFim)));
}
if (!(isDevolvidos() &&
isCancelados())){
if (isDevolvidos() && !isCancelados()) {
predicates.add(cb.equal(root.get("statusDevolucaoCompra").as(StatusDevolucaoCompra.class), StatusDevolucaoCompra.DEVOLVIDA));
}else
if (!isDevolvidos() && isCancelados()) {
predicates.add(cb.equal(root.get("statusDevolucaoCompra").as(StatusDevolucaoCompra.class), StatusDevolucaoCompra.CANCELADA));
}
}
query.where(predicates.toArray(new Predicate[predicates.size()]));
return query.getGroupRestriction();
}
};
int rows = devolucaoCompraService.count(specs).intValue();
setRowCount(rows);
if (sortOrder == SortOrder.UNSORTED || StringUtils.isBlank(sortField)) {
result = devolucaoCompraService.findAll(specs, new PageRequest(first / pageSize, pageSize)).getContent();
} else {
Sort sort = new Sort(sortOrder == SortOrder.ASCENDING ? Sort.Direction.ASC : Sort.Direction.DESC,
sortField);
result = devolucaoCompraService.findAll(specs, new PageRequest(first / pageSize, pageSize, sort))
.getContent();
}
return result;
}
};
limpar();
}
public void inicializar() {
if (FacesUtil.isNotPostback()) {
limpar();
}
}
private void limpar() {
devolucaoCompra = new DevolucaoCompra();
compra = new Compra();
itensDevolucaoCompra = new ArrayList<ItemDevolucaoCompra>();
this.itensCompraDevolucao = new DualListModel<ItemCompra>();
this.itensCompraDevolucaoSource = new ArrayList<ItemCompra>();
this.itensCompraDevolucaoTarget = new ArrayList<ItemCompra>();
}
public void finalizarDevolucao(){
this.devolucaoCompra.setEmpresa(this.seguranca.getEmpresa());
this.devolucaoCompra.setDataDevolucao(new Date());
this.devolucaoCompra.setCompra(this.compra);
for (ItemDevolucaoCompra idc : this.itensDevolucaoCompra) {
if (idc.getItemCompra().getValorSaldo().compareTo(idc.getQuantidade()) == -1){
throw new NegocioException("Quantidade devolvida é maior que a quantidade pedida.");
}
idc.setDevolucaoCompra(this.devolucaoCompra);
}
this.devolucaoCompra = this.devolucaoCompraService.save(this.devolucaoCompra);
this.devolucaoCompra = this.devolucaoCompraService.finalizar(this.devolucaoCompra);
FacesUtil.showMessage("", "Devolução de Compra finalizada com sucesso!");
this.limpar();
}
public void confirmaDevolucao(){
this.itensDevolucaoCompra = new ArrayList<ItemDevolucaoCompra>();
for (ItemCompra ic : this.itensCompraDevolucao.getTarget()) {
if (ic.getValorSaldo().compareTo(BigDecimal.ZERO) <= 0) {
throw new NegocioException("Não há disponibilidade no saldo do item: "+ ic.getValorSaldo());
}
ItemDevolucaoCompra idc = new ItemDevolucaoCompra();
idc.setItemCompra(ic);
idc.setValorUnitario(ic.getValorUnitario());
this.itensDevolucaoCompra.add(idc);
}
this.devolucaoCompra.setItensDevolucaoCompra(this.itensDevolucaoCompra);
if (this.itensCompraDevolucao.getTarget().isEmpty()){
throw new NegocioException("A devolução da compra deve possuir pelo menos um item para devolução.");
}
FacesUtil.showMessage("", "Itens da Devolução de Compra confirmados com sucesso!");
}
public void cancelarDevolucao() {
this.devolucaoCompra = this.devolucaoCompraService.cancelar(this.devolucaoCompra);
init();
FacesUtil.showMessage("", "Devolução Compra cancelada com sucesso!");
}
public void onReturnFromCompra(SelectEvent event){
limpar();
if (event.getObject() instanceof Compra){
this.compra = (Compra) event.getObject();
this.devolucaoCompra.setCompra((Compra) event.getObject());
this.itensCompraDevolucaoSource = this.compra.getItensCompra();
this.itensCompraDevolucaoTarget = new ArrayList<ItemCompra>();
this.itensCompraDevolucao = new DualListModel<ItemCompra>(this.itensCompraDevolucaoSource,this.itensCompraDevolucaoTarget);
}
}
public DevolucaoCompra getDevolucaoCompra() {
return devolucaoCompra;
}
public void setDevolucaoCompra(DevolucaoCompra devolucaoCompra) {
this.devolucaoCompra = devolucaoCompra;
}
public LazyDataModel<DevolucaoCompra> getDevolucoesCompras() {
return devolucoesCompras;
}
public void setDevolucoesCompras(LazyDataModel<DevolucaoCompra> devolucoesCompras) {
this.devolucoesCompras = devolucoesCompras;
}
public List<ItemDevolucaoCompra> getItensDevolucaoCompra() {
return itensDevolucaoCompra;
}
public void setItensDevolucaoCompra(List<ItemDevolucaoCompra> itensDevolucaoCompra) {
this.itensDevolucaoCompra = itensDevolucaoCompra;
}
public DualListModel<ItemCompra> getItensCompraDevolucao() {
return itensCompraDevolucao;
}
public void setItensCompraDevolucao(DualListModel<ItemCompra> itensCompraDevolucao) {
this.itensCompraDevolucao = itensCompraDevolucao;
}
public Compra getCompra() {
return compra;
}
public void setCompra(Compra compra) {
this.compra = compra;
}
public Date getSearchDataIni() {
return searchDataIni;
}
public void setSearchDataIni(Date searchDataIni) {
this.searchDataIni = searchDataIni;
}
public Date getSearchDataFim() {
return searchDataFim;
}
public void setSearchDataFim(Date searchDataFim) {
this.searchDataFim = searchDataFim;
}
public boolean isDevolvidos() {
return devolvidos;
}
public void setDevolvidos(boolean devolvidos) {
this.devolvidos = devolvidos;
}
public boolean isCancelados() {
return cancelados;
}
public void setCancelados(boolean cancelados) {
this.cancelados = cancelados;
}
}
@Transient
public BigDecimal getValorSaldo() {
return this.getQuantidade().subtract(this.getQuantidadeDevolvida());
}
Heeeelllpppp!!!