package br.com.centralit.citcorpore.negocio; import java.sql.Timestamp; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; import br.com.centralit.bpm.dto.ElementoFluxoDTO; import br.com.centralit.bpm.negocio.ItemTrabalho; import br.com.centralit.citcorpore.bean.CidadesDTO; import br.com.centralit.citcorpore.bean.DespesaViagemDTO; import br.com.centralit.citcorpore.bean.GrupoDTO; import br.com.centralit.citcorpore.bean.IntegranteViagemDTO; import br.com.centralit.citcorpore.bean.ParecerDTO; import br.com.centralit.citcorpore.bean.RequisicaoProdutoDTO; 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.GrupoDao; import br.com.centralit.citcorpore.integracao.IntegranteViagemDao; import br.com.centralit.citcorpore.integracao.ParecerDao; import br.com.centralit.citcorpore.integracao.RequisicaoViagemDAO; import br.com.centralit.citcorpore.integracao.RoteiroViagemDAO; import br.com.centralit.citcorpore.util.Enumerados; import br.com.centralit.citcorpore.util.Enumerados.TipoDate; import br.com.citframework.dto.IDto; import br.com.citframework.excecao.LogicException; import br.com.citframework.integracao.TransactionControler; import br.com.citframework.service.ServiceLocator; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilI18N; import br.com.citframework.util.UtilStrings; import br.com.citframework.util.WebUtil; @SuppressWarnings("unchecked") public class AutorizacaoViagemServiceEjb extends ComplemInfSolicitacaoServicoServiceEjb implements AutorizacaoViagemService { 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 delete(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {} @Override public void validaCreate(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception {} @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.validaAprovacao(solicitacaoServicoDto, model); } @Override public IDto create(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception { return null; } @Override public void update(final TransactionControler tc, final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception { final RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model; this.getDao().setTransactionControler(tc); if (requisicaoViagemDto != null && !solicitacaoServicoDto.getDescrSituacao().equalsIgnoreCase(Enumerados.SituacaoSolicitacaoServico.Cancelada.name())) { ParecerDTO parecerDto = new ParecerDTO(); final ParecerDao parecerDao = new ParecerDao(); parecerDao.setTransactionControler(tc); final RequisicaoViagemDTO bean = (RequisicaoViagemDTO) model; if (bean != null && bean.getCancelarRequisicao() != null && bean.getCancelarRequisicao().equalsIgnoreCase("S")) { solicitacaoServicoDto.setSituacao(Enumerados.SituacaoSolicitacaoServico.Cancelada.name()); this.getDao().updateNotNull(bean); return; } if (solicitacaoServicoDto.getIdSolicitante().intValue() == solicitacaoServicoDto.getUsuarioDto().getIdEmpregado().intValue() && !(bean != null && bean.getCancelarRequisicao() != null && bean.getCancelarRequisicao().equalsIgnoreCase("S"))) { final GrupoDao grupoDao = new GrupoDao(); final Collection<GrupoDTO> colGrupos = grupoDao.getGruposByIdEmpregado(solicitacaoServicoDto.getIdSolicitante().intValue()); boolean result = true; if (colGrupos != null && !colGrupos.isEmpty()) { for (final GrupoDTO grupoDTO : colGrupos) { if (grupoDTO.getNome().equalsIgnoreCase("CENTRALIT - DIRETORES")) { result = false; } } } if (result) { throw new LogicException("Usu�rio sem permiss�o para Autoriza��o!"); } } if (requisicaoViagemDto != null && requisicaoViagemDto.getAutorizado().equalsIgnoreCase("S")) { parecerDto.setIdJustificativa(null); } else { 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); final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao(); final IntegranteViagemService integranteViagemService = (IntegranteViagemService) ServiceLocator.getInstance().getService(IntegranteViagemService.class, null); final Collection<IntegranteViagemDTO> colIntegrantes = integranteViagemService.recuperaIntegrantesViagemByIdSolicitacaoEstado( requisicaoViagemDto.getIdSolicitacaoServico(), RequisicaoViagemDTO.EM_AUTORIZACAO); if (solicitacaoServicoDto.getAcaoFluxo().equalsIgnoreCase("E") && !solicitacaoServicoDto.getSituacao().equalsIgnoreCase(Enumerados.SituacaoSolicitacaoServico.Cancelada.name())) { this.validaItensDespesa(solicitacaoServicoDto, model); this.validaUpdate(solicitacaoServicoDto, model); if (requisicaoViagemDto.getAutorizado().equalsIgnoreCase("N")) { requisicaoViagemDto.setEstado(RequisicaoViagemDTO.REJEITADA_PLANEJAMENTO); if (colIntegrantes != null && colIntegrantes.size() > 0) { for (final IntegranteViagemDTO integranteViagemDTO : colIntegrantes) { integranteViagemDTO.setEstado(RequisicaoViagemDTO.AGUARDANDO_PLANEJAMENTO); integranteViagemDao.updateNotNull(integranteViagemDTO); } } } else { requisicaoViagemDto.setEstado(RequisicaoViagemDTO.AGUARDANDO_COMPRAS); if (colIntegrantes != null && colIntegrantes.size() > 0) { for (final IntegranteViagemDTO integranteViagemDTO : colIntegrantes) { integranteViagemDTO.setEstado(RequisicaoViagemDTO.AGUARDANDO_COMPRAS); integranteViagemDao.updateNotNull(integranteViagemDTO); } } } } if (parecerDto != null) { requisicaoViagemDto.setIdAprovacao(parecerDto.getIdParecer()); this.getDao().updateNotNull(requisicaoViagemDto); } } else { requisicaoViagemDto.setEstado(Enumerados.SituacaoSolicitacaoServico.Cancelada.name()); this.getDao().update(requisicaoViagemDto); } } /** * Verifica se o autorizador realmente autorizou a solicita��o de viagem clicando no checkbox de autoriza��o * * @param solicitacaoServicoDto * @param model * @throws Exception */ public void validaAprovacao(final SolicitacaoServicoDTO solicitacaoServicoDto, final IDto model) throws Exception { final RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) model; if (requisicaoViagemDto.getAutorizado() == null || requisicaoViagemDto.getAutorizado().equalsIgnoreCase("")) { throw new LogicException(this.i18nMessage("autorizacaoViagem.autorizacaoCampoObrigatorio")); } else { if (requisicaoViagemDto.getAutorizado().equalsIgnoreCase("N")) { if (requisicaoViagemDto.getIdJustificativaAutorizacao() == null) { throw new LogicException(this.i18nMessage("autorizacaoViagem.justificativaCampoObrigatorio")); } } } } /** * Retorna as informacoes da solicitacao (@param: solicitacaoDTO) que serao exibidas na tela do mobile * * @param solicitacaoDto * @param itemTrabalho * */ @Override public String getInformacoesComplementaresFmtTexto(final SolicitacaoServicoDTO solicitacaoDto, final ItemTrabalho itemTrabalho) throws Exception { RoteiroViagemDTO roteiroViagemDTO = new RoteiroViagemDTO(); RequisicaoViagemDTO requisicaoViagemDto = new RequisicaoViagemDTO(); final RoteiroViagemService roteiroViagemService = (RoteiroViagemService) ServiceLocator.getInstance().getService(RoteiroViagemService.class, null); final DespesaViagemService despesaViagemService = (DespesaViagemService) ServiceLocator.getInstance().getService(DespesaViagemService.class, null); final IntegranteViagemService integranteViagemService = (IntegranteViagemService) ServiceLocator.getInstance().getService(IntegranteViagemService.class, null); final RequisicaoViagemService reqViagemService = (RequisicaoViagemService) ServiceLocator.getInstance().getService(RequisicaoViagemService.class, null); final CidadesService cidadesService = (CidadesService) ServiceLocator.getInstance().getService(CidadesService.class, null); final NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale("pt", "BR")); final DecimalFormat decimal = (DecimalFormat) nf; decimal.applyPattern("#,##0.00"); CidadesDTO origem = null; CidadesDTO destino = null; requisicaoViagemDto.setIdSolicitacaoServico(solicitacaoDto.getIdSolicitacaoServico()); requisicaoViagemDto = (RequisicaoViagemDTO) reqViagemService.restore(requisicaoViagemDto); new ArrayList<DespesaViagemDTO>(); String result = ""; result += "\n------------------ " + this.i18nMessage("requisicaoViagem.dadosGerais") + " ------------------\n"; if (solicitacaoDto.getSolicitante() != null && !solicitacaoDto.getSolicitante().trim().equals("")) { result = "Solicitante: " + solicitacaoDto.getSolicitante() + "\n"; } result += "\n" + "Descri��o: " + solicitacaoDto.getDescricaoSemFormatacao() + "\n"; result += "\n" + "Motivo: " + requisicaoViagemDto.getDescricaoMotivo() + "\n"; result += "\n------------------ " + this.i18nMessage("requisicaoViagem.integrantes") + " ------------------\n"; final Collection<IntegranteViagemDTO> integrantes = integranteViagemService.recuperaIntegrantesViagemByIdSolicitacaoEstado(solicitacaoDto.getIdSolicitacaoServico(), RequisicaoViagemDTO.EM_AUTORIZACAO); if (integrantes != null && !integrantes.isEmpty()) { for (final IntegranteViagemDTO integranteViagemDTO : integrantes) { result += "\n" + integranteViagemDTO.getNome(); roteiroViagemDTO = roteiroViagemService.findByIdIntegrante(integranteViagemDTO.getIdIntegranteViagem()); origem = (CidadesDTO) ((List) cidadesService.findNomeByIdCidade(roteiroViagemDTO.getOrigem())).get(0); destino = (CidadesDTO) ((List) cidadesService.findNomeByIdCidade(roteiroViagemDTO.getDestino())).get(0); despesaViagemService.findDespesasAtivasViagemByIdRoteiro(roteiroViagemDTO.getIdRoteiroViagem()); result += " - " + this.i18nMessage("si.comum.ida") + " " + UtilDatas.convertDateToString(TipoDate.DATE_DEFAULT, roteiroViagemDTO.getIda(), UtilI18N.getLocale()) + " - " + this.i18nMessage("si.comum.volta") + " " + UtilDatas.convertDateToString(TipoDate.DATE_DEFAULT, roteiroViagemDTO.getVolta(), UtilI18N.getLocale()) + " - " + origem.getNomeCidade() + "/" + origem.getNomeUf() + " - " + destino.getNomeCidade() + "/" + destino.getNomeUf() + "\n"; } } result += "\n" + "Valor total a aprovar: R$ " + decimal.format(despesaViagemService.buscaValorTotalViagemAtivo(solicitacaoDto.getIdSolicitacaoServico())); result += "\n" + "Valor total j� aprovado: R$ " + decimal.format(despesaViagemService.buscaValorTotalViagemInativo(solicitacaoDto.getIdSolicitacaoServico())); result += "\n" + this.i18nMessage("requisicaoViagem.custoTotalViagem") + ": R$ " + decimal.format(despesaViagemService.buscarDespesaTotalViagem(solicitacaoDto.getIdSolicitacaoServico())); return result; } @Override public void preparaSolicitacaoParaAprovacao(final SolicitacaoServicoDTO solicitacaoDto, final ItemTrabalho itemTrabalho, final String aprovacao, final Integer idJustificativa, final String observacoes) throws Exception { RequisicaoViagemDTO requisicaoViagemDTO = new RequisicaoViagemDTO(); requisicaoViagemDTO.setIdSolicitacaoServico(solicitacaoDto.getIdSolicitacaoServico()); requisicaoViagemDTO = (RequisicaoViagemDTO) this.restore(requisicaoViagemDTO); final ElementoFluxoDTO elementoDto = itemTrabalho.getElementoFluxoDto(); if (UtilStrings.nullToVazio(elementoDto.getTemplate()).toUpperCase().indexOf("AUTORIZACAO") >= 0) { requisicaoViagemDTO.setAcaoFluxo(RequisicaoProdutoDTO.ACAO_AUTORIZACAO); if (aprovacao.equalsIgnoreCase("N")) { requisicaoViagemDTO.setRejeitada("S"); } requisicaoViagemDTO.setAutorizado(aprovacao); requisicaoViagemDTO.setComplemJustificativaAutorizacao(observacoes); requisicaoViagemDTO.setIdJustificativaAutorizacao(idJustificativa); this.getDao().update(requisicaoViagemDTO); // ItemRequisicaoProdutoService itemRequisicaoProdutoService = (ItemRequisicaoProdutoService) // ServiceLocator.getInstance().getService(ItemRequisicaoProdutoService.class, this.usuario); } if (requisicaoViagemDTO.getAcaoFluxo() != null) { solicitacaoDto.setInformacoesComplementares(requisicaoViagemDTO); solicitacaoDto.setAcaoFluxo(br.com.centralit.bpm.util.Enumerados.ACAO_EXECUTAR); solicitacaoDto.setIdTarefa(itemTrabalho.getIdItemTrabalho()); } } /** * Verifica se os itens est�o com a cota��o vencida * * @param solicitacaoDto * @param model * @throws Exception */ public void validaItensDespesa(final SolicitacaoServicoDTO solicitacaoDto, final IDto model) throws Exception { final IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao(); final DespesaViagemDAO despesaViagemDAO = new DespesaViagemDAO(); final RoteiroViagemDAO roteiroViagemDAO = new RoteiroViagemDAO(); RoteiroViagemDTO roteiroViagemDTO = new RoteiroViagemDTO(); final Timestamp dataHoraAtual = UtilDatas.getDataHoraAtual(); Collection<DespesaViagemDTO> colDespesaViagemDTOs = new ArrayList<DespesaViagemDTO>(); final Collection<IntegranteViagemDTO> colIntegranteViagemDTOs = integranteViagemDao.recuperaIntegrantesViagemByIdSolicitacaoEstado( solicitacaoDto.getIdSolicitacaoServico(), RequisicaoViagemDTO.getAguardandoAprovacao()); if (colIntegranteViagemDTOs != null && !colIntegranteViagemDTOs.isEmpty()) { for (final IntegranteViagemDTO dto : colIntegranteViagemDTOs) { roteiroViagemDTO = roteiroViagemDAO.findByIdIntegrante(dto.getIdIntegranteViagem()); if (roteiroViagemDTO != null) { colDespesaViagemDTOs = despesaViagemDAO.findDespesasAtivasViagemByIdRoteiro(roteiroViagemDTO.getIdRoteiroViagem()); if (colDespesaViagemDTOs != null && !colDespesaViagemDTOs.isEmpty()) { for (final DespesaViagemDTO dtoDespesa : colDespesaViagemDTOs) { if (dtoDespesa.getValidade() != null && dtoDespesa.getValidade().compareTo(dataHoraAtual) < 0) { throw new LogicException(this.i18nMessage("requisicaoViagem.itensVencidos")); } } } } } } } }