public void Salvar(WorkflowAprovacaoDto workflowAprovacaoNiveisDto) { WorkflowAprovacao workflowAprovacao = MapearDtoParaEntidade(workflowAprovacaoNiveisDto); unitOfWork.IniciarTransacao(); repositorioWorkflowAprovacao.Salvar(workflowAprovacao); foreach (var workflowAprovacaoNivel in workflowAprovacao.Niveis) { workflowAprovacaoNivel.WorkflowId = workflowAprovacao.Id; repositorioWorkflowAprovacaoNivel.Salvar(workflowAprovacaoNivel); foreach (var usuario in workflowAprovacaoNivel.Usuarios) { repositorioWorkflowAprovacaoNivelUsuario.Salvar(new WorkflowAprovacaoNivelUsuario() { UsuarioId = usuario.Id, WorkflowAprovacaoNivelId = workflowAprovacaoNivel.Id }); } } servicoWorkflowAprovacao.ConfiguracaoInicial(workflowAprovacao); }
private async Task TrataNovoFuncionarioNivel(WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelDoCargo, string funcionarioRF) { var notificacaoBase = wfAprovacao.Niveis.Where(a => a.Notificacoes.Any()).SelectMany(a => a.Notificacoes).FirstOrDefault(); var notificarUsuarioCommand = new NotificarUsuarioCommand( wfAprovacao.NotifacaoTitulo, wfAprovacao.NotifacaoMensagem, funcionarioRF, (NotificacaoCategoria)wfAprovacao.NotificacaoCategoria, (NotificacaoTipo)wfAprovacao.NotificacaoTipo, wfAprovacao.DreId, wfAprovacao.UeId, wfAprovacao.TurmaId, wfAprovacao.Ano, notificacaoBase.Codigo, notificacaoBase.CriadoEm); var notificacaoId = await mediator.Send(notificarUsuarioCommand); repositorioWorkflowAprovacaoNivelNotificacao.Salvar(new WorkflowAprovacaoNivelNotificacao() { NotificacaoId = notificacaoId, WorkflowAprovacaoNivelId = nivelDoCargo.Id }); }
private async Task <WorkflowAprovacao> MapearDtoParaEntidade(WorkflowAprovacaoDto workflowAprovacaoNiveisDto) { WorkflowAprovacao workflowAprovacao = new WorkflowAprovacao(); workflowAprovacao.Ano = workflowAprovacaoNiveisDto.Ano; workflowAprovacao.DreId = workflowAprovacaoNiveisDto.DreId; workflowAprovacao.UeId = workflowAprovacaoNiveisDto.UeId; workflowAprovacao.TurmaId = workflowAprovacaoNiveisDto.TurmaId; workflowAprovacao.NotifacaoMensagem = workflowAprovacaoNiveisDto.NotificacaoMensagem; workflowAprovacao.NotifacaoTitulo = workflowAprovacaoNiveisDto.NotificacaoTitulo; workflowAprovacao.NotificacaoTipo = workflowAprovacaoNiveisDto.NotificacaoTipo; workflowAprovacao.NotificacaoCategoria = workflowAprovacaoNiveisDto.NotificacaoCategoria; workflowAprovacao.Tipo = workflowAprovacaoNiveisDto.Tipo; foreach (var nivel in workflowAprovacaoNiveisDto.Niveis) { var workflowNivel = new WorkflowAprovacaoNivel() { Cargo = nivel.Cargo, Nivel = nivel.Nivel }; if (nivel.UsuariosRf != null && nivel.UsuariosRf.Length > 0) { foreach (var usuarioRf in nivel.UsuariosRf) { workflowNivel.Adicionar(await ObterUsuarioPorRf(usuarioRf)); } } workflowAprovacao.Adicionar(workflowNivel); } return(workflowAprovacao); }
private static WorkflowAprovacao GeraWorkflow() { var workflowAprovacao = new WorkflowAprovacao(); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 1, Cargo = Cargo.AD }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 1, Cargo = Cargo.Diretor }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 2, Cargo = Cargo.Diretor }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 3, Cargo = Cargo.Diretor }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 5, Cargo = Cargo.Diretor }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 10, Cargo = Cargo.Diretor }); workflowAprovacao.Adicionar(new WorkflowAprovacaoNivel() { Nivel = 13, Cargo = Cargo.Diretor }); return(workflowAprovacao); }
private async Task TrataNovoNivel(WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelDoCargo, List <FuncionarioCargoDTO> funcionariosCargosDaUe) { var funcionariosDoNivel = funcionariosCargosDaUe.Where(a => a.CargoId == (int)nivelDoCargo.Cargo); var notificacaoBase = wfAprovacao.Niveis.Where(a => a.Notificacoes.Any()).SelectMany(a => a.Notificacoes).FirstOrDefault(); foreach (var funcionarioDoNivel in funcionariosDoNivel) { var notificarUsuarioCommand = new NotificarUsuarioCommand( wfAprovacao.NotifacaoTitulo, wfAprovacao.NotifacaoMensagem, funcionarioDoNivel.FuncionarioRF, (NotificacaoCategoria)wfAprovacao.NotificacaoCategoria, (NotificacaoTipo)wfAprovacao.NotificacaoTipo, wfAprovacao.DreId, wfAprovacao.UeId, wfAprovacao.TurmaId, wfAprovacao.Ano, notificacaoBase.Codigo, notificacaoBase.CriadoEm); var notificacaoId = await mediator.Send(notificarUsuarioCommand); repositorioWorkflowAprovacaoNivelNotificacao.Salvar(new WorkflowAprovacaoNivelNotificacao() { NotificacaoId = notificacaoId, WorkflowAprovacaoNivelId = nivelDoCargo.Id }); } }
private async Task <bool> VerificaSeExisteNivelEadiciona(WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelParaModificar, Cargo cargo, List <FuncionarioCargoDTO> funcionariosCargosDaUe) { var nivelDoCargo = wfAprovacao.ObterPrimeiroNivelPorCargo(cargo); var modificaNiveisPosteriores = false; if (nivelDoCargo == null) { modificaNiveisPosteriores = true; nivelDoCargo = new WorkflowAprovacaoNivel() { Cargo = cargo, Nivel = nivelParaModificar.Nivel + 1, WorkflowId = wfAprovacao.Id }; } else { if (nivelDoCargo.Notificacoes.Any()) { return(false); } } await TrataModificacaoDosNiveis(funcionariosCargosDaUe, wfAprovacao, nivelParaModificar, true, nivelDoCargo, modificaNiveisPosteriores); return(true); }
private async Task AprovarNivel(WorkflowAprovacaoNivel nivel, WorkflowAprovacao workflow, long codigoDaNotificacao) { var niveis = workflow.ObtemNiveisParaEnvioPosAprovacao(); if (niveis != null && niveis.Any()) { EnviaNotificacaoParaNiveis(niveis.ToList(), codigoDaNotificacao); } else { if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Liberacao_Excepcional) { await AprovarUltimoNivelEventoLiberacaoExcepcional(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.ReposicaoAula) { await AprovarUltimoNivelDaReposicaoAula(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Data_Passada) { AprovarUltimoNivelDeEventoDataPassada(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Fechamento_Reabertura) { AprovarUltimoNivelDeEventoFechamentoReabertura(codigoDaNotificacao, workflow.Id, nivel.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.AlteracaoNotaFechamento) { await AprovarAlteracaoNotaFechamento(codigoDaNotificacao, workflow.Id, workflow.TurmaId, workflow.CriadoRF, workflow.CriadoPor); } } }
private void TrataReprovacaoEventoLiberacaoExcepcional(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo, Cargo?cargoDoNivelQueRecusou) { Evento evento = repositorioEvento.ObterPorWorkflowId(workflow.Id); if (evento == null) { throw new NegocioException("Não foi possível localizar o evento deste fluxo de aprovação."); } evento.ReprovarWorkflow(); repositorioEvento.Salvar(evento); var escola = repositorioUe.ObterPorCodigo(evento.UeId); if (escola == null) { throw new NegocioException("Não foi possível localizar a Ue deste evento."); } if (cargoDoNivelQueRecusou == Cargo.Supervisor) { var funcionariosRetorno = servicoNotificacao.ObterFuncionariosPorNivel(evento.UeId, Cargo.Diretor); foreach (var funcionario in funcionariosRetorno) { var usuarioDiretor = servicoUsuario.ObterUsuarioPorCodigoRfLoginOuAdiciona(funcionario.Id); NotificarEventoQueFoiReprovado(evento, codigoDaNotificacao, usuarioDiretor, motivo, escola.Nome); } } var usuario = servicoUsuario.ObterUsuarioPorCodigoRfLoginOuAdiciona(evento.CriadoRF); NotificarEventoQueFoiReprovado(evento, codigoDaNotificacao, usuario, motivo, escola.Nome); }
public async Task Aprovar(WorkflowAprovacao workflow, bool aprovar, string observacao, long notificacaoId) { WorkflowAprovacaoNivel nivel = workflow.ObterNivelPorNotificacaoId(notificacaoId); var codigoDaNotificacao = nivel.Notificacoes.FirstOrDefault(a => a.Id == notificacaoId)?.Codigo; if (codigoDaNotificacao == null) { throw new NegocioException("Não foi possível localizar a notificação."); } nivel.PodeAprovar(); var niveisParaPersistir = workflow.ModificarStatusPorNivel(aprovar ? WorkflowAprovacaoNivelStatus.Aprovado : WorkflowAprovacaoNivelStatus.Reprovado, nivel.Nivel, observacao); AtualizaNiveis(niveisParaPersistir); if (aprovar) { await AprovarNivel(nivel, workflow, (long)codigoDaNotificacao); } else { await ReprovarNivel(workflow, (long)codigoDaNotificacao, observacao, nivel.Cargo, nivel); } }
private void AprovarNivel(WorkflowAprovacaoNivel nivel, long notificacaoId, WorkflowAprovacao workflow, long codigoDaNotificacao) { var niveis = workflow.ObtemNiveisParaEnvioPosAprovacao(); if (niveis != null) { EnviaNotificacaoParaNiveis(niveis.ToList(), codigoDaNotificacao); } else { if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Liberacao_Excepcional) { AprovarUltimoNivelEventoLiberacaoExcepcional(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.ReposicaoAula) { AprovarUltimoNivelDaReposicaoAula(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Data_Passada) { AprovarUltimoNivelDeEventoDataPassada(codigoDaNotificacao, workflow.Id); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Fechamento_Reabertura) { AprovarUltimoNivelDeEventoFechamentoReabertura(codigoDaNotificacao, workflow.Id, nivel.Id); } } }
public async Task <long> Handle(SalvarWorkflowAprovacaoCommand request, CancellationToken cancellationToken) { if (request.WorkflowAprovacao.Tipo != WorkflowAprovacaoTipo.Basica && request.WorkflowAprovacao.EntidadeParaAprovarId == 0) { throw new NegocioException("Para um workflow diferente de básico, é necessário informar o Id da entidade para Aprovar."); } WorkflowAprovacao workflowAprovacao = await MapearDtoParaEntidade(request.WorkflowAprovacao); await repositorioWorkflowAprovacao.SalvarAsync(workflowAprovacao); foreach (var workflowAprovacaoNivel in workflowAprovacao.Niveis) { workflowAprovacaoNivel.WorkflowId = workflowAprovacao.Id; await repositorioWorkflowAprovacaoNivel.SalvarAsync(workflowAprovacaoNivel); foreach (var usuario in workflowAprovacaoNivel.Usuarios) { repositorioWorkflowAprovacaoNivelUsuario.Salvar(new WorkflowAprovacaoNivelUsuario() { UsuarioId = usuario.Id, WorkflowAprovacaoNivelId = workflowAprovacaoNivel.Id }); } } servicoWorkflowAprovacao.ConfiguracaoInicial(workflowAprovacao, request.WorkflowAprovacao.EntidadeParaAprovarId); return(workflowAprovacao.Id); }
private WorkflowAprovacao ObterWorkflow(long notificacaoId) { WorkflowAprovacao workflow = repositorioWorkflowAprovacao.ObterEntidadeCompleta(0, notificacaoId); if (workflow == null) { throw new NegocioException($"Não foi possível localizar o fluxo de aprovação da notificação {notificacaoId}"); } return(workflow); }
public void ConfiguracaoInicial(WorkflowAprovacao workflowAprovacao, long idEntidadeParaAprovar) { if (workflowAprovacao.NotificacaoCategoria == NotificacaoCategoria.Workflow_Aprovacao) { var niveisIniciais = workflowAprovacao.ObtemNiveis(workflowAprovacao.ObtemPrimeiroNivel()).ToList(); EnviaNotificacaoParaNiveis(niveisIniciais); } else { EnviaNotificacaoParaNiveis(workflowAprovacao.Niveis.ToList()); } }
private void TrataReprovacaoEventoDataPassada(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo) { Evento evento = repositorioEvento.ObterPorWorkflowId(workflow.Id); if (evento == null) { throw new NegocioException("Não foi possível localizar o evento deste fluxo de aprovação."); } evento.ReprovarWorkflow(); repositorioEvento.Salvar(evento); NotificarCriadorEventoDataPassadaReprovacao(evento, codigoDaNotificacao, motivo); }
private async Task TrataReprovacaoReposicaoAula(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo) { Aula aula = repositorioAula.ObterPorWorkflowId(workflow.Id); if (aula == null) { throw new NegocioException("Não foi possível localizar a aula deste fluxo de aprovação."); } aula.ReprovarWorkflow(); repositorioAula.Salvar(aula); await NotificarAulaReposicaoQueFoiReprovada(aula, codigoDaNotificacao, motivo); }
public void ConfiguracaoInicial(WorkflowAprovacao workflowAprovacao) { if (workflowAprovacao.NotificacaoCategoria == NotificacaoCategoria.Workflow_Aprovacao) { var niveisIniciais = workflowAprovacao.ObtemNiveis(workflowAprovacao.ObtemPrimeiroNivel()).ToList(); EnviaNotificacaoParaNiveis(niveisIniciais); } else { EnviaNotificacaoParaNiveis(workflowAprovacao.Niveis.ToList()); } unitOfWork.PersistirTransacao(); }
public void Deve_Retornar_Nivel_Por_Notificacao() { WorkflowAprovacao workflowAprovacao = GeraWorkflow(); var nivel = workflowAprovacao.ObtemNiveis(5); Assert.True(nivel != null && nivel.FirstOrDefault().Nivel == 5); nivel.FirstOrDefault().Adicionar(new Notificacao() { Id = 10, Mensagem = "Mensagem de teste" }); var nivelDaNotificacao = workflowAprovacao.ObterNivelPorNotificacaoId(10); Assert.True(nivelDaNotificacao != null && nivelDaNotificacao.Nivel == 5); }
private void TrataReprovacaoFechamentoReabertura(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo, long nivelId) { FechamentoReabertura fechamentoReabertura = repositorioFechamentoReabertura.ObterCompleto(0, workflow.Id); if (fechamentoReabertura == null) { throw new NegocioException("Não foi possível localizar a reabertura do fechamento do fluxo de aprovação."); } fechamentoReabertura.ReprovarWorkFlow(); repositorioFechamentoReabertura.Salvar(fechamentoReabertura); NotificarAdminSgpUeFechamentoReaberturaReprovado(fechamentoReabertura, codigoDaNotificacao, motivo, nivelId); NotificarDiretorUeFechamentoReaberturaReprovado(fechamentoReabertura, codigoDaNotificacao, motivo, nivelId); }
private void ReprovarNivel(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo, Cargo?cargoDoNivelQueRecusou, WorkflowAprovacaoNivel nivel) { if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Liberacao_Excepcional) { TrataReprovacaoEventoLiberacaoExcepcional(workflow, codigoDaNotificacao, motivo, cargoDoNivelQueRecusou); } else if (workflow.Tipo == WorkflowAprovacaoTipo.ReposicaoAula) { TrataReprovacaoReposicaoAula(workflow, codigoDaNotificacao, motivo); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Evento_Data_Passada) { TrataReprovacaoEventoDataPassada(workflow, codigoDaNotificacao, motivo); } else if (workflow.Tipo == WorkflowAprovacaoTipo.Fechamento_Reabertura) { TrataReprovacaoFechamentoReabertura(workflow, codigoDaNotificacao, motivo, nivel.Id); } }
public void Aprovar(WorkflowAprovacao workflow, bool aprovar, string observacao, long notificacaoId) { WorkflowAprovacaoNivel nivel = workflow.ObterNivelPorNotificacaoId(notificacaoId); nivel.PodeAprovar(); var niveisParaPersistir = workflow.ModificarStatusPorNivel(aprovar ? WorkflowAprovacaoNivelStatus.Aprovado : WorkflowAprovacaoNivelStatus.Reprovado, nivel.Nivel, observacao); AtualizaNiveis(niveisParaPersistir); if (aprovar) { var codigoDaNotificacao = nivel.Notificacoes .FirstOrDefault(a => a.Id == notificacaoId).Codigo; var niveis = workflow.ObtemNiveisParaEnvioPosAprovacao(); if (niveis != null) { EnviaNotificacaoParaNiveis(niveis.ToList(), codigoDaNotificacao); } } }
public void Aprovar(WorkflowAprovacao workflow, bool aprovar, string observacao, long notificacaoId) { WorkflowAprovacaoNivel nivel = workflow.ObterNivelPorNotificacaoId(notificacaoId); nivel.PodeAprovar(); var niveisParaPersistir = workflow.ModificarStatusPorNivel(aprovar ? WorkflowAprovacaoNivelStatus.Aprovado : WorkflowAprovacaoNivelStatus.Reprovado, nivel.Nivel, observacao); AtualizaNiveis(niveisParaPersistir); var codigoDaNotificacao = nivel.Notificacoes .FirstOrDefault(a => a.Id == notificacaoId).Codigo; if (aprovar) { AprovarNivel(nivel, notificacaoId, workflow, codigoDaNotificacao); } else { ReprovarNivel(workflow, codigoDaNotificacao, observacao, nivel.Cargo, nivel); } }
public void Deve_Retornar_Niveis_Status() { WorkflowAprovacao workflowAprovacao = GeraWorkflow(); Assert.Equal(6, workflowAprovacao.ObtemNiveisUnicosEStatus().Count()); }
private async Task TrataCargoSupervisor(List <FuncionarioCargoDTO> funcionariosCargosDaUe, WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelParaModificar) { var supervisorTecnico = funcionariosCargosDaUe.FirstOrDefault(a => a.CargoId == (int)Cargo.SupervisorTecnico); if (supervisorTecnico != null) { await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.SupervisorTecnico, funcionariosCargosDaUe); } }
private async Task TrataReprovacaoAlteracaoNotaFechamento(WorkflowAprovacao workflow, long codigoDaNotificacao, string motivo) { var notasEmAprovacao = ObterNotasEmAprovacao(workflow.Id); await NotificarAprovacaoNotasFechamento(notasEmAprovacao, codigoDaNotificacao, workflow.TurmaId, false, motivo); }
private async Task TrataCargoCP(List <FuncionarioCargoDTO> funcionariosCargosDaUe, WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelParaModificar) { var ad = funcionariosCargosDaUe.FirstOrDefault(a => a.CargoId == (int)Cargo.AD); if (ad != null) { await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.AD, funcionariosCargosDaUe); } else { var diretor = funcionariosCargosDaUe.FirstOrDefault(a => a.CargoId == (int)Cargo.Diretor); if (diretor != null) { await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.Diretor, funcionariosCargosDaUe); } else { var supervisor = funcionariosCargosDaUe.FirstOrDefault(a => a.CargoId == (int)Cargo.Supervisor); if (supervisor != null) { await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.Supervisor, funcionariosCargosDaUe); } else { await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.SupervisorTecnico, funcionariosCargosDaUe); } } } }
private async Task TrataModificacaoDosNiveis(List <FuncionarioCargoDTO> funcionariosCargosDaUe, WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelParaModificar, bool modificarNivelAtual, WorkflowAprovacaoNivel nivelDoCargo, bool modificaNiveisPosteriores) { if (modificarNivelAtual) { if (modificaNiveisPosteriores) { var niveisParaModificar = wfAprovacao.Niveis.Where(a => a.Nivel > nivelParaModificar.Nivel); foreach (var nivel in niveisParaModificar) { nivel.Nivel += 1; await repositorioWorkflowAprovacaoNivel.SalvarAsync(nivel); } } await repositorioNotificacao.ExcluirLogicamentePorIdsAsync(nivelParaModificar.Notificacoes.Select(a => a.Id).ToArray()); nivelParaModificar.Status = WorkflowAprovacaoNivelStatus.Substituido; nivelDoCargo.Status = WorkflowAprovacaoNivelStatus.AguardandoAprovacao; await repositorioWorkflowAprovacaoNivel.SalvarAsync(nivelParaModificar); nivelDoCargo.Id = await repositorioWorkflowAprovacaoNivel.SalvarAsync(nivelDoCargo); await TrataNovoNivel(wfAprovacao, nivelDoCargo, funcionariosCargosDaUe); } }
private async Task TrataCargoDiretor(List <FuncionarioCargoDTO> funcionariosCargosDaUe, WorkflowAprovacao wfAprovacao, WorkflowAprovacaoNivel nivelParaModificar) { var ad = funcionariosCargosDaUe.FirstOrDefault(a => a.CargoId == (int)Cargo.AD); if (ad != null) { var adicionouNivelAd = await VerificaSeExisteNivelEadiciona(wfAprovacao, nivelParaModificar, Cargo.AD, funcionariosCargosDaUe); if (!adicionouNivelAd) { await TrataSupervisoresDiretor(funcionariosCargosDaUe, wfAprovacao, nivelParaModificar); } } else { await TrataSupervisoresDiretor(funcionariosCargosDaUe, wfAprovacao, nivelParaModificar); } }