Gostaria de uma ajuda na seguinte situação. Tenho uma tela num sistema web ao qual tenho uma coluna que informa a quantidade em estoque dos itens. Eu preciso ter essa infomação em outra tela mas não consigo colocar. Abaixo segue os códigos explicando:
Esse primeiro trecho é da tela onde tenho o estoque dos itens na consulta:
<p:dataTable var="item" value="#{consultaEstoqueMB.quantidadesEstoque}"
rows="20" paginator="true" paginatorPosition="bottom" currentPageReportTemplate="Item {startRecord} a {endRecord} de {totalRecords}. Página {currentPage} de {totalPages}."
id="dtQuantidades" rowStatePreserved="false"
emptyMessage="Nenhum resultado encontrado"
resizableColumns="true"
caseSensitiveSort="false"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<p:ajax event="page" oncomplete="app.ajaxModal.init()"/>
<p:ajax event="filter" oncomplete="app.ajaxModal.init()"/>
<p:ajax event="sort" oncomplete="app.ajaxModal.init()"/>
<p:column sortBy="#{item.qtdEstoque}" filterBy="#{item.qtdEstoque}">
<f:facet name="header">Em estoque</f:facet>
<f:facet name="footer">Em estoque</f:facet>
<h:outputText value="#{item.qtdEstoque}">
<f:convertNumber minFractionDigits="#{configSistemaMB.financeiro.qtdCasasDecimais}"
maxFractionDigits="#{configSistemaMB.financeiro.qtdCasasDecimais}"/>
</h:outputText>
</p:column>
</p:dataTable>
Esse outro trecho é da tela onde preciso ter a coluna com a exibição do estoque dos itens.
<p:dataTable var="item" value="#{produtoServicoMB.produtosServicos}"
rendered="#{not empty produtoServicoMB.produtosServicos}"
rows="20" paginator="true" paginatorPosition="bottom" currentPageReportTemplate="Item {startRecord} a {endRecord} de {totalRecords}. Página {currentPage} de {totalPages}."
id="searchResults" rowStatePreserved="false"
emptyMessage="Nenhum resultado encontrado"
resizableColumns="true"
caseSensitiveSort="false"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<p:ajax event="page" oncomplete="app.ajaxModal.init()"/>
<p:ajax event="filter" oncomplete="app.ajaxModal.init()"/>
<p:ajax event="sort" oncomplete="app.ajaxModal.init()"/>
<f:facet name="header">
Resultados da busca
</f:facet>
<p:column sortBy="#{item.codBarras}" filterBy="#{item.codBarras}">
<f:facet name="header">Cód. barras</f:facet>
<f:facet name="footer">Cód. barras</f:facet>
#{item.codBarras}
</p:column>
<p:column filterBy="#{item.produto}" sortBy="#{item.produto}">
<f:facet name="header">Tipo</f:facet>
<f:facet name="footer">Tipo</f:facet>
<span jsf:rendered="#{item.produto}">Produto</span>
<span jsf:rendered="#{not item.produto}">Serviço</span>
</p:column>
<p:column sortBy="#{item.nome}" filterBy="#{item.nome}">
<f:facet name="header">Nome</f:facet>
<f:facet name="footer">Nome</f:facet>
<div imgTooltip="#{not empty item.imagem}" prodId="#{item.id}">
#{item.nome}
</div>
</p:column>
Poderia explicar melhor? Quais entidades e métodos usados pra listagem? O seu #{item.produto}
não tem estoque?
leo.souza:
item.qtdEstoque
opa Bom Dia, eu preciso que ele faça exatamente o que faz no primeiro texto do código que mandei, pelo que vi ele pega a quantidade em estoque do item no item.qtdEstoque. Só que não consigo pegar isso e colocar no trecho seguinte, talvez por uma questão de herança não sei.
Então coloque as classes envolvidas e os métodos. Assim fica mais fácil alguém identificar o possível problema.
Você declarou a variável item nos 2 DataTable
e fez chamadas de 2 ManagedBeans
diferentes… Poste seu código
Essa é a classe da tela onde quero colocar para exibir o estoque de cada item:
public class ProdutoServicoMB implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(ProdutoServicoMB.class);
private ProdutoServico produtoServico;
private boolean isTipoSelecionado;
private String terms;
private boolean isError;
private boolean isSearch;
private boolean isProdutoAdicionado;
private boolean habilitarNFe;
private Double estoqueInicial;
private Double qtdBusca;
private Double qtdTmpBusca;
private ViewQuantidadeEstoque qtdEstoque;
private boolean cancelamentoConcluido;
private boolean ativamentoConcluido;
private Double pctValorVendaCalculo;
private final Map<Integer, ProdutoServico> sequencial;
private Integer numeroSequencialBusca;
private List<ProdutoServico> produtosServicos;
private List<ProdutoServico> variacoesRemover;
private List<CategoriaProduto> categorias;
private List<ItemProdutoComposto> itensRemoverProdComposto;
private List<ViewProdutoEstoqueBaixo> viewProdutoEstoqueBaixo;
private final ProdutoServicoDao produtoServicoDao;
private final PessoaDao pessoaDao;
private final CategoriaProdutoDao categoriaDao;
private final ViewQuantidadeEstoqueDao quantidadeEstoqueDao;
private final ViewProdutoEstoqueBaixoDao viewProdutoEstoqueBaixoDao;
private Part imagemPart;
// 1 - Simples; 2 - Composto; 3 - Derivado
private Integer tipoProduto;
public ProdutoServicoMB() {
this.produtoServico = new ProdutoServico();
this.produtoServico.setDadosFiscais(null);
this.isTipoSelecionado = false;
this.habilitarNFe = false;
this.estoqueInicial = 0D;
this.qtdBusca = 1D;
this.categoriaDao = DaoFactory.getDao(CategoriaProdutoDao.class);
this.quantidadeEstoqueDao = DaoFactory.getDao(ViewQuantidadeEstoqueDao.class);
this.categorias = categoriaDao.getAll();
this.sequencial = new HashMap<>();
this.variacoesRemover = new ArrayList<>();
this.itensRemoverProdComposto = new ArrayList<>();
this.pctValorVendaCalculo = 100D;
this.tipoProduto = 1;
this.produtoServicoDao = DaoFactory.getDao(ProdutoServicoDao.class);
this.pessoaDao = DaoFactory.getDao(PessoaDao.class);
this.viewProdutoEstoqueBaixoDao = DaoFactory.getDao(ViewProdutoEstoqueBaixoDao.class);
if (this.produtoServico.getDadosFiscais() == null) {
this.produtoServico.setDadosFiscais(new DadosFiscaisNFe());
this.produtoServico.getDadosFiscais().setProdutoServico(this.produtoServico);
}
this.produtoServico.getDadosFiscais().setProdutoServico(this.produtoServico);
}
Essa é a classe usada para a tela onde já exibe o estoque dos itens:
public class ConsultaEstoqueMB implements Serializable {
private final ProdutoServicoDao produtoServicoDao;
private final MovimentoEstoqueDao movimentoEstoqueDao;
private final ViewQuantidadeEstoqueDao quantidadeEstoqueDao;
private ProdutoServico produto;
private List<ProdutoServico> produtos;
private List<MovimentoEstoque> movimentos;
private List<ViewQuantidadeEstoque> quantidadesEstoque;
private ViewQuantidadeEstoque quantidadeEstoque;
private boolean exibirTodosSelecionado;
public ConsultaEstoqueMB() {
this.produtoServicoDao = DaoFactory.getDao(ProdutoServicoDao.class);
this.movimentoEstoqueDao = DaoFactory.getDao(MovimentoEstoqueDao.class);
this.quantidadeEstoqueDao = DaoFactory.getDao(ViewQuantidadeEstoqueDao.class);
this.movimentos = new ArrayList<>();
}
public void verificarPermissao(){
if(!ConfigFacade.getAsBoolean("restricao.tela.estoque")){
JsfFacade.redirect("/");
Messenger.getInstance().addMessage(MessageType.INFO, "Desculpe. mas você não tem acesso aos serviços solicitados.", false);
return;
}else if(!ConfigFacade.getAsBoolean("restricao.tela.consulta_estoque")){
JsfFacade.redirect("/");
Messenger.getInstance().addMessage(MessageType.INFO, "Desculpe, mas você não tem acesso a consulta de estoque.", false);
}
}
public void callbackProduto() {
Integer id = JsfFacade.getParameterAsInteger("id_produto");
ProdutoServico produto = produtoServicoDao.getById(id);
if (produto instanceof ProdutoServico) {
setProduto(produto);
this.exibirTodosSelecionado = false;
this.quantidadesEstoque = null;
AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);
}
}
public void exibirPorProduto(ProdutoServico produto) {
if (produto instanceof ProdutoServico) {
setProduto(produto);
this.exibirTodosSelecionado = false;
this.quantidadesEstoque = null;
AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);
}
}
public void exibirTodos() {
this.exibirTodosSelecionado = true;
this.quantidadesEstoque = quantidadeEstoqueDao.getAll();
this.produto = null;
AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_SUMARIZADA_REALIZADA);
}
public ProdutoServico getProduto() {
return produto;
}
public void setProduto(ProdutoServico produto) {
this.produto = produto;
this.movimentos = movimentoEstoqueDao.getAllByProduto(produto);
this.quantidadeEstoque = quantidadeEstoqueDao.getByProduto(produto);
}
public boolean isProdutoSelecionado() {
return produto != null;
}
public boolean isProdutoNotServico() {
return (produto == null) ? false : produto.getProduto();
}
public List<MovimentoEstoque> getMovimentos() {
return this.movimentos;
}
public ViewQuantidadeEstoque getQuantidadeEstoque() {
return quantidadeEstoque;
}
public boolean isExibirTodosSelecionado() {
return exibirTodosSelecionado;
}
public List<ViewQuantidadeEstoque> getQuantidadesEstoque() {
return quantidadesEstoque;
}
}
Espero que seja isso que vc pediu, ainda sou bem cru nisso e não foi eu que desenvolvi, caiu no meu colo essa tarefa para atender uma demanda.
No ProdutoServicoMB
a lista produtosServicos
é do tipo ProdutoServico
e vc declara private ViewQuantidadeEstoque qtdEstoque;
no Produto, então tenta:
<h:outputText value="#{item.qtdEstoque.qtdEstoque}">
dessa forma estaria pegando o qtdEstoque da ViewQuantidadeEstoque
ou então posta aí as classes ViewQuantidadeEstoque
e o ProdutoServico
Já tinha tentado isso que vc falou mas não deu certo. Abaixo seguem as classes que vc pediu:
trecho da ViewQuantidadeEstoque
public class ViewQuantidadeEstoque implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "fake_id")
private Integer fakeId;
@JoinColumn(name = "produto", referencedColumnName = "id", nullable = false)
@OneToOne
private ProdutoServico produto;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(precision = 17, scale = 17)
private Double compra;
@Column(precision = 17, scale = 17)
private Double venda;
@Column(name = "uso_interno", precision = 17, scale = 17)
private Double usoInterno;
@Column(name = "fabricacao", precision = 17, scale = 17)
private Double fabricacao;
public ViewQuantidadeEstoque() {
}
public Integer getFakeId() {
return fakeId;
}
public void setFakeId(Integer fakeId) {
this.fakeId = fakeId;
}
public ProdutoServico getProduto() {
return produto;
}
public void setProduto(ProdutoServico produto) {
this.produto = produto;
}
public Double getCompra() {
return compra;
}
public void setCompra(Double compra) {
this.compra = compra;
}
public Double getVenda() {
return venda;
}
public void setVenda(Double venda) {
this.venda = venda;
}
public Double getUsoInterno() {
return usoInterno;
}
public void setUsoInterno(Double usoInterno) {
this.usoInterno = usoInterno;
}
public Double getQtdEstoque() {
return compra - venda - usoInterno + fabricacao;
}
public Double getFabricacao() {
return fabricacao;
}
public void setFabricacao(Double fabricacao) {
this.fabricacao = fabricacao;
}
@Override
public String toString() {
return "ViewQuantidadeEstoque{" + "fakeId=" + fakeId + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ViewQuantidadeEstoque that = (ViewQuantidadeEstoque) o;
if (fakeId == null && that.fakeId == null) return super.equals(o);
return new EqualsBuilder()
.append(fakeId, that.fakeId)
.isEquals();
}
Trecho da ProdutoServico:
public ProdutoServico() {
this.initObject();
}
public ProdutoServico(Integer id) {
this();
this.id = id;
}
public ProdutoServico(Integer id, boolean produto, String nome, double valorVenda) {
this();
this.id = id;
this.produto = produto;
this.nome = nome;
this.valorVenda = valorVenda;
}
private void initObject() {
this.valorCompra = 0D;
this.valorVenda = 0D;
this.estoqueInicial = 0D;
this.produtoComposto = false;
this.produtoVariado = false;
this.produto = true;
this.dadosFiscais = new DadosFiscaisNFe();
this.dadosFiscais.setProdutoServico(this);
this.formatoValor = FormatoValorProduto.FIXO;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public boolean getProduto() {
return produto;
}
public void setProduto(boolean produto) {
this.produto = produto;
}
quer exibir essa informação no produto, certo?
Não sei bem como e onde a tela está sendo chamada, mas a primeira coisa que pensei foi: Posso alterar o value="#{produtoServicoMB.produtosServicos}"
por : value="#{consultaEstoqueMB.quantidadesEstoque}"
? E assim chamar : #{item.produto.nome}
, `#{item.qtdEstoque} mas nao sei o que impactaria na sua aplicação.
Outra coisa que imaginei foi: Criar um campo @transient
em Produto e fazer algo do tipo na consulta:
public List<ProdutoServico> pesquisaProdutos() {
String jpql = "select p.nome, (v.compra - v.venda - v.usoInterno + v.fabricacao) as qtdEstoque from ProdutoServico p"
+ " inner join ViewQuantidadeEstoque as v on v.produtoServico.id = p.id";
jpql += " order by p.nome";
List<Object[]> list = result.getResultList();
for (Object[] objectArray : list) {
ProdutoServico produto = new ProdutoServico();
produto.setNome(((String) objectArray[0]));
produto.setQtdEstoque(((Double) objectArray[1]).doubleValue());
produtosServicos.add(produto);
}
return produtosServicos;
}
Nesse exemplo teria o nome e qtdEstoque que poderia ser usado
Bom dia, tudo certo ?
então, com relação a primeira idéia não posso fazer isso pq se eu alterar aquela linha pois na tela exibem várias outras colunas que dependem daquela classe e só adicionar a coluna em estoque.
Vou verificar com relação a segunda idéia que vc falou. Obrigado.
Na sua ViewQuantidadeEstoque
você tem Produto
sendo assim você poderia fazer:
#{item.produto.nome}; #{item.produto.codBarras}...
esses dados do produto e também poderia fazer #{item.qtdEstoque}
só pela listagem funcionaria, mas como disse: Não sei o que causaria na aplicação.
De toda forma tenta as 2 formas pra vê se resolve o problema.