| | | 1 | | namespace Syki.Back.Features.Academic.StartClasses; |
| | | 2 | | |
| | 100 | 3 | | public class StartClassesService(SykiDbContext ctx) : IAcademicService |
| | | 4 | | { |
| | | 5 | | public async Task<OneOf<SykiSuccess, SykiError>> Start(Guid institutionId, StartClassesIn data) |
| | | 6 | | { |
| | 100 | 7 | | var classes = await ctx.Classes |
| | 100 | 8 | | .Include(x => x.Students) |
| | 100 | 9 | | .Where(c => c.InstitutionId == institutionId && data.Classes.Contains(c.Id)) |
| | 100 | 10 | | .ToListAsync(); |
| | | 11 | | |
| | 102 | 12 | | if (classes.Count == 0) return new InvalidClassesList(); |
| | | 13 | | |
| | 576 | 14 | | var statusOk = classes.All(x => x.Status == ClassStatus.OnEnrollment); |
| | 100 | 15 | | if (!statusOk) return new ClassMustHaveOnEnrollmentStatus(); |
| | | 16 | | |
| | 96 | 17 | | var today = DateTime.UtcNow.ToDateOnly(); |
| | 96 | 18 | | var periods = await ctx.EnrollmentPeriods.AsNoTracking().Where(x => x.InstitutionId == institutionId).ToListAsyn |
| | 1142 | 19 | | foreach (var @class in classes) |
| | | 20 | | { |
| | 952 | 21 | | var period = periods.FirstOrDefault(x => x.Id == @class.PeriodId); |
| | 476 | 22 | | if (period == null) return new EnrollmentPeriodNotFound(); |
| | 478 | 23 | | if (today <= period.EndAt) return new EnrollmentPeriodMustBeFinalized(); |
| | | 24 | | } |
| | | 25 | | |
| | 568 | 26 | | classes.ForEach(c => c.Start()); |
| | | 27 | | |
| | 94 | 28 | | await ctx.SaveChangesAsync(); |
| | | 29 | | |
| | 94 | 30 | | return new SykiSuccess(); |
| | 100 | 31 | | } |
| | | 32 | | } |