| | 1 | | namespace Syki.Back.Features.Academic.ReleaseClassesForEnrollment; |
| | 2 | |
|
| 118 | 3 | | public class ReleaseClassesForEnrollmentService(SykiDbContext ctx) : IAcademicService |
| | 4 | | { |
| | 5 | | public async Task<OneOf<SykiSuccess, SykiError>> Release(Guid institutionId, ReleaseClassesForEnrollmentIn data) |
| | 6 | | { |
| 118 | 7 | | var classes = await ctx.Classes |
| 118 | 8 | | .Where(c => c.InstitutionId == institutionId && data.Classes.Contains(c.Id)) |
| 118 | 9 | | .ToListAsync(); |
| | 10 | |
|
| 118 | 11 | | var today = DateTime.UtcNow.ToDateOnly(); |
| 118 | 12 | | var periods = await ctx.EnrollmentPeriods.AsNoTracking().Where(x => x.InstitutionId == institutionId).ToListAsyn |
| 1260 | 13 | | foreach (var @class in classes) |
| | 14 | | { |
| 1028 | 15 | | var period = periods.FirstOrDefault(x => x.Id == @class.PeriodId); |
| 520 | 16 | | if (period == null) return new EnrollmentPeriodNotFound(); |
| 514 | 17 | | if (today < period.StartAt) return new EnrollmentPeriodNotStarted(); |
| 512 | 18 | | if (today > period.EndAt) return new EnrollmentPeriodFinalized(); |
| | 19 | | } |
| | 20 | |
|
| 618 | 21 | | var statusOk = classes.All(x => x.Status == ClassStatus.OnPreEnrollment); |
| 112 | 22 | | if (!statusOk) return new AllClassesMustHaveOnPreEnrollmentStatus(); |
| | 23 | |
|
| 614 | 24 | | classes.ForEach(c => c.Status = ClassStatus.OnEnrollment); |
| | 25 | |
|
| 108 | 26 | | await ctx.SaveChangesAsync(); |
| | 27 | |
|
| 108 | 28 | | return new SykiSuccess(); |
| 118 | 29 | | } |
| | 30 | |
|
| | 31 | | public async Task ReleaseWithThrowOnError(Guid institutionId, ReleaseClassesForEnrollmentIn data) |
| | 32 | | { |
| 0 | 33 | | (await Release(institutionId, data)).ThrowOnError(); |
| 0 | 34 | | } |
| | 35 | | } |