package br.com.centralit.citsmart.rest.v2.operation; import java.math.BigInteger; import java.sql.Timestamp; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXBException; import br.com.centralit.bpm.dto.PermissoesFluxoDTO; import br.com.centralit.bpm.util.Enumerados.TipoAtribuicao; import br.com.centralit.citcorpore.bean.AtribuicaoSolicitacaoAtendenteDTO; import br.com.centralit.citcorpore.bean.CheckinDTO; import br.com.centralit.citcorpore.bean.CheckinDeniedDTO; import br.com.centralit.citcorpore.bean.CheckoutDTO; import br.com.centralit.citcorpore.bean.PosicionamentoAtendenteDTO; import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO; import br.com.centralit.citcorpore.bean.UsuarioDTO; import br.com.centralit.citcorpore.negocio.AtribuicaoSolicitacaoAtendenteService; import br.com.centralit.citcorpore.negocio.CheckinDeniedService; import br.com.centralit.citcorpore.negocio.CheckinService; import br.com.centralit.citcorpore.negocio.CheckoutService; import br.com.centralit.citcorpore.negocio.PermissoesFluxoService; import br.com.centralit.citcorpore.negocio.PosicionamentoAtendenteService; import br.com.centralit.citcorpore.negocio.SolicitacaoServicoServiceForMobileV2; import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema; import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.centralit.citsmart.rest.bean.RestSessionDTO; import br.com.centralit.citsmart.rest.operation.RestMobile; import br.com.centralit.citsmart.rest.schema.CtNotificationGetById; import br.com.centralit.citsmart.rest.util.RestEnum; import br.com.centralit.citsmart.rest.util.RestOperationUtil; import br.com.centralit.citsmart.rest.util.RestUtil; import br.com.centralit.citsmart.rest.v2.schema.CTNotification; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationAttendRequest; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationAttendRequestResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationAttendantLocation; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationAttendantLocationResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckin; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckinDenied; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckinDeniedResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckinResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckout; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCheckoutResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationCommonResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetByCoordinates; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetByCoordinatesResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetById; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetByIdResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetNewest; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetNewestResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetOldest; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationGetOldestResp; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationUpdate; import br.com.centralit.citsmart.rest.v2.schema.CTNotificationUpdateResp; import br.com.centralit.citsmart.rest.v2.schema.CTPageRequest; import br.com.centralit.citsmart.rest.v2.schema.CTPageResponse; import br.com.citframework.excecao.ServiceException; import br.com.citframework.integracao.core.Page; import br.com.citframework.integracao.core.PageRequest; import br.com.citframework.integracao.core.Pageable; import br.com.citframework.service.ServiceLocator; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilStrings; import br.com.citframework.util.UtilXMLDate; /** * Implementa��o das opera��os que respondem em {@code /mobile} da vers�o V2 de apis consumidas pelo mobile * * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 22/09/2014 * */ public class RESTMobile extends RestMobile { private static final Logger LOGGER = Logger.getLogger(RESTMobile.class.getName()); protected CTNotificationAttendantLocationResp attendantLocation(final RestSessionDTO restSession, final CTNotificationAttendantLocation message) { final CTNotificationAttendantLocationResp resp = new CTNotificationAttendantLocationResp(); final PosicionamentoAtendenteDTO posicao = new PosicionamentoAtendenteDTO(); posicao.setLatitude(message.getLatitude()); posicao.setLongitude(message.getLongitude()); posicao.setDateTime(UtilXMLDate.toTimeStamp(message.getDateTime())); posicao.setIdUsuario(restSession.getUserId()); try { this.getPosicionamentoAtendenteService().create(posicao); resp.setSuccess(true); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } protected CTNotificationAttendRequestResp attendRequest(final RestSessionDTO restSession, final CTNotificationAttendRequest message) { final CTNotificationAttendRequestResp resp = new CTNotificationAttendRequestResp(); final Double latitude = message.getLatitude(); final Double longitude = message.getLongitude(); final Integer idSolicitacao = message.getNumber().intValue(); final Integer idUsuario = restSession.getUserId(); final Timestamp dataInicioAtendimento = UtilXMLDate.toTimeStamp(message.getDateTime()); final AtribuicaoSolicitacaoAtendenteDTO atribuicao = new AtribuicaoSolicitacaoAtendenteDTO(); atribuicao.setIdSolicitacao(idSolicitacao); atribuicao.setIdUsuario(idUsuario); atribuicao.setLatitude(latitude); atribuicao.setLongitude(longitude); atribuicao.setDataInicioAtendimento(dataInicioAtendimento); try { this.getAtribuicaoSolicitacaoAtendenteService().criarAtribuicao(atribuicao); resp.setSuccess(true); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } protected CTNotificationCheckinResp checkin(final RestSessionDTO restSession, final CTNotificationCheckin message) { final CTNotificationCheckinResp resp = new CTNotificationCheckinResp(); if (message.getTaskId() == null) { resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null"))); return resp; } try { final Integer numeroSolicitacao = this.getCheckinService().realizarCheckin(this.setCheckin(restSession, message), restSession.getUser()); resp.setNumber(numeroSolicitacao); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } private CheckinDTO setCheckin(final RestSessionDTO restSession, final CTNotificationCheckin message) { final CheckinDTO checkin = new CheckinDTO(); checkin.setIdUsuario(restSession.getUserId()); checkin.setDataHoraCheckin(UtilXMLDate.toTimeStamp(message.getStartTime())); checkin.setIdTarefa(message.getTaskId().intValue()); checkin.setLatitude(message.getLatitude()); checkin.setLongitude(message.getLongitude()); return checkin; } protected CTNotificationCheckinDeniedResp checkinDenied(final RestSessionDTO restSession, final CTNotificationCheckinDenied message) { final CTNotificationCheckinDeniedResp resp = new CTNotificationCheckinDeniedResp(); if (message.getTaskId() == null) { resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null"))); return resp; } try { this.getCheckinDenied().create(this.setCheckinDenied(restSession, message)); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } private CheckinDeniedDTO setCheckinDenied(final RestSessionDTO restSession, final CTNotificationCheckinDenied message) { final CheckinDeniedDTO checkinDenied = new CheckinDeniedDTO(); checkinDenied.setIdTarefa(message.getTaskId().intValue()); checkinDenied.setIdUsuario(restSession.getUserId()); checkinDenied.setIdJustificativa(message.getReasonId()); checkinDenied.setLatitude(message.getLatitude()); checkinDenied.setLongitude(message.getLongitude()); checkinDenied.setDataHora(UtilXMLDate.toTimeStamp(message.getDateTime())); return checkinDenied; } protected CTNotificationCheckoutResp checkout(final RestSessionDTO restSession, final CTNotificationCheckout message) throws JAXBException { final CTNotificationCheckoutResp resp = new CTNotificationCheckoutResp(); if (message.getTaskId() == null) { resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null"))); return resp; } try { final Integer numeroSolicitacao = this.getCheckoutService().realizarCheckout(this.setCheckout(restSession, message), restSession.getUser()); resp.setNumber(numeroSolicitacao); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } private CheckoutDTO setCheckout(final RestSessionDTO restSession, final CTNotificationCheckout message) { final CheckoutDTO checkout = new CheckoutDTO(); checkout.setIdTarefa(message.getTaskId().intValue()); checkout.setIdResposta(message.getSolution()); checkout.setLatitude(message.getLatitude()); checkout.setLongitude(message.getLongitude()); checkout.setDescricao(message.getDescSolution()); checkout.setStatus(message.getStatus()); checkout.setIdUsuario(restSession.getUserId().intValue()); return checkout; } protected CTNotificationGetByCoordinatesResp getByCoordinates(final RestSessionDTO restSession, final CTNotificationGetByCoordinates message) { final CTNotificationGetByCoordinatesResp resp = new CTNotificationGetByCoordinatesResp(); try { final int tipo = message.getNotificationType(); if (!this.validNotificationType(restSession, resp, tipo)) { return resp; } final Pageable pageable = this.makePageable(message.getPager()); final Page<SolicitacaoServicoDTO> page = this.getSolicitacaoServicoService().listByCoordinates(message.getLatitude(), message.getLongitude(), restSession.getUser(), this.getTiposArrayFromType(tipo), this.getAprovacao(message.getOnlyApproval()), pageable); resp.setPaging(this.makePageResponse(page)); final List<SolicitacaoServicoDTO> solicitacoes = page.getContent(); this.makeNotificationsResponse(resp, solicitacoes, restSession.getUser()); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } @Override protected CTNotificationGetByIdResp getById(final RestSessionDTO restSession, final CtNotificationGetById input) { final CTNotificationGetByIdResp resp = new CTNotificationGetByIdResp(); try { this.doGetByIDValidation(restSession, input); } catch (final Exception ex) { resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, ex.getMessage())); return resp; } NotificationDetail detail = null; try { detail = this.populateNotificationDetail(restSession, input.getTaskId().intValue()); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildError(e)); return resp; } final CTNotificationGetById notification = new CTNotificationGetById(); notification.setEndSLA(detail.getEndSLA()); notification.setTask(detail.getTask()); notification.setService(detail.getService()); notification.setDescription(detail.getDescription()); notification.setStatus(detail.getStatus()); notification.setTaskStatus(detail.getTaskStatus()); notification.setTimeSLA(detail.getTimeSLA()); resp.setNotification(notification); return resp; } protected CTNotificationGetNewestResp getNewest(final RestSessionDTO restSession, final CTNotificationGetNewest message) { final CTNotificationGetNewestResp resp = new CTNotificationGetNewestResp(); try { final int tipo = message.getNotificationType(); if (!this.validNotificationType(restSession, resp, tipo)) { return resp; } final Page<SolicitacaoServicoDTO> page = this.getSolicitacaoServicoService().listNewest(message.getNewestNumber().intValue(), restSession.getUser(), this.getTiposArrayFromType(tipo), this.getAprovacao(message.getOnlyApproval())); final List<SolicitacaoServicoDTO> solicitacoes = page.getContent(); this.makeNotificationsResponse(resp, solicitacoes, restSession.getUser()); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } protected CTNotificationGetOldestResp getOldest(final RestSessionDTO restSession, final CTNotificationGetOldest message) { final CTNotificationGetOldestResp resp = new CTNotificationGetOldestResp(); try { final int tipo = message.getNotificationType(); if (!this.validNotificationType(restSession, resp, tipo)) { return resp; } final Page<SolicitacaoServicoDTO> page = this.getSolicitacaoServicoService().listOldest(message.getOldestNumber().intValue(), restSession.getUser(), this.getTiposArrayFromType(tipo), this.getAprovacao(message.getOnlyApproval())); final List<SolicitacaoServicoDTO> solicitacoes = page.getContent(); this.makeNotificationsResponse(resp, solicitacoes, restSession.getUser()); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } protected CTNotificationUpdateResp updateNotification(final RestSessionDTO restSession, final CTNotificationUpdate message) { final CTNotificationUpdateResp resp = new CTNotificationUpdateResp(); try { final Page<SolicitacaoServicoDTO> page = this.getSolicitacaoServicoService().listNotificationByNumberAndUser(message.getNumber().intValue(), restSession.getUser()); final List<SolicitacaoServicoDTO> solicitacoes = page.getContent(); this.makeNotificationsResponse(resp, solicitacoes, restSession.getUser()); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); resp.setError(RestOperationUtil.buildSimpleError(e)); } return resp; } private CTPageResponse makePageResponse(final Page<SolicitacaoServicoDTO> page) { CTPageResponse paging = null; if (page.hasContent()) { paging = new CTPageResponse(); paging.setPage(page.getNumber() + 1); paging.setElements(page.getNumberOfElements()); paging.setTotalPages(page.getTotalPages()); paging.setTotalElements((int) page.getTotalElements()); } return paging; } private <E extends CTNotificationCommonResp> void makeNotificationsResponse(final E resp, final List<SolicitacaoServicoDTO> solicitacoes, final UsuarioDTO usuario) { for (final SolicitacaoServicoDTO solicitacao : solicitacoes) { final CTNotification notification = new CTNotification(); final Integer idSolicitacao = solicitacao.getIdSolicitacaoServico(); final Integer idTarefa = solicitacao.getIdTarefa(); notification.setNumber(BigInteger.valueOf(idSolicitacao)); notification.setTaskId(BigInteger.valueOf(idTarefa)); if (solicitacao.getDataHoraInicio() != null) { notification.setDate(UtilDatas.dateToSTR(solicitacao.getDataHoraInicio())); } notification.setLatitude(solicitacao.getLatitude()); notification.setLongitude(solicitacao.getLongitude()); notification.setEndSLA(" "); if (UtilStrings.nullToVazio(solicitacao.getSituacaoSLA()).equalsIgnoreCase("A") && solicitacao.getDataHoraLimite() != null && solicitacao.getSlaACombinar().equalsIgnoreCase("N")) { notification.setEndSLA(solicitacao.getDataHoraLimiteStr()); } notification.setTask(solicitacao.getNomeElementoFluxo()); notification.setService(solicitacao.getNomeServico()); notification.setTypeRequest(0); if (solicitacao.getAprovacao() != null && solicitacao.getAprovacao().trim().equalsIgnoreCase("S")) { notification.setTypeRequest(1); notification.setWaiting(1); } if (this.validaPermissaoFluxo(usuario, solicitacao.getSituacao(), idTarefa) && notification.getTypeRequest() == 0 && !solicitacao.getTipoAtribuicao().trim().equalsIgnoreCase(TipoAtribuicao.Acompanhamento.toString()) && solicitacao.getIdentificacaoTemplate() == null) { notification.setWaiting(1); } final Integer idUsuario = usuario.getIdUsuario(); final Integer idResponsavel = solicitacao.getIdResponsavel(); if (idResponsavel != null && idResponsavel.equals(idUsuario) || solicitacao.getIdSolicitacaoIndividual() != null) { notification.setPersonal(true); } if (solicitacao.getDataInicioAtendimento() != null) { notification.setInService(true); } notification.setInChekin(0); final boolean isCheckinAtivo = this.isCheckinAtivo(idTarefa, idSolicitacao, idUsuario); if (isCheckinAtivo) { notification.setInChekin(1); } Integer timeSLA = 0; if (solicitacao.getPrazoHH().intValue() != 0) { timeSLA += 60 * solicitacao.getPrazoHH(); } if (solicitacao.getPrazoMM().intValue() != 0) { timeSLA += solicitacao.getPrazoMM(); } notification.setContract(solicitacao.getIdContrato()); notification.setUnit(solicitacao.getIdUnidade()); notification.setTimeSLA(timeSLA); notification.setPriorityorder(solicitacao.getPriorityorder()); notification.setTimeFlag(this.determinaTimeFlag(solicitacao)); notification.setType(this.determinaTipoSolicitacao(solicitacao)); resp.getNotifications().add(notification); } } private boolean validaPermissaoFluxo(final UsuarioDTO usuario, final String situacaoSolicitacao, final Integer idTarefa) { final PermissoesFluxoDTO permissoesFluxo = this.getPermissoesFluxoService().findByIdFluxoAndIdUsuario(usuario.getIdUsuario(), idTarefa); // Valida Permiss�o de reativa��o if (situacaoSolicitacao.trim().equalsIgnoreCase(SituacaoSolicitacaoServico.Suspensa.name()) && permissoesFluxo != null && permissoesFluxo.getReativar().trim().equalsIgnoreCase("S")) { return true; } if (permissoesFluxo != null && permissoesFluxo.getExecutar().trim().equalsIgnoreCase("S")) { return true; } return false; } private boolean isCheckinAtivo(final Integer idTarefa, final Integer idSolicitacao, final Integer idUsuario) { try { return this.getCheckinService().isCheckinAtivo(idTarefa, idSolicitacao, idUsuario); } catch (final Exception e) { LOGGER.log(Level.WARNING, e.getMessage(), e); } return false; } private AtribuicaoSolicitacaoAtendenteService atribuicaoSolicitacaoAtendenteService; private CheckinService checkinService; private CheckinDeniedService checkinDeniedService; private CheckoutService checkoutService; private PermissoesFluxoService permissoesFluxoService; private PosicionamentoAtendenteService posicionamentoAtendenteService; private SolicitacaoServicoServiceForMobileV2 solicitacaoServicoService; private AtribuicaoSolicitacaoAtendenteService getAtribuicaoSolicitacaoAtendenteService() { if (atribuicaoSolicitacaoAtendenteService == null) { try { atribuicaoSolicitacaoAtendenteService = (AtribuicaoSolicitacaoAtendenteService) ServiceLocator.getInstance().getService( AtribuicaoSolicitacaoAtendenteService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return atribuicaoSolicitacaoAtendenteService; } private CheckinService getCheckinService() { if (checkinService == null) { try { checkinService = (CheckinService) ServiceLocator.getInstance().getService(CheckinService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return checkinService; } private CheckinDeniedService getCheckinDenied() { if (checkinDeniedService == null) { try { checkinDeniedService = (CheckinDeniedService) ServiceLocator.getInstance().getService(CheckinDeniedService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return checkinDeniedService; } private CheckoutService getCheckoutService() { if (checkoutService == null) { try { checkoutService = (CheckoutService) ServiceLocator.getInstance().getService(CheckoutService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return checkoutService; } private PermissoesFluxoService getPermissoesFluxoService() { if (permissoesFluxoService == null) { try { permissoesFluxoService = (PermissoesFluxoService) ServiceLocator.getInstance().getService(PermissoesFluxoService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return permissoesFluxoService; } private PosicionamentoAtendenteService getPosicionamentoAtendenteService() { if (posicionamentoAtendenteService == null) { try { posicionamentoAtendenteService = (PosicionamentoAtendenteService) ServiceLocator.getInstance().getService(PosicionamentoAtendenteService.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return posicionamentoAtendenteService; } private SolicitacaoServicoServiceForMobileV2 getSolicitacaoServicoService() { if (solicitacaoServicoService == null) { try { solicitacaoServicoService = (SolicitacaoServicoServiceForMobileV2) ServiceLocator.getInstance().getService(SolicitacaoServicoServiceForMobileV2.class, null); } catch (final ServiceException e) { RestUtil.handleServiceException(LOGGER, e); } } return solicitacaoServicoService; } private Pageable makePageable(final CTPageRequest pageRequest) { final Integer page = pageRequest.getPage() != null ? pageRequest.getPage() : 1; final Integer size = pageRequest.getSize() != null ? pageRequest.getSize() : ParametroUtil.getValorParametro(ParametroSistema.REST_SERVICES_DEFAULT_PAGE_SIZE, "10"); return new PageRequest(page - 1, size); } }