package br.com.centralit.bpm.negocio;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import br.com.centralit.bpm.dto.AtribuicaoFluxoDTO;
import br.com.centralit.bpm.dto.ElementoFluxoInicioDTO;
import br.com.centralit.bpm.dto.EventoFluxoDTO;
import br.com.centralit.bpm.dto.InstanciaFluxoDTO;
import br.com.centralit.bpm.dto.ObjetoInstanciaFluxoDTO;
import br.com.centralit.bpm.integracao.AtribuicaoFluxoDao;
import br.com.centralit.bpm.integracao.EventoFluxoDao;
import br.com.centralit.bpm.integracao.InstanciaFluxoDao;
import br.com.centralit.bpm.integracao.ObjetoInstanciaFluxoDao;
import br.com.centralit.bpm.util.Enumerados;
import br.com.centralit.bpm.util.Enumerados.SituacaoInstanciaFluxo;
import br.com.centralit.bpm.util.UtilScript;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.util.UtilDatas;
import com.google.gson.Gson;
public class InstanciaFluxo extends NegocioBpm{
private InstanciaFluxoDTO instanciaFluxoDto;
private HashMap<String, Object> mapObj;
public InstanciaFluxoDTO getInstanciaFluxoDto() {
return instanciaFluxoDto;
}
private ExecucaoFluxo execucaoFluxo;
public InstanciaFluxo(ExecucaoFluxo execucaoFluxo, Map<String, Object> objetos) throws Exception {
this.execucaoFluxo = execucaoFluxo;
setTransacao(execucaoFluxo.getTransacao());
criaInstancia(objetos);
}
private void criaInstancia(Map<String, Object> objetos) throws Exception {
try {
InstanciaFluxoDao instanciaFluxoDao = new InstanciaFluxoDao();
setTransacaoDao(instanciaFluxoDao);
instanciaFluxoDto = new InstanciaFluxoDTO();
instanciaFluxoDto.setIdFluxo(execucaoFluxo.getIdFluxo());
instanciaFluxoDto.setDataHoraCriacao(UtilDatas.getDataHoraAtual());
instanciaFluxoDto.setSituacao(Enumerados.INSTANCIA_ABERTA);
instanciaFluxoDto = (InstanciaFluxoDTO) instanciaFluxoDao.create(instanciaFluxoDto);
atualizaObjetosInstancia(objetos);
ElementoFluxoInicioDTO elementoInicioDto = execucaoFluxo.getElementoInicioDto();
avanca(elementoInicioDto.getIdElemento());
} catch (Exception e) {
e.printStackTrace();
throw new LogicException("Erro na cria��o da inst�ncia do fluxo. Verifique o desenho e a parametriza��o do fluxo.");
}
}
public InstanciaFluxo(ExecucaoFluxo execucaoFluxo, Integer idInstanciaFluxo) throws Exception {
this.execucaoFluxo = execucaoFluxo;
setTransacao(execucaoFluxo.getTransacao());
InstanciaFluxoDao instanciaFluxoDao = new InstanciaFluxoDao();
setTransacaoDao(instanciaFluxoDao);
instanciaFluxoDto = new InstanciaFluxoDTO();
instanciaFluxoDto.setIdInstancia(idInstanciaFluxo);
instanciaFluxoDto = (InstanciaFluxoDTO) instanciaFluxoDao.restore(instanciaFluxoDto);
}
private void avanca(Integer idElemento) throws Exception{
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalhoDeElemento(this, idElemento);
avanca(itemTrabalho);
}
private void avanca(ItemTrabalho itemTrabalho) throws Exception{
List<ItemTrabalho> itens = itemTrabalho.resolve();
if (itens != null) {
for (ItemTrabalho elementoDestino : itens)
avanca(elementoDestino);
}
}
public Map<String, Object> getObjetos() throws Exception{
return getObjetos(null);
}
public Map<String, Object> getObjetos(Map<String, Object> mapObjetos) throws Exception{
ObjetoInstanciaFluxoDao objetoInstanciaDao = new ObjetoInstanciaFluxoDao();
setTransacaoDao(objetoInstanciaDao);
if (mapObjetos == null)
mapObjetos = new HashMap<>();
adicionaObjeto("instanciafluxo",this, mapObjetos);
adicionaObjeto("transacao",this.getTransacao(), mapObjetos);
if (mapObj != null && mapObjetos != mapObj && !mapObj.isEmpty()) {
for(String var: mapObj.keySet())
adicionaObjeto(var,mapObj.get(var), mapObjetos);
}
Collection<ObjetoInstanciaFluxoDTO> colObjetos = objetoInstanciaDao.findByIdInstancia(getIdInstancia());
if (colObjetos != null) {
Gson gson = new Gson();
for (ObjetoInstanciaFluxoDTO objetoInstanciaDto : colObjetos) {
if (mapObjetos.get(objetoInstanciaDto.getNomeObjeto()) == null && objetoInstanciaDto.getNomeClasse() != null && objetoInstanciaDto.getValor() != null) {
try{
Object objeto = gson.fromJson(objetoInstanciaDto.getValor(), Class.forName(objetoInstanciaDto.getNomeClasse()));
adicionaObjeto(objetoInstanciaDto.getNomeObjeto(),objeto, mapObjetos);
}catch (Exception e) {
}
}
}
}
return mapObjetos;
}
public void encerra() throws Exception {
if (instanciaFluxoDto.getSituacao().equalsIgnoreCase(Enumerados.INSTANCIA_ENCERRADA))
return;
AtribuicaoFluxoDao atribuicaoFluxoDao = new AtribuicaoFluxoDao();
setTransacaoDao(atribuicaoFluxoDao);
Collection<AtribuicaoFluxoDTO> colAtribuicao = atribuicaoFluxoDao.findByDisponiveisByIdInstancia(instanciaFluxoDto.getIdInstancia());
if (colAtribuicao != null) {
for (AtribuicaoFluxoDTO atribuicaoFluxoDto : colAtribuicao) {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, atribuicaoFluxoDto.getIdItemTrabalho());
itemTrabalho.cancela(null);
}
}
EventoFluxoDao eventoFluxoDao = new EventoFluxoDao();
setTransacaoDao(eventoFluxoDao);
Collection<EventoFluxoDTO> colEventos = eventoFluxoDao.findDisponiveis(instanciaFluxoDto.getIdInstancia());
if (colEventos != null) {
for (EventoFluxoDTO eventoFluxoDto : colEventos) {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, eventoFluxoDto.getIdItemTrabalho());
itemTrabalho.encerra();
}
}
InstanciaFluxoDao instanciaFluxoDao = new InstanciaFluxoDao();
setTransacaoDao(instanciaFluxoDao);
instanciaFluxoDto.setSituacao(Enumerados.INSTANCIA_ENCERRADA);
instanciaFluxoDto.setDataHoraFinalizacao(UtilDatas.getDataHoraAtual());
instanciaFluxoDao.update(instanciaFluxoDto);
}
public ExecucaoFluxo getExecucaoFluxo() {
return this.execucaoFluxo;
}
public Integer getIdInstancia() {
if (instanciaFluxoDto != null)
return instanciaFluxoDto.getIdInstancia();
else
return null;
}
public Integer getIdFluxo() {
if (instanciaFluxoDto != null)
return instanciaFluxoDto.getIdFluxo();
else
return null;
}
public Timestamp getDataHoraCriacao() {
return instanciaFluxoDto.getDataHoraCriacao();
}
public SituacaoInstanciaFluxo getSituacao() {
return Enumerados.SituacaoInstanciaFluxo.valueOf(instanciaFluxoDto.getSituacao());
}
public Timestamp getDataHoraFinalizacao() {
return instanciaFluxoDto.getDataHoraFinalizacao();
}
public void executaItemTrabalho(String loginUsuario, Integer idItemTrabalho, Map<String, Object> objetos) throws Exception {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, idItemTrabalho);
if (itemTrabalho.resolvido())
throw new LogicException("O item de trabalho '"+itemTrabalho.getElementoFluxoDto().getDocumentacao()+"' j� foi executado.");
itemTrabalho.executa(loginUsuario, objetos);
atualizaObjetosInstancia(objetos);
if (itemTrabalho.finalizado()) {
SequenciaFluxo sequenciaFluxo = new SequenciaFluxo(this);
List<ItemTrabalho> itens = sequenciaFluxo.getDestinos(itemTrabalho);
if (itens != null) {
for (ItemTrabalho itemDestino : itens)
avanca(itemDestino);
}
}
}
private boolean condicaoAtendida(String condicao) throws Exception {
return new Condicao(this,condicao,"Condicao").executa();
}
public void executaEvento(Integer idItemTrabalho, Map<String, Object> objetos) throws Exception {
Evento evento = (Evento) ItemTrabalho.getItemTrabalho(this, idItemTrabalho);
if (!condicaoAtendida(evento.getElementoFluxoDto().getCondicaoDisparo()))
return;
evento.executa(null, objetos);
SequenciaFluxo sequenciaFluxo = new SequenciaFluxo(this);
List<ItemTrabalho> itens = sequenciaFluxo.getDestinos(evento);
if (itens != null) {
for (ItemTrabalho itemDestino : itens)
avanca(itemDestino);
}
}
public void iniciaItemTrabalho(String loginUsuario, Integer idItemTrabalho, Map<String, Object> objetos) throws Exception {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, idItemTrabalho);
itemTrabalho.inicia(loginUsuario, objetos);
atualizaObjetosInstancia(objetos);
}
public void delegaItemTrabalho(String loginUsuario, Integer idItemTrabalho, String usuarioDestino, String grupoDestino) throws Exception {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, idItemTrabalho);
itemTrabalho.delega(loginUsuario, usuarioDestino, grupoDestino);
}
private void atualizaObjetosInstancia(Map<String, Object> objetos) throws Exception {
if (execucaoFluxo.getVariaveis() != null) {
ObjetoInstanciaFluxoDao objetoInstanciaFluxoDao = new ObjetoInstanciaFluxoDao();
setTransacaoDao(objetoInstanciaFluxoDao);
List colObjetos = new ArrayList<>();
Gson gson = new Gson();
Map<String, Object> params = UtilScript.getParams(objetos);
String[] variaveis = execucaoFluxo.getVariaveis();
for (int i = 0; i < variaveis.length; i++) {
Object obj = params.get(variaveis[i]);
if (obj == null)
continue;
ObjetoInstanciaFluxoDTO objetoInstanciaDto = null;
if (ObjetoInstanciaFluxoDTO.class.isInstance(obj)) {
objetoInstanciaDto = (ObjetoInstanciaFluxoDTO) obj;
}else{
objetoInstanciaDto = new ObjetoInstanciaFluxoDTO();
objetoInstanciaDto.setNomeObjeto(variaveis[i]);
objetoInstanciaDto.setNomeClasse(obj.getClass().getName());
objetoInstanciaDto.setCampoChave("N");
objetoInstanciaDto.setObjetoPrincipal("S");
try{
objetoInstanciaDto.setValor(gson.toJson(obj));
}catch (Exception e) {
}
}
objetoInstanciaFluxoDao.deleteByIdInstanciaAndNome(instanciaFluxoDto.getIdInstancia(), objetoInstanciaDto.getNomeObjeto());
objetoInstanciaDto.setIdObjetoInstancia(null);
objetoInstanciaDto.setIdInstancia(instanciaFluxoDto.getIdInstancia());
objetoInstanciaDto.setTipoAssociacao(Enumerados.TIPO_ASSOCIACAO_INSTANCIA);
objetoInstanciaDto = (ObjetoInstanciaFluxoDTO) objetoInstanciaFluxoDao.create(objetoInstanciaDto);
colObjetos.add(objetoInstanciaDto);
}
instanciaFluxoDto.setColObjetos(colObjetos);
}
mapObj = new HashMap<>();
for(String var: objetos.keySet()) {
Object obj = objetos.get(var);
mapObj.put(var, obj);
}
}
public void teste() {
System.out.println("############# IDINSTANCIA: "+getIdInstancia());
}
public HashMap<String, Object> getMapObj() {
if (mapObj == null)
mapObj = new HashMap<>();
return mapObj;
}
public void setMapObj(HashMap<String, Object> mapObj) {
this.mapObj = mapObj;
}
public void cancelaItemTrabalho(String loginUsuario, Integer idItemTrabalho) throws Exception {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this, idItemTrabalho);
itemTrabalho.cancela(loginUsuario);
}
public void verificaSLA(ItemTrabalho itemTrabalho) throws Exception {
execucaoFluxo.verificaSLA(itemTrabalho);
}
}