kreta/Kreta.WebApi/Naplo/Kreta.Naplo.BusinessLogic/V3/Felmentes/FelmentesSubqueries.cs
2024-03-13 00:33:46 +01:00

79 lines
4.1 KiB
C#

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<JelenletResponseDao>();
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<JelenletResponseDao> GetTanulokWithFelmentesek(List<JelenletResponseDao> 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;
}
}
}
/// <summary>
/// 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
/// </summary>
/// <param name="felmentesek">felmentes lista ha több is szerepel</param>
/// <param name="felmentes">felmentes elem</param>
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;
}
}
}