package br.com.centralit.citcorpore.negocio; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import br.com.centralit.citcorpore.bean.GerenciamentoRotasDTO; import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO; import br.com.centralit.citcorpore.bean.UsuarioDTO; import br.com.centralit.citcorpore.bean.result.GerenciamentoRotasResultDTO; import br.com.centralit.citcorpore.integracao.SolicitacaoServicoForMobileV2Dao; import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema; import br.com.centralit.citcorpore.util.Enumerados.TipoSolicitacaoServico; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.citframework.excecao.ServiceException; import br.com.citframework.integracao.core.Page; import br.com.citframework.integracao.core.PageImpl; import br.com.citframework.integracao.core.Pageable; import br.com.citframework.service.ServiceLocator; import br.com.citframework.util.Assert; import br.com.citframework.util.geo.GeoLocation; import br.com.citframework.util.geo.GeoUtils; public class SolicitacaoServicoServiceForMobileV2Ejb extends SolicitacaoServicoServiceEjb implements SolicitacaoServicoServiceForMobileV2 { private static final String PAGEABLE_MUST_NOT_BE_NULL = "'Pageable' must not be null."; private static final String USUARIO_MUST_NOT_BE_NULL = "'Usu�rio' must not be null."; private SolicitacaoServicoForMobileV2Dao dao; @Override protected SolicitacaoServicoForMobileV2Dao getDao() { if (dao == null) { dao = new SolicitacaoServicoForMobileV2Dao(); } return dao; } @Override public Page<SolicitacaoServicoDTO> listNewest(final Integer newestNumber, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao) throws ServiceException { Assert.notNull(usuario, USUARIO_MUST_NOT_BE_NULL); try { return this.calculaSLA(this.getDao().listNewest(newestNumber, usuario, tiposSolicitacao, aprovacao)); } catch (final Exception e) { throw new ServiceException(e); } } @Override public Page<SolicitacaoServicoDTO> listOldest(final Integer oldestNumber, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao) throws ServiceException { Assert.notNull(usuario, USUARIO_MUST_NOT_BE_NULL); try { final Integer oldest = oldestNumber != null && oldestNumber.intValue() > 0 ? oldestNumber : 0; return this.calculaSLA(this.getDao().listOldest(oldest, usuario, tiposSolicitacao, aprovacao)); } catch (final Exception e) { throw new ServiceException(e); } } @Override public Page<SolicitacaoServicoDTO> listNotificationByNumberAndUser(final Integer number, final UsuarioDTO user) throws ServiceException { try { return this.calculaSLA(this.getDao().listNotificationByNumberAndUser(number, user)); } catch (final Exception e) { throw new ServiceException(e); } } @Override public Page<SolicitacaoServicoDTO> listByCoordinates(final Double latitude, final Double longitude, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao, final Pageable pageable) throws ServiceException { Assert.notNull(usuario, USUARIO_MUST_NOT_BE_NULL); Assert.notNull(pageable, PAGEABLE_MUST_NOT_BE_NULL); try { final GeoLocation referencePoint = GeoLocation.fromDegrees(latitude, longitude); final double distance = Double.valueOf(StringUtils.trim(ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.MOBILE_RANGE_ACTION, "10"))); final double distanceRadius = distance / GeoUtils.EARTH_RADIUS; final GeoLocation[] bounds = referencePoint.boundingCoordinates(distance, GeoUtils.EARTH_RADIUS); return this.calculaSLA(this.getDao().listByCoordinates(referencePoint, bounds, distanceRadius, bounds[0].getLongitudeInRadians() > bounds[1].getLongitudeInRadians(), usuario, tiposSolicitacao, aprovacao, pageable)); } catch (final Exception e) { throw new ServiceException(e); } } @Override public Page<GerenciamentoRotasResultDTO> listSolicitacoesParaRoteirizacao(final GerenciamentoRotasDTO filter, final Pageable pageable) throws ServiceException { Assert.notNull(filter, "'GerenciamentoRotas' must not be null."); Assert.notNull(pageable, PAGEABLE_MUST_NOT_BE_NULL); try { final Page<GerenciamentoRotasResultDTO> result = this.getDao().listarSolicitacoesParaRoteirizacao(filter, pageable); final List<GerenciamentoRotasResultDTO> content = result.getContent(); final List<GerenciamentoRotasResultDTO> newContent = new ArrayList<>(); for (final GerenciamentoRotasResultDTO gerResult : content) { if (gerResult.getDataInicioAtendimento() != null) { gerResult.setIniciada(true); gerResult.setDataInicioAtendimento(null); } newContent.add(gerResult); } return new PageImpl<GerenciamentoRotasResultDTO>(newContent, pageable, result.getTotalElements()); } catch (final Exception e) { throw new ServiceException(e); } } private Page<SolicitacaoServicoDTO> calculaSLA(final Page<SolicitacaoServicoDTO> page) throws Exception { for (final SolicitacaoServicoDTO solicitacao : page) { solicitacao.setNomeServico(solicitacao.getServico()); if (StringUtils.isNotBlank(solicitacao.getNomeUnidadeSolicitante())) { solicitacao.setSolicitanteUnidade(solicitacao.getSolicitante() + " (" + solicitacao.getNomeUnidadeSolicitante() + ")"); } this.verificaSituacaoSLA(solicitacao, null); } return page; } private UsuarioService usuarioService; public UsuarioService getUsuarioService() throws ServiceException { if (usuarioService == null) { usuarioService = (UsuarioService) ServiceLocator.getInstance().getService(UsuarioService.class, null); } return usuarioService; } }