< Summary - Syki

Information
Class: Syki.Back.Features.Academic.FinalizeClasses.FinalizeClassesService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Academic/FinalizeClasses/FinalizeClassesService.cs
Tag: 4_16869239191
Line coverage
93%
Covered lines: 31
Uncovered lines: 2
Coverable lines: 33
Total lines: 59
Line coverage: 93.9%
Branch coverage
81%
Covered branches: 18
Total branches: 22
Branch coverage: 81.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Finalize()83.33%181892%

File(s)

/home/runner/work/syki/syki/Back/Features/Academic/FinalizeClasses/FinalizeClassesService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Academic.FinalizeClasses;
 2
 103public class FinalizeClassesService(SykiDbContext ctx) : IAcademicService
 4{
 5    public async Task<OneOf<SykiSuccess, SykiError>> Finalize(Guid institutionId, FinalizeClassesIn data)
 6    {
 107        var classes = await ctx.Classes
 108            .Include(x => x.Lessons)
 109                .ThenInclude(x => x.Attendances)
 1010            .Include(x => x.Students)
 1011            .Include(t => t.Notes)
 1012            .Where(c => c.InstitutionId == institutionId && data.Classes.Contains(c.Id))
 1013            .ToListAsync();
 14
 1215        if (classes.Count == 0) return new InvalidClassesList();
 16
 1617        var statusOk = classes.All(x => x.Status == ClassStatus.Started);
 1218        if (!statusOk) return new ClassMustHaveStartedStatus();
 19
 820        var results = classes.ConvertAll(c => c.Finish());
 1421        foreach (var result in results)
 22        {
 623            if (result.IsError) return result.Error;
 24        }
 25
 426        var ids = classes.ConvertAll(x => x.Id);
 227        var classesStudents = await ctx.ClassesStudents.Where(x => ids.Contains(x.ClassId)).ToListAsync();
 28
 229        var configs = await ctx.Configs.FirstAsync(x => x.InstitutionId == institutionId);
 30
 831        foreach (var @class in classes)
 32        {
 4633            var lessons = @class.Lessons.Count(x => x.Attendances.Count > 0);
 834            foreach (var student in @class.Students)
 35            {
 36                // TODO: Calculate notes using the class activities
 237                var studentNotes = @class.Notes.Where(g => g.StudentId == student.Id).ToList();
 238                var averageNote = studentNotes.GetAverageNote();
 9039                var presences = @class.Lessons.Count(x => x.Attendances.Exists(a => a.StudentId == student.Id && a.Prese
 240                var frequency = lessons == 0 ? 0.00M : 100M * (1M * presences / (1M * lessons));
 441                var link = classesStudents.First(x => x.ClassId == @class.Id && x.SykiStudentId == student.Id);
 42
 243                link.StudentDisciplineStatus = StudentDisciplineStatus.Aprovado;
 244                if (averageNote < configs.NoteLimit)
 45                {
 246                    link.StudentDisciplineStatus = StudentDisciplineStatus.ReprovadoPorNota;
 47                }
 048                else if (frequency < configs.FrequencyLimit)
 49                {
 050                    link.StudentDisciplineStatus = StudentDisciplineStatus.ReprovadoPorFalta;
 51                }
 52            }
 53        }
 54
 255        await ctx.SaveChangesAsync();
 56
 257        return new SykiSuccess();
 1058    }
 59}