package br.com.centralit.citcorpore.negocio;
import java.sql.Timestamp;
import java.util.Collection;
import br.com.centralit.citcorpore.bean.DespesaViagemDTO;
import br.com.centralit.citcorpore.bean.IntegranteViagemDTO;
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.DespesaViagemDAO;
import br.com.centralit.citcorpore.integracao.IntegranteViagemDao;
import br.com.centralit.citcorpore.integracao.RequisicaoViagemDAO;
import br.com.centralit.citcorpore.integracao.RoteiroViagemDAO;
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.TransactionControler;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.WebUtil;
public class DespesaViagemServiceEjb extends ComplemInfSolicitacaoServicoServiceEjb implements DespesaViagemService {
private DespesaViagemDAO dao;
@Override
protected DespesaViagemDAO getDao() {
if (dao == null) {
dao = new DespesaViagemDAO();
}
return dao;
}
@Override
public IDto deserializaObjeto(final String serialize) throws Exception {
DespesaViagemDTO despesaViagemDTO = null;
if (serialize != null) {
despesaViagemDTO = (DespesaViagemDTO) WebUtil.deserializeObject(DespesaViagemDTO.class, serialize);
}
return despesaViagemDTO;
}
@Override
public void validaCreate(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
if (!this.validaPrazoItens(solicitacaoServicoDto.getIdSolicitacaoServico())) {
throw new LogicException("Prazo cota��o expirado ou maior que a data fim viagem, favor refazer a cota��o dos itens novamente!");
}
}
@Override
public void validaDelete(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
}
@Override
public void validaUpdate(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
if (!this.validaPrazoItens(solicitacaoServicoDto.getIdSolicitacaoServico())) {
throw new LogicException("Prazo cota��o expirado ou maior que a data fim viagem, favor refazer a cota��o dos itens novamente!");
}
}
@Override
public IDto create(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
return null;
}
@Override
public IDto create(IDto model) throws ServiceException, LogicException {
try {
model = this.getDao().create(model);
} catch (final Exception e) {
e.printStackTrace();
}
return model;
}
@Override
public void update(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
final RequisicaoViagemDAO requisicaoViagemDAO = new RequisicaoViagemDAO();
requisicaoViagemDAO.setTransactionControler(tc);
if (!(solicitacaoServicoDto.getAlterarSituacao().equalsIgnoreCase("S") && solicitacaoServicoDto.getDescrSituacao().equalsIgnoreCase("Cancelada"))) {
final DespesaViagemDTO despesaViagemDTO = (DespesaViagemDTO) model;
RequisicaoViagemDTO requisicaoViagemDTO = new RequisicaoViagemDTO();
Collection<DespesaViagemDTO> colDespesaViagemDTO = null;
final DespesaViagemDAO despesaViagemDAO = this.getDao();
final IntegranteViagemDao integranteViagemDAO = new IntegranteViagemDao();
final RoteiroViagemDAO roteiroViagemDAO = new RoteiroViagemDAO();
if (solicitacaoServicoDto.getIdSolicitante().intValue() == solicitacaoServicoDto.getUsuarioDto().getIdEmpregado().intValue()
&& !(despesaViagemDTO != null && despesaViagemDTO.getCancelarRequisicao() != null && despesaViagemDTO.getCancelarRequisicao().equalsIgnoreCase("S"))) {
throw new LogicException("Usu�rio sem permiss�o para Execu��o!");
}
despesaViagemDAO.setTransactionControler(tc);
integranteViagemDAO.setTransactionControler(tc);
roteiroViagemDAO.setTransactionControler(tc);
final Collection<IntegranteViagemDTO> colIntegrante = integranteViagemDAO.recuperaIntegrantesViagemByIdSolicitacaoEstado(despesaViagemDTO.getIdSolicitacaoServico(),
RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
if (colIntegrante != null && !colIntegrante.isEmpty()) {
for (final IntegranteViagemDTO dto : colIntegrante) {
final RoteiroViagemDTO roteiroViagemDTO = roteiroViagemDAO.findByIdIntegrante(dto.getIdIntegranteViagem());
colDespesaViagemDTO = despesaViagemDAO.findDespesasAtivasViagemByIdRoteiro(roteiroViagemDTO.getIdRoteiroViagem());
if (colDespesaViagemDTO == null || colDespesaViagemDTO.isEmpty()) {
throw new LogicException("Deve ser atribuido a um integrante ao menos um item de despesa!");
}
}
}
requisicaoViagemDTO.setIdSolicitacaoServico(solicitacaoServicoDto.getIdSolicitacaoServico());
requisicaoViagemDTO = (RequisicaoViagemDTO) requisicaoViagemDAO.restore(requisicaoViagemDTO);
requisicaoViagemDTO.setIdAprovacao(null);
requisicaoViagemDAO.update(requisicaoViagemDTO);
if (despesaViagemDTO != null && despesaViagemDTO.getCancelarRequisicao() != null && despesaViagemDTO.getCancelarRequisicao().equalsIgnoreCase("S")) {
if (requisicaoViagemDTO.getIdSolicitacaoServico() != null) {
requisicaoViagemDTO.setCancelarRequisicao("S");
solicitacaoServicoDto.setSituacao(Enumerados.SituacaoSolicitacaoServico.Cancelada.name());
requisicaoViagemDAO.updateNotNull(requisicaoViagemDTO);
return;
}
}
this.validaUpdate(solicitacaoServicoDto, model);
} else {
RequisicaoViagemDTO requisicaoViagemDto = new RequisicaoViagemDTO();
requisicaoViagemDto.setIdSolicitacaoServico(solicitacaoServicoDto.getIdSolicitacaoServico());
requisicaoViagemDto = (RequisicaoViagemDTO) requisicaoViagemDAO.restore(requisicaoViagemDto);
if (requisicaoViagemDto != null) {
requisicaoViagemDto.setEstado(Enumerados.SituacaoSolicitacaoServico.Cancelada.name());
requisicaoViagemDAO.update(requisicaoViagemDto);
}
}
}
@Override
public void delete(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {
}
@Override
public Collection<DespesaViagemDTO> findDespesaViagemByIdRoteiro(final Integer idRoteiro) throws Exception {
return this.getDao().findDespesaViagemByIdRoteiro(idRoteiro);
}
@Override
public Double buscarDespesaTotalViagem(final Integer idSolicitacao) throws Exception {
return this.getDao().buscaValorTotalViagem(idSolicitacao);
}
/**
* Valida se os itens de despesa est�o com a cota��o vencida
*
* @param idSolicitacaoServico
* @return
* @throws Exception
* @author renato.jesus
*/
public boolean validaPrazoItens(final Integer idSolicitacaoServico) throws Exception {
final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao();
RoteiroViagemDTO roteiroViagemDTO = new RoteiroViagemDTO();
final RoteiroViagemDAO roteiroViagemDAO = new RoteiroViagemDAO();
final DespesaViagemDAO despesaViagemDAO = new DespesaViagemDAO();
final Timestamp dataHoraAtual = UtilDatas.getDataHoraAtual();
Timestamp volta = null;
final Collection<IntegranteViagemDTO> colIntegrantes = integranteViagemDao.recuperaIntegrantesViagemByIdSolicitacaoEstado(idSolicitacaoServico,
RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO);
if (colIntegrantes != null) {
for (final IntegranteViagemDTO integranteViagemDto : colIntegrantes) {
roteiroViagemDTO = roteiroViagemDAO.findByIdIntegrante(integranteViagemDto.getIdIntegranteViagem());
volta = UtilDatas.getTimeStampComUltimaHoraDoDia(roteiroViagemDTO.getVolta());
final Collection<DespesaViagemDTO> colDespesas = despesaViagemDAO.findDespesasAtivasViagemByIdRoteiro(roteiroViagemDTO.getIdRoteiroViagem());
if (colDespesas != null) {
for (final DespesaViagemDTO despesaViagemDTO : colDespesas) {
if (despesaViagemDTO.getValidade() != null && despesaViagemDTO.getValidade().compareTo(dataHoraAtual) < 0 || despesaViagemDTO.getValidade() != null
&& despesaViagemDTO.getValidade().compareTo(volta) > 0) {
return false;
}
}
}
}
}
return true;
}
@Override
public Double getTotalDespesaViagemPrestacaoContas(final Integer idSolicitacao, final Integer idEmpregado) throws Exception {
return this.getDao().getTotalDespesaViagemPrestacaoContas(idSolicitacao, idEmpregado);
}
@Override
public Collection<DespesaViagemDTO> findDespesaViagemByIdRoteiroAndPermiteAdiantamento(final Integer idRoteiro, final String permiteAdiantamento) throws Exception {
return this.getDao().findDespesaViagemByIdRoteiroAndPermiteAdiantamento(idRoteiro, permiteAdiantamento);
}
@Override
public Collection<DespesaViagemDTO> findDespesasAtivasViagemByIdRoteiro(final Integer idRoteiro) throws Exception {
return this.getDao().findDespesasAtivasViagemByIdRoteiro(idRoteiro);
}
@Override
public Collection<DespesaViagemDTO> findTodasDespesasViagemByIdRoteiro(final Integer idRoteiro) throws Exception {
return this.getDao().findTodasDespesasViagemByIdRoteiro(idRoteiro);
}
/**
* TODO Este metodo esta em desuso, pode ser removido na proxima vers�o
*/
@Override
public Collection<DespesaViagemDTO> findHitoricoDespesaViagemByIdRoteiro(final Integer idRoteiro) throws Exception {
return this.getDao().findHitoricoDespesaViagemByIdRoteiro(idRoteiro);
}
@Override
public Double buscaValorTotalViagemAtivo(final Integer idSolicitacao) throws Exception {
return this.getDao().buscaValorTotalViagemAtivo(idSolicitacao);
}
@Override
public Double buscaValorTotalViagemInativo(final Integer idSolicitacao) throws Exception {
return this.getDao().buscaValorTotalViagemInativo(idSolicitacao);
}
@Override
public Double buscaValorViagemHistorico(final Integer idSolicitacao) throws Exception {
return this.getDao().buscaValorViagemHistorico(idSolicitacao);
}
}