Ultimo problema para finalizar meu primeiro Sistema

@Lucas_Camara

Veja o que acontece

Uai, mas a venda não possui apenas um produto vendido. Uma venda pode ter mais de um produto vendido, certo?

Na classe venda, se vc tiver alguma propriedade ProdutoVendido, remova ele, e deixe apenas a lista List<ProdutoVendido> produtosVendidos.

1 curtida

@Lucas_Camara

Sim uma venda pode ter vários produtos vendidos

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

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;
	
	//@ManyToOne										
	//private ProdutoVendido produtoVendido;  REMOVIDO

	@OneToMany(cascade = CascadeType.PERSIST)
	private List<ProdutoVendido> produtos = new ArrayList<>();

	public void addProduto(Produto produto) {
		ProdutoVendido produtoVenda = new ProdutoVendido();
		produtos.add(produtoVenda);
	}

	private String valorTotalVenda;

}

Agora está certo a classe Venda?

public void addProduto(Produto produto) { 
	ProdutoVendido produtoVenda = new ProdutoVendido(); 
	produtos.add(produtoVenda); 
}

Essa parte ainda está errada. Você esta ignorando o parâmetro produto.

O objetivo do método addProduto, é vincular o produto à venda. E isso é feito pela classe ProdutoVendido. Ou seja, vc deve criar um produto vendido a partir do cliente e a venda, e depois adicionar na lista. Assim:

public void addProduto(Produto produto) { 
	ProdutoVendido produtoVenda = new ProdutoVendido(this, produto); // repare que aqui é chamado um construtor que recebe a venda e o produto
	produtos.add(produtoVenda); 
}

E na classe ProdutoVendido

public class ProdutoVendido {

	private Venda venda;
	private Produto produto;
	
	// Aqui é o construtor que irá criar o produto vendido a partir da venda e do produto
	// essa classe é responsável por vincular o produto à venda
	public ProdutoVendido(Venda venda, Produto produto) {
		this.venda = venda;
		this.produto = produto;
	}

	// getters and setters
}

obs: Na classe ProdutoVendido não coloquei as anotações do mapeamento, mas vc deve colocar para ficar correto.

1 curtida

@Lucas_Camara

Correto agora?

Classe Venda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

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;

	/*
	 * @ManyToOne private ProdutoVendido produtoVendido; //REMOVIDO
	 */

	@OneToMany(cascade = CascadeType.PERSIST)
	private List<ProdutoVendido> produtos = new ArrayList<>();

	public void addProduto(Produto produto) {
		ProdutoVendido produtoVenda = new ProdutoVendido(this, produto);																			
		produtos.add(produtoVenda);
	}

	private String valorTotalVenda;

}
1 curtida

@Lucas_Camara

Classe ProdutoVendido

package br.com.fjsistemas.backend;

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 ProdutoVendido {

	public ProdutoVendido(Venda venda, Produto produto) {
		this.venda = venda;
		this.produto = produto;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	@ManyToOne
	private Venda venda;

	@ManyToOne
	private Produto produto;

}
1 curtida

@Lucas_Camara

Deixei assim as classes:

Classe Venda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@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;

	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
	private List<ProdutoVendido> produtos = new ArrayList<>();

	public void addProduto(Produto produto) {
		ProdutoVendido produtoVenda = new ProdutoVendido(this, produto);																			
		produtos.add(produtoVenda);
	}

	private String valorTotalVenda;

} 

Classe ProdutoVendido:

package br.com.fjsistemas.backend;

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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Data
@Entity
public class ProdutoVendido {

	public ProdutoVendido(Venda venda, Produto produto) {
		this.venda = venda;
		this.produto = produto;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	@ManyToOne
	private Venda venda;

	@ManyToOne
	private Produto produto;

}

Classe VendaView(apenas o metodo adicionaProduto, metodo Alterar e montarListaProdutos)

private void alterarClick() {
		if (venda != null) {
			binderVenda.setBean(venda);
			montarListaProdutos(venda.getProdutos());

			dlgJanela.open();
		}
	}

	private void montarListaProdutos(List<ProdutoVendido> produtos) {
		for (ProdutoVendido pv : produtos) {
			Produto produto = pv.getProduto();
			venda.addProduto(produto);
		}
	}

	private void adicionaProduto() {

		ComboBox<Produto> txtProdutos = new ComboBox<>();

		NumberField txtQuantidade = new NumberField("Quantidade");

		TextField txtValorUnitario = new TextField("Valor Unitário");

		TextField txtValorTotalItem = new TextField("Valor Total Item");

		txtProdutos.setWidth("370px");
		txtProdutos.setLabel("Produtos");
		List<Produto> listaDeProdutos = produtoRepository.findAll();
		txtProdutos.setItemLabelGenerator(Produto::getNome);
		txtProdutos.setItems(listaDeProdutos);
		txtProdutos.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			try {

				txtValorUnitario.setValue(formatter.format(event.getValue().getValor()));

			} catch (Exception e) {
				e.printStackTrace();
			}

		});

//==========================================================================================================================

		txtQuantidade.setHasControls(true);
		txtQuantidade.setValue(null);
		txtQuantidade.setMin(1);

		txtQuantidade.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			double valorTotal = 0;

			try {
				valorTotal = formatter.parse(txtValorUnitario.getValue()).doubleValue() * txtQuantidade.getValue();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			txtValorTotalItem.setValue(formatter.format(valorTotal));

			double soma = 0;
			for (TextField tf : valores) {
				try {
					soma += formatter.parse(tf.getValue()).doubleValue();

				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

			campoSomaValores.setValue(formatter.format(soma));

		});

feito desta forma, fui tentar rodar a aplicação para ver se dava certo, mas da este stack

java.util.ConcurrentModificationException: null
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1009) ~[na:na]
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:963) ~[na:na]
	at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:883) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
	at br.com.fjsistemas.compraVendaView.VendaView.montarListaProdutos(VendaView.java:412) ~[classes/:na]
	at br.com.fjsistemas.compraVendaView.VendaView.alterarClick(VendaView.java:405) ~[classes/:na]
	at br.com.fjsistemas.compraVendaView.VendaView.lambda$1(VendaView.java:160) ~[classes/:na]
	at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:205) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:373) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:264) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:441) ~[flow-server-2.4.6.jar:2.4.6]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) ~[na:na]
	at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:441) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:59) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:64) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:409) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$1(ServerRpcHandler.java:390) ~[flow-server-2.4.6.jar:2.4.6]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) ~[na:na]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:390) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:317) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:89) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1547) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:247) ~[flow-server-2.4.6.jar:2.4.6]
	at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:111) ~[vaadin-spring-12.3.2.jar:na]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:141) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar:5.3.3]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar:5.3.3]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar:5.3.3]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar:5.3.3]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]

Essa parte está errada ainda:

private void montarListaProdutos(List<ProdutoVendido> produtos) {
		for (ProdutoVendido pv : produtos) {
			Produto produto = pv.getProduto();
			venda.addProduto(produto);
		}
	}

Vc está recebendo a lista de produtos da venda e adicionando na venda novamente.

Nessa parte vc deveria montar a view dos produtos vinculados à venda. Que imagino que seja aqui:

txtProdutos.setItems(produtos);

Se vc estiver usando java versão 8 ou superior, tu pode fazer o método para ficar assim:

private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
	List<Produto> produtos = produtosVendidos.stream()
		.map(pv -> pv.getProduto())
		.collect(Collectors.toList());
		
	txtProdutos.setItems(produtos);
}
1 curtida

@Lucas_Camara

Acontece que essa variavel txtProdutos, é uma variavel declarada dentro do metodo adicionaProduto(linha 422)

tentei declarar ela fora, la no começo do código, porém ao declarar ela fora, não consigo adicionar 2 ou mais produtos na venda…consigo add apenas 1 produto por venda

Ah, essa txtProduto é a combobox, entendi. Vacilo meu.

Qual o elemento que apresenta os produtos da venda? É uma tabela?

1 curtida

@Lucas_Camara

os produtos para venda são listados nesta comboBox, nesta combo estão todos os produtos disponíveis para venda

O que tava querendo dizer é algo assim:

private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
	HorizontalLayout adicionarProdutos = new HorizontalLayout();
	
	for (ProdutoVendido pv : produtosVendidos) {
		Produto p = pv.getProduto();
		adicionarProdutos.add(p.getDescricao(), pv.getQuantidade(), p.getValorUnitario(), p.getValorTotalItem());
	}
	
	centro.add(adicionarProdutos);
}

A partir dos produtos vendidos vinculados à venda, vc vai motar o layout que irá apresentar os dados desses produtos.

obs.: Tem que corrigir os parâmetros do método add

obs2: E esse nome adicionarProdutos não seria menos confuso se fosse layoutProdutosVenda (ou algo semelhante)?

2 curtidas

Ah sim. Esses códigos usando os elementos do Vaadin que to colocando, é mais como forma de passar a ideia do que fazer, mas eu não sei como fazer pois nunca usei esse Vaadin, blz.

Com isso, para pegar cada produto e colocar na tela usando os componentes do Vaadin, tu tem que usar o elemento de acordo com o que tu jah conhece desse framework.

1 curtida

@Lucas_Camara

blz, vou ver se consigo deixar td certinho…muito obg por tudo!!! Foi de grande ajuda!!!

@Lucas_Camara

acho que estou chegando perto, veja o que acontece aqui:

Classe Venda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@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;

	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
	private List<ProdutoVendido> produtos = new ArrayList<>();

	public void addProduto(Produto produto) {
		ProdutoVendido produtoVenda = new ProdutoVendido(id, this, produto, 0, null, null);																			
		produtos.add(produtoVenda);
	}

	private String valorTotalVenda;

}  

Classe ProdutoVendido:

package br.com.fjsistemas.backend;

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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Getter
@Setter
@Entity
public class ProdutoVendido {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@ManyToOne
	private Venda venda;
	
	@ManyToOne
	private Produto produto;
	
	private int quantidade;
	private Double valorUnitario;
	private Double valorTotalItem;
}

Classe VendaView(apenas metodo montarLista):

    private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
		HorizontalLayout adicionarProdutos = new HorizontalLayout();
		
		for (ProdutoVendido pv : produtosVendidos) {
			Produto p = pv.getProduto();
			adicionarProdutos.add(pv.getProduto(), pv.getQuantidade(), pv.getValorUnitario(), pv.getValorTotalItem());
		}
		
		centro.add(adicionarProdutos);
	}

Imagem do metodo montarListaProdutos:

Como resolver este erro:?

Está no caminho. Esse método add, imagino que seja para adicionar algum elemento de tela, como um textfield, por exemplo.

Se vc for adicionar a descrição do produto, imagino que vc tenha que adicionar um textfield com a descricao do produto como valor.

No seu caso, vc terá que criar elementos de tela para dada informação que deverá aparecer nesse HorizontalLayout.

1 curtida

@Lucas_Camara

Isso, o metodo add, irá adicionar as informações (nome do produto, quantidade vendida, valor unitário e valor total do item) dentro de uma Div(centro), que será exibida quando o usuario quiser visualizar ou alterar uma venda.

Se eu entendi corretamente, o certo agora é um declarar um TextField lá no começo do código e depois setar o valor nesta nova textfield…é isso?

tu não pode declarar no comeco do codigo, pq podem ser vários produtos. Se tu usar o mesmo textfield qdo for mais de um produto, o valor de um produto pode sobrescrever o outro.

Pensa assim: Se tu for apresentar 2 produtos nesse HorizontalLayout, onde para cada produto, serão apresentados 4 dados, vc terá 8 elementos na tela para isso.

Essas informações da tela serão apenas para apresentar os dados, ou o usuário poderá editar também?

1 curtida

@Lucas_Camara

Apenas para apresentar…sem alterar nada

Bão, fica mais fácil. Basta ir adicionando os textfields dentro do loop mesmo.

Algo mais ou menos assim:

for (ProdutoVendido pv : produtosVendidos) {
    layoutProdutos.add(new Textfield(pv.getProduto().getDescricao());
}

obs.: Nao sei como se cria textfield no vaadin

1 curtida