kreta/Kreta.WebApi/Ellenorzo/Kreta.Ellenorzo.BL/VN/Orarend/OrarendSubqueries.cs
2024-03-13 00:33:46 +01:00

266 lines
15 KiB
C#

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<OrarendElemListResponse> 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<OrarendElemListResponse> ListOrarendElemek(DefaultConnectionParameters dcp, ITraceLogger logger, DateTime datumTol, DateTime datumIg, int? orarendElemId = null, CalendarOraTypeEnum? orarendElemTipus = null)
{
var response = new HashSet<OrarendElemListResponse>(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<bool>("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<OrarendCO.ExtendedEvent> 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<bool>(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<bool>(RendszerBeallitasTipusEnum.helyettesites_lathatosaga_az_ellenorzoben);
var orakAdatai = orarend.Tables[0].Rows.Cast<DataRow>().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<TargyKategoriaTipusEnum>(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<CsatolmanySimplifiedResponse>()
};
if (!response.Add(responseItem))
{
throw new BlException(BlExceptionType.DuplikaltKulcs);
}
}
}
}
private static Dictionary<FeladatTipusEnum, List<IDKT_Feladat>> GetFeladatokTipusSzerint(List<IDKT_Feladat> feladatok)
{
var feladatokTipusSzerint = new Dictionary<FeladatTipusEnum, List<IDKT_Feladat>> {
{ FeladatTipusEnum.HaziFeladat, new List<IDKT_Feladat>() },
{ FeladatTipusEnum.OraiFeladat, new List<IDKT_Feladat>() },
{ FeladatTipusEnum.NyelviFeladat, new List<IDKT_Feladat>() }
};
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;
}
}
}