package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import br.com.centralit.bpm.dto.PermissoesFluxoDTO;
import br.com.centralit.bpm.dto.TarefaFluxoDTO;
import br.com.centralit.bpm.util.Enumerados;
import br.com.centralit.citcorpore.bean.AtribuicaoSolicitacaoAtendenteDTO;
import br.com.centralit.citcorpore.bean.CheckinDTO;
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.AtribuicaoSolicitacaoAtendenteDAO;
import br.com.centralit.citcorpore.integracao.CheckinDao;
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.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
public class CheckinServiceEjb extends CrudServiceImpl implements CheckinService {
private static final Logger LOGGER = Logger.getLogger(CheckinServiceEjb.class.getName());
private CheckinDao checkinDAO;
@Override
protected CheckinDao getDao() {
if (checkinDAO == null) {
checkinDAO = new CheckinDao();
}
return checkinDAO;
}
@Override
public Integer realizarCheckin(final CheckinDTO checkin, final UsuarioDTO user) throws Exception {
this.verificarCheckinUsuarioSemCheckout(user);
final SolicitacaoServicoDTO solicitacaoServico = this.getSolicitacaoServicoDao().restoreByIdTarefa(checkin.getIdTarefa());
final Integer numeroSolicitacao = solicitacaoServico.getIdSolicitacaoServico();
checkin.setIdSolicitacao(numeroSolicitacao);
this.verificarCheckinSemAtribuicao(checkin, user);
this.verificarCheckinSolicitacaoSemCheckout(checkin, user);
this.getDao().setTransactionControler(this.getTransaction());
this.getTransaction().start();
try {
if (solicitacaoServico.getSituacao().trim().equalsIgnoreCase(SituacaoSolicitacaoServico.Suspensa.name())) {
this.validaPermissaoReativacao(checkin, user);
this.reativarSolicitacaoSuspensa(checkin, user, solicitacaoServico);
}
this.capturarSolicitacao(checkin, solicitacaoServico, user);
this.getDao().create(checkin);
this.getTransaction().commit();
} catch (final Exception e) {
this.getTransaction().rollback();
} finally {
this.getTransaction().closeQuietly();
}
return numeroSolicitacao;
}
@Override
public boolean isCheckinAtivo(final Integer idTarefa, final Integer idSolicitacao, final Integer idUsuario) throws Exception {
final CheckoutDao checkoutDao = new CheckoutDao();
final CheckoutDTO checkoutDto = new CheckoutDTO();
checkoutDto.setIdTarefa(idTarefa);
checkoutDto.setIdSolicitacao(idSolicitacao);
checkoutDto.setIdUsuario(idUsuario);
final List<QuantidadeResultDTO> quantidades = checkoutDao.listQuantidadesCheckoutAndCheckin(checkoutDto);
final Integer qtdCheckin = quantidades.get(0).getQuantidade();
final Integer qtdCheckout = quantidades.get(1).getQuantidade();
if (qtdCheckin <= qtdCheckout) {
return false;
}
return true;
}
@Override
public List<CheckinDTO> listCheckinsDoUsuarioSemCheckout(final UsuarioDTO usuario) throws ServiceException {
List<CheckinDTO> result = new ArrayList<>();
try {
result = this.getDao().listCheckinDoUsuarioSemCheckout(usuario);
} catch (final Exception e) {
throw new ServiceException(e);
}
return result;
}
@Override
public List<CheckinDTO> listCheckinSolicitacaoSemCheckout(final CheckinDTO checkin) throws ServiceException {
List<CheckinDTO> result = new ArrayList<>();
try {
result = this.getDao().listCheckinSolicitacaoSemCheckout(checkin);
} catch (final Exception e) {
throw new ServiceException(e);
}
return result;
}
private void validaPermissaoReativacao(final CheckinDTO checkin, final UsuarioDTO user) throws ServiceException {
final PermissoesFluxoServiceEjb permissoesFluxoServiceEjb = new PermissoesFluxoServiceEjb();
final PermissoesFluxoDTO permissoesFluxo = permissoesFluxoServiceEjb.findByIdFluxoAndIdUsuario(user.getIdUsuario(), checkin.getIdTarefa());
if (permissoesFluxo == null || permissoesFluxo.getReativar() == null || !permissoesFluxo.getReativar().trim().equalsIgnoreCase("S")) {
throw new ServiceException(this.i18nMessage(user.getLocale(), "rest.service.mobile.v2.checkout.usuario.sem.permissao.de.reativacao"));
}
}
private void verificarCheckinUsuarioSemCheckout(final UsuarioDTO user) throws ServiceException {
final List<CheckinDTO> checkins = this.listCheckinsDoUsuarioSemCheckout(user);
if (checkins.size() > 0) {
final int checkinsSize = checkins.size();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < checkinsSize; i++) {
final CheckinDTO withoutCheckout = checkins.get(i);
sb.append(withoutCheckout.getIdSolicitacao());
if (checkinsSize != i + 1) {
sb.append(", ");
}
}
throw new ServiceException(this.i18nMessage(user.getLocale(), "rest.service.mobile.v2.checkin.atendente.com.checkin.sem.checkout", sb.toString()));
}
}
private void verificarCheckinSolicitacaoSemCheckout(final CheckinDTO checkin, final UsuarioDTO user) throws ServiceException {
final List<CheckinDTO> checkins = this.listCheckinSolicitacaoSemCheckout(checkin);
if (checkins.size() > 0) {
final String message = this.i18nMessage(user.getLocale(), "rest.service.mobile.v2.checkin.atendente.com.checkin.sem.checkout", checkin.getNomeEmpregado(),
checkin.getIdSolicitacao());
throw new ServiceException(message);
}
}
public void verificarCheckinSemAtribuicao(final CheckinDTO checkin, final UsuarioDTO user) throws Exception {
final List<AtribuicaoSolicitacaoAtendenteDTO> checkins = this.getAtribuicaoDAO().findByIDUsuarioAndIDSolicitacao(user.getIdUsuario(), checkin.getIdSolicitacao());
if (checkins.size() == 0) {
final String message = this.i18nMessage(user.getLocale(), "rest.service.mobile.v2.checkin.atribuicao.inexistente", checkin.getIdSolicitacao());
throw new ServiceException(message);
}
}
private void reativarSolicitacaoSuspensa(final CheckinDTO checkin, final UsuarioDTO user, final SolicitacaoServicoDTO solicitacaoServico) throws Exception {
this.getSolicitacaoServicoService().reativa(user, solicitacaoServico, this.getTransaction());
}
private void capturarSolicitacao(final CheckinDTO checkin, final SolicitacaoServicoDTO solicitacaoServico, final UsuarioDTO user) throws Exception {
final TarefaFluxoDTO tarefa = this.getExecucaoSolicitacaoService().recuperaTarefa(user.getLogin(), checkin.getIdTarefa());
try {
if (tarefa.getExecutar().equals("S") && !user.getNomeUsuario().trim().equals(tarefa.getResponsavelAtual().trim())
&& !solicitacaoServico.getSituacao().equals(SituacaoSolicitacaoServico.Suspensa.toString())) {
this.getExecucaoSolicitacaoService().executar(user, checkin.getIdTarefa(), Enumerados.ACAO_INICIAR, this.getTransaction());
}
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
}
private TransactionControler transaction;
private TransactionControler getTransaction() throws ServiceException {
if (transaction == null) {
transaction = new TransactionControlerImpl(this.getDao().getAliasDB());
}
return transaction;
}
private AtribuicaoSolicitacaoAtendenteDAO atribuicaoDAO;
private SolicitacaoServicoDao solicitacaoServicoDAO;
private AtribuicaoSolicitacaoAtendenteDAO getAtribuicaoDAO() {
if (atribuicaoDAO == null) {
atribuicaoDAO = new AtribuicaoSolicitacaoAtendenteDAO();
}
return atribuicaoDAO;
}
private SolicitacaoServicoDao getSolicitacaoServicoDao() {
if (solicitacaoServicoDAO == null) {
solicitacaoServicoDAO = new SolicitacaoServicoDao();
}
return solicitacaoServicoDAO;
}
private ExecucaoSolicitacaoServiceEjb execucaoSolicitacaoService;
private SolicitacaoServicoServiceEjb solicitacaoServicoService;
private ExecucaoSolicitacaoServiceEjb getExecucaoSolicitacaoService() {
if (execucaoSolicitacaoService == null) {
execucaoSolicitacaoService = new ExecucaoSolicitacaoServiceEjb();
}
return execucaoSolicitacaoService;
}
private SolicitacaoServicoServiceEjb getSolicitacaoServicoService() {
if (solicitacaoServicoService == null) {
solicitacaoServicoService = new SolicitacaoServicoServiceEjb();
}
return solicitacaoServicoService;
}
}