public async Task <bool> Handle(SalvarCopiaPlanejamentoAnualCommand request, CancellationToken cancellationToken) { var planejamentoAnualId = await repositorioPlanejamentoAnual.SalvarAsync(request.PlanejamentoAnual); foreach (var periodo in request.PlanejamentoAnual.PeriodosEscolares) { var copiaPeriodo = new PlanejamentoAnualPeriodoEscolar(periodo.PeriodoEscolarId, planejamentoAnualId); var planejamentoAnualPeriodoEscolarId = await repositorioPlanejamentoAnualPeriodoEscolar.SalvarAsync(copiaPeriodo); foreach (var componente in periodo.ComponentesCurriculares) { var copiaComponente = new PlanejamentoAnualComponente(componente.ComponenteCurricularId, componente.Descricao, planejamentoAnualPeriodoEscolarId); var planejamentoAnualComponenteId = await repositorioPlanejamentoAnualComponente.SalvarAsync(copiaComponente); foreach (var objetivo in componente.ObjetivosAprendizagem) { var copiaObjetivo = new PlanejamentoAnualObjetivoAprendizagem(planejamentoAnualComponenteId, objetivo.ObjetivoAprendizagemId); await repositorioPlanejamentoAnualObjetivosAprendizagem.SalvarAsync(copiaObjetivo); } } } return(true); }
public async Task <PlanejamentoAnualAuditoriaDto> Handle(SalvarPlanejamentoAnualCommand comando, CancellationToken cancellationToken) { PlanejamentoAnualAuditoriaDto auditorias = new PlanejamentoAnualAuditoriaDto(); try { unitOfWork.IniciarTransacao(); var planejamentoAnual = await repositorioPlanejamentoAnual.ObterPlanejamentoSimplificadoPorTurmaEComponenteCurricular(comando.TurmaId, comando.ComponenteCurricularId); if (planejamentoAnual == null) { planejamentoAnual = new PlanejamentoAnual(comando.TurmaId, comando.ComponenteCurricularId); var id = await repositorioPlanejamentoAnual.SalvarAsync(planejamentoAnual); auditorias.Id = id; } List <string> excessoes = new List <string>(); var usuario = await mediator.Send(new ObterUsuarioLogadoQuery()); var turma = await mediator.Send(new ObterTurmaComUeEDrePorIdQuery(comando.TurmaId)); if (turma == null) { throw new NegocioException($"Turma de id [{turma.Id}] não localizada!"); } var regenteAtual = await mediator.Send(new ObterUsuarioPossuiPermissaoNaTurmaEDisciplinaQuery(comando.ComponenteCurricularId, turma.CodigoTurma, DateTime.Now.Date, usuario)); foreach (var periodoEscolar in comando.PeriodosEscolares) { var periodo = await mediator.Send(new ObterPeriodoEscolarePorIdQuery(periodoEscolar.PeriodoEscolarId)); if (usuario.EhProfessor()) { var temAtribuicao = await mediator.Send(new ObterUsuarioPossuiPermissaoNaTurmaEDisciplinaNoPeriodoQuery(comando.ComponenteCurricularId, turma.CodigoTurma, usuario.CodigoRf, periodo.PeriodoInicio.Date, periodo.PeriodoFim.Date)); if (!temAtribuicao && !regenteAtual) { excessoes.Add($"Você não possui atribuição na turma {turma.Nome} - {periodo.Bimestre}° Bimestre."); } } var periodoEmAberto = await mediator.Send(new TurmaEmPeriodoAbertoQuery(turma, DateTime.Today, periodo.Bimestre, turma.AnoLetivo == DateTime.Today.Year)); if (!periodoEmAberto) { excessoes.Add($"O {periodo.Bimestre}° Bimestre não está aberto."); } } if (!excessoes.Any()) { foreach (var periodo in comando.PeriodosEscolares) { var planejamentoAnualPeriodoEscolar = await repositorioPlanejamentoAnualPeriodoEscolar.ObterPorPlanejamentoAnualIdEPeriodoId(planejamentoAnual.Id, periodo.PeriodoEscolarId); if (planejamentoAnualPeriodoEscolar == null) { planejamentoAnualPeriodoEscolar = new PlanejamentoAnualPeriodoEscolar(periodo.PeriodoEscolarId) { PlanejamentoAnualId = planejamentoAnual.Id }; await repositorioPlanejamentoAnualPeriodoEscolar.SalvarAsync(planejamentoAnualPeriodoEscolar); } else { foreach (var componente in periodo.Componentes) { await repositorioPlanejamentoAnualObjetivosAprendizagem.RemoverTodosPorPlanejamentoAnualPeriodoEscolarIdEComponenteCurricularId(planejamentoAnualPeriodoEscolar.Id, componente.ComponenteCurricularId); } } var auditoria = new PlanejamentoAnualPeriodoEscolarDto { PeriodoEscolarId = periodo.PeriodoEscolarId, }; var componentes = periodo.Componentes.Select(c => new PlanejamentoAnualComponente { ComponenteCurricularId = c.ComponenteCurricularId, Descricao = c.Descricao, PlanejamentoAnualPeriodoEscolarId = planejamentoAnualPeriodoEscolar.Id, ObjetivosAprendizagem = c.ObjetivosAprendizagemId.Select(o => new PlanejamentoAnualObjetivoAprendizagem { ObjetivoAprendizagemId = o })?.ToList() })?.ToList(); if (componentes != null) { foreach (var componente in componentes) { var planejamentoAnualComponente = await repositorioPlanejamentoAnualComponente.ObterPorPlanejamentoAnualPeriodoEscolarId(componente.ComponenteCurricularId, planejamentoAnualPeriodoEscolar.Id); if (planejamentoAnualComponente == null) { planejamentoAnualComponente = new PlanejamentoAnualComponente { ComponenteCurricularId = componente.ComponenteCurricularId, PlanejamentoAnualPeriodoEscolarId = planejamentoAnualPeriodoEscolar.Id, }; } planejamentoAnualComponente.Descricao = componente.Descricao; await repositorioPlanejamentoAnualComponente.SalvarAsync(planejamentoAnualComponente); auditoria.Componentes.Add(new PlanejamentoAnualComponenteDto { Auditoria = (AuditoriaDto)planejamentoAnualComponente, ComponenteCurricularId = componente.ComponenteCurricularId, }); await Task.Run(() => repositorioPlanejamentoAnualObjetivosAprendizagem.SalvarVarios(componente.ObjetivosAprendizagem, planejamentoAnualComponente.Id)); } } auditorias.PeriodosEscolares.Add(auditoria); } } if (excessoes.Any()) { var str = new StringBuilder(); str.AppendLine($"Os seguintes erros foram encontrados: "); foreach (var t in excessoes) { str.AppendLine($"- {t}"); } throw new NegocioException(str.ToString()); } unitOfWork.PersistirTransacao(); } catch (Exception ex) { unitOfWork.Rollback(); throw; } return(auditorias); }