package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.Collection;
import br.com.centralit.bpm.dto.AtribuicaoFluxoDTO;
import br.com.centralit.bpm.dto.FluxoDTO;
import br.com.centralit.bpm.dto.InstanciaFluxoDTO;
import br.com.centralit.bpm.integracao.AtribuicaoFluxoDao;
import br.com.centralit.bpm.integracao.FluxoDao;
import br.com.centralit.bpm.integracao.InstanciaFluxoDao;
import br.com.centralit.citcorpore.bean.DelegacaoCentroResultadoDTO;
import br.com.centralit.citcorpore.bean.DelegacaoCentroResultadoFluxoDTO;
import br.com.centralit.citcorpore.bean.DelegacaoCentroResultadoProcessoDTO;
import br.com.centralit.citcorpore.bean.ExecucaoSolicitacaoDTO;
import br.com.centralit.citcorpore.bean.ResponsavelCentroResultadoProcessoDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.integracao.DelegacaoCentroResultadoDao;
import br.com.centralit.citcorpore.integracao.DelegacaoCentroResultadoFluxoDao;
import br.com.centralit.citcorpore.integracao.DelegacaoCentroResultadoProcessoDao;
import br.com.centralit.citcorpore.integracao.ExecucaoSolicitacaoDao;
import br.com.centralit.citcorpore.integracao.ResponsavelCentroResultadoDao;
import br.com.centralit.citcorpore.integracao.SolicitacaoServicoDao;
import br.com.centralit.citcorpore.integracao.UsuarioDao;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
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.util.Reflexao;
import br.com.citframework.util.UtilDatas;
public class DelegacaoCentroResultadoServiceEjb extends CrudServiceImpl implements DelegacaoCentroResultadoService {
private DelegacaoCentroResultadoDao dao;
@Override
protected DelegacaoCentroResultadoDao getDao() {
if (dao == null) {
dao = new DelegacaoCentroResultadoDao();
}
return dao;
}
@Override
protected void validaCreate(final Object arg0) throws Exception {
final DelegacaoCentroResultadoDTO delegacaoCentroResultadoDto = (DelegacaoCentroResultadoDTO) arg0;
if (delegacaoCentroResultadoDto.getIdCentroResultado() == null) {
throw new LogicException(this.i18nMessage("centroResultado") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
if (delegacaoCentroResultadoDto.getIdResponsavel() == null) {
throw new LogicException(this.i18nMessage("citcorpore.comum.responsavel") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
if (delegacaoCentroResultadoDto.getIdEmpregado() == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.empregado") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
if (delegacaoCentroResultadoDto.getIdProcessoNegocio() == null || delegacaoCentroResultadoDto.getIdProcessoNegocio().length == 0) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.processo") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
if (delegacaoCentroResultadoDto.getAbrangencia() == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.abrangencia") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
if (delegacaoCentroResultadoDto.getDataInicio() == null || delegacaoCentroResultadoDto.getDataInicio().compareTo(UtilDatas.getDataAtual()) < 0) {
throw new LogicException(this.i18nMessage("citcorpore.comum.datainvalida"));
}
if (delegacaoCentroResultadoDto.getDataFim() == null || delegacaoCentroResultadoDto.getDataFim().compareTo(delegacaoCentroResultadoDto.getDataInicio()) < 0) {
throw new LogicException(this.i18nMessage("citcorpore.comum.dataFinalInvalida"));
}
if (delegacaoCentroResultadoDto.getIdResponsavel().intValue() == delegacaoCentroResultadoDto.getIdEmpregado().intValue()) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.empregadoNaoPermitido"));
}
final Collection<ResponsavelCentroResultadoProcessoDTO> colResponsavel = new ResponsavelCentroResultadoDao().findByIdCentroResultadoAndIdResponsavel(
delegacaoCentroResultadoDto.getIdCentroResultado(), delegacaoCentroResultadoDto.getIdEmpregado());
if (colResponsavel != null && !colResponsavel.isEmpty()) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.empregadoNaoPermitido"));
}
if (delegacaoCentroResultadoDto.getAbrangencia().equals(DelegacaoCentroResultadoDTO.ESPECIFICAS)) {
if (delegacaoCentroResultadoDto.getRequisi�oes() == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.requisicoes") + " " + this.i18nMessage("citcorpore.comum.naoInformado"));
}
final Collection<ExecucaoSolicitacaoDTO> colInstancias = new ArrayList();
SolicitacaoServicoDTO solicitacaoServicoDto = new SolicitacaoServicoDTO();
final ExecucaoSolicitacaoDao execucaoSolicitacaoDao = new ExecucaoSolicitacaoDao();
final SolicitacaoServicoDao solicitacaoServicoDao = new SolicitacaoServicoDao();
final FluxoDao fluxoDao = new FluxoDao();
final String[] requisicoes = delegacaoCentroResultadoDto.getRequisi�oes().split(",");
for (final String requisicoe : requisicoes) {
Integer idSolicitacaoServico = null;
try {
idSolicitacaoServico = new Integer(requisicoe.trim());
} catch (final Exception e) {}
if (idSolicitacaoServico == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.numeroRequisicaoInvalido"));
}
solicitacaoServicoDto.setIdSolicitacaoServico(idSolicitacaoServico);
solicitacaoServicoDto = (SolicitacaoServicoDTO) solicitacaoServicoDao.restore(solicitacaoServicoDto);
if (solicitacaoServicoDto == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.numeroRequisicaoInvalido"));
}
if (solicitacaoServicoDto.atendida()) {
throw new LogicException("Requisi��o " + idSolicitacaoServico + " j� encerrada");
}
final ExecucaoSolicitacaoDTO execucaoDto = execucaoSolicitacaoDao.findBySolicitacaoServico(solicitacaoServicoDto);
if (execucaoDto == null) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.numeroRequisicaoInvalido") + " (" + idSolicitacaoServico + ") ");
}
FluxoDTO fluxoDto = new FluxoDTO();
fluxoDto.setIdFluxo(execucaoDto.getIdFluxo());
fluxoDto = (FluxoDTO) fluxoDao.restore(fluxoDto);
boolean bFluxoValido = false;
for (int j = 0; j < delegacaoCentroResultadoDto.getIdProcessoNegocio().length; j++) {
if (fluxoDto.getIdProcessoNegocio() == null) {
continue;
}
if (delegacaoCentroResultadoDto.getIdProcessoNegocio()[j] == fluxoDto.getIdProcessoNegocio().intValue()) {
bFluxoValido = true;
break;
}
}
if (!bFluxoValido) {
throw new LogicException("Requisi��o " + idSolicitacaoServico + " n�o pertence a nenhum processo de neg�cio v�lido para a delega��o");
}
colInstancias.add(execucaoDto);
}
delegacaoCentroResultadoDto.setColInstancias(colInstancias);
}
}
@Override
public Collection findByIdResponsavelAndIdCentroResultado(final Integer idResponsavel, final Integer idCentroResultado) throws Exception {
return this.getDao().findByIdResponsavelAndIdCentroResultado(idResponsavel, idCentroResultado);
}
@Override
public IDto create(final IDto model) throws ServiceException, LogicException {
final DelegacaoCentroResultadoDao delegacaoCentroResultadoDao = new DelegacaoCentroResultadoDao();
final DelegacaoCentroResultadoFluxoDao delegacaoCentroResultadoFluxoDao = new DelegacaoCentroResultadoFluxoDao();
final DelegacaoCentroResultadoProcessoDao delegacaoCentroResultadoProcessoDao = new DelegacaoCentroResultadoProcessoDao();
final UsuarioDao usuarioDao = new UsuarioDao();
final TransactionControler tc = new TransactionControlerImpl(delegacaoCentroResultadoDao.getAliasDB());
try {
this.validaCreate(model);
delegacaoCentroResultadoDao.setTransactionControler(tc);
delegacaoCentroResultadoFluxoDao.setTransactionControler(tc);
delegacaoCentroResultadoProcessoDao.setTransactionControler(tc);
usuarioDao.setTransactionControler(tc);
tc.start();
DelegacaoCentroResultadoDTO delegacaoCentroResultadoDto = (DelegacaoCentroResultadoDTO) model;
delegacaoCentroResultadoDto.setRevogada("N");
delegacaoCentroResultadoDto = (DelegacaoCentroResultadoDTO) delegacaoCentroResultadoDao.create(delegacaoCentroResultadoDto);
for (int i = 0; i < delegacaoCentroResultadoDto.getIdProcessoNegocio().length; i++) {
final DelegacaoCentroResultadoProcessoDTO delegProcessoDto = new DelegacaoCentroResultadoProcessoDTO();
delegProcessoDto.setIdDelegacaoCentroResultado(delegacaoCentroResultadoDto.getIdDelegacaoCentroResultado());
delegProcessoDto.setIdProcessoNegocio(delegacaoCentroResultadoDto.getIdProcessoNegocio()[i]);
delegacaoCentroResultadoProcessoDao.create(delegProcessoDto);
}
final UsuarioDTO usuarioRespDto = usuarioDao.restoreAtivoByIdEmpregado(delegacaoCentroResultadoDto.getIdResponsavel());
final UsuarioDTO usuarioEmpDto = usuarioDao.restoreAtivoByIdEmpregado(delegacaoCentroResultadoDto.getIdEmpregado());
if (delegacaoCentroResultadoDto.getColInstancias() != null) {
final AtribuicaoFluxoDao atribuicaoFluxoDao = new AtribuicaoFluxoDao();
atribuicaoFluxoDao.setTransactionControler(tc);
for (final ExecucaoSolicitacaoDTO execucaoDto : delegacaoCentroResultadoDto.getColInstancias()) {
final DelegacaoCentroResultadoFluxoDTO delegFluxoDto = new DelegacaoCentroResultadoFluxoDTO();
delegFluxoDto.setIdDelegacaoCentroResultado(delegacaoCentroResultadoDto.getIdDelegacaoCentroResultado());
delegFluxoDto.setIdInstanciaFluxo(execucaoDto.getIdInstanciaFluxo());
delegacaoCentroResultadoFluxoDao.create(delegFluxoDto);
if (usuarioRespDto == null || usuarioEmpDto == null) {
continue;
}
final Collection<AtribuicaoFluxoDTO> colAtribuicoes = atribuicaoFluxoDao.findByDisponiveisByIdInstanciaAndIdUsuario(execucaoDto.getIdInstanciaFluxo(),
usuarioRespDto.getIdUsuario());
if (colAtribuicoes == null) {
continue;
}
for (final AtribuicaoFluxoDTO atribuicaoFluxoDto : colAtribuicoes) {
final AtribuicaoFluxoDTO novaAtribuicaoFluxoDto = new AtribuicaoFluxoDTO();
Reflexao.copyPropertyValues(atribuicaoFluxoDto, novaAtribuicaoFluxoDto);
novaAtribuicaoFluxoDto.setIdAtribuicao(null);
novaAtribuicaoFluxoDto.setIdUsuario(usuarioEmpDto.getIdUsuario());
atribuicaoFluxoDao.create(novaAtribuicaoFluxoDto);
}
}
}
if (delegacaoCentroResultadoDto.getAbrangencia().equalsIgnoreCase(DelegacaoCentroResultadoDTO.NOVAS_EXISTENTES) && usuarioRespDto != null && usuarioEmpDto != null) {
final FluxoDao fluxoDao = new FluxoDao();
fluxoDao.setTransactionControler(tc);
final InstanciaFluxoDao instanciaFluxoDao = new InstanciaFluxoDao();
instanciaFluxoDao.setTransactionControler(tc);
final AtribuicaoFluxoDao atribuicaoFluxoDao = new AtribuicaoFluxoDao();
atribuicaoFluxoDao.setTransactionControler(tc);
for (int i = 0; i < delegacaoCentroResultadoDto.getIdProcessoNegocio().length; i++) {
final Collection<FluxoDTO> colFluxos = fluxoDao.findByIdProcessoNegocio(delegacaoCentroResultadoDto.getIdProcessoNegocio()[i]);
if (colFluxos == null) {
continue;
}
for (final FluxoDTO fluxoDto : colFluxos) {
final Collection<InstanciaFluxoDTO> colInstancias = instanciaFluxoDao.findAtivasByIdFluxo(fluxoDto.getIdFluxo());
if (colInstancias == null) {
continue;
}
for (final InstanciaFluxoDTO instanciaFluxoDto : colInstancias) {
final Collection<AtribuicaoFluxoDTO> colAtribuicoes = atribuicaoFluxoDao.findByDisponiveisByIdInstanciaAndIdUsuario(instanciaFluxoDto.getIdInstancia(),
usuarioRespDto.getIdUsuario());
if (colAtribuicoes == null) {
continue;
}
for (final AtribuicaoFluxoDTO atribuicaoFluxoDto : colAtribuicoes) {
final AtribuicaoFluxoDTO novaAtribuicaoFluxoDto = new AtribuicaoFluxoDTO();
Reflexao.copyPropertyValues(atribuicaoFluxoDto, novaAtribuicaoFluxoDto);
novaAtribuicaoFluxoDto.setIdAtribuicao(null);
novaAtribuicaoFluxoDto.setIdUsuario(usuarioEmpDto.getIdUsuario());
atribuicaoFluxoDao.create(novaAtribuicaoFluxoDto);
}
}
}
}
}
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
return model;
}
@Override
public void revoga(final DelegacaoCentroResultadoDTO delegacaoCentroResultadoDto) throws Exception {
final DelegacaoCentroResultadoDao delegacaoCentroResultadoDao = new DelegacaoCentroResultadoDao();
final UsuarioDao usuarioDao = new UsuarioDao();
final TransactionControler tc = new TransactionControlerImpl(delegacaoCentroResultadoDao.getAliasDB());
try {
tc.start();
delegacaoCentroResultadoDao.setTransactionControler(tc);
usuarioDao.setTransactionControler(tc);
final DelegacaoCentroResultadoDTO delegacaoAuxDto = (DelegacaoCentroResultadoDTO) delegacaoCentroResultadoDao.restore(delegacaoCentroResultadoDto);
if (delegacaoAuxDto.getRevogada().equalsIgnoreCase("S")) {
throw new LogicException(this.i18nMessage("delegacaoCentroResultado.jaRevogada"));
}
if (delegacaoCentroResultadoDto.getIdResponsavelRevogacao() == null) {
throw new LogicException("Usu�rio respons�vel pela revoga��o n�o informado");
}
delegacaoAuxDto.setRevogada("S");
delegacaoAuxDto.setIdResponsavelRevogacao(delegacaoCentroResultadoDto.getIdResponsavelRevogacao());
delegacaoAuxDto.setDataHoraRevogacao(UtilDatas.getDataHoraAtual());
delegacaoCentroResultadoDao.update(delegacaoAuxDto);
usuarioDao.restoreAtivoByIdEmpregado(delegacaoAuxDto.getIdResponsavel());
final UsuarioDTO usuarioEmpDto = usuarioDao.restoreAtivoByIdEmpregado(delegacaoAuxDto.getIdEmpregado());
if (delegacaoAuxDto.getAbrangencia().equals(DelegacaoCentroResultadoDTO.ESPECIFICAS)) {
final DelegacaoCentroResultadoFluxoDao delegacaoCentroResultadoFluxoDao = new DelegacaoCentroResultadoFluxoDao();
delegacaoCentroResultadoFluxoDao.setTransactionControler(tc);
final Collection<DelegacaoCentroResultadoFluxoDTO> colInstancias = delegacaoCentroResultadoFluxoDao.findByIdDelegacaoCentroResultado(delegacaoAuxDto
.getIdDelegacaoCentroResultado());
if (colInstancias != null) {
for (final DelegacaoCentroResultadoFluxoDTO delegacaoCentroResultadoFluxoDto : colInstancias) {
final AtribuicaoFluxoDao atribuicaoFluxoDao = new AtribuicaoFluxoDao();
atribuicaoFluxoDao.setTransactionControler(tc);
final Collection<AtribuicaoFluxoDTO> colAtribuicoes = atribuicaoFluxoDao.findByDisponiveisByIdInstanciaAndIdUsuario(
delegacaoCentroResultadoFluxoDto.getIdInstanciaFluxo(), usuarioEmpDto.getIdUsuario());
if (colAtribuicoes == null) {
continue;
}
for (final AtribuicaoFluxoDTO atribuicaoFluxoDto : colAtribuicoes) {
atribuicaoFluxoDao.delete(atribuicaoFluxoDto);
}
}
}
}
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
}