private async Task EnviarNotificacaoSme(IEnumerable <Ue> ues, PeriodoFechamentoBimestre periodoFechamentoBimestre, ModalidadeTipoCalendario modalidadeTipoCalendario, int ano)
        {
            var titulo   = $"UEs que não cadastraram o período de fechamento - {modalidadeTipoCalendario.Name()} {ano}";
            var mensagem = new StringBuilder($"As UEs abaixo ainda não cadastraram o período de fechamento para o tipo de calendário - <b>{modalidadeTipoCalendario.Name()} {ano}</b>.<br/><br/>");

            var grupoDres = ues.GroupBy(a => a.DreId);

            mensagem.Append("<ul>");
            foreach (var grupoDre in grupoDres)
            {
                var dre = grupoDre.First().Dre;
                mensagem.Append($"<li>{dre.Abreviacao}<ul>");
                foreach (var ue in grupoDre)
                {
                    mensagem.Append($"<li>{ue.TipoEscola.ShortName()} {ue.Nome}</li>");
                }
                mensagem.Append("</ul></li>");
            }
            mensagem.Append("</ul>");

            var adminsSme = await ObterUsuariosSme();

            if (adminsSme != null && adminsSme.Any())
            {
                await mediator.Send(new EnviarNotificacaoUsuariosCommand(titulo, mensagem.ToString(), NotificacaoCategoria.Aviso, NotificacaoTipo.Calendario, adminsSme));
            }
        }
예제 #2
0
        private PeriodoFechamento MapearParaDominio(FechamentoDto fechamentoDto)
        {
            var(dre, ue) = ObterDreEUe(fechamentoDto.DreId, fechamentoDto.UeId);
            var fechamento = repositorioFechamento.ObterPorTipoCalendarioDreEUE(fechamentoDto.TipoCalendarioId.Value, dre?.Id, ue?.Id);

            if (fechamento == null)
            {
                fechamento = new PeriodoFechamento(dre, ue);
            }

            var tipoCalendario = repositorioTipoCalendario.ObterPorId(fechamentoDto.TipoCalendarioId.Value);

            if (tipoCalendario == null)
            {
                throw new NegocioException("Tipo calendário não encontrado.");
            }

            if (fechamentoDto.FechamentosBimestres != null && fechamentoDto.FechamentosBimestres.Any())
            {
                foreach (var bimestre in fechamentoDto.FechamentosBimestres)
                {
                    var periodoEscolar = repositorioPeriodoEscolar.ObterPorId(bimestre.PeriodoEscolarId);
                    PeriodoFechamentoBimestre fechamentoBimestreExistente = fechamento.ObterFechamentoBimestre(bimestre.PeriodoEscolarId);
                    if (fechamentoBimestreExistente != null)
                    {
                        fechamentoBimestreExistente.AtualizarDatas(bimestre.InicioDoFechamento, bimestre.FinalDoFechamento);
                    }
                    else
                    {
                        fechamento.AdicionarFechamentoBimestre(new PeriodoFechamentoBimestre(fechamento.Id, periodoEscolar, bimestre.InicioDoFechamento, bimestre.FinalDoFechamento));
                    }
                }
            }
            return(fechamento);
        }
        public async Task <string> Handle(ObterTipoNotaQuery request, CancellationToken cancellationToken)
        {
            var bimestreFechamento = request.PeriodoEscolar != null ? request.PeriodoEscolar.Bimestre : (await ObterPeriodoUltimoBimestre(request.Turma)).Bimestre;
            PeriodoFechamentoBimestre periodoFechamentoBimestre = await periodoFechamentoRepository.ObterPeriodoFechamentoTurmaAsync(request.Turma.Ue.Id, request.Turma.Dre.Id, request.Turma.AnoLetivo, bimestreFechamento, request.PeriodoEscolar?.Id);

            return(await ObterTipoNota(request.Turma, periodoFechamentoBimestre));
        }
        public async Task <IDictionary <string, string> > Handle(ObterTiposNotaRelatorioBoletimQuery request, CancellationToken cancellationToken)
        {
            var bimestreFechamento = (await ObterPeriodoUltimoBimestre(request.AnoLetivo, ObterModalidadeTipoCalendario(request.Modalidade), request.Semestre)).Bimestre;
            PeriodoFechamentoBimestre periodoFechamentoBimestre = await periodoFechamentoRepository.ObterPeriodoFechamentoTurmaAsync(request.UeId, request.DreId, request.AnoLetivo, bimestreFechamento, null);

            return(await ObterTiposNota(request.Turmas, periodoFechamentoBimestre, request.AnoLetivo, request.Modalidade, request.Semestre));
        }
        private async Task EnviarNotificacaoDre(IEnumerable <Ue> ues, PeriodoFechamentoBimestre periodoFechamentoBimestre, ModalidadeTipoCalendario modalidadeTipoCalendario, int ano)
        {
            var grupoDres = ues.GroupBy(a => a.DreId);

            foreach (var grupoDre in grupoDres)
            {
                await NotificarDre(grupoDre, modalidadeTipoCalendario, ano);
            }
        }
예제 #6
0
        private void AtualizaEventoDeFechamento(PeriodoFechamentoBimestre bimestre, EventoFechamento fechamentoExistente)
        {
            var eventoExistente = fechamentoExistente.Evento ?? repositorioEvento.ObterPorId(fechamentoExistente.EventoId);

            if (eventoExistente != null)
            {
                eventoExistente.DataInicio = bimestre.InicioDoFechamento;
                eventoExistente.DataFim    = bimestre.FinalDoFechamento;
                repositorioEvento.Salvar(eventoExistente);
            }
        }
        public async Task <long> SalvarAsync(PeriodoFechamentoBimestre entidade)
        {
            if (entidade.Id > 0)
            {
                await database.Conexao.UpdateAsync(entidade);
            }
            else
            {
                entidade.Id = (long)(await database.Conexao.InsertAsync(entidade));
            }

            return(entidade.Id);
        }
        private async Task <string> ObterTipoNota(Turma turma, PeriodoFechamentoBimestre periodoFechamentoBimestre)
        {
            var dataReferencia = periodoFechamentoBimestre != null ?
                                 periodoFechamentoBimestre.FinalDoFechamento :
                                 (await ObterPeriodoUltimoBimestre(turma)).PeriodoFim;

            var tipoNota = await ObterNotaTipo(turma, dataReferencia);

            if (tipoNota == null)
            {
                throw new NegocioException("Não foi possível identificar o tipo de nota da turma");
            }

            return(tipoNota);
        }
        private async Task <TipoNota> ObterTipoNota(Turma turma, PeriodoFechamentoBimestre periodoFechamentoBimestre, bool consideraHistorico = false)
        {
            var dataReferencia = periodoFechamentoBimestre != null ?
                                 periodoFechamentoBimestre.FinalDoFechamento :
                                 (await ObterPeriodoUltimoBimestre(turma)).PeriodoFim;

            var tipoNota = await servicoDeNotasConceitos.ObterNotaTipo(turma.CodigoTurma, dataReferencia, consideraHistorico);

            if (tipoNota == null)
            {
                throw new NegocioException("Não foi possível identificar o tipo de nota da turma");
            }

            return(tipoNota.TipoNota);
        }
예제 #10
0
        private async Task NotificarUe(Ue ue, PeriodoEscolar periodoEscolar, PeriodoFechamentoBimestre periodoFechamentoBimestre)
        {
            var descricaoUe = $"{ue.TipoEscola.ShortName()} {ue.Nome} ({ue.Dre.Abreviacao})";
            var titulo      = $"Início do período de fechamento do {periodoEscolar.Bimestre}º bimestre - {descricaoUe}";
            var mensagem    = $@"O fechamento do <b>{periodoEscolar.Bimestre}º bimestre</b> na <b>{descricaoUe}</b> irá iniciar no dia <b>{periodoFechamentoBimestre.InicioDoFechamento.Date.ToString("dd/MM/yyyy")}</b>.";

            var usuarios = await ObterUsuarios(ue);

            if (usuarios != null && usuarios.Any())
            {
                await mediator.Send(new EnviarNotificacaoUsuariosCommand(titulo, mensagem, NotificacaoCategoria.Aviso, NotificacaoTipo.Calendario, usuarios, ue.Dre.CodigoDre, ue.CodigoUe));
            }

            await mediator.Send(new EnviarNotificacaoCommand(titulo, mensagem.ToString(), NotificacaoCategoria.Aviso, NotificacaoTipo.Calendario, ObterCargosGestaoEscola(),
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.Dre.CodigoDre,
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.CodigoUe));
        }
예제 #11
0
        private void AtualizaDatasInicioEFim(PeriodoFechamentoBimestre periodoFechamentoBimestreDre, PeriodoFechamentoBimestre periodoFechamentoBimestreUe)
        {
            var inicioFechamentoDre = periodoFechamentoBimestreDre.InicioDoFechamento;
            var finalFechamentoDre  = periodoFechamentoBimestreDre.FinalDoFechamento;
            var inicioFechamentoUe  = periodoFechamentoBimestreUe.InicioDoFechamento;
            var finalFechamentoUe   = periodoFechamentoBimestreUe.FinalDoFechamento;

            if (inicioFechamentoDre > inicioFechamentoUe || inicioFechamentoUe > finalFechamentoDre)
            {
                periodoFechamentoBimestreUe.InicioDoFechamento = periodoFechamentoBimestreDre.InicioDoFechamento;
            }

            if (finalFechamentoDre < finalFechamentoUe || finalFechamentoUe < periodoFechamentoBimestreUe.InicioDoFechamento)
            {
                periodoFechamentoBimestreUe.FinalDoFechamento = periodoFechamentoBimestreDre.FinalDoFechamento;
            }
        }
        private async Task EnviarNotificacaoProfessores(IEnumerable <Turma> turmas, PeriodoEscolar periodoEscolar, PeriodoFechamentoBimestre periodoFechamentoBimestre, Ue ue)
        {
            var descricaoUe = $"{ue.TipoEscola.ShortName()} {ue.Nome} ({ue.Dre.Abreviacao})";
            var titulo      = $"Término do período de fechamento do  {periodoEscolar.Bimestre}º bimestre - {descricaoUe}";
            var mensagem    = $@"O fechamento do <b>{periodoEscolar.Bimestre}º bimestre</b> na <b>{descricaoUe}</b> irá encerrar no dia <b>{periodoFechamentoBimestre.FinalDoFechamento.Date:dd/MM/yyyy}</b>.
                <br/><br/>Após esta data o sistema será bloqueado para edições neste bimestre.";

            var professores = await ObterProfessores(turmas);

            if (professores != null && professores.Any())
            {
                await mediator.Send(new EnviarNotificacaoUsuariosCommand(titulo, mensagem, NotificacaoCategoria.Aviso, NotificacaoTipo.Calendario, professores, ue.Dre.CodigoDre, ue.CodigoUe));
            }

            await mediator.Send(new EnviarNotificacaoCommand(titulo, mensagem.ToString(), NotificacaoCategoria.Aviso, NotificacaoTipo.Calendario, ObterCargosGestaoEscola(),
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.Dre.CodigoDre,
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.CodigoUe));
        }
예제 #13
0
        private void CriaEventoDeFechamento(PeriodoFechamento fechamento, EventoTipo tipoEvento, PeriodoFechamentoBimestre bimestre)
        {
            var evento = new Evento()
            {
                DataInicio       = bimestre.InicioDoFechamento,
                DataFim          = bimestre.FinalDoFechamento,
                DreId            = fechamento.Dre?.CodigoDre,
                UeId             = fechamento.Ue?.CodigoUe,
                Nome             = $"Fechamento do {bimestre.PeriodoEscolar?.Bimestre}º bimestre",
                TipoEventoId     = tipoEvento.Id,
                TipoCalendarioId = bimestre.PeriodoEscolar.TipoCalendarioId
            };
            var eventoId = repositorioEvento.Salvar(evento);

            repositorioEventoFechamento.Salvar(new EventoFechamento()
            {
                FechamentoId = bimestre.Id,
                EventoId     = eventoId
            });
        }
 private async Task NotificarUe(ModalidadeTipoCalendario modalidade, PeriodoFechamentoBimestre periodoIniciando)
 {
     await mediator.Send(new NotificarPeriodoFechamentoUeCommand(modalidade, periodoIniciando));
 }
        public async Task <ConselhoClasseAlunoResumoDto> ObterConselhoClasseTurma(string turmaCodigo, string alunoCodigo, int bimestre = 0, bool ehFinal = false, bool consideraHistorico = false)
        {
            var turma = await ObterTurma(turmaCodigo);

            var ehAnoAnterior = turma.AnoLetivo != DateTime.Today.Year;

            if (bimestre == 0 && !ehFinal)
            {
                bimestre = await ObterBimestreAtual(turma);
            }

            var fechamentoTurma = await consultasFechamentoTurma.ObterPorTurmaCodigoBimestreAsync(turmaCodigo, bimestre);

            if (fechamentoTurma == null && !ehAnoAnterior)
            {
                throw new NegocioException("Fechamento da turma não localizado " + (!ehFinal && bimestre > 0 ? $"para o bimestre {bimestre}" : ""));
            }

            var conselhoClasse = fechamentoTurma != null ? await repositorioConselhoClasse.ObterPorFechamentoId(fechamentoTurma.Id): null;

            var periodoEscolarId = fechamentoTurma?.PeriodoEscolarId;

            if (periodoEscolarId == null)
            {
                var tipoCalendario = await repositorioTipoCalendario.BuscarPorAnoLetivoEModalidade(turma.AnoLetivo, turma.ModalidadeTipoCalendario, turma.Semestre);

                if (tipoCalendario == null)
                {
                    throw new NegocioException("Tipo de calendário não encontrado");
                }

                var periodoEscolar = await repositorioPeriodoEscolar.ObterPorTipoCalendarioEBimestreAsync(tipoCalendario.Id, bimestre);

                periodoEscolarId = periodoEscolar?.Id;
            }

            var bimestreFechamento = !ehFinal ? bimestre : (await ObterPeriodoUltimoBimestre(turma)).Bimestre;

            PeriodoFechamentoBimestre periodoFechamentoBimestre = await consultasPeriodoFechamento
                                                                  .ObterPeriodoFechamentoTurmaAsync(turma, bimestreFechamento, periodoEscolarId);

            var tipoNota = await ObterTipoNota(turma, periodoFechamentoBimestre, consideraHistorico);

            var mediaAprovacao = double.Parse(await repositorioParametrosSistema
                                              .ObterValorPorTipoEAno(TipoParametroSistema.MediaBimestre));

            var conselhoClasseAluno = conselhoClasse != null ? await repositorioConselhoClasseAluno.ObterPorConselhoClasseAlunoCodigoAsync(conselhoClasse.Id, alunoCodigo) : null;

            return(new ConselhoClasseAlunoResumoDto()
            {
                FechamentoTurmaId = fechamentoTurma?.Id,
                ConselhoClasseId = conselhoClasse?.Id,
                ConselhoClasseAlunoId = conselhoClasseAluno?.Id,
                Bimestre = bimestre,
                PeriodoFechamentoInicio = periodoFechamentoBimestre?.InicioDoFechamento,
                PeriodoFechamentoFim = periodoFechamentoBimestre?.FinalDoFechamento,
                TipoNota = tipoNota,
                Media = mediaAprovacao,
                AnoLetivo = turma.AnoLetivo
            });
        }
        private async Task <IDictionary <string, string> > ObterTiposNota(IEnumerable <Turma> turmas, PeriodoFechamentoBimestre periodoFechamentoBimestre,
                                                                          int anoLetivo, Modalidade modalidade, int semestre)
        {
            var dataReferencia = periodoFechamentoBimestre != null ?
                                 periodoFechamentoBimestre.FinalDoFechamento :
                                 (await ObterPeriodoUltimoBimestre(anoLetivo, ObterModalidadeTipoCalendario(modalidade), semestre)).PeriodoFim;

            var tiposNota = await ObterNotasTipo(turmas, modalidade, dataReferencia);

            if (tiposNota == null)
            {
                throw new NegocioException("Não foi possível identificar o tipo de nota da turma");
            }

            return(tiposNota);
        }
예제 #17
0
        private async Task EnviarNotificacoes(List <NotificarResultadoInsatisfatorioDto> listaNotificacoes, PeriodoFechamentoBimestre periodoFechamentoBimestre)
        {
            var titulo   = $"Turmas com resultados insatisfatórios no {periodoFechamentoBimestre.PeriodoEscolar.Bimestre}º bimestre";
            var mensagem = new StringBuilder($"As turmas e componentes curriculares abaixo da <b>{periodoFechamentoBimestre.PeriodoFechamento.Ue.TipoEscola.ShortName()} {periodoFechamentoBimestre.PeriodoFechamento.Ue.Nome} ({periodoFechamentoBimestre.PeriodoFechamento.Ue.Dre.Abreviacao})</b> tiveram mais de 50% dos estudantes com resultado insatisfatório no <b>{periodoFechamentoBimestre.PeriodoEscolar.Bimestre}º bimestre</b>:");

            mensagem.Append("<table style='margin-left: auto; margin-right: auto; margin-top: 10px' border='2' cellpadding='5'>");
            foreach (var turmasPorModalidade in listaNotificacoes.GroupBy(c => c.TurmaModalidade))
            {
                mensagem.Append(ObterHeaderModalidade(turmasPorModalidade.Key));

                foreach (var turma in turmasPorModalidade)
                {
                    mensagem.Append(MontarLinhaDaTurma(turma));
                }
            }
            mensagem.Append("</table>");

            await mediator.Send(new EnviarNotificacaoCommand(titulo, mensagem.ToString(), NotificacaoCategoria.Aviso, NotificacaoTipo.Fechamento, ObterCargosGestaoEscola(),
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.Dre.CodigoDre,
                                                             periodoFechamentoBimestre.PeriodoFechamento.Ue.CodigoUe));
        }
 public NotificarPeriodoFechamentoDreCommand(ModalidadeTipoCalendario modalidadeTipoCalendario, PeriodoFechamentoBimestre periodoFechamentoBimestre)
 {
     PeriodoFechamentoBimestre = periodoFechamentoBimestre;
     ModalidadeTipoCalendario  = modalidadeTipoCalendario;
 }
예제 #19
0
 public ExecutaNotificacaoPeriodoFechamentoEncerrandoCommand(PeriodoFechamentoBimestre periodoFechamentoBimestre, ModalidadeTipoCalendario modalidadeTipoCalendario)
 {
     PeriodoFechamentoBimestre = periodoFechamentoBimestre;
     ModalidadeTipoCalendario  = modalidadeTipoCalendario;
 }
예제 #20
0
 private async Task <bool> ExistePeriodoFechamentoCadastrado(Ue ue, PeriodoFechamentoBimestre periodoFechamentoBimestre)
 => await mediator.Send(new ExistePeriodoFechmantoPorUePeriodoEscolarQuery(ue.Id, periodoFechamentoBimestre.PeriodoEscolarId));