diff --git a/src/SME.SGP.Aplicacao/Commands/ParecerConclusivo/GerarParecerConclusivoAluno/GerarParecerConclusivoAlunoCommandHandler.cs b/src/SME.SGP.Aplicacao/Commands/ParecerConclusivo/GerarParecerConclusivoAluno/GerarParecerConclusivoAlunoCommandHandler.cs index 6c79863eaf..35a953079f 100644 --- a/src/SME.SGP.Aplicacao/Commands/ParecerConclusivo/GerarParecerConclusivoAluno/GerarParecerConclusivoAlunoCommandHandler.cs +++ b/src/SME.SGP.Aplicacao/Commands/ParecerConclusivo/GerarParecerConclusivoAluno/GerarParecerConclusivoAlunoCommandHandler.cs @@ -117,115 +117,8 @@ private async Task> ObterPareceresD } public async Task VerificaNotasTodosComponentesCurriculares(string alunoCodigo, Turma turma, long? periodoEscolarId) - { - int bimestre; - long[] conselhosClassesIds; - string[] turmasCodigos; - var turmasItinerarioEnsinoMedio = (await mediator.Send(ObterTurmaItinerarioEnsinoMedioQuery.Instance)).ToList(); - - if ((turma.DeveVerificarRegraRegulares() || turmasItinerarioEnsinoMedio.Any(a => a.Id == (int)turma.TipoTurma)) && !(periodoEscolarId.EhNulo() && turma.EhEJA())) - { - var tiposTurmasParaConsulta = new List { (int)turma.TipoTurma }; - - tiposTurmasParaConsulta.AddRange(turma.ObterTiposRegularesDiferentes()); - tiposTurmasParaConsulta.AddRange(turmasItinerarioEnsinoMedio.Select(s => s.Id)); - - var periodoEscolar = periodoEscolarId.HasValue ? - await mediator.Send(new ObterPeriodoEscolarePorIdQuery(periodoEscolarId.Value)) : - (await mediator.Send(new ObterPeriodosEscolaresPorAnoEModalidadeTurmaQuery(turma.ModalidadeCodigo, turma.AnoLetivo, turma.Semestre))).OrderBy(p => p.Bimestre).LastOrDefault(); - - if(periodoEscolar.NaoEhNulo()) - { - var turmasCodigosEOL = await mediator - .Send(new ObterTurmaCodigosAlunoPorAnoLetivoAlunoTipoTurmaQuery(turma.AnoLetivo, alunoCodigo, tiposTurmasParaConsulta, dataReferencia: periodoEscolar.PeriodoFim, ueCodigo: turma.Ue.CodigoUe, semestre: turma.Semestre != 0 ? turma.Semestre : null)); - - if (turmasCodigosEOL.NaoEhNulo() && turmasCodigosEOL.Any()) - { - var turmasComMatriculasValidas = await mediator.Send(new ObterTurmasComMatriculasValidasQuery(alunoCodigo, turmasCodigosEOL, DateTimeExtension.HorarioBrasilia().Date, DateTimeExtension.HorarioBrasilia().Date)); - if (turmasComMatriculasValidas.Any()) - turmasCodigosEOL = turmasComMatriculasValidas.ToArray(); - } - - var turmasEOL = turmasCodigosEOL.NaoEhNulo() && turmasCodigosEOL.Any() ? await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigosEOL)) : null; - - turmasCodigosEOL = turmasEOL.NaoEhNulo() && turmasEOL.Any() ? turmasEOL.Where(x => x.Ano == turma.Ano).Select(x => x.CodigoTurma).ToArray() : null; - - if (turma.Historica == true && turmasCodigosEOL.NaoEhNulo() && turmasCodigosEOL.Any()) - { - var turmasCodigosHistorico = await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigosEOL)); - - if (turmasCodigosHistorico.NaoEhNulo() && turmasCodigosHistorico.Any(x => x.EhTurmaHistorica)) - { - turmasCodigos = turmasCodigosEOL; - turmasCodigos = turmasCodigos - .Concat(new string[] { turma.CodigoTurma }).ToArray(); - } - else - turmasCodigos = new string[] { turma.CodigoTurma }; - } - else - turmasCodigos = turmasCodigosEOL.NaoEhNulo() && turmasCodigosEOL.Any() ? turmasCodigosEOL - .Concat(new string[] { turma.CodigoTurma }).ToArray() : new string[] { turma.CodigoTurma }; - } - else turmasCodigos = new string[] { turma.CodigoTurma }; - } - else turmasCodigos = new string[] { turma.CodigoTurma }; - - turmasCodigos = turmasCodigos.Distinct().ToArray(); + => await mediator.Send(new VerificaNotasTodosComponentesCurricularesQuery(alunoCodigo, turma)); - if (periodoEscolarId.HasValue) - { - var periodoEscolar = await mediator - .Send(new ObterPeriodoEscolarePorIdQuery(periodoEscolarId.Value)); - - if (periodoEscolar.EhNulo()) - throw new NegocioException("Não foi possível localizar o período escolar"); - - bimestre = periodoEscolar.Bimestre; - - conselhosClassesIds = await mediator - .Send(new ObterConselhoClasseIdsPorTurmaEPeriodoQuery(turmasCodigos, periodoEscolar?.Id)); - } - else - { - bimestre = 0; - conselhosClassesIds = Enumerable.Empty().ToArray(); - } - - var notasParaVerificar = new List(); - if (conselhosClassesIds.NaoEhNulo()) - { - foreach (var conselhosClassesId in conselhosClassesIds) - { - var notasParaAdicionar = await mediator.Send(new ObterConselhoClasseNotasAlunoQuery(conselhosClassesId, alunoCodigo, bimestre)); - notasParaVerificar.AddRange(notasParaAdicionar); - } - } - - if (periodoEscolarId.HasValue) - notasParaVerificar.AddRange(await mediator.Send(new ObterNotasFechamentosPorTurmasCodigosBimestreQuery(turmasCodigos, alunoCodigo, bimestre))); - else - { - var todasAsNotas = await mediator.Send(new ObterNotasFinaisBimestresAlunoQuery(turmasCodigos, alunoCodigo)); - - if (todasAsNotas.NaoEhNulo() && todasAsNotas.Any()) - notasParaVerificar.AddRange(todasAsNotas.Where(a => a.Bimestre.EhNulo())); - } - - var componentesCurriculares = await ObterComponentesTurmas(turmasCodigos, turma.EnsinoEspecial, turma.TurnoParaComponentesCurriculares); - var disciplinasDaTurma = await mediator - .Send(new ObterComponentesCurricularesPorIdsQuery(componentesCurriculares.Select(x => x.CodigoComponenteCurricular).Distinct().ToArray())); - - // Checa se todas as disciplinas da turma receberam nota - var disciplinasLancamNota = disciplinasDaTurma.Where(c => c.LancaNota && c.GrupoMatrizNome.NaoEhNulo()); - foreach (var componenteCurricular in disciplinasLancamNota) - { - if (!notasParaVerificar.Any(c => c.ComponenteCurricularCodigo == componenteCurricular.CodigoComponenteCurricular)) - return false; - } - - return true; - } private async Task> ObterComponentesTurmas(string[] turmasCodigo, bool ehEnsinoEspecial, int turnoParaComponentesCurriculares) { diff --git a/src/SME.SGP.Aplicacao/Queries/EOL/Aluno/Turmas/ObterTurmasComMatriculasValidas/ObterTurmasComMatriculasValidasQueryHandler.cs b/src/SME.SGP.Aplicacao/Queries/EOL/Aluno/Turmas/ObterTurmasComMatriculasValidas/ObterTurmasComMatriculasValidasQueryHandler.cs index 77005909e4..43a4783ef7 100644 --- a/src/SME.SGP.Aplicacao/Queries/EOL/Aluno/Turmas/ObterTurmasComMatriculasValidas/ObterTurmasComMatriculasValidasQueryHandler.cs +++ b/src/SME.SGP.Aplicacao/Queries/EOL/Aluno/Turmas/ObterTurmasComMatriculasValidas/ObterTurmasComMatriculasValidasQueryHandler.cs @@ -27,10 +27,13 @@ public async Task> Handle(ObterTurmasComMatriculasValidasQue var matriculasAluno = await ObterMatriculasAlunoTurma(codTurma, request.AlunoCodigo, request.PeriodoInicio, cancellationToken); if (matriculasAluno.NaoEhNulo() || matriculasAluno.Any()) { + Func> fncInstanciarTurma = async () => await mediator.Send(new ObterTurmaPorCodigoQuery(codTurma)); if (matriculasAluno.Any(m => m.CodigoTurma.ToString() == codTurma && ((m.PossuiSituacaoAtiva() && m.DataMatricula <= request.PeriodoFim) || (!m.PossuiSituacaoAtiva() && m.DataSituacao >= request.PeriodoInicio && m.DataSituacao <= request.PeriodoFim) - || (!m.PossuiSituacaoAtiva() && m.DataMatricula <= request.PeriodoFim && m.DataSituacao > request.PeriodoFim)))) + || (!m.PossuiSituacaoAtiva() && m.DataMatricula <= request.PeriodoFim && m.DataSituacao > request.PeriodoFim)) + && !(m.PossuiSituacaoDispensadoTurmaEdFisica(fncInstanciarTurma)) + )) turmasCodigosComMatriculasValidas.Add(codTurma); } } diff --git a/src/SME.SGP.Aplicacao/Queries/Notas/VerificaNotasTodosComponentesCurriculares/VerificaNotasTodosComponentesCurricularesQueryHandler.cs b/src/SME.SGP.Aplicacao/Queries/Notas/VerificaNotasTodosComponentesCurriculares/VerificaNotasTodosComponentesCurricularesQueryHandler.cs index 8646a27a29..45162b82dc 100644 --- a/src/SME.SGP.Aplicacao/Queries/Notas/VerificaNotasTodosComponentesCurriculares/VerificaNotasTodosComponentesCurricularesQueryHandler.cs +++ b/src/SME.SGP.Aplicacao/Queries/Notas/VerificaNotasTodosComponentesCurriculares/VerificaNotasTodosComponentesCurricularesQueryHandler.cs @@ -23,48 +23,7 @@ public VerificaNotasTodosComponentesCurricularesQueryHandler(IMediator mediator) public async Task Handle(VerificaNotasTodosComponentesCurricularesQuery request, CancellationToken cancellationToken) { - string[] turmasCodigos; - - var turmasItinerarioEnsinoMedio = (await mediator.Send(ObterTurmaItinerarioEnsinoMedioQuery.Instance, cancellationToken)).ToList(); - - if (request.Turma.DeveVerificarRegraRegulares() || turmasItinerarioEnsinoMedio.Any(a => a.Id == (int)request.Turma.TipoTurma)) - { - var tiposTurmas = new List { (int)request.Turma.TipoTurma }; - - tiposTurmas.AddRange(request.Turma.ObterTiposRegularesDiferentes()); - tiposTurmas.AddRange(turmasItinerarioEnsinoMedio.Select(s => s.Id).Where(c => tiposTurmas.All(x => x != c))); - - var turmasCodigosEol = await mediator.Send(new ObterTurmaCodigosAlunoPorAnoLetivoAlunoTipoTurmaQuery(request.Turma.AnoLetivo, request.AlunoCodigo, tiposTurmas, - dataReferencia: request.PeriodoEscolar?.PeriodoFim, semestre: request.Turma.EhEJA() ? request.Turma.Semestre : null), cancellationToken); - - if (request.Historico.HasValue && request.Historico.Value) - { - var turmasCodigosHistorico = await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigosEol), cancellationToken); - - if (turmasCodigosHistorico.Any(x => x.EhTurmaHistorica)) - { - turmasCodigos = turmasCodigosEol; - turmasCodigos = !turmasCodigosEol.Contains(request.Turma.CodigoTurma) ? turmasCodigos.Concat(new[] { request.Turma.CodigoTurma }).ToArray() : turmasCodigosEol; - } - else - turmasCodigos = new[] { request.Turma.CodigoTurma }; - } - else - turmasCodigos = !turmasCodigosEol.Contains(request.Turma.CodigoTurma) ? turmasCodigosEol.Concat(new[] { request.Turma.CodigoTurma }).ToArray() : turmasCodigosEol; - - if (turmasCodigos.Length > 0) - { - var turmas = await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigos.ToArray())); - - if (turmas.Select(t => t.TipoTurma).Distinct().Count() == 1 && request.Turma.ModalidadeCodigo != Modalidade.Medio) - turmasCodigos = new string[] { request.Turma.CodigoTurma }; - else if (ValidaPossibilidadeMatricula2TurmasRegularesNovoEM(turmas, request.Turma)) - turmasCodigos = new string[] { request.Turma.CodigoTurma }; - } - } - else - turmasCodigos = new[] { request.Turma.CodigoTurma }; - + string[] turmasCodigos = await ObterTurmasAluno(request, cancellationToken); var conselhosClassesIds = await mediator.Send(new ObterConselhoClasseIdsPorTurmaEBimestreQuery(turmasCodigos, request.Bimestre), cancellationToken); var notasParaVerificar = new List(); @@ -98,6 +57,45 @@ public async Task Handle(VerificaNotasTodosComponentesCurricularesQuery re return disciplinasLancamNota.All(componenteCurricular => notasParaVerificar.Any(c => c.ComponenteCurricularCodigo == componenteCurricular.CodigoComponenteCurricular)); } + private async Task ObterTurmasAluno(VerificaNotasTodosComponentesCurricularesQuery request, CancellationToken cancellationToken) + { + string[] turmasCodigos = new[] { request.Turma.CodigoTurma }; + var turmasItinerarioEnsinoMedio = (await mediator.Send(ObterTurmaItinerarioEnsinoMedioQuery.Instance, cancellationToken)).ToList(); + if (request.Turma.DeveVerificarRegraRegulares() + || turmasItinerarioEnsinoMedio.Any(a => a.Id == (int)request.Turma.TipoTurma)) + { + var tiposTurmas = new List { (int)request.Turma.TipoTurma }; + tiposTurmas.AddRange(request.Turma.ObterTiposRegularesDiferentes()); + tiposTurmas.AddRange(turmasItinerarioEnsinoMedio.Select(s => s.Id).Where(c => tiposTurmas.All(x => x != c))); + + var turmasCodigosEol = await mediator.Send(new ObterTurmaCodigosAlunoPorAnoLetivoAlunoTipoTurmaQuery(request.Turma.AnoLetivo, request.AlunoCodigo, tiposTurmas, + dataReferencia: request.PeriodoEscolar?.PeriodoFim, semestre: request.Turma.EhEJA() ? request.Turma.Semestre : null), cancellationToken); + + if (request.Historico.HasValue && request.Historico.Value) + { + var turmasCodigosHistorico = await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigosEol), cancellationToken); + if (turmasCodigosHistorico.Any(x => x.EhTurmaHistorica)) + { + turmasCodigos = turmasCodigosEol; + turmasCodigos = !turmasCodigosEol.Contains(request.Turma.CodigoTurma) ? turmasCodigos.Concat(new[] { request.Turma.CodigoTurma }).ToArray() : turmasCodigosEol; + } + } + else + turmasCodigos = !turmasCodigosEol.Contains(request.Turma.CodigoTurma) ? turmasCodigosEol.Concat(new[] { request.Turma.CodigoTurma }).ToArray() : turmasCodigosEol; + + if (turmasCodigos.Any()) + { + var turmas = await mediator.Send(new ObterTurmasPorCodigosQuery(turmasCodigos.ToArray())); + if (turmas.Select(t => t.TipoTurma).Distinct().Count() == 1 + && request.Turma.ModalidadeCodigo != Modalidade.Medio) + turmasCodigos = new string[] { request.Turma.CodigoTurma }; + else if (ValidaPossibilidadeMatricula2TurmasRegularesNovoEM(turmas, request.Turma)) + turmasCodigos = new string[] { request.Turma.CodigoTurma }; + } + }; + return turmasCodigos; + } + private static string[] DefinirTurmasConsideradasDeAcordoComMatricula(IEnumerable matriculasDoAluno, Dominio.PeriodoEscolar periodoEscolar, string[] turmasCodigos) { if (periodoEscolar.NaoEhNulo()) @@ -106,7 +104,10 @@ private static string[] DefinirTurmasConsideradasDeAcordoComMatricula(IEnumerabl where ((m.Ativo && m.DataMatricula.Date < periodoEscolar.PeriodoFim) || (m.Inativo && m.DataMatricula.Date < periodoEscolar.PeriodoFim && m.DataSituacao.Date >= periodoEscolar.PeriodoInicio)) && m.CodigoSituacaoMatricula != SituacaoMatriculaAluno.VinculoIndevido - select m.CodigoTurma).Distinct(); + && turmasCodigos.Contains(m.CodigoTurma.ToString()) + select m.CodigoTurma.ToString()).Distinct(); + if (turmasConsideradas.Any()) + return turmasConsideradas.ToArray(); } else { diff --git a/src/SME.SGP.Aplicacao/Queries/TipoCalendario/ObterAulaEventoAvaliacaoCalendarioProfessorPorMes/ObterAulaEventoAvaliacaoCalendarioProfessorPorMesQueryHandler.cs b/src/SME.SGP.Aplicacao/Queries/TipoCalendario/ObterAulaEventoAvaliacaoCalendarioProfessorPorMes/ObterAulaEventoAvaliacaoCalendarioProfessorPorMesQueryHandler.cs index 62a09da1d7..483d06440b 100644 --- a/src/SME.SGP.Aplicacao/Queries/TipoCalendario/ObterAulaEventoAvaliacaoCalendarioProfessorPorMes/ObterAulaEventoAvaliacaoCalendarioProfessorPorMesQueryHandler.cs +++ b/src/SME.SGP.Aplicacao/Queries/TipoCalendario/ObterAulaEventoAvaliacaoCalendarioProfessorPorMes/ObterAulaEventoAvaliacaoCalendarioProfessorPorMesQueryHandler.cs @@ -84,9 +84,12 @@ where componentesCurricularesDoDia.Contains(disciplina.DisciplinaId.ToString()) } var aulasId = aulasDoDia.Select(a => a.Id).ToArray(); - if (turma.ModalidadeCodigo == Modalidade.EJA) + if (turma.EhEJA() + || turma.EhMedioNoturno()) { - var aulas = aulasDoDia.Where(a => !a.EhTecnologiaAprendizagem); + var aulas = aulasDoDia.Where(a => !(a.EhAulaCompartilhada + || (turma.EhEJA() && a.EhTecnologiaAprendizagem) + || (turma.EhMedioNoturno() && a.EhTecAprendizagemELeitura))); aulasId = aulas.NaoEhNulo() && aulas.Any() ? aulas.Select(a => a.Id).ToArray() : null; } diff --git a/src/SME.SGP.Dados/Repositorios/RepositorioConselhoClasseParecerConclusivoConsulta.cs b/src/SME.SGP.Dados/Repositorios/RepositorioConselhoClasseParecerConclusivoConsulta.cs index b2732cd243..4d7c024f7d 100644 --- a/src/SME.SGP.Dados/Repositorios/RepositorioConselhoClasseParecerConclusivoConsulta.cs +++ b/src/SME.SGP.Dados/Repositorios/RepositorioConselhoClasseParecerConclusivoConsulta.cs @@ -1,6 +1,4 @@ using SME.SGP.Dominio; -using SME.SGP.Dominio.Entidades; -using SME.SGP.Dominio.Enumerados; using SME.SGP.Dominio.Interfaces; using SME.SGP.Infra; using SME.SGP.Infra.Interface; @@ -8,7 +6,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -16,6 +13,9 @@ namespace SME.SGP.Dados.Repositorios { public class RepositorioConselhoClasseParecerConclusivoConsulta : RepositorioBase, IRepositorioConselhoClasseParecerConclusivo { + private const char ANO_IDENTIFICACAO_TURMA_BILINGUE_OU_INFANTIL_LIBRAS = 'S'; + private const string ANO_IDENTIFICACAO_TURMA_TECNICA_P = "P", ANO_IDENTIFICACAO_TURMA_TECNICA_Q = "Q"; + public RepositorioConselhoClasseParecerConclusivoConsulta(ISgpContextConsultas database, IServicoAuditoria servicoAuditoria) : base(database, servicoAuditoria) { } @@ -23,7 +23,7 @@ public RepositorioConselhoClasseParecerConclusivoConsulta(ISgpContextConsultas d public async Task> ObterListaPorTurmaIdAsync(long turmaId, DateTime dataConsulta) { var where = "t.id = @parametro"; - + return await ObterListaPorTurma(where, turmaId, dataConsulta); } @@ -48,19 +48,26 @@ private async Task> ObterListaPorTu { var sql = string.Format(ObterSqlParecerConclusivoTurma(), where); - var param = new { parametro, dataConsulta }; + var param = new + { + parametro, + dataConsulta, + modalidadeEja = (int)Modalidade.EJA, + anoBilingueOuInfantilLibras = ANO_IDENTIFICACAO_TURMA_BILINGUE_OU_INFANTIL_LIBRAS, + anosTurmasTecnicas = new string[] { ANO_IDENTIFICACAO_TURMA_TECNICA_P, ANO_IDENTIFICACAO_TURMA_TECNICA_Q } + }; return await database.Conexao.QueryAsync(sql, param); } - private string ObterSqlParecerConclusivoTurma() + private static string ObterSqlParecerConclusivoTurma() { return @"select ccp.* from conselho_classe_parecer ccp inner join conselho_classe_parecer_ano ccpa on ccp.id = ccpa.parecer_id inner join turma t on ccpa.modalidade = t.modalidade_codigo - and ((t.ano = 'S' and ccpa.ano_turma = 1) OR cast(ccpa.ano_turma as varchar) = t.ano) - and ((t.modalidade_codigo = 3 and t.etapa_eja = ccpa.etapa_eja) - or (t.modalidade_codigo <> 3 and ccpa.etapa_eja is null)) + and ((t.ano = @anoBilingueOuInfantilLibras and ccpa.ano_turma = 1) or (t.ano = any(@anosTurmasTecnicas) and ccpa.ano_turma = 1) or cast(ccpa.ano_turma as varchar) = t.ano) + and ((t.modalidade_codigo = @modalidadeEja and t.etapa_eja = ccpa.etapa_eja) + or (t.modalidade_codigo <> @modalidadeEja and ccpa.etapa_eja is null)) where {0} and ccpa.inicio_vigencia <= @dataConsulta and (ccpa.fim_vigencia >= @dataConsulta or ccpa.fim_vigencia is null)"; } diff --git a/src/SME.SGP.Dados/Repositorios/RepositorioPendencia.cs b/src/SME.SGP.Dados/Repositorios/RepositorioPendencia.cs index 1a8ada2fbf..6f75f79aba 100644 --- a/src/SME.SGP.Dados/Repositorios/RepositorioPendencia.cs +++ b/src/SME.SGP.Dados/Repositorios/RepositorioPendencia.cs @@ -40,29 +40,38 @@ public async Task ExclusaoLogicaPendenciaIds(long[] pendenciasIds) public async Task AtualizarPendencias(long fechamentoId, SituacaoPendencia situacaoPendencia, TipoPendencia tipoPendencia) { - const string query = @"update pendencia p - set situacao = @situacaoPendencia - from pendencia_fechamento f - where f.pendencia_id = p.id - and p.tipo = @tipoPendencia - and f.fechamento_turma_disciplina_id = @fechamentoId - and not p.excluido "; - - await database.Conexao.ExecuteAsync(query, new { fechamentoId, situacaoPendencia, tipoPendencia }); + string query = "select fechamento_turma_id, disciplina_id from fechamento_turma_disciplina where id = @fechamentoId"; + (long fechamentoTurmaId, long disciplinaId) = await database.Conexao.QueryFirstOrDefaultAsync<(long fechamentoTurmaId, long disciplinaId)>(query, new { fechamentoId }); + query = @"update pendencia p + set situacao = @situacaoPendencia + from pendencia_fechamento f + inner join fechamento_turma_disciplina ftd on ftd.id = f.fechamento_turma_disciplina_id + where f.pendencia_id = p.id + and p.tipo = @tipoPendencia + and ftd.fechamento_turma_id = @fechamentoTurmaId + and ftd.disciplina_id = @disciplinaId + and not p.excluido "; + + await database.Conexao.ExecuteAsync(query, new { fechamentoTurmaId, disciplinaId, situacaoPendencia, tipoPendencia }); } public async Task ExcluirPendenciasFechamento(long fechamentoId, TipoPendencia tipoPendencia) { - const string query = @"update pendencia p - set excluido = true - from pendencia_fechamento f - where not p.excluido - and p.situacao = 1 - and p.id = f.pendencia_id - and p.tipo = @tipoPendencia - and f.fechamento_turma_disciplina_id = @fechamentoId"; - - await database.Conexao.ExecuteAsync(query, new { fechamentoId, tipoPendencia }); + string query = "select fechamento_turma_id, disciplina_id from fechamento_turma_disciplina where id = @fechamentoId"; + (long fechamentoTurmaId, long disciplinaId) = await database.Conexao.QueryFirstOrDefaultAsync<(long fechamentoTurmaId, long disciplinaId)>(query, new { fechamentoId }); + + query = @"update pendencia p + set excluido = true + from pendencia_fechamento f + inner join fechamento_turma_disciplina ftd on ftd.id = f.fechamento_turma_disciplina_id + where not p.excluido + and p.situacao = 1 + and p.id = f.pendencia_id + and p.tipo = @tipoPendencia + and ftd.fechamento_turma_id = @fechamentoTurmaId + and ftd.disciplina_id = @disciplinaId"; + + await database.Conexao.ExecuteAsync(query, new { fechamentoTurmaId, disciplinaId, tipoPendencia }); } public async Task> ListarPendenciasUsuarioSemFiltro(long usuarioId, Paginacao paginacao) diff --git a/src/SME.SGP.Dados/Repositorios/RepositorioPendenciaAulaConsulta.cs b/src/SME.SGP.Dados/Repositorios/RepositorioPendenciaAulaConsulta.cs index 1999d351b8..7e13ba9cc2 100644 --- a/src/SME.SGP.Dados/Repositorios/RepositorioPendenciaAulaConsulta.cs +++ b/src/SME.SGP.Dados/Repositorios/RepositorioPendenciaAulaConsulta.cs @@ -39,7 +39,8 @@ public async Task> ListarPendenciasPorTipo(TipoPendencia tipoP sqlQuery.AppendLine(" a.data_aula DataAula,"); sqlQuery.AppendLine(" a.aula_cj AulaCJ,"); sqlQuery.AppendLine(" t.id Id,"); - sqlQuery.AppendLine(" t.modalidade_codigo ModalidadeCodigo"); + sqlQuery.AppendLine(" t.modalidade_codigo ModalidadeCodigo,"); + sqlQuery.AppendLine(" t.tipo_turno"); sqlQuery.AppendLine(" from aula a"); sqlQuery.AppendLine(" inner join tipo_calendario tc"); sqlQuery.AppendLine(" on a.tipo_calendario_id = tc.id"); diff --git a/src/SME.SGP.Dominio/Entidades/Aula.cs b/src/SME.SGP.Dominio/Entidades/Aula.cs index 17c1952754..4955d0f343 100644 --- a/src/SME.SGP.Dominio/Entidades/Aula.cs +++ b/src/SME.SGP.Dominio/Entidades/Aula.cs @@ -171,17 +171,12 @@ public bool PermiteRegistroFrequencia(Turma turma) if (turma.EhNulo()) throw new NegocioException("A turma deve ser informada."); - return !(EhAulaCompartilhada || (EhTecnologiaAprendizagem && turma.ModalidadeCodigo == Modalidade.EJA) - || (EhTecAprendizagemELeitura && turma.ModalidadeCodigo == Modalidade.Medio && turma.TipoTurno == (int)TipoTurnoEOL.Noite)); + return !(EhAulaCompartilhada + || (EhTecnologiaAprendizagem && turma.EhEJA()) + || (EhTecAprendizagemELeitura && turma.EhMedioNoturno())); } - public bool PermiteRegistroFrequencia() - { - if (Turma.EhNulo()) - throw new NegocioException("A turma não foi preenchida."); - - return !(EhAulaCompartilhada || (EhTecnologiaAprendizagem && Turma.ModalidadeCodigo == Modalidade.EJA)); - } + public bool PermiteRegistroFrequencia() => PermiteRegistroFrequencia(Turma); public void PodeSerAlterada(Usuario usuario) { diff --git a/src/SME.SGP.Dominio/Entidades/Turma.cs b/src/SME.SGP.Dominio/Entidades/Turma.cs index fcf453ca6a..f27f151dd6 100644 --- a/src/SME.SGP.Dominio/Entidades/Turma.cs +++ b/src/SME.SGP.Dominio/Entidades/Turma.cs @@ -65,6 +65,9 @@ public void AdicionarUe(Ue ue) public bool EhEJA() => ModalidadeCodigo == Modalidade.EJA; + public bool EhMedioNoturno() + => ModalidadeCodigo == Modalidade.Medio && TipoTurno == (int)TipoTurnoEOL.Noite; + public bool EhCELP() => ModalidadeCodigo == Modalidade.CELP; diff --git a/src/SME.SGP.Infra/Dtos/AlunoPorTurmaResposta.cs b/src/SME.SGP.Infra/Dtos/AlunoPorTurmaResposta.cs index 0f0f7073ca..d4a784c12a 100644 --- a/src/SME.SGP.Infra/Dtos/AlunoPorTurmaResposta.cs +++ b/src/SME.SGP.Infra/Dtos/AlunoPorTurmaResposta.cs @@ -1,6 +1,7 @@ using SME.SGP.Dominio; using System; using System.Linq; +using System.Threading.Tasks; namespace SME.SGP.Infra { @@ -76,6 +77,13 @@ public bool PossuiSituacaoAtiva() return SituacoesAtiva.Contains(CodigoSituacaoMatricula); } + public bool PossuiSituacaoDispensadoTurmaEdFisica(Func> instanciarTurma) + { + if (CodigoSituacaoMatricula == SituacaoMatriculaAluno.DispensadoEdFisica) + return (instanciarTurma().Result).EhTurmaEdFisica(); + return false; + } + public bool DeveMostrarNaChamada(DateTime dataAula, DateTime periodoInicio) { return EstaAtivo(dataAula) || (!PossuiSituacaoAtiva() && DataSituacao.Date > periodoInicio.Date); diff --git a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_gerar_parecer_conclusivo.cs b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_gerar_parecer_conclusivo.cs index 8c72500d36..4d81660662 100644 --- a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_gerar_parecer_conclusivo.cs +++ b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_gerar_parecer_conclusivo.cs @@ -5,6 +5,7 @@ using Shouldly; using SME.SGP.Aplicacao; using SME.SGP.Aplicacao.Interfaces; +using SME.SGP.Aplicacao.Queries; using SME.SGP.Dominio; using SME.SGP.Infra; using SME.SGP.Infra.Dtos; @@ -43,6 +44,7 @@ protected override void RegistrarFakes(IServiceCollection services) services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterAlunosEolPorTurmaQueryHandlerFake), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterTodosAlunosNaTurmaQueryHandlerFake), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterInfoComponentesCurricularesESPorTurmasCodigoQueryHandlerFake), ServiceLifetime.Scoped)); + services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(VerificaNotasTodosComponentesCurricularesQueryHandlerFake), ServiceLifetime.Scoped)); } [Fact] diff --git a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_parecer_conclusivo_aluno_turma.cs b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_parecer_conclusivo_aluno_turma.cs index ce9c2a03d6..e67c1e47de 100644 --- a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_parecer_conclusivo_aluno_turma.cs +++ b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_parecer_conclusivo_aluno_turma.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Shouldly; using SME.SGP.Aplicacao; +using SME.SGP.Aplicacao.Queries; using SME.SGP.Dominio; using SME.SGP.Infra; using SME.SGP.TesteIntegracao.ConselhoDeClasse.ServicosFakes; @@ -32,7 +33,7 @@ protected override void RegistrarFakes(IServiceCollection services) services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(ProfessorPodePersistirTurmaQueryHandlerComPermissaoFake), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(ObterAlunoPorTurmaAlunoCodigoQueryHandlerFake), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterComponentesCurricularesPorTurmasCodigoLPQueryFake), ServiceLifetime.Scoped)); - + services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(VerificaNotasTodosComponentesCurricularesQueryHandlerFake), ServiceLifetime.Scoped)); } [Fact(DisplayName = "Conselho Classe - Deve retornar as informações do parecer conclusivo do aluno")] diff --git a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_pareceres_conclusivos_turma.cs b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_pareceres_conclusivos_turma.cs index 03cb02e450..e725e0bd14 100644 --- a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_pareceres_conclusivos_turma.cs +++ b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_obter_pareceres_conclusivos_turma.cs @@ -1,7 +1,10 @@ -using Microsoft.Extensions.DependencyInjection; +using MediatR; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using SME.SGP.Aplicacao; using SME.SGP.Dominio; +using SME.SGP.Dominio.Entidades; +using SME.SGP.Dominio.Interfaces; using SME.SGP.TesteIntegracao.ConselhoDeClasse; using SME.SGP.TesteIntegracao.Setup; using System; @@ -72,5 +75,147 @@ public async Task Ao_obter_pareceres_conclusivos_ano_anterior() retorno.ToList().Exists(parecer => parecer.Nome == "Retido por frequência"); retorno.ToList().Exists(parecer => parecer.Nome == "Continuidade dos estudos"); } + + [Fact(DisplayName = "Conselho Classe - Deve retornar pareceres EM para turmas com ano P")] + public async Task Ao_obter_pareceres_conclusivos_ensino_medio_turmas_ano_p() + { + var dataAtual = DateTimeExtension.HorarioBrasilia(); + var inicioVigencia = new DateTime(2014, 01, 01); + var dre = new Dre() { Id = 1, CodigoDre = "100000", Abreviacao = "DRE", Nome = "DRE TESTE", DataAtualizacao = dataAtual.Date }; + var ue = new Ue { Id = 1, CodigoUe = "123456", DreId = 1, Nome = "UE TESTE", TipoEscola = TipoEscola.EMEFM, DataAtualizacao = dataAtual.Date }; + var turma = new Dominio.Turma() + { + Id = 1, + CodigoTurma = "1", + UeId = 1, + Nome = "PA", + Ano = "P", + AnoLetivo = dataAtual.Year, + ModalidadeCodigo = Modalidade.Medio, + Semestre = 0, + QuantidadeDuracaoAula = 4, + TipoTurno = 3, + DataAtualizacao = dataAtual, + EtapaEJA = 0, + SerieEnsino = "2º MODULO", + TipoTurma = Dominio.Enumerados.TipoTurma.Regular, + NomeFiltro = "PA - 2º MODULO" + }; + var conselhoClasseParecerPromovidoConselho = new ConselhoClasseParecer() + { + Nome = "Promovido pelo conselho", + Aprovado = true, + Frequencia = false, + Conselho = true, + InicioVigencia = inicioVigencia, + FimVigencia = null, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia, + Nota = false + }; + var conselhoClasseParecerRetido = new ConselhoClasseParecer() + { + Nome = "Retido", + Aprovado = false, + Frequencia = false, + Conselho = true, + InicioVigencia = inicioVigencia, + FimVigencia = null, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia, + Nota = true + }; + var conselhoClasseParecerRetidoFrequencia = new ConselhoClasseParecer() + { + Nome = "Retido por frequência", + Aprovado = false, + Frequencia = true, + Conselho = false, + InicioVigencia = inicioVigencia, + FimVigencia = null, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia, + Nota = false + }; + var conselhoClasseParecerPromovido = new ConselhoClasseParecer() + { + Nome = "Promovido", + Aprovado = true, + Frequencia = true, + Conselho = false, + InicioVigencia = inicioVigencia, + FimVigencia = null, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia, + Nota = true + }; + var conselhoClasseParecerAnoParecerRetidoFrequencia = new ConselhoClasseParecerAno() + { + ParecerId = 3, + AnoTurma = 1, + Modalidade = (int)Modalidade.Medio, + InicioVigencia = inicioVigencia, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia + }; + var conselhoClasseParecerAnoParecerPromovido = new ConselhoClasseParecerAno() + { + ParecerId = 4, + AnoTurma = 1, + Modalidade = (int)Modalidade.Medio, + InicioVigencia = inicioVigencia, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia + }; + var conselhoClasseParecerAnoParecerPromovidoConselho = new ConselhoClasseParecerAno() + { + ParecerId = 1, + AnoTurma = 1, + Modalidade = (int)Modalidade.Medio, + InicioVigencia = inicioVigencia, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia + }; + var conselhoClasseParecerAnoParecerRetido = new ConselhoClasseParecerAno() + { + ParecerId = 2, + AnoTurma = 1, + Modalidade = (int)Modalidade.Medio, + InicioVigencia = inicioVigencia, + CriadoPor = "SISTEMA", + CriadoRF = "0", + CriadoEm = inicioVigencia + }; + + await InserirNaBase(dre); + await InserirNaBase(ue); + await InserirNaBase(turma); + await InserirNaBase(conselhoClasseParecerPromovidoConselho); + await InserirNaBase(conselhoClasseParecerRetido); + await InserirNaBase(conselhoClasseParecerRetidoFrequencia); + await InserirNaBase(conselhoClasseParecerPromovido); + await InserirNaBase(conselhoClasseParecerAnoParecerRetidoFrequencia); + await InserirNaBase(conselhoClasseParecerAnoParecerPromovido); + await InserirNaBase(conselhoClasseParecerAnoParecerPromovidoConselho); + await InserirNaBase(conselhoClasseParecerAnoParecerRetido); + + var repositorioParecer = ServiceProvider.GetService(); + var mediator = ServiceProvider.GetService(); + var query = new ObterPareceresConclusivosPorTurmaQueryHandler(repositorioParecer, mediator); + + var resultado = await query.Handle(new ObterPareceresConclusivosPorTurmaQuery(turma), new System.Threading.CancellationToken()); + + resultado.ShouldContain(x => x.Nome == conselhoClasseParecerPromovidoConselho.Nome); + resultado.ShouldContain(x => x.Nome == conselhoClasseParecerRetido.Nome); + resultado.ShouldContain(x => x.Nome == conselhoClasseParecerRetidoFrequencia.Nome); + resultado.ShouldContain(x => x.Nome == conselhoClasseParecerPromovido.Nome); + } } } diff --git a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_validar_situacao_do_parecer_conclusivo.cs b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_validar_situacao_do_parecer_conclusivo.cs index 87fb0036d8..d4e5b97cf5 100644 --- a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_validar_situacao_do_parecer_conclusivo.cs +++ b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/Ao_validar_situacao_do_parecer_conclusivo.cs @@ -5,6 +5,7 @@ using Shouldly; using SME.SGP.Aplicacao; using SME.SGP.Aplicacao.Interfaces; +using SME.SGP.Aplicacao.Queries; using SME.SGP.Dominio; using SME.SGP.Infra; using SME.SGP.Infra.Dtos; @@ -37,6 +38,7 @@ protected override void RegistrarFakes(IServiceCollection services) services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterAlunosAtivosPorTurmaCodigoQueryHandlerParecerConclusivo), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(ProfessorPodePersistirTurmaQueryHandlerComPermissaoFake), ServiceLifetime.Scoped)); services.Replace(new ServiceDescriptor(typeof(IRequestHandler>), typeof(ObterAlunosEolPorTurmaQueryHandlerParecerConclusivo), ServiceLifetime.Scoped)); + services.Replace(new ServiceDescriptor(typeof(IRequestHandler), typeof(VerificaNotasTodosComponentesCurricularesQueryHandlerFake), ServiceLifetime.Scoped)); } [Fact] diff --git a/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/ServicosFakes/VerificaNotasTodosComponentesCurricularesQueryHandlerFake.cs b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/ServicosFakes/VerificaNotasTodosComponentesCurricularesQueryHandlerFake.cs new file mode 100644 index 0000000000..7be7b0d978 --- /dev/null +++ b/teste/SME.SGP.TesteIntegracao.Fechamento/ConselhoDeClasse/ServicosFakes/VerificaNotasTodosComponentesCurricularesQueryHandlerFake.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; +using MediatR; +using SME.SGP.Dominio; +using SME.SGP.Dominio.Constantes.MensagensNegocio; +using SME.SGP.Infra; + +namespace SME.SGP.Aplicacao.Queries +{ + public class VerificaNotasTodosComponentesCurricularesQueryHandlerFake : IRequestHandler + { + private const string TURMA_CODIGO_1 = "1"; + private const string ALUNO_CODIGO_1 = "1"; + + public VerificaNotasTodosComponentesCurricularesQueryHandlerFake() + {} + + public async Task Handle(VerificaNotasTodosComponentesCurricularesQuery request, CancellationToken cancellationToken) + { + if (request.Turma.CodigoTurma.Equals(TURMA_CODIGO_1) + && request.AlunoCodigo.Equals(ALUNO_CODIGO_1)) + return true; + return false; + } + } +} \ No newline at end of file