package br.com.centralit.bpm.negocio;
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.ElementoFluxoTarefaDTO;
import br.com.centralit.bpm.dto.GrupoBpmDTO;
import br.com.centralit.bpm.dto.ItemTrabalhoFluxoDTO;
import br.com.centralit.bpm.dto.ObjetoInstanciaFluxoDTO;
import br.com.centralit.bpm.dto.ObjetoNegocioFluxoDTO;
import br.com.centralit.bpm.dto.TarefaFluxoDTO;
import br.com.centralit.bpm.dto.UsuarioBpmDTO;
import br.com.centralit.bpm.integracao.AtribuicaoFluxoDao;
import br.com.centralit.bpm.integracao.ItemTrabalhoFluxoDao;
import br.com.centralit.bpm.integracao.ObjetoInstanciaFluxoDao;
import br.com.centralit.bpm.integracao.TarefaFluxoDao;
import br.com.centralit.bpm.util.Enumerados;
import br.com.centralit.bpm.util.Enumerados.AcaoItemTrabalho;
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 class Tarefa extends ItemTrabalho {
private void executaAcaoEntrada(Map<String, Object> objetos) throws Exception {
if (elementoFluxoDto.getAcaoEntrada() == null || elementoFluxoDto.getAcaoEntrada().trim().length() == 0)
return;
if (objetos == null)
objetos = new HashMap<>();
this.instanciaFluxo.getExecucaoFluxo().mapObjetoNegocio(objetos);
this.instanciaFluxo.getObjetos(objetos);
adicionaObjeto("itemTrabalho", this, objetos);
UtilScript.executaScript(elementoFluxoDto.getNome(), elementoFluxoDto.getAcaoEntrada(), objetos);
}
private void executaAcaoSaida(Map<String, Object> objetos) throws Exception {
if (elementoFluxoDto.getAcaoSaida() == null || elementoFluxoDto.getAcaoSaida().trim().length() == 0)
return;
if (objetos == null)
objetos = new HashMap<>();
this.instanciaFluxo.getExecucaoFluxo().mapObjetoNegocio(objetos);
this.instanciaFluxo.getObjetos(objetos);
adicionaObjeto("itemTrabalho", this, objetos);
UtilScript.executaScript(elementoFluxoDto.getNome(), elementoFluxoDto.getAcaoSaida(), objetos);
}
public List<ItemTrabalho> resolve() throws Exception {
registra();
return null;
}
@Override
public void inicia(String loginUsuario, Map<String, Object> objetos) throws Exception {
atualizaTarefa(loginUsuario, Enumerados.SituacaoItemTrabalho.EmAndamento, objetos);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
UsuarioBpmDTO responsavel = usuarioGrupo.recuperaUsuario(loginUsuario);
new HistoricoItemTrabalho(this).registra(responsavel, AcaoItemTrabalho.Iniciar);
}
@Override
public void executa(String loginUsuario, Map<String, Object> objetos) throws Exception {
if (resolvido())
return;
atualizaTarefa(loginUsuario, Enumerados.SituacaoItemTrabalho.Executado, objetos);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
UsuarioBpmDTO responsavel = usuarioGrupo.recuperaUsuario(loginUsuario);
new HistoricoItemTrabalho(this).registra(responsavel, AcaoItemTrabalho.Executar);
executaAcaoSaida(objetos);
}
@Override
public void delega(String loginUsuario, String usuarioDestino, String grupoDestino) throws Exception {
boolean bDelegacaoUsuario = usuarioDestino != null && usuarioDestino.trim().length() > 0;
boolean bDelegacaoGrupo = grupoDestino != null && grupoDestino.trim().length() > 0;
if (bDelegacaoUsuario || bDelegacaoGrupo) {
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
UsuarioBpmDTO responsavel = usuarioGrupo.recuperaUsuario(loginUsuario);
UsuarioBpmDTO usuario = null;
GrupoBpmDTO grupo = null;
if (bDelegacaoUsuario)
usuario = usuarioGrupo.recuperaUsuario(usuarioDestino);
else
grupo = usuarioGrupo.recuperaGrupo(grupoDestino);
new AtribuicaoFluxo(this).registraDelegacao(responsavel, usuario, grupo);
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
/*
* Removido: o respons�vel atual continua o mesmo
*/
//itemTrabalhoDto.setIdResponsavelAtual(responsavel.getIdUsuario());
itemTrabalhoDto.setSituacao(SituacaoItemTrabalho.Disponivel.name());
tarefaFluxoDao.updateNotNull(itemTrabalhoDto);
}
}
private void atualizaTarefa(String loginUsuario, SituacaoItemTrabalho situacao, Map<String, Object> objetos) throws Exception {
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(loginUsuario);
itemTrabalhoDto.setSituacao(situacao.name());
itemTrabalhoDto.setIdResponsavelAtual(usuarioDto.getIdUsuario());
if (itemTrabalhoDto.getDataHoraInicio() == null)
itemTrabalhoDto.setDataHoraInicio(UtilDatas.getDataHoraAtual());
if (situacao.name().equals(Enumerados.SituacaoItemTrabalho.Executado.name()))
itemTrabalhoDto.setDataHoraFinalizacao(UtilDatas.getDataHoraAtual());
tarefaFluxoDao.update(itemTrabalhoDto);
if (objetos != null) {
ObjetoInstanciaFluxoDao objetoInstanciaFluxoDao = new ObjetoInstanciaFluxoDao();
setTransacaoDao(objetoInstanciaFluxoDao);
for(String key: objetos.keySet()) {
Object objeto = objetos.get(key);
if (!ObjetoInstanciaFluxoDTO.class.isInstance(objeto))
continue;
objetoInstanciaFluxoDao.deleteByIdInstanciaAndNome(instanciaFluxo.getIdInstancia(), key);
ObjetoInstanciaFluxoDTO campoInstanciaDto = (ObjetoInstanciaFluxoDTO) objeto;
campoInstanciaDto.setIdObjetoInstancia(null);
campoInstanciaDto.setIdItemTrabalho(itemTrabalhoDto.getIdItemTrabalho());
campoInstanciaDto.setTipoAssociacao(Enumerados.TIPO_ASSOCIACAO_TAREFA);
campoInstanciaDto.setIdInstancia(itemTrabalhoDto.getIdInstancia());
campoInstanciaDto = (ObjetoInstanciaFluxoDTO) objetoInstanciaFluxoDao.create(campoInstanciaDto);
}
}
}
@Override
public void cancela(String loginUsuario) throws Exception {
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
itemTrabalhoDto.setSituacao(SituacaoItemTrabalho.Cancelado.name());
itemTrabalhoDto.setDataHoraFinalizacao(UtilDatas.getDataHoraAtual());
tarefaFluxoDao.update(itemTrabalhoDto);
if (loginUsuario != null) {
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(loginUsuario);
new HistoricoItemTrabalho(this).registra(usuarioDto, AcaoItemTrabalho.Cancelar);
}
}
public void registra(String[] grupos, String[] usuarios) throws Exception {
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
TarefaFluxoDTO tarefaFluxoDto = new TarefaFluxoDTO();
tarefaFluxoDto.setIdElemento(elementoFluxoDto.getIdElemento());
tarefaFluxoDto.setIdInstancia(instanciaFluxo.getIdInstancia());
tarefaFluxoDto.setDataHoraCriacao(UtilDatas.getDataHoraAtual());
tarefaFluxoDto.setSituacao(Enumerados.SituacaoItemTrabalho.Disponivel.name());
tarefaFluxoDto = (TarefaFluxoDTO) tarefaFluxoDao.create(tarefaFluxoDto);
itemTrabalhoDto = tarefaFluxoDto;
atribui(grupos, usuarios, TipoAtribuicao.Automatica);
executaAcaoEntrada(instanciaFluxo.getObjetos());
}
@Override
public void registra() throws Exception {
if (existe())
return;
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
Collection<ItemTrabalhoFluxoDTO> colItens = tarefaFluxoDao.findByIdInstanciaAndIdElemento(instanciaFluxo.getIdInstancia(), elementoFluxoDto.getIdElemento());
if (colItens != null) {
for (ItemTrabalhoFluxoDTO itemDto : colItens) {
ItemTrabalho itemTrabalho = ItemTrabalho.getItemTrabalho(this.instanciaFluxo,itemDto.getIdItemTrabalho());
if (itemTrabalho.pendente())
return;
}
}
String[] grupos = substituiParametros(((ElementoFluxoTarefaDTO) elementoFluxoDto).getColGrupos(), instanciaFluxo.getObjetos(), ";");
String[] usuarios = substituiParametros(((ElementoFluxoTarefaDTO) elementoFluxoDto).getColUsuarios(), instanciaFluxo.getObjetos(), ";");
if (elementoFluxoDto.getMultiplasInstancias() != null && elementoFluxoDto.getMultiplasInstancias().equals("U")) {
for (String usuario : usuarios) {
String[] usrAtribuicao = new String[] {usuario};
Tarefa tarefa = (Tarefa) ItemTrabalho.getItemTrabalhoDeElemento(instanciaFluxo,elementoFluxoDto.getIdElemento());
tarefa.registra(grupos, usrAtribuicao);
}
}else{
registra(grupos, usuarios);
}
instanciaFluxo.verificaSLA(this);
}
@Override
public void redireciona(String loginUsuario, String usuarioDestino, String grupoDestino) throws Exception {
AtribuicaoFluxoDao atribuicaoFluxoDao = new AtribuicaoFluxoDao();
setTransacaoDao(atribuicaoFluxoDao);
Collection<AtribuicaoFluxoDTO> colAtribuicao = atribuicaoFluxoDao.findByDisponiveisByIdItemTrabalho(itemTrabalhoDto.getIdItemTrabalho());
if (colAtribuicao != null) {
for (AtribuicaoFluxoDTO atribuicaoFluxoDto : colAtribuicao) {
atribuicaoFluxoDao.delete(atribuicaoFluxoDto);
}
}
AtribuicaoFluxo atribuicaoFluxo = new AtribuicaoFluxo(this);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
if (usuarioDestino != null) {
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(usuarioDestino);
if (usuarioDto != null)
atribuicaoFluxo.registraAtribuicao(usuarioDto, null, TipoAtribuicao.Automatica);
}else{
GrupoBpmDTO grupoDto = usuarioGrupo.recuperaGrupo(grupoDestino);
if (grupoDto != null)
atribuicaoFluxo.registraAtribuicao(null, grupoDto, TipoAtribuicao.Automatica);
}
boolean bAtribuidoAoUsuario = loginUsuario != null && usuarioDestino != null && loginUsuario.equalsIgnoreCase(usuarioDestino);
boolean bPertenceAoGrupo = usuarioGrupo.pertenceAoGrupo(loginUsuario, grupoDestino);
TarefaFluxoDao tarefaFluxoDao = new TarefaFluxoDao();
setTransacaoDao(tarefaFluxoDao);
if (bAtribuidoAoUsuario || bPertenceAoGrupo) {
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(loginUsuario);
itemTrabalhoDto.setIdResponsavelAtual(usuarioDto.getIdUsuario());
}else{
itemTrabalhoDto.setIdResponsavelAtual(null);
}
tarefaFluxoDao.update(itemTrabalhoDto);
Map<String, GrupoBpmDTO> mapGrupos = new HashMap<>();
Map<String, UsuarioBpmDTO> mapUsuarios = new HashMap<>();
atribuiAcompanhamento(mapGrupos, mapUsuarios);
}
public void atribui(String[] grupos, String[] usuarios, TipoAtribuicao tipoAtribuicao) throws Exception {
Map<String, GrupoBpmDTO> mapGrupos = new HashMap<>();
Map<String, UsuarioBpmDTO> mapUsuarios = new HashMap<>();
AtribuicaoFluxo atribuicaoFluxo = new AtribuicaoFluxo(this);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
if (grupos != null) {
for (String grupo : grupos) {
GrupoBpmDTO grupoDto = usuarioGrupo.recuperaGrupo(grupo);
if (grupoDto != null) {
atribuicaoFluxo.registraAtribuicao(null, grupoDto, tipoAtribuicao);
mapGrupos.put(""+grupoDto.getIdGrupo(), grupoDto);
}
}
}
if (usuarios != null) {
for (String usuario : usuarios) {
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(usuario);
if (usuarioDto != null) {
boolean bAtribui = true;
Collection<GrupoBpmDTO> colGrupos = usuarioGrupo.getGruposDoUsuario(usuario);
if (colGrupos != null) {
for (GrupoBpmDTO grupoBpmDto : colGrupos) {
if (mapGrupos.get(""+grupoBpmDto.getIdGrupo()) != null) {
bAtribui = false;
break;
}
}
}
if (bAtribui) {
atribuicaoFluxo.registraAtribuicao(usuarioDto, null, tipoAtribuicao);
mapUsuarios.put(""+usuarioDto.getIdUsuario(), usuarioDto);
}
}
}
}
if (!tipoAtribuicao.equals(TipoAtribuicao.Acompanhamento))
atribuiAcompanhamento(mapGrupos, mapUsuarios);
}
public void atribuiAcompanhamento(Map<String, GrupoBpmDTO> mapGrupos, Map<String, UsuarioBpmDTO> mapUsuarios) throws Exception {
AtribuicaoFluxo atribuicaoFluxo = new AtribuicaoFluxo(this);
IUsuarioGrupo usuarioGrupo = new UsuarioGrupo();
ObjetoNegocioFluxoDTO objetoNegocioDto = instanciaFluxo.getExecucaoFluxo().getObjetoNegocioDto();
if (objetoNegocioDto != null) {
if (objetoNegocioDto.getIdGrupoNivel1() != null && mapGrupos.get(""+objetoNegocioDto.getIdGrupoNivel1()) == null) {
GrupoBpmDTO grupoDto = usuarioGrupo.recuperaGrupo(objetoNegocioDto.getIdGrupoNivel1());
if (grupoDto != null){
atribuicaoFluxo.registraAtribuicao(null, grupoDto, TipoAtribuicao.Acompanhamento);
mapGrupos.put(""+grupoDto.getIdGrupo(), grupoDto);
}
}
if (objetoNegocioDto.getIdResponsavel() != null && mapUsuarios.get(""+objetoNegocioDto.getIdResponsavel()) == null) {
UsuarioBpmDTO usuarioDto = usuarioGrupo.recuperaUsuario(objetoNegocioDto.getIdResponsavel());
boolean bAtribui = true;
Collection<GrupoBpmDTO> colGrupos = usuarioGrupo.getGruposDoUsuario(usuarioDto.getLogin());
if (colGrupos != null) {
for (GrupoBpmDTO grupoBpmDto : colGrupos) {
if (mapGrupos.get(""+grupoBpmDto.getIdGrupo()) != null) {
bAtribui = false;
break;
}
}
}
if (bAtribui)
atribuicaoFluxo.registraAtribuicao(usuarioDto, null, TipoAtribuicao.Acompanhamento);
}
}
}
@Override
public void atribui(String usuario, String grupo, TipoAtribuicao tipoAtribuicao) throws Exception {
String[] usuarios = null;
if (usuario != null)
usuarios = usuario.split(";");
String[] grupos = null;
if (grupo != null)
grupos = grupo.split(";");
if (usuarios == null && grupos == null)
return;
atribui(grupos, usuarios, tipoAtribuicao);
}
public String getTipoInteracao() {
return elementoFluxoDto.getTipoInteracao();
}
public String getUrl() {
return elementoFluxoDto.getUrl();
}
public String getVisao() {
return elementoFluxoDto.getVisao();
}
@Override
public boolean finalizado() throws Exception {
if (getSituacao() == null)
return false;
boolean result = false;
if (resolvido()) {
result = true;
if (elementoFluxoDto.getMultiplasInstancias() != null && elementoFluxoDto.getMultiplasInstancias().equalsIgnoreCase("U")) {
ItemTrabalhoFluxoDao itemTrabalhoDao = new ItemTrabalhoFluxoDao();
setTransacaoDao(itemTrabalhoDao);
Collection<ItemTrabalhoFluxoDTO> colItens = itemTrabalhoDao.findByIdInstanciaAndIdElemento(instanciaFluxo.getIdInstancia(), itemTrabalhoDto.getIdElemento());
if (colItens != null) {
for (ItemTrabalhoFluxoDTO itemTrabalhoAuxDto : colItens) {
if (itemTrabalhoAuxDto.getIdItemTrabalho().intValue() == itemTrabalhoDto.getIdItemTrabalho().intValue())
continue;
if (!itemTrabalhoAuxDto.getSituacao().trim().equalsIgnoreCase(Enumerados.SituacaoItemTrabalho.Executado.name()) && !itemTrabalhoAuxDto.getSituacao().trim().equalsIgnoreCase(Enumerados.SituacaoItemTrabalho.Cancelado.name())) {
result = false;
break;
}
}
}
}
}
return result;
}
@Override
public boolean executavel() {
return true;
}
}