package br.com.ec.controller.managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.StreamedContent;
import org.springframework.context.annotation.Scope;
import br.com.ec.controller.managedbean.consultademanda.PedidoConsultaPorDemanda;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.ParametrosConsultaPedidoDTO;
import br.com.ec.domain.dto.PedidoDTO;
import br.com.ec.domain.model.Cliente;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Pedido;
import br.com.ec.domain.model.PedidoHistorico;
import br.com.ec.domain.model.PedidoProduto;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.tipos.TipoPedido;
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
import br.com.ec.domain.model.tipos.TipoSituacaoPedidoResumido;
import br.com.ec.domain.service.cliente.ClienteService;
import br.com.ec.domain.service.loja.LojaService;
import br.com.ec.domain.service.pedido.PedidoService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandRelatorioStreamedContent;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
import br.com.ec.web.util.TipoOperacao;
@Named
@Scope
("view")
public class PedidoBean
extends AbstractBean
<Pedido
> implements Serializable {
private static final long serialVersionUID = 1L
;
private PedidoConsultaPorDemanda lazy
;
private Loja lojaSelecionada
;
private String senhaUsuario
;
private String cpfCliente
;
private String codigoProduto
;
private Produto produtoSelecionado
;
private Double valorProdutoSelecionado
;
private Integer quantidadeProdutoSelecionado
;
private String observacaoProdutoSelecionado
;
private PedidoHistorico pedidoHistorico
;
private PedidoDTO pedidoParaImpressao
;
private PedidoService pedidoService
;
private ClienteService clienteService
;
private ProdutoService produtoService
;
private UsuarioService usuarioService
;
private LojaService lojaService
;
@Inject
public PedidoBean
(PedidoConsultaPorDemanda lazy, PedidoService pedidoService, ClienteService clienteService,
ProdutoService produtoService, UsuarioService usuarioService, LojaService lojaService
) {
this.
lazy = lazy
;
this.
pedidoService = pedidoService
;
this.
clienteService = clienteService
;
this.
produtoService = produtoService
;
this.
usuarioService = usuarioService
;
this.
lojaService = lojaService
;
}
@
Override
public void preCarregamento
() {
limparEntidade
();
preencherLojaPeloParametro
();
limparParametros
();
prepararConsultaDemanda
();
}
@
Override
public void preConsultar
() {
setTipoOperacao
(TipoOperacao.
CONSULTAR);
prepararConsultaDemanda
();
}
@
Override
public void preCadastrar
() {
super.
preCadastrar();
getEntidade
().
setLoja(getLojaSelecionada
());
entidade.
setTipoPedido(TipoPedido.
RESERVA.
getValor());
}
private void preencherLojaPeloParametro
() {
if (VerificadorUtil.
naoEstaNulo(getParametro
("sequencialLoja"))) {
setLojaSelecionada
(lojaService.
consultarPorId(new Loja
(new Long(getParametro
("sequencialLoja").
toString()))));
getEntidade
().
setLoja(getLojaSelecionada
());
}
}
@
Override
public void preAlterar
(Pedido pedido
) {
pedido = pedidoService.
consultarPedidoCompleto(pedido
);
super.
preAlterar(pedido
);
}
public void prepararAtendimento
(Pedido pedido
) {
limparEntidade
();
setTipoOperacao
(TipoOperacao.
REALIZAR);
pedido = pedidoService.
consultarPedidoCompleto(pedido
);
setEntidade
(pedido
);
PedidoHistorico pedidoHistorico =
new PedidoHistorico
();
pedidoHistorico.
setTipoSituacao(pedido.
getTipoSituacao());
pedidoHistorico.
setDataHistorico(DataUtils.
getDataAtual());
pedidoHistorico.
setPedido(pedido
);
setPedidoHistorico
(pedidoHistorico
);
prepararImpressao
(pedido
);
}
@
Override
public void limparEntidade
() {
entidade =
new Pedido
();
setSenhaUsuario
("");
setQuantidadeProdutoSelecionado
(1);
}
public void limparParametros
() {
parametrosConsulta =
new ParametrosConsultaPedidoDTO
();
parametrosConsulta.
setEntidade(entidade
);
((ParametrosConsultaPedidoDTO
)parametrosConsulta
).
setAtendido(false);
}
@
Override
public GenericService
<Pedido
> getService
() {
return pedidoService
;
}
@
Override
public Pedido getEntidade
() {
return entidade
;
}
@
Override
public Pedido getId
() {
return getEntidade
();
}
public PedidoConsultaPorDemanda getLazy
() {
return lazy
;
}
public void setLazy
(PedidoConsultaPorDemanda lazy
) {
this.
lazy = lazy
;
}
public void prepararConsultaDemanda
() {
lazy.
setarParametrosConsulta(getParametrosConsulta
());
}
public Loja getLojaSelecionada
() {
return lojaSelecionada
;
}
public void setLojaSelecionada
(Loja lojaSelecionada
) {
this.
lojaSelecionada = lojaSelecionada
;
}
public String getSenhaUsuario
() {
return senhaUsuario
;
}
public void setSenhaUsuario
(String senhaUsuario
) {
this.
senhaUsuario = senhaUsuario
;
}
public String getCpfCliente
() {
return VerificadorUtil.
naoEstaNulo(cpfCliente
)? cpfCliente.
replace(".",
"").
replace("-",
"") : cpfCliente
;
}
public void setCpfCliente
(String cpfCliente
) {
this.
cpfCliente = cpfCliente
;
}
public String getCodigoProduto
() {
return codigoProduto
;
}
public void setCodigoProduto
(String codigoProduto
) {
this.
codigoProduto = codigoProduto
;
}
public Produto getProdutoSelecionado
() {
return produtoSelecionado
;
}
public void setProdutoSelecionado
(Produto produtoSelecionado
) {
this.
produtoSelecionado = produtoSelecionado
;
}
public Double getValorProdutoSelecionado
() {
return valorProdutoSelecionado
;
}
public void setValorProdutoSelecionado
(Double valorProdutoSelecionado
) {
this.
valorProdutoSelecionado = valorProdutoSelecionado
;
}
public Integer getQuantidadeProdutoSelecionado
() {
return quantidadeProdutoSelecionado
;
}
public void setQuantidadeProdutoSelecionado
(Integer quantidadeProdutoSelecionado
) {
this.
quantidadeProdutoSelecionado = quantidadeProdutoSelecionado
;
}
public String getObservacaoProdutoSelecionado
() {
return observacaoProdutoSelecionado
;
}
public void setObservacaoProdutoSelecionado
(String observacaoProdutoSelecionado
) {
this.
observacaoProdutoSelecionado = StringUtil.
setarUpperCaseComTrim(observacaoProdutoSelecionado
);
}
public PedidoHistorico getPedidoHistorico
() {
return pedidoHistorico
;
}
public void setPedidoHistorico
(PedidoHistorico pedidoHistorico
) {
this.
pedidoHistorico = pedidoHistorico
;
}
public TipoSituacaoPedido
[] getTiposSituacaoPedido
() {
return TipoSituacaoPedido.
values();
}
public TipoSituacaoPedidoResumido
[] getTiposSituacaoPedidoResumido
() {
return TipoSituacaoPedidoResumido.
values();
}
public TipoPedido
[] getTiposPedido
() {
return TipoPedido.
values();
}
public PedidoDTO getPedidoParaImpressao
() {
return pedidoParaImpressao
;
}
public void setPedidoParaImpressao
(PedidoDTO pedidoParaImpressao
) {
this.
pedidoParaImpressao = pedidoParaImpressao
;
}
public Long getSequencialDoPedidoParaImpressao
() {
return VerificadorUtil.
naoEstaNulo(getPedidoParaImpressao
())? getPedidoParaImpressao
().
getSequencial() :
null;
}
/***************************************************************/
@
Override
public void cadastrar
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
setEntidade
(pedidoService.
adicionarPedido(getEntidade
(), senhaUsuario
));
prepararImpressao
(getEntidade
());
LancadorMensagem.
lancarSucesso("PEDIDO ADICIONADO COM SUCESSO: " + getEntidade
().
getSequencial());
limparEntidade
();
getEntidade
().
setTipoPedido(TipoPedido.
RESERVA.
getValor());
getEntidade
().
setLoja(getLojaSelecionada
());
}
});
}
public PedidoDTO prepararImpressao
(Pedido pedido
) {
PedidoDTO pedidoParaImpressao =
new PedidoDTO
();
pedidoParaImpressao.
preencher(pedido
);
setPedidoParaImpressao
(pedidoParaImpressao
);
return pedidoParaImpressao
;
}
@
Override
public void alterar
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setDataUltimaAlteracaoSituacao(DataUtils.
getDataAtual());
getEntidade
().
setUsuarioAtendimento(usuarioService.
consultarUsuarioPorSenha(senhaUsuario
));
if (VerificadorUtil.
naoEstaNuloOuVazio(getEntidade
().
getProdutos())) {
Produto primeiroProduto = getEntidade
().
getProdutos().
get(0).
getProduto();
if (primeiroProduto.
getCodigo().
equals("000000") && getEntidade
().
getProdutos().
size() > 1) {
primeiroProduto = getEntidade
().
getProdutos().
get(1).
getProduto();
}
getEntidade
().
setModelo(primeiroProduto.
getModelo());
getEntidade
().
setGenero(primeiroProduto.
getGenero());
}
alterar
(getEntidade
());
}
});
}
public void atenderPedido
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setDataUltimaAlteracaoSituacao(DataUtils.
getDataAtual());
getEntidade
().
setTipoSituacao(getPedidoHistorico
().
getTipoSituacao());
getEntidade
().
setUsuarioAtendimento(usuarioService.
consultarUsuarioPorSenha(senhaUsuario
));
getPedidoHistorico
().
setUsuario(getEntidade
().
getUsuarioAtendimento());
if (VerificadorUtil.
estaNulo(getEntidade
().
getHistorico())) {
getEntidade
().
setHistorico(new ArrayList<PedidoHistorico
>());
}
getEntidade
().
getHistorico().
add(getPedidoHistorico
());
pedidoService.
alterar(getEntidade
());
LancadorMensagem.
lancarSucesso("ATENDIMENTO REALIZADO COM SUCESSO: " + getEntidade
().
getSequencial());
preConsultar
();
}
});
}
public void excluirPedido
(final Pedido pedido
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Pedido pedidoParaExcluir = pedidoService.
consultarPorId(pedido
);
pedidoService.
excluirHistoricosDoPedido(pedidoParaExcluir
);
pedidoService.
excluir(pedidoParaExcluir
);
LancadorMensagem.
lancarSucesso("PEDIDO EXCLUÍDO COM SUCESSO!");
}
});
}
public void selecionarCliente
(final Cliente cliente
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
cliente.
setAtivo(true);
clienteService.
alterar(cliente
);
getEntidade
().
setCliente(clienteService.
consultarClientePorCpfCnpj(cliente.
getCpfCnpj()));
getEntidade
().
setObservacao(getEntidade
().
getObservacao() +
"\n" + getEntidade
().
getCliente().
getEndereco());
setCpfCliente
(null);
adicionandoParametroArgsConfirmandoAcao
(true);
}
});
}
public void retirarCliente
() {
getEntidade
().
setCliente(null);
}
public void consultarProduto
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Produto produtoSelecionado = produtoService.
consultarProdutoPorCodigoOuCodigoEAN(getCodigoProduto
());
if (VerificadorUtil.
naoEstaNulo(produtoSelecionado
)) {
setObservacaoProdutoSelecionado
("");
setQuantidadeProdutoSelecionado
(1);
setProdutoSelecionado
(produtoSelecionado
);
if (VerificadorUtil.
naoEstaNulo(produtoSelecionado.
getValorVarejoPromocional())) {
setValorProdutoSelecionado
(produtoSelecionado.
getValorVarejoPromocional());
} else {
setValorProdutoSelecionado
(produtoSelecionado.
getValorVarejo());
}
}
}
});
}
public void selecionarProduto
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
if (VerificadorUtil.
estaNulo(getEntidade
().
getProdutos())) {
getEntidade
().
setProdutos(new ArrayList<PedidoProduto
>());
}
PedidoProduto pedidoProduto =
new PedidoProduto
();
pedidoProduto.
setPedido(getEntidade
());
pedidoProduto.
setProduto(getProdutoSelecionado
());
if (getEntidade
().
getProdutos().
contains(pedidoProduto
)) {
throw new NegocioException
("PRODUTO JÁ ADICIONADO");
}
pedidoProduto.
setValor(getValorProdutoSelecionado
());
pedidoProduto.
setQuantidade(getQuantidadeProdutoSelecionado
());
pedidoProduto.
setObservacao(getObservacaoProdutoSelecionado
());
getEntidade
().
getProdutos().
add(pedidoProduto
);
setCodigoProduto
("");
getEntidade
().
setModelo(produtoSelecionado.
getModelo());
getEntidade
().
setGenero(produtoSelecionado.
getGenero());
LancadorMensagem.
lancarSucesso("PRODUTO ADICIONADO COM SUCESSO");
}
});
}
public void retirarProduto
(final PedidoProduto pedidoProduto
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
getProdutos().
remove(pedidoProduto
);
setCodigoProduto
("");
LancadorMensagem.
lancarSucesso("PRODUTO RETIRADO COM SUCESSO");
}
});
}
public void solicitarCompra
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setDataSolicitadoParaComprar(DataUtils.
getDataAtual());
pedidoService.
alterar(getEntidade
());
LancadorMensagem.
lancarSucesso("PEDIDO SOLICITADO PARA COMPRAR");
}
});
}
public void retirarSolicitacaoDeCompra
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setDataSolicitadoParaComprar(null);
pedidoService.
alterar(getEntidade
());
LancadorMensagem.
lancarSucesso("PEDIDO RETIRADO DA SOLICITAÇÃO DE COMPRA");
}
});
}
public void iniciarPedidoPadrao
() {
entidade.
setTipoPedido(TipoPedido.
RESERVA.
getValor());
}
public void iniciarPedidoAssistencia
() {
entidade.
setTipoPedido(TipoPedido.
ASSISTENCIA.
getValor());
}
public StreamedContent downloadPlanilha
() {
return new VerificadorLancamentoException
().
verificarLancamentoException(new CommandRelatorioStreamedContent
() {
@
Override
public StreamedContent execute
() {
return pedidoService.
gerarArquivoExcel(getParametrosConsulta
());
// return RelatorioUtils.gerarArquivo(arquivo, "recibo", TipoExtensao.parse(extensao).getValue());
}
});
}
}