package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.Collection;
import br.com.centralit.citcorpore.bean.CentroResultadoDTO;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.IntegranteViagemDTO;
import br.com.centralit.citcorpore.bean.ParecerDTO;
import br.com.centralit.citcorpore.bean.ProjetoDTO;
import br.com.centralit.citcorpore.bean.RequisicaoViagemDTO;
import br.com.centralit.citcorpore.bean.RoteiroViagemDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.integracao.CentroResultadoDao;
import br.com.centralit.citcorpore.integracao.EmpregadoDao;
import br.com.centralit.citcorpore.integracao.IntegranteViagemDao;
import br.com.centralit.citcorpore.integracao.ParecerDao;
import br.com.centralit.citcorpore.integracao.ProjetoDao;
import br.com.centralit.citcorpore.integracao.RequisicaoViagemDAO;
import br.com.centralit.citcorpore.integracao.RoteiroViagemDAO;
import br.com.centralit.citcorpore.integracao.SolicitacaoServicoDao;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.CrudDAO;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilStrings;
import br.com.citframework.util.WebUtil;
@SuppressWarnings("unchecked")
public class RequisicaoViagemServiceEjb extends ComplemInfSolicitacaoServicoServiceEjb implements RequisicaoViagemService {
private RequisicaoViagemDAO dao;
@Override
protected RequisicaoViagemDAO getDao() {
if (dao == null) {
dao = new RequisicaoViagemDAO();
}
return dao;
}
@Override
public IDto deserializaObjeto(final String serialize) throws Exception {
RequisicaoViagemDTO requisicaoViagemDto = null;
if (serialize != null) {
requisicaoViagemDto = (RequisicaoViagemDTO) WebUtil.deserializeObject(RequisicaoViagemDTO.class, serialize);
if (requisicaoViagemDto != null && requisicaoViagemDto.getIntegranteViagemSerialize() != null) {
requisicaoViagemDto.setIntegranteViagem(WebUtil.deserializeCollectionFromString(IntegranteViagemDTO.class, requisicaoViagemDto.getIntegranteViagemSerialize()));
}
}
return requisicaoViagemDto;
}
@Override
public void validaCreate(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
this.validaAtualizacao(solicitacaoServicoDto, model);
}
@Override
public void validaDelete(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {}
@Override
public void validaUpdate(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
this.validaAtualizacao(solicitacaoServicoDto, model);
}
public void validaAtualizacao(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
final RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model;
this.validaCentroResultado(requisicaoViagemDto);
this.validaProjeto(requisicaoViagemDto);
this.validaObrigatoriedade(requisicaoViagemDto);
}
public void validaObrigatoriedade(final RequisicaoViagemDTO requisicaoViagemDto) throws Exception {
if (requisicaoViagemDto.getIdCidadeOrigem() == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("citcorpore.comum.origem") + "] " + this.i18nMessage("rh.alertEObrigatorio")
+ "!");
}
if (requisicaoViagemDto.getIdCidadeDestino() == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("importmanager.destino") + "] " + this.i18nMessage("rh.alertEObrigatorio")
+ "!");
}
if (requisicaoViagemDto.getIdCidadeOrigem().equals(requisicaoViagemDto.getIdCidadeDestino())) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("citcorpore.comum.origem") + "] "
+ this.i18nMessage("si.comum.deveSerDiferente") + " [" + this.i18nMessage("importmanager.destino") + "] ");
}
if (requisicaoViagemDto.getDataInicioViagem() == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("itemControleFinanceiroViagem.ida") + "] "
+ this.i18nMessage("rh.alertEObrigatorio") + "!");
}
if (requisicaoViagemDto.getIdMotivoViagem() == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("requisicaoViagem.justificativa") + "] "
+ this.i18nMessage("rh.alertEObrigatorio") + "!");
}
if (requisicaoViagemDto.getDescricaoMotivo().equalsIgnoreCase("")) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("requisicaoViagem.motivo") + "] " + this.i18nMessage("rh.alertEObrigatorio")
+ "!");
}
if (requisicaoViagemDto.getDataInicioViagem().compareTo(UtilDatas.getDataAtual()) < 0) {
throw new LogicException(this.i18nMessage("solicitacaoliberacao.validacao.datainiciomenoratual"));
}
if (UtilStrings.nullToVazio(requisicaoViagemDto.getEstado()).equalsIgnoreCase(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO)) {
if (requisicaoViagemDto.getIntegranteViagem() == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("requisicaoViagem.integranteFuncionario") + "] "
+ this.i18nMessage("rh.alertEObrigatorio") + "!");
}
}
}
private void validaProjeto(final RequisicaoViagemDTO requisicaoViagemDto) throws Exception {
ProjetoDTO projetoDto = null;
if (requisicaoViagemDto.getIdProjeto() != null) {
projetoDto = new ProjetoDTO();
projetoDto.setIdProjeto(requisicaoViagemDto.getIdProjeto());
projetoDto = (ProjetoDTO) new ProjetoDao().restore(projetoDto);
}
if (projetoDto == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("lookup.projeto") + "] " + this.i18nMessage("rh.alertEObrigatorio") + "!");
}
if (projetoDto.getIdProjetoPai() == null) {
throw new LogicException(this.i18nMessage("requisicaoViagem.mensagemProjeto"));
}
}
private void validaCentroResultado(final RequisicaoViagemDTO requisicaoViagemDto) throws Exception {
CentroResultadoDTO centroCustoDto = null;
if (requisicaoViagemDto.getIdCentroCusto() != null) {
centroCustoDto = new CentroResultadoDTO();
centroCustoDto.setIdCentroResultado(requisicaoViagemDto.getIdCentroCusto());
centroCustoDto = (CentroResultadoDTO) new CentroResultadoDao().restore(centroCustoDto);
}
if (centroCustoDto == null) {
throw new LogicException(this.i18nMessage("rh.alertOCampo") + " [" + this.i18nMessage("centroResultado") + "] " + this.i18nMessage("rh.alertEObrigatorio") + "!");
}
if (centroCustoDto.getIdCentroResultadoPai() == null || centroCustoDto.getPermiteRequisicaoProduto() == null
|| !centroCustoDto.getPermiteRequisicaoProduto().equalsIgnoreCase("S")) {
throw new LogicException(this.i18nMessage("requisicaoViagem.mensagemCentroResultado"));
}
}
@Override
public IDto create(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model;
requisicaoViagemDto.setEstado(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
final SolicitacaoServicoDao solicitacaoServicoDao = new SolicitacaoServicoDao();
final RequisicaoViagemDAO requisicaoViagemDao = this.getDao();
final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao();
final RoteiroViagemDAO roteiroViagemDAO = new RoteiroViagemDAO();
this.validaCreate(solicitacaoServicoDto, model);
requisicaoViagemDao.setTransactionControler(tc);
integranteViagemDao.setTransactionControler(tc);
solicitacaoServicoDao.setTransactionControler(tc);
roteiroViagemDAO.setTransactionControler(tc);
if (solicitacaoServicoDto.getIdSolicitacaoServico() != null) {
requisicaoViagemDto.setIdSolicitacaoServico(solicitacaoServicoDto.getIdSolicitacaoServico());
requisicaoViagemDto.setRemarcacao("N");
if (requisicaoViagemDto.getDataFimViagem() == null) {
requisicaoViagemDto.setDataFimViagem(requisicaoViagemDto.getDataInicioViagem());
}
requisicaoViagemDto = (RequisicaoViagemDTO) requisicaoViagemDao.create(requisicaoViagemDto);
}
if (requisicaoViagemDto.getIntegranteViagemSerialize() != null) {
for (IntegranteViagemDTO integranteViagemDto : requisicaoViagemDto.getIntegranteViagem()) {
integranteViagemDto.setIdSolicitacaoServico(requisicaoViagemDto.getIdSolicitacaoServico());
integranteViagemDto.setIdEmpregado(integranteViagemDto.getIdEmpregado());
integranteViagemDto.setRemarcacao("N");
if (integranteViagemDto.getIdRespPrestacaoContas() == null || integranteViagemDto.getIdRespPrestacaoContas() == 0) {
integranteViagemDto.setIdRespPrestacaoContas(integranteViagemDto.getIdEmpregado());
}
integranteViagemDto.setEstado(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
integranteViagemDto = (IntegranteViagemDTO) integranteViagemDao.create(integranteViagemDto);
final RoteiroViagemDTO roteiroViagemDTO = new RoteiroViagemDTO();
roteiroViagemDTO.setDataInicio(UtilDatas.getDataAtual());
roteiroViagemDTO.setIdSolicitacaoServico(solicitacaoServicoDto.getIdSolicitacaoServico());
roteiroViagemDTO.setIdIntegrante(integranteViagemDto.getIdIntegranteViagem());
roteiroViagemDTO.setOrigem(requisicaoViagemDto.getIdCidadeOrigem());
roteiroViagemDTO.setDestino(requisicaoViagemDto.getIdCidadeDestino());
roteiroViagemDTO.setIda(requisicaoViagemDto.getDataInicioViagem());
if (requisicaoViagemDto.getDataFimViagem() != null) {
roteiroViagemDTO.setVolta(requisicaoViagemDto.getDataFimViagem());
} else {
roteiroViagemDTO.setVolta(requisicaoViagemDto.getDataInicioViagem());
}
roteiroViagemDAO.create(roteiroViagemDTO);
}
}
return requisicaoViagemDto;
}
@Override
public void update(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
final RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model;
ParecerDTO parecerDto = new ParecerDTO();
final ParecerDao parecerDao = new ParecerDao();
final RequisicaoViagemDAO requisicaoViagemDao = this.getDao();
final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao();
parecerDao.setTransactionControler(tc);
requisicaoViagemDao.setTransactionControler(tc);
integranteViagemDao.setTransactionControler(tc);
final RequisicaoViagemDTO bean = (RequisicaoViagemDTO) model;
if (bean != null && bean.getCancelarRequisicao() != null && bean.getCancelarRequisicao().equalsIgnoreCase("S")) {
solicitacaoServicoDto.setSituacao(Enumerados.SituacaoSolicitacaoServico.Cancelada.name());
requisicaoViagemDao.updateNotNull(bean);
return;
}
if (solicitacaoServicoDto.getIdSolicitante().intValue() == solicitacaoServicoDto.getUsuarioDto().getIdEmpregado().intValue()
&& !solicitacaoServicoDto.getSituacao().equalsIgnoreCase(Enumerados.SituacaoSolicitacaoServico.Cancelada.name())) {
throw new LogicException("Usu�rio sem permiss�o para Execu��o!");
}
this.validaUpdate(solicitacaoServicoDto, model);
requisicaoViagemDto.setEstado(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
parecerDto.setIdJustificativa(requisicaoViagemDto.getIdJustificativaAutorizacao());
parecerDto.setIdResponsavel(solicitacaoServicoDto.getUsuarioDto().getIdEmpregado());
parecerDto.setObservacoes(requisicaoViagemDto.getObservacoes());
parecerDto.setComplementoJustificativa(requisicaoViagemDto.getComplemJustificativaAutorizacao());
parecerDto.setAprovado(requisicaoViagemDto.getAutorizado());
parecerDto.setDataHoraParecer(UtilDatas.getDataHoraAtual());
parecerDto = (ParecerDTO) parecerDao.create(parecerDto);
if (parecerDto != null) {
requisicaoViagemDto.setIdAprovacao(parecerDto.getIdParecer());
if (requisicaoViagemDto.getRemarcacao() == null || requisicaoViagemDto.getRemarcacao().trim().equals("")) {
requisicaoViagemDto.setRemarcacao("N");
}
requisicaoViagemDao.updateNotNull(requisicaoViagemDto);
}
if (requisicaoViagemDto.getIntegranteViagemSerialize() != null) {
for (final IntegranteViagemDTO integranteViagemDto : requisicaoViagemDto.getIntegranteViagem()) {
integranteViagemDto.setIdSolicitacaoServico(requisicaoViagemDto.getIdSolicitacaoServico());
integranteViagemDto.setIdEmpregado(integranteViagemDto.getIdEmpregado());
if (integranteViagemDto.getIntegranteFuncionario().equals("S")) {
if (!integranteViagemDao.verificarSeIntegranteViagemExiste(integranteViagemDto.getIdSolicitacaoServico(), integranteViagemDto.getIdEmpregado())) {
integranteViagemDto.setEstado(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
integranteViagemDao.create(integranteViagemDto);
}
}
}
}
}
@Override
public void update(final IDto model) throws ServiceException {
// Instancia Objeto controlador de transacao
final CrudDAO crudDao = this.getDao();
TransactionControler tc = null;
try {
tc = this.getDao().getTransactionControler();
// Faz validacao, caso exista.
this.validaUpdate(model);
// Seta o TransactionController para os DAOs
crudDao.setTransactionControler(tc);
// Executa operacoes pertinentes ao negocio.
crudDao.update(model);
} catch (final Exception e) {
e.printStackTrace();
}
}
/**
* TODO Este metodo esta em desuso, pode ser removido na proxima vers�o
*/
public void atualizarRemarcacaoDeViagem(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
final RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model;
ParecerDTO parecerDto = new ParecerDTO();
final ParecerDao parecerDao = new ParecerDao();
final RequisicaoViagemDAO requisicaoViagemDao = this.getDao();
final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao();
this.validaUpdate(solicitacaoServicoDto, model);
parecerDao.setTransactionControler(tc);
requisicaoViagemDao.setTransactionControler(tc);
integranteViagemDao.setTransactionControler(tc);
requisicaoViagemDto.setEstado(RequisicaoViagemDTO.REMARCADO);
parecerDto.setIdJustificativa(requisicaoViagemDto.getIdJustificativaAutorizacao());
parecerDto.setIdResponsavel(solicitacaoServicoDto.getUsuarioDto().getIdEmpregado());
parecerDto.setObservacoes(requisicaoViagemDto.getObservacoes());
parecerDto.setComplementoJustificativa(requisicaoViagemDto.getComplemJustificativaAutorizacao());
parecerDto.setAprovado(requisicaoViagemDto.getAutorizado());
parecerDto.setDataHoraParecer(UtilDatas.getDataHoraAtual());
parecerDto = (ParecerDTO) parecerDao.create(parecerDto);
if (parecerDto != null) {
requisicaoViagemDto.setIdAprovacao(parecerDto.getIdParecer());
requisicaoViagemDao.updateNotNull(requisicaoViagemDto);
}
if (requisicaoViagemDto.getIntegranteViagemSerialize() != null) {
for (final IntegranteViagemDTO integranteViagemDto : requisicaoViagemDto.getIntegranteViagem()) {
integranteViagemDto.setIdSolicitacaoServico(requisicaoViagemDto.getIdSolicitacaoServico());
integranteViagemDto.setIdEmpregado(integranteViagemDto.getIdEmpregado());
if (integranteViagemDto.getIntegranteFuncionario().equals("S")) {
if (!integranteViagemDao.verificarSeIntegranteViagemExiste(integranteViagemDto.getIdSolicitacaoServico(), integranteViagemDto.getIdEmpregado())) {
integranteViagemDao.create(integranteViagemDto);
}
}
}
}
}
@Override
public void delete(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
}
/**
* Retorna uma cole��o com todos os integrantes adicionados em uma solicita��o de viagem.
*
* @param idSolicitacaoServico
* @return
* @throws Exception
*/
@Override
public Collection<IntegranteViagemDTO> recuperaIntegrantesViagemBySolicitacao(final Integer idSolicitacao) throws Exception {
final Collection<IntegranteViagemDTO> colIntegrantesViagem = new ArrayList<IntegranteViagemDTO>();
final IntegranteViagemDao integranteDao = new IntegranteViagemDao();
final EmpregadoDao empregadoDao = new EmpregadoDao();
EmpregadoDTO empregado;
final Collection<IntegranteViagemDTO> colIntegrantAux = integranteDao.findAllByIdSolicitacao(idSolicitacao);
if (colIntegrantAux != null) {
for (final IntegranteViagemDTO integrante : colIntegrantAux) {
empregado = empregadoDao.restoreByIdEmpregado(integrante.getIdEmpregado());
integrante.setNome(empregado.getNome());
integrante.setEmail(empregado.getEmail());
if (integrante.getIdRespPrestacaoContas() == null) {
integrante.setRespPrestacaoContas(empregado.getNome());
} else {
integrante.setRespPrestacaoContas(this.recuperarNome(integrante.getIdRespPrestacaoContas()));
}
colIntegrantesViagem.add(integrante);
}
}
return colIntegrantesViagem;
}
public String recuperarNome(final Integer idEmpregado) throws Exception {
final EmpregadoDao dao = new EmpregadoDao();
EmpregadoDTO empregadoDto = new EmpregadoDTO();
empregadoDto = dao.restoreByIdEmpregado(idEmpregado);
return empregadoDto.getNome();
}
@Override
public RequisicaoViagemDTO recuperaRequisicaoPelaSolicitacao(final Integer idSolicitacao) throws Exception {
return this.getDao().findByIdSolicitacao(idSolicitacao);
}
}