package br.com.ufrj.msi2.netuno.bean;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import br.com.ufrj.msi2.netuno.attributes.Attributes;
import br.com.ufrj.msi2.netuno.contratacao.servicos.ContratacaoService;
import br.com.ufrj.msi2.netuno.modelo.entidades.Carga;
import br.com.ufrj.msi2.netuno.modelo.entidades.CargaLog;
import br.com.ufrj.msi2.netuno.modelo.entidades.CargaPerecivel;
import br.com.ufrj.msi2.netuno.modelo.entidades.Contratante;
import br.com.ufrj.msi2.netuno.modelo.entidades.Contrato;
import br.com.ufrj.msi2.netuno.modelo.enums.FormaPagamentoEnum;
import br.com.ufrj.msi2.netuno.modelo.servicos.PortoService;
@ManagedBean(name="contratacaoController")
@ViewScoped
public class ContratacaoControllerBean extends MBean {
@EJB
ContratacaoService contratacaoService;
@EJB
private PortoService portoService;
@ManagedProperty(value="#{contratacaoModel}")
private ContratacaoModelBean contratacaoModelBean;
private boolean deveRedirecionarParaTelaDeAtendente;
private ResourceBundle contratacaoBundle;
@PostConstruct
public void construct() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
Contratante contratante = (Contratante) session.getAttribute(Attributes.SessionAttributes.CONTRATANTE.toString());
contratacaoModelBean.setContratante(contratante);
if(session.getAttribute(Attributes.SessionAttributes.VIAATENDENTE.toString()) == null) {
this.deveRedirecionarParaTelaDeAtendente = false;
} else {
if(session.getAttribute(Attributes.SessionAttributes.VIAATENDENTE.toString()).toString() == "atendente") {
this.deveRedirecionarParaTelaDeAtendente = true;
}
}
if(session.getAttribute(Attributes.SessionAttributes.CONTRATO.toString()) == null) {
contratacaoModelBean.setContrato(this.contratacaoService.criarContrato());
contratacaoModelBean.getContrato().setCargas(new ArrayList<Carga>());
} else {
Contrato contrato = (Contrato) session.getAttribute(Attributes.SessionAttributes.CONTRATO.toString());
Contrato contratoComCargas;
if(session.getAttribute(Attributes.SessionAttributes.CARREGACARGAS.toString()) != null) {
contratoComCargas = contratacaoService.recuperaContratoComCargas(contrato);
session.removeAttribute(Attributes.SessionAttributes.CARREGACARGAS.toString());
List<CargaLog> logs = new ArrayList<CargaLog>();
for(Carga carga : contratoComCargas.getCargas()) {
CargaLog cargaLog = this.contratacaoService.recuperaUltimoCargaLogDeCarga(carga);
if(cargaLog == null) {
cargaLog = new CargaLog();
}
logs.add(cargaLog);
}
contratacaoModelBean.setLogs(logs);
contratacaoModelBean.setModoVerDetalhes(true);
} else {
contratoComCargas = contrato;
}
contratacaoModelBean.setContrato(contratoComCargas);
if(contratacaoModelBean.getContrato().getEnderecoColeta() != null) {
contratacaoModelBean.setEnderecoColeta(true);
}
if(contratacaoModelBean.getContrato().getEnderecoEntrega() != null) {
contratacaoModelBean.setEnderecoEntrega(true);
}
}
contratacaoModelBean.setPortos(this.portoService.obterTodos());
contratacaoModelBean.setFormasPagamento(FormaPagamentoEnum.values());
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "contratacaoMsg");
this.contratacaoBundle = bundle;
}
/**
* Chama m�todo do service para estimar data de entrega das cargas do contrato.
*/
public void atualizarPrazo() {
this.contratacaoService.estimarDataEntrega(contratacaoModelBean.getContrato(), contratacaoModelBean.isEnderecoColeta(), contratacaoModelBean.isEnderecoEntrega());
}
/**
* Adiciona Carga ao Contrato
* @param isCargaPerecivel boolean. Se true, adiciona CargaPerecivel. Caso contr�rio, adiciona Carga.
*/
public void adicionarCarga(boolean isCargaPerecivel) {
Carga carga;
if(isCargaPerecivel) {
carga = new CargaPerecivel();
} else {
carga = new Carga();
}
contratacaoModelBean.getContrato().getCargas().add(carga);
carga.setContrato(contratacaoModelBean.getContrato());
}
/**
* Remove carga do contrato.
* @param carga escolhida pelo usu�rio
*/
public void removerCarga(Carga carga) {
contratacaoModelBean.getContrato().getCargas().remove(carga);
}
/**
* Valida dados do contrato e redireciona para a tela de fechar contrato.
* @return String de navega��o para a tela de fechar contrato.
*/
public String avancarParaFecharContrato() {
boolean valida = true;
if(!contratacaoModelBean.isEnderecoColeta()) {
contratacaoModelBean.getContrato().setEnderecoColeta(null);
}
if(!contratacaoModelBean.isEnderecoEntrega()) {
contratacaoModelBean.getContrato().setEnderecoEntrega(null);
}
if(contratacaoModelBean.getContrato().getPortoOrigem().equals(contratacaoModelBean.getContrato().getPortoDestino())) {
super.sendMessage(null, FacesMessage.SEVERITY_ERROR, this.contratacaoBundle.getString("contratacao.msg_portoOrigemEDestinoIguais"), null);
valida = false;
}
if(contratacaoModelBean.getContrato().getCargas().size() == 0) {
super.sendMessage(null, FacesMessage.SEVERITY_ERROR, this.contratacaoBundle.getString("contratacao.msg_erroSemCarga"), null);
valida = false;
}
for(Carga carga : contratacaoModelBean.getContrato().getCargas()) {
if(carga.getDataValidade() != null) {
if(carga.getDataValidade().before(contratacaoModelBean.getContrato().getDataEstimada())) {
super.sendMessage(null, FacesMessage.SEVERITY_ERROR, this.contratacaoBundle.getString("contratacao.msg_cargaPerecivelExpira"), null);
valida = false;
}
}
}
if(valida) {
this.contratacaoService.calcularPreco(contratacaoModelBean.getContrato(), contratacaoModelBean.isEnderecoColeta(), contratacaoModelBean.isEnderecoEntrega());
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
session.setAttribute(Attributes.SessionAttributes.CONTRATO.toString(), contratacaoModelBean.getContrato());
return "fecharContrato";
}
return null;
}
/**
* Redireciona para a tela inicial do usu�rio logado (Contratante ou Atendente).
* @return String de navega��o.
*/
public String cancelar() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
session.removeAttribute(Attributes.SessionAttributes.CONTRATANTE.toString());
session.removeAttribute(Attributes.SessionAttributes.CONTRATO.toString());
session.removeAttribute(Attributes.SessionAttributes.VIAATENDENTE.toString());
if(this.deveRedirecionarParaTelaDeAtendente) {
return "telaAtendente";
} else {
return "verContratos";
}
}
public ContratacaoService getContratacaoService() {
return contratacaoService;
}
public PortoService getPortoService() {
return portoService;
}
public ContratacaoModelBean getContratacaoModelBean() {
return contratacaoModelBean;
}
public boolean isDeveRedirecionarParaTelaDeAtendente() {
return deveRedirecionarParaTelaDeAtendente;
}
public ResourceBundle getContratacaoBundle() {
return contratacaoBundle;
}
public void setContratacaoService(ContratacaoService contratacaoService) {
this.contratacaoService = contratacaoService;
}
public void setPortoService(PortoService portoService) {
this.portoService = portoService;
}
public void setContratacaoModelBean(ContratacaoModelBean contratacaoModelBean) {
this.contratacaoModelBean = contratacaoModelBean;
}
public void setDeveRedirecionarParaTelaDeAtendente(
boolean deveRedirecionarParaTelaDeAtendente) {
this.deveRedirecionarParaTelaDeAtendente = deveRedirecionarParaTelaDeAtendente;
}
public void setContratacaoBundle(ResourceBundle contratacaoBundle) {
this.contratacaoBundle = contratacaoBundle;
}
}