package br.com.centralit.citcorpore.negocio;
import java.util.Collection;
import br.com.centralit.bpm.dto.TipoFluxoDTO;
import br.com.centralit.bpm.integracao.TipoFluxoDao;
import br.com.centralit.citcorpore.bean.ProcessoNegocioDTO;
import br.com.centralit.citcorpore.bean.ProcessoNivelAutoridadeDTO;
import br.com.centralit.citcorpore.integracao.ProcessoNegocioDao;
import br.com.centralit.citcorpore.integracao.ProcessoNivelAutoridadeDao;
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;
public class ProcessoNegocioServiceEjb extends CrudServiceImpl implements ProcessoNegocioService {
private ProcessoNegocioDao dao;
@Override
protected ProcessoNegocioDao getDao() {
if (dao == null) {
dao = new ProcessoNegocioDao();
}
return dao;
}
@Override
public IDto create(final IDto model) throws ServiceException, LogicException {
final ProcessoNegocioDao processoNegocioDao = new ProcessoNegocioDao();
final ProcessoNivelAutoridadeDao processoNivelAutoridadeDao = new ProcessoNivelAutoridadeDao();
final TransactionControler tc = new TransactionControlerImpl(processoNegocioDao.getAliasDB());
try {
this.validaCreate(model);
processoNegocioDao.setTransactionControler(tc);
processoNivelAutoridadeDao.setTransactionControler(tc);
tc.start();
ProcessoNegocioDTO processoNegocioDto = (ProcessoNegocioDTO) model;
if (processoNegocioDto.getPercDispensaNovaAprovacao() == null) {
processoNegocioDto.setPercDispensaNovaAprovacao(new Double(0));
}
processoNegocioDto = (ProcessoNegocioDTO) processoNegocioDao.create(processoNegocioDto);
this.atualizaAutoridades(processoNegocioDto, processoNivelAutoridadeDao);
this.atualizaFluxos(processoNegocioDto, tc);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
return model;
}
private void atualizaAutoridades(final ProcessoNegocioDTO processoNegocioDto, final ProcessoNivelAutoridadeDao processoNivelAutoridadeDao) throws Exception {
processoNivelAutoridadeDao.deleteByIdProcessoNegocio(processoNegocioDto.getIdProcessoNegocio());
if (processoNegocioDto.getColAutoridades() != null) {
for (final ProcessoNivelAutoridadeDTO autoridadeDto : processoNegocioDto.getColAutoridades()) {
if (autoridadeDto.getIdNivelAutoridade() == null) {
throw new Exception("N�vel de autoridade n�o informada");
}
if (autoridadeDto.getAntecedenciaMinimaAprovacao() == null) {
autoridadeDto.setAntecedenciaMinimaAprovacao(new Integer(0));
}
if (autoridadeDto.getPermiteSolicitacao() == null || autoridadeDto.getPermiteSolicitacao().trim().equals("")) {
autoridadeDto.setPermiteSolicitacao("S");
}
autoridadeDto.setIdProcessoNegocio(processoNegocioDto.getIdProcessoNegocio());
processoNivelAutoridadeDao.create(autoridadeDto);
}
}
}
@Override
public void update(final IDto model) throws ServiceException, LogicException {
final ProcessoNegocioDao processoNegocioDao = new ProcessoNegocioDao();
final ProcessoNivelAutoridadeDao processoNivelAutoridadeDao = new ProcessoNivelAutoridadeDao();
final TransactionControler tc = new TransactionControlerImpl(processoNegocioDao.getAliasDB());
try {
this.validaUpdate(model);
processoNegocioDao.setTransactionControler(tc);
processoNivelAutoridadeDao.setTransactionControler(tc);
tc.start();
final ProcessoNegocioDTO processoNegocioDto = (ProcessoNegocioDTO) model;
processoNegocioDao.update(processoNegocioDto);
this.atualizaAutoridades(processoNegocioDto, processoNivelAutoridadeDao);
this.atualizaFluxos(processoNegocioDto, tc);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
private void atualizaFluxos(final ProcessoNegocioDTO processoNegocioDto, final TransactionControler tc) throws Exception {
final TipoFluxoDao tipoFluxoDao = new TipoFluxoDao();
tipoFluxoDao.setTransactionControler(tc);
final Collection<TipoFluxoDTO> colTipoFluxo = tipoFluxoDao.findByIdProcessoNegocio(processoNegocioDto.getIdProcessoNegocio());
if (colTipoFluxo != null) {
for (final TipoFluxoDTO tipoFluxoDto : colTipoFluxo) {
tipoFluxoDto.setIdProcessoNegocio(null);
tipoFluxoDao.update(tipoFluxoDto);
}
}
if (processoNegocioDto.getIdTipoFluxo() != null && processoNegocioDto.getIdTipoFluxo().length > 0) {
final TipoFluxoDTO tipoFluxoDto = new TipoFluxoDTO();
for (int i = 0; i < processoNegocioDto.getIdTipoFluxo().length; i++) {
tipoFluxoDto.setIdTipoFluxo(processoNegocioDto.getIdTipoFluxo()[i]);
tipoFluxoDto.setIdProcessoNegocio(processoNegocioDto.getIdProcessoNegocio());
tipoFluxoDao.updateNotNull(tipoFluxoDto);
}
}
}
}