package br.com.ec.controller.managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletContext;
import org.primefaces.model.StreamedContent;
import org.springframework.context.annotation.Scope;
import br.com.ec.core.consulta.ParametrosConsulta;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.EtiquetaDTO;
import br.com.ec.domain.model.Compra;
import br.com.ec.domain.model.CompraProduto;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.service.compraproduto.CompraProdutoService;
import br.com.ec.domain.service.etiqueta.EtiquetaService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.domain.shared.Ordenador;
import br.com.ec.domain.shared.OrdenadorImpl;
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 EtiquetaBean
extends AbstractBean
<EtiquetaDTO
> implements Serializable {
private static final long serialVersionUID = 1L
;
private CompraProdutoService compraProdutoService
;
private EtiquetaService etiquetaService
;
private ProdutoService produtoService
;
private List<EtiquetaDTO
> etiquetas
;
private Long loteCompra
;
private String codigoProduto
;
private Ordenador ordenador
;
@Inject
public EtiquetaBean
(CompraProdutoService compraProdutoService, EtiquetaService etiquetaService, ProdutoService produtoService
) {
this.
compraProdutoService = compraProdutoService
;
this.
etiquetaService = etiquetaService
;
this.
produtoService = produtoService
;
this.
ordenador =
new OrdenadorImpl
();
}
@
Override
public void preCarregamento
() {
entidade =
new EtiquetaDTO
();
parametrosConsulta =
new ParametrosConsulta
<EtiquetaDTO
>();
parametrosConsulta.
setEntidade(entidade
);
}
@
Override
public void limparEntidade
() {
EtiquetaDTO etiqueta =
new EtiquetaDTO
();
setEntidade
(etiqueta
);
setCodigoProduto
("");
}
@
Override
public GenericService
<EtiquetaDTO
> getService
() {
return null;
}
@
Override
public EtiquetaDTO getEntidade
() {
return entidade
;
}
@
Override
public EtiquetaDTO getId
() {
return getEntidade
();
}
public List<EtiquetaDTO
> getEtiquetas
() {
return etiquetas
;
}
public void setEtiquetas
(List<EtiquetaDTO
> etiquetas
) {
this.
etiquetas = etiquetas
;
}
public Long getLoteCompra
() {
return loteCompra
;
}
public void setLoteCompra
(Long loteCompra
) {
this.
loteCompra = loteCompra
;
}
public String getCodigoProduto
() {
return codigoProduto
;
}
public void setCodigoProduto
(String codigoProduto
) {
this.
codigoProduto = codigoProduto
;
}
/***************************************************************/
public void prepararProdutosParaEtiquetas
() {
limparEntidade
();
setEtiquetas
(new ArrayList<EtiquetaDTO
>());
preDetalhar
(getEntidade
());
}
public void prepararProdutosParaEtiquetas
(Compra compra
) {
limparEntidade
();
preencherEtiquetas
(compraProdutoService.
consultarProdutosDaCompra(compra
));
setEtiquetas
((List<EtiquetaDTO
>) ordenador.
ordenar(getEtiquetas
()));
preDetalhar
(getEntidade
());
}
public void preencherEtiquetas
(List<CompraProduto
> listaCompraProduto
) {
setEtiquetas
(new ArrayList<EtiquetaDTO
>());
for (CompraProduto compraProduto : listaCompraProduto
) {
EtiquetaDTO etiqueta =
new EtiquetaDTO
();
etiqueta.
setProduto(compraProduto.
getProduto());
etiqueta.
setQuantidade(compraProduto.
getQuantidade());
etiqueta.
setLote(compraProduto.
getCompra().
getSequencial());
getEtiquetas
().
add(etiqueta
);
}
}
public void removerProduto
(final EtiquetaDTO etiqueta
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEtiquetas
().
remove(etiqueta
);
LancadorMensagem.
lancarSucesso("Etiqueta removida com sucesso!");
}
});
}
public void escolherProduto
(Produto produto
) {
limparEntidade
();
getEntidade
().
setProduto(produto
);
}
public void consultarProduto
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Produto produtoSelecionado = produtoService.
consultarProdutoPorCodigoOuCodigoEAN(getCodigoProduto
());
if (produtoSelecionado
!=
null) {
getEntidade
().
setProduto(produtoSelecionado
);
getEntidade
().
setLote(getLoteCompra
());
adicionandoParametroArgsConfirmandoAcao
(true);
} else {
LancadorMensagem.
lancarErro("Produto não encontrado");
}
}
});
}
public void adicionarEtiqueta
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
if (VerificadorUtil.
estaNuloOuVazio(getEntidade
().
getProduto().
getValorVarejo())) {
throw new NegocioException
("Não é possível gerar etiqueta sem preço");
}
getEtiquetas
().
add(getEntidade
());
limparEntidade
();
LancadorMensagem.
lancarSucesso("Etiqueta adicionada com sucesso!");
}
});
}
public StreamedContent emitirEtiquetasComBarras
() {
List<EtiquetaDTO
> etiquetas = adicionarEtiquetas
();
return etiquetaService.
gerarEtiquetas(etiquetas,
((ServletContext
)FacesContext.
getCurrentInstance().
getExternalContext().
getContext()),
true,
false);
}
public StreamedContent emitirEtiquetasComBarrasAtacado
() {
List<EtiquetaDTO
> etiquetas = adicionarEtiquetas
();
return etiquetaService.
gerarEtiquetas(etiquetas,
((ServletContext
)FacesContext.
getCurrentInstance().
getExternalContext().
getContext()),
true,
true);
}
public StreamedContent emitirEtiquetasSemBarras
() throws Exception {
List<EtiquetaDTO
> etiquetas = adicionarEtiquetas
();
return etiquetaService.
gerarEtiquetas(etiquetas,
((ServletContext
)FacesContext.
getCurrentInstance().
getExternalContext().
getContext()),
false,
false);
}
private List<EtiquetaDTO
> adicionarEtiquetas
() {
List<EtiquetaDTO
> etiquetas =
new ArrayList<EtiquetaDTO
>();
for (EtiquetaDTO etiqueta : getEtiquetas
()) {
Integer quantidadeEmitir = etiqueta.
getQuantidade();
for (int i =
1; i
<= quantidadeEmitir
; i++
) {
etiquetas.
add(etiqueta
);
}
}
return etiquetas
;
}
public int getQuantidadeItens
() {
if (VerificadorUtil.
naoEstaNulo(getEtiquetas
())) {
Integer quantidade =
0;
for (EtiquetaDTO etiqueta : getEtiquetas
()) {
quantidade = quantidade + etiqueta.
getQuantidade();
}
return quantidade
;
}
return 0;
}
public int getQuantidadePaginas
() {
return VerificadorUtil.
naoEstaNulo(getEtiquetas
()) ? getQuantidadeItens
() > 0 ? ((getQuantidadeItens
() / ConstantesSEC.
Etiqueta.
QUANTIDADE_MAXIMA_POR_FOLHA) +
1) :
0 :
0;
}
public int getQuantidadeEtiquetasVazias
() {
return VerificadorUtil.
naoEstaNulo(getEtiquetas
()) ? getQuantidadeItens
() > 0 ? (ConstantesSEC.
Etiqueta.
QUANTIDADE_MAXIMA_POR_FOLHA -
(getQuantidadeItens
() % ConstantesSEC.
Etiqueta.
QUANTIDADE_MAXIMA_POR_FOLHA)) :
0 :
0;
}
}