@RoinujNosde e @Lucas_Camara
Bom dia amigos!!
Eu fiz algumas alterações no código, nada muito radical, para tentar deixar mais fácil para eu aprender e tbm para vcs entenderem, peço para que esqueçam tudo que vimos anteriormente, e partimos deste post atual.
O problema ainda é o mesmo, salvar os produtos vendidos. Então fiz o seguinte:
Tenho a classe Venda:
package br.com.fjsistemas.backend;
import java.time.LocalDate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Venda {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private LocalDate dataVenda = LocalDate.now();
@ManyToOne
private Cliente cliente;
@ManyToOne
private FormaDePagamento formaDePagamento;
private String valorTotalVenda;
}
Na classe venda, não criei nenhuma lista pois quero fazer passo a passo com vcs!!!
tbm criei a classe VendaItem:
package br.com.fjsistemas.backend;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class VendaItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn( name = "venda_id", referencedColumnName = "id" )
private Venda venda;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn( name = "produto_id", referencedColumnName = "id" )
private Produto produto;
private Integer quantidade;
private BigDecimal valorUnitario;
private BigDecimal valorTotal;
}
tbm não criei nenhuma lista ou qualquer outra coisa, pois quero fazer passo a passo, pois só assim vou entender e aprender
e por fim tenho a classe VendaView
package br.com.fjsistemas.compraVenda;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.formlayout.FormLayout.ResponsiveStep;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.binder.PropertyId;
import com.vaadin.flow.data.renderer.LocalDateRenderer;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import br.com.fjsistemas.backend.Cliente;
import br.com.fjsistemas.backend.FormaDePagamento;
import br.com.fjsistemas.backend.Venda;
import br.com.fjsistemas.backend.VendaItem;
import br.com.fjsistemas.main.MainView;
import br.com.fjsistemas.repository.ClienteRepository;
import br.com.fjsistemas.repository.FormaDePagamentoRepository;
import br.com.fjsistemas.repository.ProdutoRepository;
import br.com.fjsistemas.service.VendaService;
@Route(value = "venda-view", layout = MainView.class)
@PageTitle("Lançamento de Vendas")
public class VendaView extends VerticalLayout {
private static final long serialVersionUID = 1L;
private FormLayout fltVenda = new FormLayout();
@PropertyId("dataVenda")
private DatePicker txtDataVenda = new DatePicker("Data Venda");
@PropertyId("cliente")
private ComboBox<Cliente> cbxCliente = new ComboBox<>("Cliente");
@PropertyId("telefone")
private TextField txtTelefone = new TextField("Telefone");
@PropertyId("celular")
private TextField txtCelular = new TextField("Celular");
@PropertyId("endereco")
private TextField txtEndereco = new TextField("Endereço");
@PropertyId("numero")
private TextField txtNumero = new TextField("Nº");
@PropertyId("bairro")
private TextField txtBairro = new TextField("Bairro");
@PropertyId("cidade")
TextField txtCidade = new TextField("Cidade");
@PropertyId("estado")
TextField txtEstado = new TextField("Estado");
@PropertyId("formaDePagamento")
private ComboBox<FormaDePagamento> txtFormasPagamento = new ComboBox<>("Formas de Pagamento");
@PropertyId("valorTotalVenda")
private TextField campoSomaValores = new TextField();
private VerticalLayout vltVenda = new VerticalLayout();
Grid<Venda> grdVenda = new Grid<>(Venda.class, false);
Grid<VendaItem> grdVendidos = new Grid<>(VendaItem.class, false);
private HorizontalLayout hltBarraBotoes = new HorizontalLayout();
Button btnNovo = new Button("Novo");
Button btnAlterar = new Button("Alterar");
Button btnExcluir = new Button("Excluir");
private Dialog dlgJanela = new Dialog();
HorizontalLayout primeiraLinhaDivSuperior = new HorizontalLayout();
HorizontalLayout segundaLinhaDivSuperior = new HorizontalLayout();
HorizontalLayout adicionarProdutos = new HorizontalLayout();
double somaValores;
private Button btnSalvar = new Button("Salvar");
private Button btnFechar = new Button("Fechar");
private Button btnAdicionarItem = new Button("Adicionar Produtos");
@Autowired
VendaService vendaService;
@Autowired
ClienteRepository clienteRepository;
@Autowired
FormaDePagamentoRepository formaDePagamentoRepository;
@Autowired
ProdutoRepository produtoRepository;
private List<Venda> listaVendas;
private List<Cliente> listaDeClientes = new ArrayList<>();
List<FormaDePagamento> listaPagamento = new ArrayList<>();
private Venda venda;
Binder<Venda> binderVenda = new Binder<>(Venda.class);
public VendaView() {
}
@PostConstruct
public void init() {
configuraTela();
}
private void configuraTela() {
setMargin(false);
setPadding(false);
configuraVltVenda();
configuraFltBarraBotoes();
populaGrdVenda();
populaCbxCliente();
populaFormaPagamento();
configuraBinder();
add(fltVenda, vltVenda, hltBarraBotoes);
}
private void configuraFltBarraBotoes() {
btnNovo.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnNovo.addClickListener(e -> {
novoClick();
});
btnAlterar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnAlterar.addClickListener(e -> {
alterarClick();
});
btnExcluir.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnExcluir.addClickListener(e -> {
excluirClick();
});
hltBarraBotoes.add(btnNovo, btnAlterar, btnExcluir);
}
private void excluirClick() {
if (venda != null) {
listaVendas.remove(venda);
vendaService.delete(venda);
atualizaGrdVenda();
}
}
private void configuraVltVenda() {
vltVenda.setWidthFull();
vltVenda.setHeight("820px");
vltVenda.getStyle().set("margin-top", "0");
vltVenda.setMargin(false);
vltVenda.setPadding(false);
configuraGrdVenda();
vltVenda.add(grdVenda);
}
private void configuraGrdVenda() {
grdVenda.setHeight("320px");
grdVenda.setWidthFull();
grdVenda.addColumn(Venda::getId).setHeader("ID:").setAutoWidth(true);
grdVenda.addColumn(new LocalDateRenderer<>(Venda::getDataVenda, DateTimeFormatter.ofPattern("dd/MM/yyy")))
.setHeader("Data Venda").setAutoWidth(true);
grdVenda.addColumn(venda -> venda.getCliente().getNome()).setHeader("Nome:").setAutoWidth(true)
.setKey("cliente.nome");
grdVenda.addColumn(Venda::getValorTotalVenda).setHeader("Valor Total:").setAutoWidth(true)
.setKey("valorTotalVenda");
grdVenda.addColumn(venda -> venda.getFormaDePagamento().getFormaDePagamento()).setHeader("Forma de Pagamento")
.setAutoWidth(true).setKey("formaDePagamento");
grdVenda.addThemeVariants(GridVariant.LUMO_COMPACT, GridVariant.LUMO_COLUMN_BORDERS);
grdVenda.getColumns().forEach(col -> col.setAutoWidth(true).setSortable(true).setResizable(true));
grdVenda.addItemClickListener(e -> {
venda = e.getItem();
binderVenda.setBean(venda);
});
grdVenda.addItemDoubleClickListener(event -> {
if (venda != null) {
binderVenda.readBean(venda);
}
});
}
private void populaFormaPagamento() {
listaPagamento = formaDePagamentoRepository.findAll();
txtFormasPagamento.setItemLabelGenerator(FormaDePagamento::getFormaDePagamento);
txtFormasPagamento.setItems(listaPagamento);
}
private void populaCbxCliente() {
cbxCliente.setItemLabelGenerator(cliente -> {
if (cliente == null || cliente.getNome() == null) {
return " ";
} else {
return cliente.getNome();
}
});
listaDeClientes = clienteRepository.findAll();
cbxCliente.setItems(listaDeClientes);
}
private void salvarClick() {
venda = binderVenda.getBean();
boolean adicionarLista = venda.getId() == null ? true : false;
vendaService.create(venda);
if (adicionarLista) {
listaVendas.add(venda);
}
atualizaGrdVenda();
novaVenda();
cbxCliente.focus();
binderVenda.setBean(venda);
if (adicionarLista) {
}
}
private void populaGrdVenda() {
listaVendas = vendaService.read();
atualizaGrdVenda();
}
private void atualizaGrdVenda() {
grdVenda.setItems(listaVendas);
}
private void configuraBinder() {
binderVenda.bindInstanceFields(this);
}
private void janelaVenda() {
dlgJanela.open();
dlgJanela.setWidthFull();
dlgJanela.setHeightFull();
fltVenda.setWidthFull();
btnAdicionarItem.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnAdicionarItem.getStyle().set("margin-top", "0em");
btnAdicionarItem.addClickListener(e -> {
adicionarProdutos();
});
fltVenda.setResponsiveSteps(new ResponsiveStep("25em", 1), new ResponsiveStep("25em", 2),
new ResponsiveStep("25em", 3), new ResponsiveStep("25em", 4));
fltVenda.add(txtDataVenda, cbxCliente, txtTelefone, txtCelular, txtEndereco, txtNumero, txtBairro, txtCidade,
txtEstado, txtFormasPagamento, btnAdicionarItem);
cbxCliente.addValueChangeListener(event -> {
if (event.getValue() == null || event.getValue().getFone() == null) {
txtTelefone.setValue(" ");
} else {
txtTelefone.setValue(event.getValue().getFone());
}
if (event.getValue() == null || event.getValue().getCelular() == null) {
txtCelular.setValue(" ");
} else {
txtCelular.setValue(event.getValue().getCelular());
}
if (event.getValue() == null || event.getValue().getEndereco() == null) {
txtEndereco.setValue(" ");
} else {
txtEndereco.setValue(event.getValue().getEndereco());
}
if (event.getValue() == null || event.getValue().getNumero() == null) {
txtNumero.setValue(" ");
} else {
txtNumero.setValue(event.getValue().getNumero());
}
if (event.getValue() == null || event.getValue().getBairro() == null) {
txtBairro.setValue(" ");
} else {
txtBairro.setValue(event.getValue().getBairro());
}
if (event.getValue() == null || event.getValue().getCidade() == null) {
txtCidade.setValue(" ");
} else {
txtCidade.setValue(event.getValue().getCidade());
}
if (event.getValue() == null || event.getValue().getEstado() == null) {
txtEstado.setValue(" ");
} else {
txtEstado.setValue(event.getValue().getEstado());
}
});
grdVendidos.setWidthFull();
grdVendidos.setHeight("600px");
grdVendidos.addColumn(VendaItem::getProduto).setHeader("Produto:").setAutoWidth(true);
grdVendidos.addColumn(VendaItem::getQuantidade).setHeader("Quantidade:").setAutoWidth(true);
grdVendidos.addColumn(VendaItem::getValorUnitario).setHeader("Valor Unitário:").setAutoWidth(true);
grdVendidos.addColumn(VendaItem::getValorTotal).setHeader("Valor Total:").setAutoWidth(true);
btnSalvar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnSalvar.getStyle().set("margin-top", "5px");
btnSalvar.getStyle().set("margin-left", "0em");
btnSalvar.addClickListener(e -> {
salvarClick();
});
btnFechar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnFechar.getStyle().set("margin-top", "0em");
btnFechar.getStyle().set("margin-left", "1em");
btnFechar.addClickListener(e -> {
dlgJanela.close();
});
dlgJanela.add(fltVenda, grdVendidos, btnSalvar, btnFechar);
}
private void adicionarProdutos() {
Dialog janelaProdutoVendido = new Dialog();
janelaProdutoVendido.open();
janelaProdutoVendido.setWidthFull();
janelaProdutoVendido.setHeightFull();
}
private void novoClick() {
novaVenda();
binderVenda.setBean(venda);
janelaVenda();
cbxCliente.focus();
}
private void alterarClick() {
if (venda != null) {
binderVenda.setBean(venda);
// dlgJanela.open();
}
}
private void novaVenda() {
venda = new Venda();
venda.setCliente(null);
venda.setFormaDePagamento(null);
}
}
Visualmente, ficou desta forma:
Tela Inicial - Vendas
Agora vamos ao que preciso de ajuda, como vcs viram na imagem acima tenho um botão “Adicionar Produtos”
Neste botão tenho uma lóigica simples:
btnAdicionarItem.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
btnAdicionarItem.getStyle().set("margin-top", "0em");
btnAdicionarItem.addClickListener(e -> {
adicionarProdutos();
});
Como podem ver, ele chama o metodo adicionarProdutos();
que está aqui:
private void adicionarProdutos() {
Dialog janelaProdutoVendido = new Dialog();
janelaProdutoVendido.open();
janelaProdutoVendido.setWidthFull();
janelaProdutoVendido.setHeightFull();
}
Eu não não implementei mais, pois tbm quero fazer este metodo passo a passo com vcs
Então quando clico no botão Adicionar Produtos, fica assim:
uma janela em branco.
Vcs podem agora me ajudar a construir esta tela de vendas? Não precisa ser nada muito elaborado, algo simples, como escolher o produto, digitar a quantidade, valor unitario e valor total…e tbm adicionar quantos produtos forem necessários a uma venda(1 venda pode ter infinitos produtos).
Desculpem pelo post gigante!! Obg novamente!!!