package br.com.centralit.bpm.negocio; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.mozilla.javascript.NativeJavaObject; import br.com.centralit.bpm.config.Config; import br.com.centralit.bpm.dto.ElementoFluxoDTO; import br.com.centralit.bpm.dto.ItemTrabalhoFluxoDTO; import br.com.centralit.bpm.integracao.ElementoFluxoDao; import br.com.centralit.bpm.integracao.ItemTrabalhoFluxoDao; import br.com.centralit.bpm.integracao.TarefaFluxoDao; import br.com.centralit.bpm.util.Enumerados; import br.com.centralit.bpm.util.Enumerados.SituacaoItemTrabalho; import br.com.centralit.bpm.util.Enumerados.TipoAtribuicao; import br.com.centralit.bpm.util.UtilScript; import br.com.citframework.util.UtilDatas; public abstract class ItemTrabalho extends NegocioBpm implements IItemTrabalho { protected ElementoFluxoDTO elementoFluxoDto; protected InstanciaFluxo instanciaFluxo; protected ItemTrabalhoFluxoDTO itemTrabalhoDto; public static ItemTrabalho getItemTrabalhoDeElemento(InstanciaFluxo instanciaFluxo, Integer idElemento) throws Exception { ElementoFluxoDao elementoFluxoDao = new ElementoFluxoDao(); if (instanciaFluxo.getTransacao() != null) elementoFluxoDao.setTransactionControler(instanciaFluxo.getTransacao()); ElementoFluxoDTO elementoDto = elementoFluxoDao.restore(idElemento); String nomeClasse = Config.getClasseNegocioElemento(elementoDto.getTipoElemento()); ItemTrabalho classe = (ItemTrabalho) Class.forName(nomeClasse).newInstance(); classe.instanciaFluxo = instanciaFluxo; classe.elementoFluxoDto = elementoDto; classe.itemTrabalhoDto = null; classe.setTransacao(instanciaFluxo.getTransacao()); return classe; } public static ItemTrabalho getItemTrabalho(InstanciaFluxo instanciaFluxo, Integer idItemTrabalho) throws Exception { ItemTrabalhoFluxoDao itemTrabalhoDao = new ItemTrabalhoFluxoDao(); if (instanciaFluxo.getTransacao() != null) itemTrabalhoDao.setTransactionControler(instanciaFluxo.getTransacao()); ItemTrabalhoFluxoDTO itemDto = new ItemTrabalhoFluxoDTO(); itemDto.setIdItemTrabalho(idItemTrabalho); itemDto = (ItemTrabalhoFluxoDTO) itemTrabalhoDao.restore(itemDto); ElementoFluxoDao elementoFluxoDao = new ElementoFluxoDao(); if (instanciaFluxo.getTransacao() != null) elementoFluxoDao.setTransactionControler(instanciaFluxo.getTransacao()); ElementoFluxoDTO elementoDto = elementoFluxoDao.restore(itemDto.getIdElemento()); String nomeClasse = Config.getClasseNegocioElemento(elementoDto.getTipoElemento()); ItemTrabalho classe = (ItemTrabalho) Class.forName(nomeClasse).newInstance(); classe.instanciaFluxo = instanciaFluxo; classe.elementoFluxoDto = elementoDto; classe.itemTrabalhoDto = itemDto; classe.setTransacao(instanciaFluxo.getTransacao()); return classe; } public static ItemTrabalho getItemTrabalho(Integer idItemTrabalho) throws Exception { ItemTrabalhoFluxoDao itemTrabalhoDao = new ItemTrabalhoFluxoDao(); ItemTrabalhoFluxoDTO itemDto = new ItemTrabalhoFluxoDTO(); itemDto.setIdItemTrabalho(idItemTrabalho); itemDto = (ItemTrabalhoFluxoDTO) itemTrabalhoDao.restore(itemDto); ElementoFluxoDao elementoFluxoDao = new ElementoFluxoDao(); ElementoFluxoDTO elementoDto = elementoFluxoDao.restore(itemDto.getIdElemento()); String nomeClasse = Config.getClasseNegocioElemento(elementoDto.getTipoElemento()); ItemTrabalho classe = (ItemTrabalho) Class.forName(nomeClasse).newInstance(); classe.elementoFluxoDto = elementoDto; classe.itemTrabalhoDto = itemDto; return classe; } protected String[] substituiParametros(String[] arrayExpr, Map<String, Object> objetos, String separador) throws Exception { if (arrayExpr == null || arrayExpr.length == 0) return null; if (separador == null || separador.trim().equals("")) separador = ";"; List<String> list = new ArrayList<String>(); for (String expr : arrayExpr) { String arraySubst = substituiParametros(expr, objetos); if (arraySubst != null) { String[] arrayTrat = arraySubst.split(separador); for (String str : arrayTrat) { str = substituiParametros(str, objetos); if (str != null && !str.trim().equals("")) list.add(str.trim()); } } } int i = 0; String[] result = new String[list.size()]; for (String str : list) { result[i] = str; i++; } return result; } protected String substituiParametros(String str, Map<String, Object> objetos) throws Exception { if (str.indexOf("script:", 0) >= 0) { try{ String[] s = str.split(":"); NativeJavaObject result = (NativeJavaObject) UtilScript.executaScript("script", s[1], objetos); if (result != null) return (String) NativeJavaObject.coerceType(String.class, result); }catch (Exception e) { } }else if (str.indexOf("#{", 0) >= 0) { Map<String, Object> params = UtilScript.getParams(objetos); for(String var: params.keySet()) { try{ if (!String.class.isInstance(params.get(var)) || params.get(var) == null) continue; str = str.replaceAll("\\#\\{"+var+"\\}", (String) params.get(var)); }catch (Exception e) { } } } return str; } public void registra() throws Exception{ } @Override public void redireciona(String loginUsuario, String usuarioDestino, String grupoDestino) throws Exception { } @Override public void executa(String loginUsuario, Map<String, Object> campos) throws Exception{ } @Override public void inicia(String loginUsuario, Map<String, Object> campos) throws Exception{ } @Override public void delega(String loginUsuario, String usuarioDestino, String grupoDestino) throws Exception { } @Override public void cancela(String loginUsuario) throws Exception{ } @Override public void atribui(String usuario, String grupo, TipoAtribuicao tipoAtribuicao) throws Exception { } @Override public void encerra() throws Exception{ TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao(); setTransacaoDao(tarefaFluxoDao); itemTrabalhoDto.setSituacao(SituacaoItemTrabalho.Encerrado.name()); itemTrabalhoDto.setDataHoraFinalizacao(UtilDatas.getDataHoraAtual()); tarefaFluxoDao.update(itemTrabalhoDto); } public abstract List<ItemTrabalho> resolve() throws Exception; public boolean executavel() { return false; } public boolean existe() { return itemTrabalhoDto != null && itemTrabalhoDto.getIdItemTrabalho() != null; } @Override public boolean iniciado() { if (!executavel()) return false; if (itemTrabalhoDto == null) return false; if (getSituacao().equals(Enumerados.SituacaoItemTrabalho.EmAndamento)) return true; else return false; } @Override public boolean pendente() throws Exception { if (itemTrabalhoDto.getSituacao() == null) return true; if (elementoFluxoDto != null) { if (elementoFluxoDto.getMultiplasInstancias() != null && !elementoFluxoDto.getMultiplasInstancias().equals("N")) return false; } return !getSituacao().equals(SituacaoItemTrabalho.Executado) && !getSituacao().equals(SituacaoItemTrabalho.Cancelado); } @Override public boolean resolvido() throws Exception { if (itemTrabalhoDto == null || itemTrabalhoDto.getSituacao() == null) return false; return getSituacao().equals(SituacaoItemTrabalho.Executado) || getSituacao().equals(SituacaoItemTrabalho.Cancelado); } @Override public boolean finalizado() throws Exception { if (!executavel()) return true; if (getSituacao() == null) return false; return resolvido(); } public Integer getIdFluxo() { return elementoFluxoDto.getIdFluxo(); } public String getTipoElemento() { return elementoFluxoDto.getTipoElemento(); } public Integer getIdElemento() { return elementoFluxoDto.getIdElemento(); } public String getNome() { return elementoFluxoDto.getNome(); } public String getDocumentacao() { return elementoFluxoDto.getDocumentacao(); } public String getAcaoEntrada() { return elementoFluxoDto.getAcaoEntrada(); } public String getAcaoSaida() { return elementoFluxoDto.getAcaoSaida(); } public ElementoFluxoDTO getElementoFluxoDto() { return elementoFluxoDto; } public ItemTrabalhoFluxoDTO getItemTrabalhoDto() { return itemTrabalhoDto; } public Integer getIdItemTrabalho(){ return getItemTrabalhoDto().getIdItemTrabalho(); } public InstanciaFluxo getInstanciaFluxo() { return instanciaFluxo; } public String getContabilizaSLA() { return elementoFluxoDto.getContabilizaSLA(); } public SituacaoItemTrabalho getSituacao() { if (itemTrabalhoDto == null || itemTrabalhoDto.getSituacao() == null) return null; return SituacaoItemTrabalho.valueOf(itemTrabalhoDto.getSituacao().trim()); } }