< Summary - Syki

Information
Class: Syki.Back.Features.Academic.CreateClass.Class
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Academic/CreateClass/Class.cs
Tag: 4_16869239191
Line coverage
78%
Covered lines: 119
Uncovered lines: 33
Coverable lines: 152
Total lines: 269
Line coverage: 78.2%
Branch coverage
95%
Covered branches: 21
Total branches: 22
Branch coverage: 95.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_InstitutionId()100%11100%
get_DisciplineId()100%11100%
get_Discipline()100%11100%
get_PeriodId()100%11100%
get_Period()100%11100%
get_Vacancies()100%11100%
get_Status()100%11100%
get_Workload()100%11100%
get_CampusId()100%210%
get_TeacherId()100%11100%
get_Teacher()100%11100%
get_Schedules()100%11100%
get_Lessons()100%11100%
get_Students()100%11100%
get_Activities()100%11100%
get_Notes()100%11100%
get_FillRatio()100%11100%
.ctor()100%11100%
.ctor(...)100%11100%
New(...)100%22100%
Validate(...)100%66100%
CreateLessons()100%66100%
Start()100%11100%
AddActivity(...)100%22100%
GetNotesRemainingWeights()100%22100%
Finish()100%22100%
GetScheduleAsString()100%11100%
GetWorkloadAsString()100%11100%
GetProgressAsString()100%11100%
SetFillRatio(...)100%11100%
ToOut()50%22100%
ToGetAcademicClassOut()100%11100%
ToTeacherClassOut()100%11100%
ToStudentClassOut(...)100%210%
ToTeacherClassesOut()100%210%
ToTeacherCurrentClassOut()100%210%
ToStudentCurrentClassOut()100%210%

File(s)

/home/runner/work/syki/syki/Back/Features/Academic/CreateClass/Class.cs

#LineLine coverage
 1using Syki.Back.Features.Academic.CreateTeacher;
 2using Syki.Back.Features.Academic.CreateStudent;
 3using Syki.Back.Features.Academic.CreateDiscipline;
 4using Syki.Back.Features.Teacher.CreateClassActivity;
 5using Syki.Back.Features.Teacher.AddClassActivityNote;
 6using Syki.Back.Features.Academic.CreateAcademicPeriod;
 7
 8namespace Syki.Back.Features.Academic.CreateClass;
 9
 10/// <summary>
 11/// Turma
 12/// </summary>
 13public class Class
 14{
 1744815    public Guid Id { get; set; }
 83216    public Guid InstitutionId { get; set; }
 80417    public Guid DisciplineId { get; set; }
 82618    public Discipline Discipline { get; set; }
 232019    public string PeriodId { get; set; }
 9301820    public AcademicPeriod Period { get; set; }
 133221    public int Vacancies { get; set; }
 332622    public ClassStatus Status { get; set; }
 2623423    public int Workload { get; set; }
 24
 025    public Guid? CampusId { get; set; }
 70426    public Guid? TeacherId { get; set; }
 63227    public SykiTeacher Teacher { get; set; }
 28
 197029    public List<Schedule> Schedules { get; set; }
 1577830    public List<ClassLesson> Lessons { get; set; }
 92231    public List<SykiStudent> Students { get; set; }
 134032    public List<ClassActivity> Activities { get; set; }
 68833    public List<StudentClassNote> Notes { get; set; }
 34
 64435    public string FillRatio { get; set; }
 36
 541237    private Class() {}
 38
 68639    private Class(
 68640        Guid institutionId,
 68641        Guid disciplineId,
 68642        Guid teacherId,
 68643        string period,
 68644        int vacancies,
 68645        List<Schedule> schedules
 68646    ) {
 68647        Id = Guid.CreateVersion7();
 68648        InstitutionId = institutionId;
 68649        DisciplineId = disciplineId;
 68650        TeacherId = teacherId;
 68651        PeriodId = period;
 68652        Vacancies = vacancies;
 68653        Status = ClassStatus.OnPreEnrollment;
 68654        Schedules = schedules;
 68655        Lessons = [];
 68656        Students = [];
 68657        Activities = [];
 68658        Notes = [];
 68659    }
 60
 61    public static OneOf<Class, SykiError> New(
 62        Guid institutionId,
 63        Guid disciplineId,
 64        Guid teacherId,
 65        string period,
 66        int vacancies,
 67        List<Schedule> schedules
 68    ) {
 70269        var result = Validate(schedules);
 70
 71871        if (result.IsError) return result.Error;
 72
 68673        return new Class(institutionId, disciplineId, teacherId, period, vacancies, schedules);
 74    }
 75
 76    private static OneOf<SykiSuccess, SykiError> Validate(List<Schedule> schedules)
 77    {
 145278        for (int i = 0; i < schedules.Count-1; i++)
 79        {
 14480            for (int j = i+1; j < schedules.Count; j++)
 81            {
 4882                if (schedules[i].Conflict(schedules[j]))
 1683                    return new ConflictingSchedules();
 84            }
 85        }
 68686        return new SykiSuccess();
 87    }
 88
 89    public void CreateLessons()
 90    {
 66291        var schedules = Schedules.OrderBy(x => x.Day).ThenBy(x => x.StartAt).ToList();
 92
 61493        var number = 1;
 61494        var current = Period.StartAt;
 9238695        while (current < Period.EndAt)
 96        {
 36758097            foreach (var schedule in schedules)
 98            {
 9201899                if (current.DayOfWeek.Is(schedule.Day))
 100                {
 13102101                    Lessons.Add(new(Id, number, current, schedule.StartAt, schedule.EndAt));
 13102102                    Workload += schedule.GetDiff();
 13102103                    number++;
 104                }
 105            }
 91772106            current = current.AddDays(1);
 107        }
 614108    }
 109
 110    public void Start()
 111    {
 476112        Status = ClassStatus.Started;
 476113    }
 114
 115    public OneOf<SykiSuccess, SykiError> AddActivity(ClassActivity activity)
 116    {
 852117        var sum = Activities.Where(x => x.Note == activity.Note).Sum(x => x.Weight);
 118
 346119        if (sum + activity.Weight > 100) return new InvalidClassActivityWeight();
 120
 266121        Activities.Add(activity);
 122
 266123        return new SykiSuccess();
 124    }
 125
 126    public List<ClassNoteRemainingWeightsOut> GetNotesRemainingWeights()
 127    {
 8128        var weights = new List<ClassNoteRemainingWeightsOut>();
 64129        foreach (var note in Enum.GetValues<ClassNoteType>())
 130        {
 128131            var sum = Activities.Where(x => x.Note == note).Sum(x => x.Weight);
 24132            weights.Add(new() { Note = note, Weight = 100 - sum });
 133        }
 134
 8135        return weights;
 136    }
 137
 138    public OneOf<SykiSuccess, SykiError> Finish()
 139    {
 62140        if (Lessons.Any(x => x.Status != ClassLessonStatus.Finalized))
 4141            return new AllClassLessonsMustHaveFinalizedStatus();
 142
 4143        Status = ClassStatus.Finalized;
 4144        return new SykiSuccess();
 145    }
 146
 147    private string GetScheduleAsString()
 148    {
 42149        return string.Join(" | ", Schedules.OrderBy(h => h.Day).ThenBy(h => h.StartAt).ToList().ConvertAll(h => h.ToStri
 150    }
 151
 152    private string GetWorkloadAsString()
 153    {
 16154        return Workload.MinutesToString();
 155    }
 156
 157    private string GetProgressAsString()
 158    {
 16159        var total = Lessons.Count;
 198160        var finalized = Lessons.Count(x => x.Status == ClassLessonStatus.Finalized);
 16161        return $"{finalized}/{total}";
 162    }
 163
 164    public void SetFillRatio(int count)
 165    {
 24166        FillRatio = $"{count}/{Vacancies}";
 24167    }
 168
 169    // OUTS
 170
 171    public ClassOut ToOut()
 172    {
 13762173        var presences = Lessons.Sum(l => l.Attendances.Count(a => a.Present));
 13762174        var attendances = Lessons.Sum(l => l.Attendances.Count);
 604175        return new()
 604176        {
 604177            Id = Id,
 604178            Discipline = Discipline.Name,
 604179            Teacher = Teacher.Name,
 604180            Period = PeriodId,
 604181            Vacancies = Vacancies,
 604182            Status = Status,
 606183            Schedules = Schedules.ConvertAll(h => h.ToOut()),
 604184            FillRatio = FillRatio,
 604185            Frequency = attendances == 0 ? 0.00M : 100M * (1M * presences / (1M * attendances)),
 26316186            Lessons = Lessons.OrderBy(x => x.Number).Select(x => x.ToOut()).ToList(),
 604187        };
 188    }
 189
 190    public GetAcademicClassOut ToGetAcademicClassOut()
 191    {
 16192        return new()
 16193        {
 16194            Id = Id,
 16195            Discipline = Discipline.Name,
 16196            Code = Discipline.Code,
 16197            Teacher = Teacher.Name,
 16198            Period = PeriodId,
 16199            Vacancies = Vacancies,
 16200            Status = Status,
 18201            Schedules = Schedules.ConvertAll(h => h.ToOut()),
 364202            Lessons = Lessons.OrderBy(x => x.Number).Select(x => x.ToOut()).ToList(),
 16203            SchedulesInline = GetScheduleAsString(),
 16204            Workload = GetWorkloadAsString(),
 16205            Progress = GetProgressAsString(),
 16206            FillRatio = FillRatio,
 16207        };
 208    }
 209
 210    public TeacherClassOut ToTeacherClassOut()
 211    {
 2212        return new()
 2213        {
 2214            Id = Id,
 2215            Discipline = Discipline.Name,
 2216            Code = Discipline.Code,
 2217            Period = PeriodId,
 2218            Status = Status,
 2219        };
 220    }
 221
 222    public StudentClassOut ToStudentClassOut(decimal n1, decimal n2, decimal n3, decimal average, decimal frequency)
 223    {
 0224        return new()
 0225        {
 0226            Id = Id,
 0227            Discipline = Discipline.Name,
 0228            Code = Discipline.Code,
 0229            Period = PeriodId,
 0230            Status = Status,
 0231            N1 = n1,
 0232            N2 = n2,
 0233            N3 = n3,
 0234            Average = average,
 0235            Frequency = frequency,
 0236        };
 237    }
 238
 239    public TeacherClassesOut ToTeacherClassesOut()
 240    {
 0241        return new()
 0242        {
 0243            Id = Id,
 0244            Discipline = Discipline.Name,
 0245            Code = Discipline.Code,
 0246            Period = PeriodId,
 0247            Schedules = Schedules.ConvertAll(h => h.ToOut()),
 0248            SchedulesInline = GetScheduleAsString(),
 0249        };
 250    }
 251
 252    public TeacherCurrentClassOut ToTeacherCurrentClassOut()
 253    {
 0254        return new()
 0255        {
 0256            Id = Id,
 0257            Discipline = Discipline.Name,
 0258        };
 259    }
 260
 261    public StudentCurrentClassOut ToStudentCurrentClassOut()
 262    {
 0263        return new()
 0264        {
 0265            Id = Id,
 0266            Discipline = Discipline.Name,
 0267        };
 268    }
 269}