I have the following error accessing the sales completion screen, it does not show the registered employees, but the clients show.
Screenshot:
View:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="/templates/template.xhtml">
<ui:define name="conteudo">
<h:form id="formulario">
<p:panel header="Produtos">
<p:dataTable id="tabelaProduto"
emptyMessage="Nenhum registro encontrado." paginator="true"
value="#{vendaController.produtos}" var="produto" rows="5"
paginatorPosition="bottom">
<p:column headerText="Descrição" filterBy="#{produto.descricao}"
sortBy="#{produto.descricao}">
<h:outputText value="#{produto.descricao}" />
</p:column>
<p:column headerText="Quantidade" sortBy="#{produto.quantidade}">
<h:outputText value="#{produto.quantidade}" />
</p:column>
<p:column headerText="Preço" sortBy="#{produto.preco}">
<h:outputText value="#{produto.preco}">
<f:convertNumber locale="pt_BR" minFractionDigits="2" />
</h:outputText>
</p:column>
<p:column headerText="Fabricante"
filterBy="#{produto.fabricante.descricao}"
sortBy="#{produto.fabricante.descricao}">
<h:outputText value="#{produto.fabricante.descricao}" />
</p:column>
<p:column headerText="Opções">
<p:commandButton icon="ui-icon-plus"
actionListener="#{vendaController.adicionar}"
update=":formulario:tabelaCesta :formulario:painelFinalizacao">
<f:attribute name="produtoSelecionado" value="#{produto}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
<p:panel header="Cesta de Compras">
<p:dataTable id="tabelaCesta"
emptyMessage="Nenhum registro encontrado." paginator="true"
value="#{vendaController.itensVenda}" var="itemVenda" rows="5"
paginatorPosition="bottom">
<p:column headerText="Descrição">
<h:outputText value="#{itemVenda.produto.descricao}" />
</p:column>
<p:column headerText="Preço Un.">
<h:outputText value="#{itemVenda.produto.preco}">
<f:convertNumber locale="pt_BR" minFractionDigits="2" />
</h:outputText>
</p:column>
<p:column headerText="Qtde.">
<h:outputText value="#{itemVenda.quantidade}" />
</p:column>
<p:column headerText="Preço Parcial">
<h:outputText value="#{itemVenda.precoParcial}">
<f:convertNumber locale="pt_BR" minFractionDigits="2" />
</h:outputText>
</p:column>
<p:column headerText="Opções">
<p:commandButton icon="ui-icon-minus"
actionListener="#{vendaController.remover}"
update=":formulario:tabelaCesta :formulario:painelFinalizacao">
<f:attribute name="itemSelecionado" value="#{itemVenda}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
<p:panel header="Finalização">
<h:panelGrid id="painelFinalizacao" columns="3">
<p:outputLabel value="Total: R$" />
<h:outputText value="#{vendaController.venda.precoTotal}">
<f:convertNumber locale="pt_BR" minFractionDigits="2" />
</h:outputText>
<p:commandButton value="Finalizar"
actionListener="#{vendaController.finalizar}"
update=":mensagem :formularioFinalizar:painelFinalizar"
oncomplete="PF('dialogo').show();">
<f:actionListener
type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" />
</p:commandButton>
</h:panelGrid>
</p:panel>
</h:form>
<p:dialog header="Finalizar Venda" widgetVar="dialogo"
draggable="false" resizable="false" modal="true" closable="false">
<h:form id="formularioFinalizar">
<h:panelGrid id="painelFinalizar" columns="2">
<p:outputLabel value="Horário: " />
<h:outputText value="#{vendaController.venda.horario}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm" locale="pt_BR"
timeZone="America/Sao_Paulo" />
</h:outputText>
<p:outputLabel value="Total: R$" />
<h:outputText value="#{vendaController.venda.precoTotal}">
<f:convertNumber locale="pt_BR" minFractionDigits="2" />
</h:outputText>
<p:outputLabel for="funcionario" value="Funcionário:" />
<p:selectOneMenu id="funcionario"
value="#{vendaController.venda.funcionario}"
converter="omnifaces.SelectItemsConverter" filter="true"
filterMatchMode="contains" required="true"
requiredMessage="O campo FUNCIONÁRIO é obrigatório">
<f:selectItem noSelectionOption="true"
itemLabel="Selecione um funcionário" />
<f:selectItems value="#{vendaController.funcionarios}"
var="funcionario" itemValue="#{funcionario}"
itemLabel="#{funcionario.pessoa.nome} - #{funcionario.pessoa.cpf}" />
</p:selectOneMenu>
<p:outputLabel for="cliente" value="Cliente:" />
<p:selectOneMenu id="cliente"
value="#{vendaController.venda.cliente}"
converter="omnifaces.SelectItemsConverter" filter="true"
filterMatchMode="contains" required="true"
requiredMessage="O campo CLIENTE é obrigatórios">
<f:selectItem noSelectionOption="true"
itemLabel="Selecione um cliente" />
<f:selectItems value="#{vendaController.clientes}" var="cliente"
itemValue="#{cliente}"
itemLabel="#{cliente.pessoa.nome} - #{cliente.pessoa.cpf}" />
</p:selectOneMenu>
</h:panelGrid>
<h:panelGrid columns="2">
<p:commandButton value="Salvar"
actionListener="#{vendaController.salvar}"
update=":mensagem :formulario:tabelaProduto :formulario:tabelaCesta :formulario:painelFinalizacao"
oncomplete="PF('dialogo').hide();" />
<p:commandButton value="Fechar" oncomplete="PF('dialogo').hide();" />
</h:panelGrid>
</h:form>
</p:dialog>
</ui:define>
</ui:composition>
Controller:
public class VendaController implements Serializable {
private Venda venda;
private List<Produto> produtos;
private List<ItemVenda> itensVenda;
private List<Cliente> clientes;
private List<Funcionario> funcionarios;
public Venda getVenda() {
return venda;
}
public void setVenda(Venda venda) {
this.venda = venda;
}
public List<Produto> getProdutos() {
return produtos;
}
public void setProdutos(List<Produto> produtos) {
this.produtos = produtos;
}
public List<ItemVenda> getItensVenda() {
return itensVenda;
}
public void setItensVenda(List<ItemVenda> itensVenda) {
this.itensVenda = itensVenda;
}
public List<Cliente> getClientes() {
return clientes;
}
public void setClientes(List<Cliente> clientes) {
this.clientes = clientes;
}
public List<Funcionario> getFuncionarios() {
return funcionarios;
}
public void setFuncionarios(List<Funcionario> funcionarios) {
this.funcionarios = funcionarios;
}
@PostConstruct
public void novo() {
try {
venda = new Venda();
venda.setPrecoTotal(new BigDecimal("0.00"));
ProdutoDAO produtoDAO = new ProdutoDAO();
produtos = produtoDAO.listar("descricao");
itensVenda = new ArrayList<>();
} catch (RuntimeException erro) {
Messages.addGlobalError("Ocorreu um erro ao tentar carregar a tela de vendas");
erro.printStackTrace();
}
}
public void adicionar(ActionEvent evento) {
Produto produto = (Produto) evento.getComponent().getAttributes().get("produtoSelecionado");
int achou = -1;
for (int posicao = 0; posicao < itensVenda.size(); posicao++) {
if (itensVenda.get(posicao).getProduto().equals(produto)) {
achou = posicao;
}
}
if (achou < 0) {
ItemVenda itemVenda = new ItemVenda();
itemVenda.setPrecoParcial(produto.getPreco());
itemVenda.setProduto(produto);
itemVenda.setQuantidade(new Short("1"));
itensVenda.add(itemVenda);
} else {
ItemVenda itemVenda = itensVenda.get(achou);
itemVenda.setQuantidade(new Short(itemVenda.getQuantidade() + 1 + ""));
itemVenda.setPrecoParcial(produto.getPreco().multiply(new BigDecimal(itemVenda.getQuantidade())));
}
calcular();
}
public void remover(ActionEvent evento) {
ItemVenda itemVenda = (ItemVenda) evento.getComponent().getAttributes().get("itemSelecionado");
int achou = -1;
for (int posicao = 0; posicao < itensVenda.size(); posicao++) {
if (itensVenda.get(posicao).getProduto().equals(itemVenda.getProduto())) {
achou = posicao;
}
}
if (achou > -1) {
itensVenda.remove(achou);
}
calcular();
}
public void calcular() {
venda.setPrecoTotal(new BigDecimal("0.00"));
for (int posicao = 0; posicao < itensVenda.size(); posicao++) {
ItemVenda itemVenda = itensVenda.get(posicao);
venda.setPrecoTotal(venda.getPrecoTotal().add(itemVenda.getPrecoParcial()));
}
}
public void finalizar() {
try {
venda.setHorario(new Date());
venda.setCliente(null);
venda.setFuncionario(null);
FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
funcionarios = funcionarioDAO.listarOrdenado();
ClienteDAO clienteDAO = new ClienteDAO();
clientes = clienteDAO.listarOrdenado();
} catch (RuntimeException erro) {
Messages.addGlobalError("Ocorreu um erro ao tentar finalizar a venda");
erro.printStackTrace();
}
}
public void salvar() {
try {
if (venda.getPrecoTotal().signum() == 0) {
Messages.addGlobalError("Informe pelo menos um item para a venda");
return;
}
VendaDAO vendaDAO = new VendaDAO();
vendaDAO.salvar(venda, itensVenda);
venda = new Venda();
venda.setPrecoTotal(new BigDecimal("0.00"));
ProdutoDAO produtoDAO = new ProdutoDAO();
produtos = produtoDAO.listar("descricao");
itensVenda = new ArrayList<>();
Messages.addGlobalInfo("Venda realizada com sucesso");
} catch (RuntimeException erro) {
Messages.addGlobalError("Ocorreu um erro ao tentar salvar a venda");
erro.printStackTrace();
}
}
}
Model:
public class Venda extends Codigo {
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date horario;
@Column(nullable = false, precision = 7, scale = 2)
private BigDecimal precoTotal;
@ManyToOne
private Cliente cliente;
@ManyToOne
@JoinColumn(nullable = false)
private Funcionario funcionario;
public Date getHorario() {
return horario;
}
public void setHorario(Date horario) {
this.horario = horario;
}
public BigDecimal getPrecoTotal() {
return precoTotal;
}
public void setPrecoTotal(BigDecimal precoTotal) {
this.precoTotal = precoTotal;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public Funcionario getFuncionario() {
return funcionario;
}
public void setFuncionario(Funcionario funcionario) {
this.funcionario = funcionario;
}
}