using System.Collections.Generic; using System.Linq; using Kreta.BusinessLogic.Helpers; using Kreta.Core.ConnectionType; using Kreta.Core.Logic; using Kreta.Naplo.Dao.V3.Orarend; using Kreta.Naplo.Domain.V3.Common; using Kreta.Naplo.Domain.V3.Ertekeles; using Kreta.Naplo.Domain.V3.Felmentes; namespace Kreta.Naplo.BusinessLogic.V3.Felmentes { public static class FelmentesSubqueries { internal static IEnumerable<(int tanuloId, int? tantargyId, TanuloMentessegResponse mentessegResponse)> GetFelmentesekWithTanuloAdatok(DefaultConnectionParameters dcp, FelmentesRequest request) { var osztalyCsoportTanuloi = new OsztalyCsoportHelper(new MobileConnectionType(dcp.FelhasznaloId, dcp.IntezmenyId, dcp.IntezmenyAzonosito, dcp.TanevId)) .GetOsztalyCsoportTanulokEsFelmenteseik(request.OsztalyCsoportId, request.Datum, request.TanuloId, request.TantargyId).ToDaoList(); return GetTanulokWithFelmentesek(osztalyCsoportTanuloi).Select(x => (x.TanuloId, x.TantargyId, new TanuloMentessegResponse { TanoraLatogatasaAloliFelmentes = x.IsOraMentesites ?? false, ErtekelesAloliFelmentes = x.IsErtekelesMentesseg ?? false, SzovegesenErtekelheto = x.IsSzovegesenErtekelheto ?? true, FelmentesOka = x.MentessegOka, IsMaganTanulo = (x.IsMaganTanulo ?? false) && (x.MaganTanulosagKezdetDatuma.HasValue ? x.MaganTanulosagKezdetDatuma <= request.Datum : true) && (x.MaganTanulosagVegeDatuma.HasValue ? x.MaganTanulosagVegeDatuma >= request.Datum : true), IsJogviszonySzunetelteto = x.IsJogviszonySzunetelteto ?? false, IsSzakmaiGyakorlatonLevo = x.IsSzakmaiGyakorlatonLevo ?? false })); } private static IEnumerable GetTanulokWithFelmentesek(List osztalyCsoportTanuloi) { foreach (var felmentesek in osztalyCsoportTanuloi.GroupBy(x => (x.TanuloId, x.TantargyId))) { if (felmentesek.Any()) { var felmentes = felmentesek.First(); if (felmentesek.Count() > 1) { AggregateFelmentesek(felmentesek, felmentes); } yield return felmentes; } } } /// /// Aggregálni kell a felmentéseket a következő logika alapján /// lényegében a két felmentést kell uniózni, ami az időpont esetében egyértelmű (legkorábbitól a legkésőbbig), a CB esetében meg vagy kapcsolatotot jelent, azaz ami legalább egynél be van pipálva /// /// felmentes lista ha több is szerepel /// felmentes elem private static void AggregateFelmentesek(IGrouping<(int TanuloId, int? TantargyId), JelenletResponseDao> felmentesek, JelenletResponseDao felmentes) { var aggeregateFelmentes = felmentesek.Aggregate((currentValue, sequenceValue) => new JelenletResponseDao { IsOraMentesites = currentValue.IsOraMentesites.GetValueOrDefault() || sequenceValue.IsOraMentesites.GetValueOrDefault(), IsErtekelesMentesseg = currentValue.IsErtekelesMentesseg.GetValueOrDefault() || sequenceValue.IsErtekelesMentesseg.GetValueOrDefault(), IsSzovegesenErtekelheto = currentValue.IsSzovegesenErtekelheto.GetValueOrDefault() || sequenceValue.IsSzovegesenErtekelheto.GetValueOrDefault(), MentessegOka = currentValue.MentessegOka + $" | {sequenceValue.MentessegOka}" }); felmentes.IsOraMentesites = aggeregateFelmentes.IsOraMentesites; felmentes.IsErtekelesMentesseg = aggeregateFelmentes.IsErtekelesMentesseg; felmentes.IsSzovegesenErtekelheto = aggeregateFelmentes.IsSzovegesenErtekelheto; felmentes.MentessegOka = aggeregateFelmentes.MentessegOka; } } }