package br.com.centralit.citsmart.rest.operation;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBException;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.bpm.dto.ElementoFluxoDTO;
import br.com.centralit.bpm.dto.ItemTrabalhoFluxoDTO;
import br.com.centralit.bpm.dto.TarefaFluxoDTO;
import br.com.centralit.bpm.negocio.ItemTrabalho;
import br.com.centralit.bpm.util.Enumerados.SituacaoItemTrabalho;
import br.com.centralit.citcorpore.bean.AcordoNivelServicoDTO;
import br.com.centralit.citcorpore.bean.AcordoServicoContratoDTO;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.JustificativaParecerDTO;
import br.com.centralit.citcorpore.bean.JustificativaSolicitacaoDTO;
import br.com.centralit.citcorpore.bean.ServicoContratoDTO;
import br.com.centralit.citcorpore.bean.ServicoDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.bean.TemplateSolicitacaoServicoDTO;
import br.com.centralit.citcorpore.negocio.AcordoNivelServicoService;
import br.com.centralit.citcorpore.negocio.AcordoServicoContratoService;
import br.com.centralit.citcorpore.negocio.ComplemInfSolicitacaoServicoService;
import br.com.centralit.citcorpore.negocio.JustificativaParecerService;
import br.com.centralit.citcorpore.negocio.JustificativaSolicitacaoService;
import br.com.centralit.citcorpore.negocio.ServicoContratoService;
import br.com.centralit.citcorpore.negocio.ServicoService;
import br.com.centralit.citcorpore.negocio.SolicitacaoServicoService;
import br.com.centralit.citcorpore.negocio.TemplateSolicitacaoServicoService;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSLA;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico;
import br.com.centralit.citcorpore.util.Enumerados.TipoSolicitacaoServico;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citsmart.rest.bean.RestDomainDTO;
import br.com.centralit.citsmart.rest.bean.RestOperationDTO;
import br.com.centralit.citsmart.rest.bean.RestSessionDTO;
import br.com.centralit.citsmart.rest.schema.CtMessage;
import br.com.centralit.citsmart.rest.schema.CtMessageResp;
import br.com.centralit.citsmart.rest.schema.CtNotification;
import br.com.centralit.citsmart.rest.schema.CtNotificationDetail;
import br.com.centralit.citsmart.rest.schema.CtNotificationFeedback;
import br.com.centralit.citsmart.rest.schema.CtNotificationFeedbackResp;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetById;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetByIdResp;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetByUser;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetByUserResp;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetReasons;
import br.com.centralit.citsmart.rest.schema.CtNotificationGetReasonsResp;
import br.com.centralit.citsmart.rest.schema.CtNotificationNew;
import br.com.centralit.citsmart.rest.schema.CtNotificationNewResp;
import br.com.centralit.citsmart.rest.schema.CtReason;
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.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.Reflexao;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilStrings;
import br.com.citframework.util.geo.GeoUtils;
public class RestMobile implements IRestOperation<CtMessage, CtMessageResp> {
private static final Logger LOGGER = Logger.getLogger(RestMobile.class.getName());
private static final Integer NOPRAZO = 0;
private static final Integer NOLIMITE = 1;
private static final Integer ATRASADA = 2;
private static final Integer SUSPENSA = 3;
private static final int DEFAULT_VALUE = 123;
private static final String DEFAULT_IMPACT_URGENCY = "B";
@Override
public CtMessageResp execute(final RestSessionDTO restSession, final RestOperationDTO restOperation, final CtMessage message) throws JAXBException {
return RestUtil.execute(this, restSession, restOperation, message);
}
protected Integer determinaTimeFlag(final SolicitacaoServicoDTO solicitacao) {
Integer result = NOPRAZO;
final String situacaoSolicitacaoServico = solicitacao.getSituacao();
if (solicitacao.getAtrasada() && !situacaoSolicitacaoServico.equals(SituacaoSolicitacaoServico.Suspensa.name())) {
result = ATRASADA;
} else if (situacaoSolicitacaoServico.equals(SituacaoSolicitacaoServico.Suspensa.name())) {
result = SUSPENSA;
} else if (solicitacao.getFalta1Hora()) {
result = NOLIMITE;
}
return result;
}
protected SolicitacaoServicoDTO getSolicitacaoServicoByTarefa(final RestSessionDTO restSession, final TarefaFluxoDTO tarefaFluxo) throws Exception {
SolicitacaoServicoDTO solicitacao = null;
final Collection<TarefaFluxoDTO> listTarefas = new ArrayList<>();
listTarefas.add(tarefaFluxo);
final TipoSolicitacaoServico[] tipos = TipoSolicitacaoServico.values();
final Collection<SolicitacaoServicoDTO> colSolicitacao = this.getSolicitacaoServicoService(restSession).listByTarefas(listTarefas, tipos);
if (colSolicitacao != null && !colSolicitacao.isEmpty()) {
solicitacao = ((List<SolicitacaoServicoDTO>) colSolicitacao).get(0);
}
return solicitacao;
}
protected boolean emAprovacao(final RestSessionDTO restSession, final ItemTrabalhoFluxoDTO itemTrabalho) throws Exception {
boolean result = false;
final ElementoFluxoDTO elementoFluxo = itemTrabalho.getElementoFluxoDto();
if (itemTrabalho.getSituacao().trim().equals(SituacaoItemTrabalho.Disponivel.name()) && StringUtils.isNotBlank(elementoFluxo.getTemplate())) {
final TemplateSolicitacaoServicoDTO template = this.getTemplateSolicitacaoServicoService(restSession).findByIdentificacao(elementoFluxo.getTemplate().trim());
if (template != null && template.getAprovacao().equals("S")) {
result = true;
}
}
return result;
}
protected int determinaTipoSolicitacao(final SolicitacaoServicoDTO solicitacao) {
int tipo = 0;
final TipoSolicitacaoServico tipoSolicitacaoServico = solicitacao.getTipoSolicitacao();
if (tipoSolicitacaoServico != null) {
tipo = tipoSolicitacaoServico.getIdentifier();
}
return tipo;
}
protected void verificaImpactoUrgencia(final RestSessionDTO restSession, final SolicitacaoServicoDTO solicitacao) throws Exception {
if (solicitacao.getIdServico() == null || solicitacao.getIdContrato() == null || solicitacao.getIdContrato().intValue() == 0) {
return;
}
final ServicoContratoDTO servicoContrato = this.getServicoContratoService().findByIdContratoAndIdServico(solicitacao.getIdContrato(), solicitacao.getIdServico());
solicitacao.setImpacto(DEFAULT_IMPACT_URGENCY);
solicitacao.setUrgencia(DEFAULT_IMPACT_URGENCY);
if (servicoContrato != null) {
AcordoNivelServicoDTO acordoNivelServico = this.getAcordoNivelServicoService().findAtivoByIdServicoContrato(servicoContrato.getIdServicoContrato(), "T");
if (acordoNivelServico == null) {
// Se nao houver acordo especifico, ou seja, associado direto ao servicocontrato, entao busca um acordo geral que esteja vinculado ao servicocontrato.
final AcordoServicoContratoDTO acordoServicoContrato = this.getAcordoServicoContratoService().findAtivoByIdServicoContrato(servicoContrato.getIdServicoContrato(),
"T");
if (acordoServicoContrato == null) {
throw new LogicException(RestUtil.i18nMessage(restSession, "rest.service.mobile.sla.not.set"));
}
// Apos achar a vinculacao do acordo com o servicocontrato, entao faz um restore do acordo de nivel de servico.
acordoNivelServico = new AcordoNivelServicoDTO();
acordoNivelServico.setIdAcordoNivelServico(acordoServicoContrato.getIdAcordoNivelServico());
acordoNivelServico = (AcordoNivelServicoDTO) this.getAcordoNivelServicoService().restore(acordoNivelServico);
if (acordoNivelServico == null) {
throw new LogicException(RestUtil.i18nMessage(restSession, "rest.service.mobile.sla.not.set"));
}
}
if (acordoNivelServico.getImpacto() != null) {
solicitacao.setImpacto(acordoNivelServico.getImpacto());
}
if (acordoNivelServico.getUrgencia() != null) {
solicitacao.setUrgencia(acordoNivelServico.getUrgencia());
}
}
}
protected CtNotificationGetByUserResp getByUser(final RestSessionDTO restSession, final CtNotificationGetByUser input) {
final CtNotificationGetByUserResp resp = new CtNotificationGetByUserResp();
if (restSession.getUser() == null || StringUtils.isBlank(restSession.getUser().getLogin())) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.login.not.identified")));
return resp;
}
final int tipo = input.getNotificationType();
if (!this.validNotificationType(restSession, resp, tipo)) {
return resp;
}
try {
final List<TarefaFluxoDTO> tarefas = RestUtil.getExecucaoSolicitacaoService(restSession).recuperaTarefas(restSession.getUser().getLogin(),
this.getTiposArrayFromType(tipo), this.getAprovacao(input.getOnlyApproval()));
if (tarefas != null) {
List<TarefaFluxoDTO> tarefasAux = null;
// Altera��o feito para limitar a lista enviada para o mobile, estava indo uma lista grande e estava estourando o banco.
// Ap�s a cria��o da pagina��o do mobile retirar esse tratamento.
if (tarefas.size() > 200) {
tarefasAux = tarefas.subList(0, 200);
} else {
tarefasAux = tarefas;
}
for (final TarefaFluxoDTO tarefa : tarefasAux) {
if (!tarefa.getExecutar().equalsIgnoreCase("S")) {
continue;
}
final CtNotification notification = new CtNotification();
final SolicitacaoServicoDTO solicitacao = (SolicitacaoServicoDTO) tarefa.getSolicitacaoDto();
notification.setNumber(BigInteger.valueOf(solicitacao.getIdSolicitacaoServico()));
if (solicitacao.getDataHoraInicio() != null) {
notification.setDate(UtilDatas.dateToSTR(solicitacao.getDataHoraInicio()));
}
notification.setTaskId(BigInteger.valueOf(tarefa.getIdItemTrabalho() == null ? DEFAULT_VALUE : tarefa.getIdItemTrabalho()));
if (solicitacao != null) {
notification.setType(this.determinaTipoSolicitacao(solicitacao));
}
if (StringUtils.isNotBlank(tarefa.getElementoFluxoDto().getDocumentacao())) {
notification.setTask(tarefa.getElementoFluxoDto().getDocumentacao());
}
if (UtilStrings.nullToVazio(solicitacao.getSituacaoSLA()).equalsIgnoreCase("A") && solicitacao.getDataHoraLimite() != null
&& solicitacao.getSlaACombinar().equalsIgnoreCase("N")) {
notification.setEndSLA(solicitacao.getDataHoraLimiteStr());
}
if (StringUtils.isNotBlank(solicitacao.getServico())) {
notification.setService(solicitacao.getServico());
}
notification.setTimeFlag(this.determinaTimeFlag(solicitacao));
resp.getNotifications().add(notification);
if (this.emAprovacao(restSession, tarefa)) {
notification.setWaiting(1);
}
}
if (resp.getNotifications().size() == 0) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.mandatory.fields.are.empty")));
}
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
resp.getNotifications().clear();
}
return resp;
}
protected void doGetByIDValidation(final RestSessionDTO restSession, final CtNotificationGetById input) throws Exception {
if (input.getTaskId() == null) {
throw new Exception(RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null"));
}
}
protected CtMessageResp 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 CtNotificationDetail notification = new CtNotificationDetail();
notification.setWaiting(detail.getWaiting());
notification.setNumber(detail.getNumber());
if (StringUtils.isNotBlank(detail.getDate())) {
notification.setDate(detail.getDate());
}
notification.setTaskId(detail.getTaskId());
notification.setType(detail.getType());
notification.setDescription(detail.getDescription());
notification.setStatus(detail.getStatus());
notification.setTask(detail.getTask());
notification.setTaskStatus(detail.getTaskStatus());
notification.setService(detail.getService());
notification.setTimeFlag(detail.getTimeFlag());
resp.setNotification(notification);
final String url = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.URL_Sistema, "").trim() + Constantes.getValue("CONTEXTO_APLICACAO");
resp.setSite(url.replaceAll("//", "/"));
return resp;
}
protected NotificationDetail populateNotificationDetail(final RestSessionDTO restSession, final Integer taskId) throws Exception {
TarefaFluxoDTO tarefaFluxo = null;
ElementoFluxoDTO elementoFluxo = null;
final ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(taskId);
if (itemTrabalho != null) {
tarefaFluxo = new TarefaFluxoDTO();
Reflexao.copyPropertyValues(itemTrabalho.getItemTrabalhoDto(), tarefaFluxo);
elementoFluxo = itemTrabalho.getElementoFluxoDto();
tarefaFluxo.setElementoFluxoDto(elementoFluxo);
}
if (tarefaFluxo == null) {
throw new Exception(RestUtil.i18nMessage(restSession, "rest.service.mobile.task.notfound"));
}
final SolicitacaoServicoDTO solicitacao = this.getSolicitacaoServicoByTarefa(restSession, tarefaFluxo);
if (solicitacao == null) {
throw new Exception(RestUtil.i18nMessage(restSession, "rest.service.mobile.service.solicitation.notfound"));
}
this.getSolicitacaoServicoService(restSession).determinaPrazoLimite(solicitacao, null, null);
final NotificationDetail detail = new NotificationDetail();
// espec�ficos da V1
final Integer id = solicitacao.getIdSolicitacaoServico();
detail.setNumber(BigInteger.valueOf(id == null ? DEFAULT_VALUE : id));
if (solicitacao.getDataHoraInicio() != null) {
detail.setDate(UtilDatas.dateToSTR(solicitacao.getDataHoraInicio()));
}
detail.setTaskId(BigInteger.valueOf(tarefaFluxo.getIdItemTrabalho() == null ? DEFAULT_VALUE : tarefaFluxo.getIdItemTrabalho()));
detail.setType(this.determinaTipoSolicitacao(solicitacao));
detail.setTimeFlag(this.determinaTimeFlag(solicitacao));
if (this.emAprovacao(restSession, tarefaFluxo)) {
detail.setWaiting(1);
}
// espec�ficos da V2
detail.setTimeSLA(this.getTimeSLA(solicitacao));
if (UtilStrings.nullToVazio(solicitacao.getSituacaoSLA()).equalsIgnoreCase("A") && solicitacao.getDataHoraLimite() != null
&& solicitacao.getSlaACombinar().equalsIgnoreCase("N")) {
detail.setEndSLA(solicitacao.getDataHoraLimiteStr());
}
detail.setTask(elementoFluxo.getDocumentacao());
detail.setService(solicitacao.getServico());
String descricao = "";
try {
final ComplemInfSolicitacaoServicoService complemInfSolicitacaoServicoService = this.getSolicitacaoServicoService(restSession).getInformacoesComplementaresService(
itemTrabalho);
if (complemInfSolicitacaoServicoService != null) {
descricao = complemInfSolicitacaoServicoService.getInformacoesComplementaresFmtTexto(solicitacao, itemTrabalho);
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
if (StringUtils.isBlank(descricao)) {
descricao = solicitacao.getDescricaoSemFormatacao();
}
detail.setDescription(descricao);
detail.setStatus(solicitacao.getDescrSituacao());
detail.setTaskStatus(tarefaFluxo.getDescrSituacao());
return detail;
}
private int getTimeSLA(final SolicitacaoServicoDTO solicitacao) throws Exception {
int result = 0;
final SituacaoSLA situacaoSLA = SituacaoSLA.fromNameIgnoreCase(solicitacao.getSituacaoSLA());
if (SituacaoSLA.A.equals(situacaoSLA)) {
final int atraso = (int) solicitacao.getAtrasoSLA();
if (atraso > 0) {
result = -(atraso / 60);
} else {
final Timestamp inicio = solicitacao.getDataHoraInicioSLA();
final Timestamp fim = solicitacao.getDataHoraLimite();
if (inicio != null && fim != null) {
final long timeInMillis = UtilDatas.calculaDiferencaTempoEmMilisegundos(fim, inicio);
result = (int) (timeInMillis / 1000 / 60);
}
}
}
return result;
}
protected CtNotificationFeedbackResp feedback(final RestSessionDTO restSession, final CtNotificationFeedback input) {
final CtNotificationFeedbackResp resp = new CtNotificationFeedbackResp();
if (input.getTaskId() == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null")));
return resp;
}
if (input.getFeedback() == 0 && input.getReasonId() == 0) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.justification.null")));
return resp;
}
TarefaFluxoDTO tarefaFluxo = null;
ElementoFluxoDTO elementoFluxo = null;
ItemTrabalho itemTrabalho = null;
try {
itemTrabalho = ItemTrabalho.getItemTrabalho(input.getTaskId().intValue());
if (itemTrabalho != null) {
tarefaFluxo = new TarefaFluxoDTO();
Reflexao.copyPropertyValues(itemTrabalho.getItemTrabalhoDto(), tarefaFluxo);
elementoFluxo = itemTrabalho.getElementoFluxoDto();
tarefaFluxo.setElementoFluxoDto(elementoFluxo);
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
try {
if (!this.emAprovacao(restSession, tarefaFluxo)) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.already.approved")));
return resp;
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
SolicitacaoServicoDTO solicitacao = null;
try {
solicitacao = this.getSolicitacaoServicoByTarefa(restSession, tarefaFluxo);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
if (solicitacao == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.service.solicitation.notfound")));
return resp;
}
try {
final ComplemInfSolicitacaoServicoService complemInfSolicitacaoServicoService = this.getSolicitacaoServicoService(restSession).getInformacoesComplementaresService(
itemTrabalho);
if (complemInfSolicitacaoServicoService != null) {
complemInfSolicitacaoServicoService.preparaSolicitacaoParaAprovacao(solicitacao, itemTrabalho, this.getAprovacao(input.getFeedback()), input.getReasonId(),
input.getComments());
}
if (solicitacao.getAcaoFluxo() != null) {
solicitacao.setUsuarioDto(restSession.getUser());
this.getSolicitacaoServicoService(restSession).updateInfo(solicitacao);
} else {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.action.not.defined")));
return resp;
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
return resp;
}
protected CtNotificationNewResp add(final RestSessionDTO restSession, final RestOperationDTO restOperation, final CtNotificationNew input) {
final CtNotificationNewResp resp = new CtNotificationNewResp();
if (StringUtils.isBlank(input.getDescription())) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.description.solicitation.not.informed")));
return resp;
}
if (restSession.getUser() == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.requestor.not.informed")));
return resp;
}
final EmpregadoDTO empregadoDto = RestUtil.getEmpregadoByLogin(restSession.getUser().getLogin());
if (empregadoDto == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.user.notfound")));
return resp;
}
final String idContrato = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.CONTRATO_PADRAO, "").trim();
if (StringUtils.isBlank(idContrato)) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.contract.default.not.parametrized")));
return resp;
}
final String idServico = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.SERVICO_PADRAO_SOLICITACAO, "").trim();
if (StringUtils.isBlank(idServico)) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.service.default.not.parametrized")));
return resp;
}
ServicoDTO servico = null;
try {
final ServicoService servicoService = (ServicoService) ServiceLocator.getInstance().getService(ServicoService.class, RestUtil.getUsuarioSistema(restSession));
servico = new ServicoDTO();
servico.setIdServico(Integer.valueOf(idServico));
servico = (ServicoDTO) servicoService.restore(servico);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
if (servico == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.service.not.parametrized")));
return resp;
}
ServicoContratoDTO servicoContrato = null;
try {
final ServicoContratoService servicoContratoService = (ServicoContratoService) ServiceLocator.getInstance().getService(ServicoContratoService.class,
RestUtil.getUsuarioSistema(restSession));
servicoContrato = servicoContratoService.findByIdContratoAndIdServico(Integer.valueOf(idContrato), Integer.valueOf(idServico));
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
if (servicoContrato == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.service.not.related")));
return resp;
}
final String idOrigem = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.ORIGEM_PADRAO_SOLICITACAO, "").trim();
if (StringUtils.isBlank(idOrigem)) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.treatment.id.not.parametrized")));
return resp;
}
Integer idUnidade = restSession.getDptoId();
if (idUnidade == null) {
final Map<String, RestDomainDTO> mapParam = RestUtil.getRestParameterService(restSession).findParameters(restSession, restOperation);
if (mapParam == null || mapParam.isEmpty()) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.operation.params.not.registered")));
return resp;
}
final String idUnidadeStr = RestUtil.getRestParameterService(restSession).getParamValue(mapParam, RestEnum.PARAM_DEFAULT_DEPTO_ID);
if (idUnidadeStr == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.unit.id.undefined")));
}
idUnidade = Integer.valueOf(idUnidadeStr);
}
SolicitacaoServicoDTO solicitacaoServico = new SolicitacaoServicoDTO();
solicitacaoServico.setUsuarioDto(restSession.getUser());
solicitacaoServico.setIdContrato(Integer.valueOf(idContrato));
solicitacaoServico.setIdOrigem(Integer.valueOf(idOrigem));
solicitacaoServico.setIdServico(Integer.valueOf(idServico));
solicitacaoServico.setIdSolicitante(empregadoDto.getIdEmpregado());
solicitacaoServico.setIdTipoDemandaServico(servico.getIdTipoDemandaServico());
solicitacaoServico.setIdUnidade(idUnidade);
solicitacaoServico.setIdGrupoNivel1(servicoContrato.getIdGrupoNivel1());
solicitacaoServico.setIdGrupoAtual(servicoContrato.getIdGrupoExecutor());
solicitacaoServico.setSituacao(SituacaoSolicitacaoServico.EmAndamento.name());
if (!this.setCoordinatesIfExists(solicitacaoServico, input)) {
resp.setError(RestOperationUtil.buildError(RestEnum.PARAM_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.v2.invalid.coordinates")));
return resp;
}
try {
this.verificaImpactoUrgencia(restSession, solicitacaoServico);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
solicitacaoServico.setNomecontato(empregadoDto.getNome());
solicitacaoServico.setEmailcontato(empregadoDto.getEmail());
solicitacaoServico.setTelefonecontato(empregadoDto.getTelefone());
solicitacaoServico.setRamal(empregadoDto.getRamal());
solicitacaoServico.setEnviaEmailCriacao("S");
solicitacaoServico.setEnviaEmailAcoes("N");
solicitacaoServico.setEnviaEmailFinalizacao("S");
solicitacaoServico.setDescricao(input.getDescription());
solicitacaoServico.setRegistroexecucao("");
try {
solicitacaoServico = (SolicitacaoServicoDTO) this.getSolicitacaoServicoService(restSession).create(solicitacaoServico);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
resp.setNumber(BigInteger.valueOf(solicitacaoServico.getIdSolicitacaoServico()));
return resp;
}
protected CtNotificationGetReasonsResp getReasons(final RestSessionDTO restSession, final CtNotificationGetReasons input) {
final CtNotificationGetReasonsResp resp = new CtNotificationGetReasonsResp();
if (input.getTaskId() == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.task.id.null")));
return resp;
}
TarefaFluxoDTO tarefaFluxo = null;
ElementoFluxoDTO elementoFluxo = null;
try {
final ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(input.getTaskId().intValue());
if (itemTrabalho != null) {
tarefaFluxo = new TarefaFluxoDTO();
Reflexao.copyPropertyValues(itemTrabalho.getItemTrabalhoDto(), tarefaFluxo);
elementoFluxo = itemTrabalho.getElementoFluxoDto();
tarefaFluxo.setElementoFluxoDto(elementoFluxo);
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
SolicitacaoServicoDTO solicitacaoServico = null;
try {
solicitacaoServico = this.getSolicitacaoServicoByTarefa(restSession, tarefaFluxo);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
if (solicitacaoServico == null) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.service.solicitation.notfound")));
return resp;
}
try {
final TipoSolicitacaoServico tipoSolicitacaoServico = solicitacaoServico.getTipoSolicitacao();
switch (tipoSolicitacaoServico) {
case INCIDENTE:
case REQUISICAO:
case VIAGEM:
Collection<JustificativaSolicitacaoDTO> justificativasSolicitacao = null;
final JustificativaSolicitacaoService justificativaSolicitacaoService = (JustificativaSolicitacaoService) ServiceLocator.getInstance().getService(
JustificativaSolicitacaoService.class, RestUtil.getUsuarioSistema(restSession));
if (tipoSolicitacaoServico.equals(TipoSolicitacaoServico.VIAGEM)) {
justificativasSolicitacao = justificativaSolicitacaoService.listAtivasParaViagem();
} else {
justificativasSolicitacao = justificativaSolicitacaoService.listAtivasParaAprovacao();
}
if (justificativasSolicitacao != null) {
for (final JustificativaSolicitacaoDTO justificativaDto : justificativasSolicitacao) {
final CtReason justificativa = new CtReason();
justificativa.setId(justificativaDto.getIdJustificativa());
justificativa.setDesc(justificativaDto.getDescricaoJustificativa());
resp.getReasons().add(justificativa);
}
}
break;
default:
Collection<JustificativaParecerDTO> justificativasParecer = null;
final JustificativaParecerService justificativaParecerService = (JustificativaParecerService) ServiceLocator.getInstance().getService(
JustificativaParecerService.class, RestUtil.getUsuarioSistema(restSession));
if (tipoSolicitacaoServico.equals(TipoSolicitacaoServico.COMPRA)) {
if (StringUtils.containsIgnoreCase(elementoFluxo.getTemplate(), "APROVACAO")) {
justificativasParecer = justificativaParecerService.listAplicaveisCotacao();
} else if (StringUtils.containsIgnoreCase(elementoFluxo.getTemplate(), "AUTORIZACAO")) {
justificativasParecer = justificativaParecerService.listAplicaveisRequisicao();
}
} else if (tipoSolicitacaoServico.equals(TipoSolicitacaoServico.VIAGEM) || tipoSolicitacaoServico.equals(TipoSolicitacaoServico.RH)) {
justificativasParecer = justificativaParecerService.list();
}
if (justificativasParecer != null) {
for (final JustificativaParecerDTO justificativaDto : justificativasParecer) {
final CtReason justificativa = new CtReason();
justificativa.setId(justificativaDto.getIdJustificativa());
justificativa.setDesc(justificativaDto.getDescricaoJustificativa());
resp.getReasons().add(justificativa);
}
}
break;
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
resp.setError(RestOperationUtil.buildError(e));
return resp;
}
return resp;
}
protected <E extends CtMessageResp> boolean validNotificationType(final RestSessionDTO restSession, final E resp, final int tipo) {
if (tipo < 0 || tipo > 5) {
resp.setError(RestOperationUtil.buildError(RestEnum.INPUT_ERROR, RestUtil.i18nMessage(restSession, "rest.service.mobile.select.atleast.one.type")));
return false;
}
return true;
}
private boolean setCoordinatesIfExists(final SolicitacaoServicoDTO solicitacaoServico, final CtNotificationNew input) {
final Double latitude = input.getLatitude();
final Double longitude = input.getLongitude();
boolean result = true;
if (latitude != null && longitude != null) {
result = GeoUtils.validCoordinates(latitude, longitude);
if (result) {
solicitacaoServico.setLatitude(latitude);
solicitacaoServico.setLongitude(longitude);
}
}
return result;
}
protected String getAprovacao(final int approval) {
return approval == 1 ? "S" : "N";
}
protected TipoSolicitacaoServico[] getTiposArrayFromType(final Integer type) {
final List<TipoSolicitacaoServico> types = new ArrayList<>();
if (type == 0) {
types.addAll(Arrays.asList(TipoSolicitacaoServico.values()));
} else {
types.add(TipoSolicitacaoServico.fromIdentifier(type));
}
return types.toArray(new TipoSolicitacaoServico[types.size()]);
}
private AcordoNivelServicoService acordoNivelServicoService;
private AcordoServicoContratoService acordoServicoContratoService;
private ServicoContratoService servicoContratoService;
private SolicitacaoServicoService solicitacaoServicoService;
private TemplateSolicitacaoServicoService templateSolicitacaoServicoService;
private AcordoNivelServicoService getAcordoNivelServicoService() {
if (acordoNivelServicoService == null) {
try {
acordoNivelServicoService = (AcordoNivelServicoService) ServiceLocator.getInstance().getService(AcordoNivelServicoService.class, null);
} catch (final ServiceException e) {
RestUtil.handleServiceException(LOGGER, e);
}
}
return acordoNivelServicoService;
}
private AcordoServicoContratoService getAcordoServicoContratoService() {
if (acordoServicoContratoService == null) {
try {
acordoServicoContratoService = (AcordoServicoContratoService) ServiceLocator.getInstance().getService(AcordoServicoContratoService.class, null);
} catch (final ServiceException e) {
RestUtil.handleServiceException(LOGGER, e);
}
}
return acordoServicoContratoService;
}
private ServicoContratoService getServicoContratoService() {
if (servicoContratoService == null) {
try {
servicoContratoService = (ServicoContratoService) ServiceLocator.getInstance().getService(ServicoContratoService.class, null);
} catch (final ServiceException e) {
RestUtil.handleServiceException(LOGGER, e);
}
}
return servicoContratoService;
}
private SolicitacaoServicoService getSolicitacaoServicoService(final RestSessionDTO restSession) throws Exception {
if (solicitacaoServicoService == null) {
solicitacaoServicoService = (SolicitacaoServicoService) ServiceLocator.getInstance().getService(SolicitacaoServicoService.class,
RestUtil.getUsuarioSistema(restSession));
}
return solicitacaoServicoService;
}
private TemplateSolicitacaoServicoService getTemplateSolicitacaoServicoService(final RestSessionDTO restSession) throws Exception {
if (templateSolicitacaoServicoService == null) {
templateSolicitacaoServicoService = (TemplateSolicitacaoServicoService) ServiceLocator.getInstance().getService(TemplateSolicitacaoServicoService.class,
RestUtil.getUsuarioSistema(restSession));
}
return templateSolicitacaoServicoService;
}
protected class NotificationDetail {
private String endSLA;
private String task;
private String service;
private String description;
private String status;
private String taskStatus;
// espec�ficos da V1
private BigInteger number;
private String date;
private BigInteger taskId;
private Integer type;
private Integer timeFlag;
private int waiting;
// espec�ficos da V2
private Integer timeSLA;
public String getEndSLA() {
return endSLA;
}
public void setEndSLA(final String endSLA) {
this.endSLA = endSLA;
}
public String getTask() {
return task;
}
public void setTask(final String task) {
this.task = task;
}
public String getService() {
return service;
}
public void setService(final String service) {
this.service = service;
}
public String getDescription() {
return description;
}
public void setDescription(final String description) {
this.description = description;
}
public String getStatus() {
return status;
}
public void setStatus(final String status) {
this.status = status;
}
public String getTaskStatus() {
return taskStatus;
}
public void setTaskStatus(final String taskStatus) {
this.taskStatus = taskStatus;
}
// espec�ficos da V1
public BigInteger getNumber() {
return number;
}
public void setNumber(final BigInteger number) {
this.number = number;
}
public String getDate() {
return date;
}
public void setDate(final String date) {
this.date = date;
}
public BigInteger getTaskId() {
return taskId;
}
public void setTaskId(final BigInteger taskId) {
this.taskId = taskId;
}
public Integer getType() {
return type;
}
public void setType(final Integer type) {
this.type = type;
}
public Integer getTimeFlag() {
return timeFlag;
}
public void setTimeFlag(final Integer timeFlag) {
this.timeFlag = timeFlag;
}
public int getWaiting() {
return waiting;
}
public void setWaiting(final int waiting) {
this.waiting = waiting;
}
// espec�ficos da V2
public Integer getTimeSLA() {
return timeSLA;
}
public void setTimeSLA(final Integer timeSLA) {
this.timeSLA = timeSLA;
}
}
}