Estudando fiz um mini projeto onde simulo a criação de uma nota fiscal. O crud em si já esta pronto porém estou com problemas na atualização da nota. Acontece que possuo uma classe itens que contém meus produtos, valor total, quantidade, etc e a classe nota que armazena o numero da nota e o seu valor total. Esta assim:
Itens:
public class Itens {
@Id
@JsonProperty("id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_produto")
private Produto produto;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnoreProperties("itens")
private Nota nota;
private Integer ordenacao;
private BigDecimal quantidade;
private BigDecimal valor_total;
Nota:
public class Nota {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id_cliente")
private Cliente cliente;
@JsonManagedReference
@OneToMany(fetch = FetchType.EAGER, mappedBy = "nota", cascade = CascadeType.ALL)
@JsonIgnoreProperties("nota")
private List<Itens> itens;
private Integer numero;
private Date data;
private BigDecimal valor_total;
O meu problema acontece no momento da atualização da nota. Consigo atualizar os itens com seu valor total, porém o valor total da nota não é atualizado. O que poderia estar errado? Segue meu método salvar do meu service:
public void atualizar(NotaDTO dto) {
Nota nota = repository.getReferenceById(dto.getId());
List<Itens> list = itensRepository.findAllByIdItens(nota);
BigDecimal somaTotal = BigDecimal.ZERO;
if (dto.getCliente() != null && dto.getCliente().getId() != null) {
Cliente cliente = clienteRepository.getReferenceById(dto.getCliente().getId());
nota.setCliente(cliente);
}
int ordenacao = 1;
for (Itens item : list) { //Percorrendo a lista de itens que já esta salva no banco de dados
if (!dto.getItens().contains(itensRepository.getReferenceById(item.getId()))) {
itensRepository.deleteById(item.getId());
}
for (Itens itemDTO : dto.getItens()) { //Percorrendo a lista do dto que estou recebendo
if (itemDTO.getId() == null) {
item.setOrdenacao(ordenacao++);
itemDTO.setOrdenacao(ordenacao++);
Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());
item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
somaTotal = somaTotal.add(item.getValor_total());
itemDTO.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
item.setNota(nota);
break;
}
if (item.getId() == itemDTO.getId()) {
item.setQuantidade(itemDTO.getQuantidade());
Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());
item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
somaTotal = somaTotal.add(item.getValor_total());
break;
}
}
}
nota.setValor_total(somaTotal);
nota.atualizar(dto);
}
Na minha classe nota da entidade esta assim:
public void atualizar(NotaDTO dto) {
if (dto.getData() != null) {
this.data = dto.getData();
}
if (dto.getValor_total() != null) {
this.valor_total = dto.getValor_total();
}
if (dto.getItens() != null) {
for (Itens itemDTO : dto.getItens()) {
if (itemDTO.getId() == null) {
// Criar e adicionar novo item à lista
Itens novoItem = new Itens();
novoItem.setOrdenacao(itemDTO.getOrdenacao());
novoItem.setProduto(itemDTO.getProduto());
novoItem.setQuantidade(itemDTO.getQuantidade());
novoItem.setValor_total(itemDTO.getValor_total());
novoItem.setNota(this);
this.itens.add(novoItem);
} else {
// Atualizar item existente
for (Itens item : this.itens) {
if (item.getId().equals(itemDTO.getId())) {
item.setQuantidade(itemDTO.getQuantidade());
break;
}
}
}
}
}
}