package br.com.centralit.citcorpore.negocio; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import br.com.centralit.citcorpore.bean.HistoricoAtendimentoDTO; import br.com.centralit.citcorpore.bean.result.HistoricoAtendimentoResultDTO; import br.com.centralit.citcorpore.bean.result.HistoricoAtendimentoResultDTO.Solicitation; import br.com.centralit.citcorpore.bean.result.HistoricoAtendimentoSearchResultDTO; import br.com.centralit.citcorpore.integracao.HistoricoAtendimentoDAO; import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico; import br.com.citframework.util.Assert; import br.com.citframework.util.geo.Coordinate; import com.google.common.base.Function; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; public class HistoricoAtendimentoServiceEjb implements HistoricoAtendimentoService { private HistoricoAtendimentoDAO dao; private HistoricoAtendimentoDAO getDAO() { if (dao == null) { dao = new HistoricoAtendimentoDAO(); } return dao; } private static final Function<Solicitation, Integer> groupSolicitationFunction = new Function<Solicitation, Integer>() { @Override public Integer apply(final Solicitation item) { return item.getNum(); } }; private static final Function<HistoricoAtendimentoSearchResultDTO, Integer> groupAtendenteFunction = new Function<HistoricoAtendimentoSearchResultDTO, Integer>() { @Override public Integer apply(final HistoricoAtendimentoSearchResultDTO item) { return item.getAtendenteId(); } }; private static final Function<HistoricoAtendimentoSearchResultDTO, Integer> groupSolicitationInResultFunction = new Function<HistoricoAtendimentoSearchResultDTO, Integer>() { @Override public Integer apply(final HistoricoAtendimentoSearchResultDTO item) { return item.getSolicitacaoNumero(); } }; @Override public List<HistoricoAtendimentoResultDTO> listHistoricoAtendimentoWithSolicitationInfo(final HistoricoAtendimentoDTO historicoAtendimento) throws Exception { Assert.notNull(historicoAtendimento, "'HistoricoAtendimento' must not be null."); final List<HistoricoAtendimentoSearchResultDTO> onDB = this.getDAO().listHistoricoAtendimentoWithSolicitationInfo(historicoAtendimento); final int onDBResultSize = onDB.size(); List<HistoricoAtendimentoResultDTO> result = new ArrayList<>(); if (onDBResultSize > 0) { result = this.generateHistoricoByUser(this.groupResultByUser(onDB)); } return result; } private List<HistoricoAtendimentoSearchResultDTO> getHistoricoForSteps(final List<HistoricoAtendimentoSearchResultDTO> result) { final Multimap<Integer, HistoricoAtendimentoSearchResultDTO> maped = Multimaps.index(result.iterator(), groupSolicitationInResultFunction); final Integer num = (Integer) maped.keySet().toArray()[0]; return (List<HistoricoAtendimentoSearchResultDTO>) maped.get(num); } private List<List<HistoricoAtendimentoSearchResultDTO>> groupResultByUser(final List<HistoricoAtendimentoSearchResultDTO> result) { final List<List<HistoricoAtendimentoSearchResultDTO>> grouped = new ArrayList<>(); final Multimap<Integer, HistoricoAtendimentoSearchResultDTO> maped = Multimaps.index(result.iterator(), groupAtendenteFunction); final Set<Integer> ids = maped.keySet(); for (final Integer integer : ids) { grouped.add((List<HistoricoAtendimentoSearchResultDTO>) maped.get(integer)); } return grouped; } private List<HistoricoAtendimentoResultDTO> generateHistoricoByUser(final List<List<HistoricoAtendimentoSearchResultDTO>> grouped) { final List<HistoricoAtendimentoResultDTO> byUser = new ArrayList<>(); for (final List<HistoricoAtendimentoSearchResultDTO> list : grouped) { final HistoricoAtendimentoResultDTO historico = new HistoricoAtendimentoResultDTO(); makeSteps(historico, this.getHistoricoForSteps(list)); final int size = list.size(); if (size > 1) { final HistoricoAtendimentoSearchResultDTO start = list.get(0); historico.setIdAtendente(start.getAtendenteId()); historico.setAtendente(start.getAtendenteNome()); makeStartPoint(historico, start); for (final HistoricoAtendimentoSearchResultDTO position : list) { makeSolicitation(historico, position); } this.adjustSolicitations(historico); final HistoricoAtendimentoSearchResultDTO finish = list.get(size - 1); makeFinishPoint(historico, finish); } else { final HistoricoAtendimentoSearchResultDTO unique = list.get(0); historico.setIdAtendente(unique.getAtendenteId()); historico.setAtendente(unique.getAtendenteNome()); makeStartPoint(historico, unique); makeSolicitation(historico, unique); makeFinishPoint(historico, unique); } byUser.add(historico); } return byUser; } private void adjustSolicitations(final HistoricoAtendimentoResultDTO historico) { final List<Solicitation> solicitations = Collections.unmodifiableList(historico.getSolicitations()); final Multimap<Integer, Solicitation> maped = Multimaps.index(solicitations.iterator(), groupSolicitationFunction); final Set<Integer> nums = maped.keySet(); historico.getSolicitations().clear(); for (final Integer integer : nums) { final Solicitation solicitation = (Solicitation) maped.get(integer).toArray()[0]; historico.getSolicitations().add(solicitation); } } private static void makeStartPoint(final HistoricoAtendimentoResultDTO historico, final HistoricoAtendimentoSearchResultDTO unique) { final Coordinate startPoint = new Coordinate(); startPoint.setLat(unique.getPosicaoLatitude()); startPoint.setLng(unique.getPosicaoLongitude()); historico.setStart(startPoint); } private static void makeFinishPoint(final HistoricoAtendimentoResultDTO historico, final HistoricoAtendimentoSearchResultDTO unique) { final Coordinate finishPoint = new Coordinate(); finishPoint.setLat(unique.getPosicaoLatitude()); finishPoint.setLng(unique.getPosicaoLongitude()); historico.setFinish(finishPoint); } private static void makeSteps(final HistoricoAtendimentoResultDTO historico, final List<HistoricoAtendimentoSearchResultDTO> forSteps) { for (final HistoricoAtendimentoSearchResultDTO position : forSteps) { final Coordinate step = new Coordinate(); step.setLat(position.getPosicaoLatitude()); step.setLng(position.getPosicaoLongitude()); historico.getSteps().add(step); } } private static void makeSolicitation(final HistoricoAtendimentoResultDTO historico, final HistoricoAtendimentoSearchResultDTO position) { final Solicitation solicitation = historico.new Solicitation(); solicitation.setNum(position.getSolicitacaoNumero()); solicitation.setStatus(position.getSolicitacaoSituacao()); solicitation.setServ(position.getSolicitacaoServico()); solicitation.setDesc(position.getSolicitacaoDescricao()); solicitation.setUnid(position.getUnidadeNome()); solicitation.setSol(position.getSolicitacaoSolicitante()); solicitation.setHH(position.getSolicitacaoPrazoHH()); solicitation.setPrazoMM(position.getSolicitacaoPrazoMM()); final Integer atribuicaoId = position.getAtribuicaoId(); final Timestamp atribuicaoDatetime = position.getAtribuicaoDatetime(); final SituacaoSolicitacaoServico sitSolicitacao = SituacaoSolicitacaoServico.valueOf(position.getSolicitacaoSituacao()); if (sitSolicitacao.equals(SituacaoSolicitacaoServico.Fechada) || sitSolicitacao.equals(SituacaoSolicitacaoServico.Resolvida)) { solicitation.setSit(1); } else if (sitSolicitacao.equals(SituacaoSolicitacaoServico.EmAndamento) && atribuicaoId != null && atribuicaoDatetime != null) { solicitation.setSit(2); } else if (sitSolicitacao.equals(SituacaoSolicitacaoServico.EmAndamento) && atribuicaoId != null) { solicitation.setSit(3); } else if (sitSolicitacao.equals(SituacaoSolicitacaoServico.EmAndamento) && atribuicaoId == null) { solicitation.setSit(4); } final Coordinate coord = new Coordinate(); coord.setLat(0); coord.setLng(0); if(position.getSolicitacaoLatitude() != null && position.getSolicitacaoLongitude() != null ){ coord.setLat(position.getSolicitacaoLatitude()); coord.setLng(position.getSolicitacaoLongitude()); } solicitation.setCoord(coord); historico.getSolicitations().add(solicitation); } }