package br.com.ec.controller.managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.ProdutoHistoricoDTO;
import br.com.ec.domain.dto.ProdutoHistoricoDetalhesDTO;
import br.com.ec.domain.model.FornecedorProduto;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.ProdutoLoja;
import br.com.ec.domain.model.tipos.TipoGenero;
import br.com.ec.domain.model.tipos.TipoGeneroProduto;
import br.com.ec.domain.model.tipos.TipoLancamentoHistorico;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.service.fornecedorproduto.FornecedorProdutoService;
import br.com.ec.domain.service.loja.LojaService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
import br.com.ec.domain.service.seguranca.ContextoSeguranca;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
@Named
@Scope
("view")
public class ProdutoDetalheBean
extends AbstractBean
<Produto
> implements Serializable {
private static final long serialVersionUID = 1L
;
private ProdutoService produtoService
;
private ProdutoLojaService produtoLojaService
;
private FornecedorProdutoService fornecedorProdutoService
;
private LojaService lojaService
;
private Produto produtoSelecionado
;
private List<ProdutoHistoricoDTO
> produtosHistorico
;
private List<ProdutoHistoricoDetalhesDTO
> produtosHistoricoDetalhes
;
private List<ProdutoHistoricoDetalhesDTO
> resumoProdutosHistoricoDetalhes
;
private String descricaoDetalhamento
;
private Integer mesesConsultaHistorico
;
@Inject
public ProdutoDetalheBean
(ProdutoService produtoService, ProdutoLojaService produtoLojaService,
FornecedorProdutoService fornecedorProdutoService, LojaService lojaService, ContextoSeguranca contextoSeguranca
) {
this.
produtoService = produtoService
;
this.
produtoLojaService = produtoLojaService
;
this.
fornecedorProdutoService = fornecedorProdutoService
;
this.
lojaService = lojaService
;
}
@
Override
public void preCarregamento
() {
entidade =
new Produto
();
}
@
Override
public void limparEntidade
() {
setEntidade
(new Produto
());
}
@
Override
public GenericService
<Produto
> getService
() {
return produtoService
;
}
@
Override
public Produto getEntidade
() {
return entidade
;
}
@
Override
public Produto getId
() {
return getEntidade
();
}
public Produto getProdutoSelecionado
() {
return produtoSelecionado
;
}
public void setProdutoSelecionado
(Produto produtoSelecionado
) {
this.
produtoSelecionado = produtoSelecionado
;
}
public List<ProdutoHistoricoDTO
> getProdutosHistorico
() {
return produtosHistorico
;
}
public void setProdutosHistorico
(List<ProdutoHistoricoDTO
> produtosHistorico
) {
this.
produtosHistorico = produtosHistorico
;
}
public List<ProdutoHistoricoDetalhesDTO
> getProdutosHistoricoDetalhes
() {
return produtosHistoricoDetalhes
;
}
public void setProdutosHistoricoDetalhes
(List<ProdutoHistoricoDetalhesDTO
> produtosHistoricoDetalhes
) {
this.
produtosHistoricoDetalhes = produtosHistoricoDetalhes
;
}
public List<ProdutoHistoricoDetalhesDTO
> getResumoProdutosHistoricoDetalhes
() {
return resumoProdutosHistoricoDetalhes
;
}
public void setResumoProdutosHistoricoDetalhes
(List<ProdutoHistoricoDetalhesDTO
> resumoProdutosHistoricoDetalhes
) {
this.
resumoProdutosHistoricoDetalhes = resumoProdutosHistoricoDetalhes
;
}
public Integer subtotalResumoDetalhado
() {
Integer subtotal =
0;
for (ProdutoHistoricoDetalhesDTO detalhado : getProdutosHistoricoDetalhes
()) {
if (VerificadorUtil.
naoEstaNulo(detalhado.
getTipoLancamento()) &&
VerificadorUtil.
naoEstaNulo(detalhado.
getQuantidadeLancamentos())) {
if (detalhado.
ehTipoLancamentoHistoricoAvarias()) {
subtotal = subtotal - detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoCompras()) {
subtotal = subtotal + detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoContagensEntrada()) {
subtotal = subtotal + detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoContagensSaida()) {
subtotal = subtotal - detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoProducaoEntrada()) {
subtotal = subtotal + detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoProducaoSaida()) {
subtotal = subtotal - detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoTrocas()) {
subtotal = subtotal - detalhado.
getQuantidadeLancamentos();
}
if (detalhado.
ehTipoLancamentoHistoricoVendas()) {
subtotal = subtotal - detalhado.
getQuantidadeLancamentos();
}
} else {
subtotal++
;
}
}
return subtotal
;
}
public String getDescricaoDetalhamento
() {
return descricaoDetalhamento
;
}
public void setDescricaoDetalhamento
(String descricaoDetalhamento
) {
this.
descricaoDetalhamento = descricaoDetalhamento
;
}
public Integer getMesesConsultaHistorico
() {
return mesesConsultaHistorico
;
}
public void setMesesConsultaHistorico
(Integer mesesConsultaHistorico
) {
this.
mesesConsultaHistorico = mesesConsultaHistorico
;
}
/***************************************************************/
public Integer consultarEstoque
(Produto produto
) {
return produtoLojaService.
consultarEstoqueProduto(produto
);
}
public Integer consultarEstoque
(Produto produto,
Long sequencialLoja
) {
return produtoLojaService.
consultarEstoqueProdutoEeLoja(produto,
new Loja
(sequencialLoja
));
}
public ProdutoLoja consultarProdutoLoja
(Produto produto,
Long sequencialLoja
) {
return produtoLojaService.
consultarProdutoLoja(produto,
new Loja
(sequencialLoja
));
}
public TipoProduto
[] getTiposProduto
() {
return TipoProduto.
values();
}
public TipoGenero
[] getTiposGenero
() {
return TipoGenero.
values();
}
public TipoGeneroProduto
[] getTiposGeneroProduto
() {
return TipoGeneroProduto.
values();
}
public void consultarHistorico
(final Produto produto
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
setProdutoSelecionado
(produto
);
setMesesConsultaHistorico
(12);
setProdutosHistorico
(produtoService.
consultarHistorico(produto, getMesesConsultaHistorico
()));
}
});
}
public void detalharHistorico
(ProdutoHistoricoDTO produtoHistorico
) {
setDescricaoDetalhamento
(TipoLancamentoHistorico.
parse(produtoHistorico.
getTipoLancamento()).
getDescricao());
setProdutosHistoricoDetalhes
(produtoService.
detalharHistorico(produtoHistorico
));
montarResumoHistorico
();
}
private void montarResumoHistorico
() {
List<ProdutoHistoricoDetalhesDTO
> resumos =
new ArrayList<ProdutoHistoricoDetalhesDTO
>();
List<Loja
> lojasAtivas = lojaService.
listarLojasAtivasEspacoCase();
for (Loja loja : lojasAtivas
) {
ProdutoHistoricoDetalhesDTO resumoLoja =
new ProdutoHistoricoDetalhesDTO
();
resumoLoja.
setLoja(loja
);
resumoLoja.
setQuantidadeLancamentos(0);
resumos.
add(resumoLoja
);
}
for (ProdutoHistoricoDetalhesDTO produtoHistoricoDetalhes : getProdutosHistoricoDetalhes
()) {
for (ProdutoHistoricoDetalhesDTO resumo : resumos
) {
if (resumo.
getLoja().
equals(produtoHistoricoDetalhes.
getLoja())) {
resumo.
setQuantidadeLancamentos(resumo.
getQuantidadeLancamentos()+
1);
}
}
}
setResumoProdutosHistoricoDetalhes
(resumos
);
}
public void excluirVinculo
(final FornecedorProduto fornecedorProduto
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
fornecedorProdutoService.
excluirPorFornecedorEeProduto(fornecedorProduto
);
setEntidade
(produtoService.
detalharProduto(fornecedorProduto.
getProduto()));
LancadorMensagem.
lancarSucesso("VÍNCULO EXCLUÍDO COM SUCESSO");
}
});
}
public void consultarMaisHistorico
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
setMesesConsultaHistorico
(getMesesConsultaHistorico
() +
12);
setProdutosHistorico
(produtoService.
consultarHistorico(getProdutoSelecionado
(), getMesesConsultaHistorico
()));
}
});
}
}