package br.com.centralit.citcorpore.negocio;
import java.util.List;
import br.com.centralit.bpm.dto.PermissoesFluxoDTO;
import br.com.centralit.bpm.util.Enumerados;
import br.com.centralit.citcorpore.bean.AtribuicaoSolicitacaoAtendenteDTO;
import br.com.centralit.citcorpore.bean.CheckoutDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.bean.result.QuantidadeResultDTO;
import br.com.centralit.citcorpore.integracao.CheckoutDao;
import br.com.centralit.citcorpore.integracao.SolicitacaoServicoDao;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.UtilDatas;
public class CheckoutServiceEjb extends CrudServiceImpl implements CheckoutService {
private static final String ACAO = Enumerados.ACAO_EXECUTAR;
private CheckoutDao checkoutDAO;
@Override
protected CheckoutDao getDao() {
if (checkoutDAO == null) {
checkoutDAO = new CheckoutDao();
}
return checkoutDAO;
}
@Override
public Integer realizarCheckout(final CheckoutDTO checkout, final UsuarioDTO usuario) throws ServiceException, PersistenceException {
Integer numeroSolicitacao = null;
try {
this.getDao().setTransactionControler(this.getTransaction());
this.getTransaction().start();
final SolicitacaoServicoDTO solicitacaoServico = this.getSolicitacaoServico(checkout.getIdTarefa());
numeroSolicitacao = solicitacaoServico.getIdSolicitacaoServico();
checkout.setIdSolicitacao(solicitacaoServico.getIdSolicitacaoServico());
this.verificarExistenciaDeCheckin(checkout, usuario);
final AtribuicaoSolicitacaoAtendenteDTO atribuicao = this.verificarCheckoutSemAtribuicao(checkout, usuario);
switch (checkout.getStatus()) {
case 2:
this.validaPermissaoFluxo(usuario, checkout);
this.suspenderSolicitacao(usuario, solicitacaoServico, checkout);
break;
case 3:
this.cancelarSolicitacao(usuario, solicitacaoServico, checkout);
break;
case 4:
this.resolverSolicitacao(usuario, solicitacaoServico, checkout);
break;
default:
this.atualizarSolicitacaoServico(usuario, solicitacaoServico, checkout);
}
checkout.setDataHoraCheckout(UtilDatas.getDataHoraAtual());
this.getDao().create(checkout);
this.getAtribuicaoSolicitacaoAtendenteService().delete(atribuicao);
this.getTransaction().commit();
} catch (final Exception e) {
this.getTransaction().rollback();
throw new ServiceException(e.getMessage());
} finally {
this.getTransaction().closeQuietly();
}
return numeroSolicitacao;
}
private void validaPermissaoFluxo(final UsuarioDTO usuarioDto, final CheckoutDTO checkoutDto) throws ServiceException {
final PermissoesFluxoServiceEjb permissoesFluxoServiceEjb = new PermissoesFluxoServiceEjb();
final PermissoesFluxoDTO permissoesFluxo = permissoesFluxoServiceEjb.findByIdFluxoAndIdUsuario(usuarioDto.getIdUsuario(), checkoutDto.getIdTarefa());
if (permissoesFluxo == null || permissoesFluxo.getSuspender() == null || !permissoesFluxo.getSuspender().trim().equalsIgnoreCase("S")) {
throw new ServiceException(this.i18nMessage(usuarioDto.getLocale(), "rest.service.mobile.v2.checkout.usuario.sem.permissao.de.suspensao"));
}
}
private void verificarExistenciaDeCheckin(final CheckoutDTO checkout, final UsuarioDTO usuario) throws Exception {
final List<QuantidadeResultDTO> quantidades = this.getDao().listQuantidadesCheckoutAndCheckin(checkout);
final Integer qtdCheckin = quantidades.get(0).getQuantidade();
final Integer qtdCheckout = quantidades.get(1).getQuantidade();
if (qtdCheckin <= qtdCheckout) {
throw new ServiceException(this.i18nMessage(usuario.getLocale(), "rest.service.mobile.v2.checkout.checkin.inexistente", checkout.getIdSolicitacao()));
}
}
private void suspenderSolicitacao(final UsuarioDTO usuario, final SolicitacaoServicoDTO solicitacaoServico, final CheckoutDTO checkout) throws Exception {
solicitacaoServico.setIdJustificativa(checkout.getIdResposta());
solicitacaoServico.setComplementoJustificativa(checkout.getDescricao());
this.getSolicitacaoServicoService().suspende(usuario, solicitacaoServico, this.getTransaction());
}
private void cancelarSolicitacao(final UsuarioDTO usuario, final SolicitacaoServicoDTO solicitacaoServico, final CheckoutDTO checkout) throws Exception {
solicitacaoServico.setSituacao(SituacaoSolicitacaoServico.Cancelada.getDescricao());
solicitacaoServico.setUsuarioDto(usuario);
solicitacaoServico.setReclassificar("N");
solicitacaoServico.setAlterarSituacao("S");
solicitacaoServico.setAcaoFluxo(ACAO);
this.getSolicitacaoServicoService().updateInfo(solicitacaoServico, this.getTransaction(), false);
}
private void resolverSolicitacao(final UsuarioDTO usuario, final SolicitacaoServicoDTO solicitacaoServico, final CheckoutDTO checkout) throws Exception {
solicitacaoServico.setSituacao(SituacaoSolicitacaoServico.Resolvida.getDescricao());
solicitacaoServico.setUsuarioDto(usuario);
solicitacaoServico.setAcaoFluxo(ACAO);
solicitacaoServico.setResposta(checkout.getDescricao());
solicitacaoServico.setReclassificar("N");
solicitacaoServico.setAlterarSituacao("S");
this.getSolicitacaoServicoService().updateInfo(solicitacaoServico, this.getTransaction(), false);
}
private void atualizarSolicitacaoServico(final UsuarioDTO usuario, final SolicitacaoServicoDTO solicitacaoServico, final CheckoutDTO checkout) throws Exception {
solicitacaoServico.setAcaoFluxo(Enumerados.ACAO_INICIAR);
solicitacaoServico.setUsuarioDto(usuario);
this.getSolicitacaoServicoService().updateInfo(solicitacaoServico, this.getTransaction(), false);
}
private AtribuicaoSolicitacaoAtendenteDTO verificarCheckoutSemAtribuicao(final CheckoutDTO checkout, final UsuarioDTO user) throws Exception {
final AtribuicaoSolicitacaoAtendenteDTO atribuicao = new AtribuicaoSolicitacaoAtendenteDTO();
atribuicao.setIdUsuario(user.getIdUsuario());
atribuicao.setIdSolicitacao(checkout.getIdSolicitacao());
final List<AtribuicaoSolicitacaoAtendenteDTO> atribuicoesOnDB = this.getAtribuicaoSolicitacaoAtendenteService().findByIDUsuarioAndIDSolicitacao(atribuicao);
final int atribuicoesSizeOnDB = atribuicoesOnDB.size();
if (atribuicoesSizeOnDB == 0) {
final String message = this.i18nMessage(user.getLocale(), "rest.service.mobile.v2.ckeckout.atribuicao.inexistente", checkout.getIdSolicitacao());
throw new ServiceException(message);
}
return atribuicoesOnDB.get(atribuicoesSizeOnDB - 1);
}
private SolicitacaoServicoDTO getSolicitacaoServico(final Integer idTarefa) throws Exception {
return this.getSolicitacaoServicoDAO().restoreByIdTarefa(idTarefa);
}
private SolicitacaoServicoServiceEjb solicitacaoServicoService;
public SolicitacaoServicoServiceEjb getSolicitacaoServicoService() {
if (solicitacaoServicoService == null) {
solicitacaoServicoService = new SolicitacaoServicoServiceEjb();
}
return solicitacaoServicoService;
}
private SolicitacaoServicoDao solicitacaoServicoDAO;
private SolicitacaoServicoDao getSolicitacaoServicoDAO() {
if (solicitacaoServicoDAO == null) {
solicitacaoServicoDAO = new SolicitacaoServicoDao();
}
return solicitacaoServicoDAO;
}
private TransactionControler transaction;
private TransactionControler getTransaction() throws ServiceException {
if (transaction == null) {
transaction = new TransactionControlerImpl(this.getDao().getAliasDB());
}
return transaction;
}
private AtribuicaoSolicitacaoAtendenteService atribuicaoSolicitacaoAtendenteService;
private AtribuicaoSolicitacaoAtendenteService getAtribuicaoSolicitacaoAtendenteService() throws ServiceException {
if (atribuicaoSolicitacaoAtendenteService == null) {
atribuicaoSolicitacaoAtendenteService = (AtribuicaoSolicitacaoAtendenteService) ServiceLocator.getInstance().getService(AtribuicaoSolicitacaoAtendenteService.class,
null);
}
return atribuicaoSolicitacaoAtendenteService;
}
}