using System; using System.Collections.Generic; using System.Data; using System.Linq; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.Helpers; using Kreta.BusinessLogic.Helpers.SystemSettings; using Kreta.Core.ConnectionType; using Kreta.Core.Enum; using Kreta.Core.Exceptions; using Kreta.DataAccess.Interfaces; using Kreta.DataAccessManual.Util; using Kreta.Ellenorzo.BL.VN.Logic; using Kreta.Ellenorzo.BL.VN.Ora; using Kreta.Ellenorzo.Domain.VN.Adatszotar; using Kreta.Ellenorzo.Domain.VN.Common; using Kreta.Ellenorzo.Domain.VN.Csatolmany; using Kreta.Ellenorzo.Domain.VN.Felhasznalo.Alkalmazott.Tanar; using Kreta.Ellenorzo.Domain.VN.Orarend; using Kreta.Ellenorzo.Domain.VN.OsztalyCsoport; using Kreta.Ellenorzo.Domain.VN.Tantargy; using Kreta.Ellenorzo.Domain.VN.Terem; using Kreta.Ellenorzo.Domain.VN.UniqueIdentifier; using Kreta.Enums; using Kreta.Enums.ManualEnums; using Kreta.Web.Logging.Abstractions; using Newtonsoft.Json; namespace Kreta.Ellenorzo.BL.VN.Orarend { internal static class OrarendSubqueries { internal static HashSet ListOrarend(DefaultConnectionParameters dcp, ITraceLogger logger, OrarendElemListRequest request) { new ValidatorLogic(request).ThrowExceptionIfModelIsNotvalid(); return ListOrarendElemek(dcp, logger, request.DatumTol, request.DatumIg); } internal static OrarendElemListResponse GetOrarendElem(DefaultConnectionParameters dcp, ITraceLogger logger, OrarendElemGetRequest request) { new ValidatorLogic(request).ThrowExceptionIfModelIsNotvalid(); return ListOrarendElemek(dcp, logger, request.OrarendElemUid.Datum, request.OrarendElemUid.Datum, request.OrarendElemUid.Id, request.OrarendElemUid.Tipus).FirstOrDefault() ?? throw new BlException(BlExceptionType.NemLetezoEntitas); } private static HashSet ListOrarendElemek(DefaultConnectionParameters dcp, ITraceLogger logger, DateTime datumTol, DateTime datumIg, int? orarendElemId = null, CalendarOraTypeEnum? orarendElemTipus = null) { var response = new HashSet(new OrarendElemListResponse()); var orarend = dcp.DalHandler.OrarendiOra().GetOrarendForMobile( dcp.IntezmenyId, dcp.TanevId, datumTol, datumIg.AddDays(1), /// HACK @DevKornél: DatumIg+1 nap, hogy a filter zárt intervallumot határozzon meg null, null, dcp.TanuloId, false, OrarendTipusEnum.Minden, null, null, false, null); /// KRETA2-3484 miatt //var torolhetoSorok = orarend.Tables[0].AsEnumerable().Where(r => r.Field("Ures_BOOL")).ToList(); //foreach (var torolhetoSor in torolhetoSorok) //{ // orarend.Tables[0].Rows.Remove(torolhetoSor); //} var connection = new DalHandlerConnectionType(new MobileConnectionType(dcp.FelhasznaloId, dcp.IntezmenyId, dcp.IntezmenyAzonosito, dcp.TanevId), dcp.DalHandler); var feladatok = new DktFeladatHelper(connection).GetFeladatokByDateRange(datumTol, datumIg, true); IEnumerable tanuloOraLista = new OrarendHelper(connection).GetTanuloOrarendDataForMobile( orarend, datumTol, datumIg, dcp.TanuloId, haziFeladatok: feladatok.Where(f => f.FeladatTipusId == (int)FeladatTipusEnum.HaziFeladat)); if (orarendElemId.HasValue && orarendElemTipus.HasValue) { tanuloOraLista = tanuloOraLista.Where(x => x.id == orarendElemId && x.oraType == orarendElemTipus && x.datum == datumTol); } var tanuloOraListaTanevRendjeEsemenyekNelkul = tanuloOraLista.Where(x => !x.allDay); ///tanévrendje események skip var isTanoraTemaAzEllenorzobenLathato = new SystemSettingsHelper(connection).GetSystemSettingValue(RendszerBeallitasTipusEnum.Tanora_Tema_Az_Ellenorzoben); FillUpTanuloOrai(); FillUpTanevRendjeEsemenyek(); var feladatokTipusSzerint = GetFeladatokTipusSzerint(feladatok); foreach (var tanuloOraja in response.Where(o => !o.IsTanevRendjeEsemeny)) { if (feladatokTipusSzerint[FeladatTipusEnum.HaziFeladat].Any() && tanuloOraja.HasHaziFeladat) { var haziFeladat = feladatokTipusSzerint[FeladatTipusEnum.HaziFeladat].Where(x => x.TantargyId == tanuloOraja.Tantargy.Uid.Id && x.OsztalyCsoportId == tanuloOraja.OsztalyCsoport.Uid.Id && x.Datum == tanuloOraja.Uid.Datum && ((x.Oraszam.HasValue && tanuloOraja.Oraszam.HasValue && x.Oraszam.Value == tanuloOraja.Oraszam.Value) || (x.Idopont.HasValue && x.Idopont.Value.TimeOfDay == tanuloOraja.KezdetIdopont.TimeOfDay))) .Select(y => y.ID).FirstOrDefault(); tanuloOraja.HaziFeladatUid = new HaziFeladatUid(haziFeladat); } if (feladatokTipusSzerint[FeladatTipusEnum.OraiFeladat].Any()) { var oraiFeladatGuid = feladatokTipusSzerint[FeladatTipusEnum.OraiFeladat].Where(x => x.TantargyId == tanuloOraja.Tantargy.Uid.Id && x.OsztalyCsoportId == tanuloOraja.OsztalyCsoport.Uid.Id && x.Datum == tanuloOraja.Uid.Datum && ((x.Oraszam.HasValue && tanuloOraja.Oraszam.HasValue && x.Oraszam.Value == tanuloOraja.Oraszam.Value) || (x.Idopont.HasValue && x.Idopont.Value.TimeOfDay == tanuloOraja.KezdetIdopont.TimeOfDay))) .Select(y => y.GroupId).FirstOrDefault(); if (oraiFeladatGuid.HasValue) { tanuloOraja.FeladatGroupUid = new OraiFeladatGroupUid(SDAConvert.ToGuid(oraiFeladatGuid)); } } if (feladatokTipusSzerint[FeladatTipusEnum.NyelviFeladat].Any()) { var nyelviFeladatGuid = feladatokTipusSzerint[FeladatTipusEnum.NyelviFeladat].Where(x => x.TantargyId == tanuloOraja.Tantargy.Uid.Id && x.OsztalyCsoportId == tanuloOraja.OsztalyCsoport.Uid.Id && x.Datum == tanuloOraja.Uid.Datum && ((x.Oraszam.HasValue && tanuloOraja.Oraszam.HasValue && x.Oraszam.Value == tanuloOraja.Oraszam.Value) || (x.Idopont.HasValue && x.Idopont.Value.TimeOfDay == tanuloOraja.KezdetIdopont.TimeOfDay))) .Select(y => y.GroupId).FirstOrDefault(); if (nyelviFeladatGuid.HasValue) { tanuloOraja.NyelviFeladatGroupUid = new NyelviFeladatGroupUid(SDAConvert.ToGuid(nyelviFeladatGuid)); } } } return response; void FillUpTanuloOrai() { var helper = new TanoraHelper(connection); var oraFiles = CsatolmanySubqueries.ListCsatolmanyok(dcp, new CsatolmanyListRequest { DatumTol = datumTol, DatumIg = datumIg, OrarendElemUids = tanuloOraListaTanevRendjeEsemenyekNelkul.Select(o => new OrarendElemUid(o.id, o.oraType, o.datum.Value) { OrarendiOraId = o.OrarendiOraId ?? 0, OrarendiOraGroupId = o.OrarendiOraGroupId ?? 0 }) }); var helyettesitesLathatosagaAzEllenorzoben = new SystemSettingsHelper(connection).GetSystemSettingValue(RendszerBeallitasTipusEnum.helyettesites_lathatosaga_az_ellenorzoben); var orakAdatai = orarend.Tables[0].Rows.Cast().Select(row => new { TantargyId = SDAConvert.ToInt32(row["TantargyId"], -1), OsztalyCsoportId = SDAConvert.ToInt32(row["OsztCsopId"]), TanarId = SDAConvert.ToInt32(row["TanarID"]), OraKezdete = Convert.ToDateTime(row["OraKezdete"]) }); var elozoOrakAdatai = new OrarendiOraHelper(connection).GetElozoOrakAdatai(JsonConvert.SerializeObject(orakAdatai)); foreach (var tanuloOraja in tanuloOraListaTanevRendjeEsemenyekNelkul) { var responseItem = new OrarendElemListResponse { Uid = new OrarendElemUid(tanuloOraja.id, tanuloOraja.oraType, tanuloOraja.datum.Value), OrarendiOraUid = new OrarendElemUid(tanuloOraja.OrarendiOraId ?? tanuloOraja.OrarendiOraGroupId ?? 0, CalendarOraTypeEnum.OrarendiOra, tanuloOraja.datum.Value), Oraszam = tanuloOraja.hanyadikora, KezdetIdopont = tanuloOraja.start.Value, VegIdopont = tanuloOraja.end.Value, Tema = isTanoraTemaAzEllenorzobenLathato && !string.IsNullOrWhiteSpace(tanuloOraja.Tema) ? tanuloOraja.Tema : null, TanuloJelenlet = tanuloOraja.TanuloJelenlet != 0 ? (int?)tanuloOraja.TanuloJelenlet : null, Allapot = (int)tanuloOraja.OraAllapota, IsTanevRendjeEsemeny = tanuloOraja.allDay }; responseItem.BejelentettSzamonkeresUid = tanuloOraja.hasBejelentettSzamonkeres ? new BejelentettSzamonkeresUid(tanuloOraja.BejelentettSzamonkeresIdList[0]) : null; responseItem.Tantargy = new TantargyResponse( tanuloOraja.TantargyId, tanuloOraja.TantargyTeljesNev, /// Ha ki van töltve a tantárgy rövid neve, akkor az kerül bele, egyébként a teljes neve new Adatszotar(tanuloOraja.TantargyKategoriaId, tanuloOraja.TantargyKategoria)); responseItem.OsztalyCsoport = new OsztalyCsoportResponse { Uid = new OsztalyCsoportUid(tanuloOraja.TanevRendOsztalyCsoportId), Nev = tanuloOraja.OsztalyCsoport }; responseItem.Terem = new TeremSimplifiedResponse { Nev = tanuloOraja.Terem }; responseItem.OratTartoTanar = new TanarSimplifiedResponse { Nev = tanuloOraja.TanarNev }; responseItem.HelyettesTanar = new TanarSimplifiedResponse { Nev = string.IsNullOrWhiteSpace(tanuloOraja.HelyettesNev) || !helyettesitesLathatosagaAzEllenorzoben ? null : tanuloOraja.HelyettesNev }; responseItem.HasHaziFeladat = tanuloOraja.hasHaziFeladat; responseItem.Csatolmanyok = oraFiles[responseItem.Uid]; responseItem.IsDigitalisOra = tanuloOraja.IsDigitalisOra; responseItem.DigitalisEszkozTipus = tanuloOraja.DigitalisEszkozTipus; responseItem.DigitalisPlatformTipus = tanuloOraja.DigitalisPlatformTipus; responseItem.DigitalisTamogatoEszkozTipusList = tanuloOraja.DigitalisTamogatoEszkozTipusList; responseItem.Letrehozas = tanuloOraja.Letrehozas; responseItem.UtolsoModositas = tanuloOraja.UtolsoModositas; if (tanuloOraja.isElmaradt) { responseItem.OraEvesSorszama = null; } else { responseItem.OraEvesSorszama = tanuloOraja.EvesOraSorszam; if (tanuloOraja.OraAllapota == TanoraAllapotaEnum.Nem_naplozott) { responseItem.OraEvesSorszama = (int.TryParse(elozoOrakAdatai.FirstOrDefault(o => o.TantargyId == tanuloOraja.TantargyId && o.OsztalyCsoportId == tanuloOraja.TanevRendOsztalyCsoportId && o.TanarId == tanuloOraja.TanarId && o.OraKezdete == tanuloOraja.start.Value)?.ElozoOraEvesSorszama, out var oraszam) ? oraszam : default) + 1; } } if (!response.Add(responseItem)) { logger.Warn($"OrarendElemResponse: OrarendElem duplikált. {JsonConvert.SerializeObject(responseItem)}"); } } } void FillUpTanevRendjeEsemenyek() { foreach (var tanuloOraja in tanuloOraLista.Where(x => x.allDay)) { var responseItem = new OrarendElemListResponse { Uid = new OrarendElemUid(tanuloOraja.id, tanuloOraja.oraType, new DateTime(tanuloOraja.start.Value.Year, tanuloOraja.start.Value.Month, tanuloOraja.start.Value.Day)), KezdetIdopont = tanuloOraja.start.Value, VegIdopont = tanuloOraja.end.Value, TanuloJelenlet = tanuloOraja.TanuloJelenlet != 0 ? (int?)tanuloOraja.TanuloJelenlet : null, Allapot = (int)TanoraAllapotaEnum.TanevRendjeEsemeny, IsTanevRendjeEsemeny = tanuloOraja.allDay, TanevRendjeEsemenyNeve = tanuloOraja.title, Csatolmanyok = new List() }; if (!response.Add(responseItem)) { throw new BlException(BlExceptionType.DuplikaltKulcs); } } } } private static Dictionary> GetFeladatokTipusSzerint(List feladatok) { var feladatokTipusSzerint = new Dictionary> { { FeladatTipusEnum.HaziFeladat, new List() }, { FeladatTipusEnum.OraiFeladat, new List() }, { FeladatTipusEnum.NyelviFeladat, new List() } }; foreach (var feladat in feladatok) { if (feladat.FeladatTipusId == (int)FeladatTipusEnum.HaziFeladat) { feladatokTipusSzerint[FeladatTipusEnum.HaziFeladat].Add(feladat); } else if (feladat.FeladatTipusId == (int)FeladatTipusEnum.OraiFeladat) { feladatokTipusSzerint[FeladatTipusEnum.OraiFeladat].Add(feladat); } else if (feladat.FeladatTipusId == (int)FeladatTipusEnum.NyelviFeladat) { feladatokTipusSzerint[FeladatTipusEnum.NyelviFeladat].Add(feladat); } } return feladatokTipusSzerint; } } }