using System.Collections.Generic; using System.Data; using System.Linq; using System.Web.Http.ModelBinding; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.Core; using Kreta.Enums; using Kreta.Resources; using Kreta.Web.Security; namespace Kreta.Web.Areas.TanuloErtekeles.Models { public class ErettsegiEredmenySaveModel { public string FormName { get; set; } public List ErettsegiEredmenySaveDetailModelList { get; set; } = new List(); } public class ErettsegiEredmenySaveDetailModel { public string Id { get; set; } public int TanuloId { get; set; } public int? ErettsegiTantargyId { get; set; } public int? ErettsegiSzintId { get; set; } public int? ErettsegiTipusId { get; set; } public int? IrasbeliPontszam { get; set; } public int? SzobeliPontszam { get; set; } public int? GyakorlatiPontszam { get; set; } public string Megjegyzes { get; set; } public bool IsNew { get; set; } public ModelStateDictionary Validate(ModelStateDictionary modelStateDictionary, string formName, DataSet erettsegiTantargyAdatok) { if (!ErettsegiTantargyId.IsEntityId()) { modelStateDictionary.AddModelError(formName, string.Format(CommonResource.Required, $"\"{ErettsegiEredmenyekResource.Tantargy}\"")); } else { //NOTE: Az IsEntityId vizsgálat miatt nem lehet null az ErettsegiTantargyId! int erettsegiTantargyIdValue = ErettsegiTantargyId.Value; var erettsegiTantargyNev = erettsegiTantargyIdValue.GetDisplayName(ClaimData.SelectedTanevID.Value); if (!ErettsegiSzintId.IsEntityId()) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationRequired, erettsegiTantargyNev, $"{ErettsegiEredmenyekResource.Szint}")); } else { //NOTE: Az IsEntityId vizsgálat miatt nem lehet null az ErettsegiSzintId! int erettsegiSzintIdValue = ErettsegiSzintId.Value; List erettsegiTantargyAdatokModel = erettsegiTantargyAdatok.Tables[0].AsEnumerable().Select(dataRow => new ErettsegiTantargyAdatokModel { ID = dataRow.Field("ID"), IsSzobeli = dataRow.Field("IsSzobeli").ToBool(), IsIrasbeli = dataRow.Field("IsIrasbeli").ToBool(), IsGyakorlati = dataRow.Field("IsGyakorlati").ToBool(), IsEmelt = dataRow.Field("ErettsegiSzint") == (int)ErettsegiSzintEnum.EmeltSzint, IrasbeliMaxPontszam = dataRow.Field("IrasbeliMaxPontszam"), GyakorlatiMaxPontszam = dataRow.Field("GyakorlatiMaxpontszam"), SzobeliMaxPontszam = dataRow.Field("SzobeliMaxpontszam"), OsszMaxPontszam = dataRow.Field("OsszMaxpontszam") }).Where(x => x.ID == erettsegiTantargyIdValue).ToList(); //NOTE: Megvizsgáljuk, hogy emelt szintű-e az érettségi. if (erettsegiSzintIdValue == (int)ErettsegiSzintEnum.EmeltSzint) { //NOTE: Azért használunk SingleOrDefault-ot, mert csak és kizárólag egy darab emelt és/vagy közép szintű érettségi lehet az adott tantárgyból, ha több van, rossz adat van az adatbázisban és javítani kell. var emeltErettsegiTantargyAdat = erettsegiTantargyAdatokModel.SingleOrDefault(x => x.IsEmelt); ErettsegiSzintSzerintiValidacio(modelStateDictionary, formName, emeltErettsegiTantargyAdat, ErettsegiEredmenyekResource.Emelt, erettsegiTantargyNev); } //NOTE: Megvizsgáljuk, hogy közép szintű-e az érettségi. if (erettsegiSzintIdValue == (int)ErettsegiSzintEnum.KozepSzint) { //NOTE: Azért használunk SingleOrDefault-ot, mert csak és kizárólag egy darab emelt és/vagy közép szintű érettségi lehet az adott tantárgyból, ha több van, rossz adat van az adatbázisban és javítani kell. var kozepErettsegiTantargyAdat = erettsegiTantargyAdatokModel.SingleOrDefault(x => !x.IsEmelt); //NOTE: Megvizsgáljuk, hogy matematika-e a tantárgy, ha igen, akkor azt közép szinten egyedileg kell validálni, ha nem, akkor normális validáció következik. if (erettsegiTantargyIdValue != (int)ErettsegiTantargyEnum.matematika) { ErettsegiSzintSzerintiValidacio(modelStateDictionary, formName, kozepErettsegiTantargyAdat, ErettsegiEredmenyekResource.Kozep, erettsegiTantargyNev); } else { var matematikaOsszMaxPontszam = 0; //NOTE: Mivel matematika tantárgyról van szó, ezért a kozepErettsegiTantargyAdat nem lehet null, mert kötelező, hogy legyen ilyen az adatbázisban! PontszamValidation(modelStateDictionary, formName, IrasbeliPontszam, kozepErettsegiTantargyAdat.IrasbeliMaxPontszam, kozepErettsegiTantargyAdat.IsIrasbeli, ErettsegiEredmenyekResource.Irasbeli, erettsegiTantargyNev); matematikaOsszMaxPontszam += kozepErettsegiTantargyAdat.IrasbeliMaxPontszam; if (IrasbeliPontszam < 25) { var matematikaKozepSzobeliMaxPontszam = 50; PontszamValidation(modelStateDictionary, formName, SzobeliPontszam, matematikaKozepSzobeliMaxPontszam, kozepErettsegiTantargyAdat.IsSzobeli, ErettsegiEredmenyekResource.Szobeli, erettsegiTantargyNev); matematikaOsszMaxPontszam += matematikaKozepSzobeliMaxPontszam; } else { if (SzobeliPontszam.HasValue) { modelStateDictionary.AddModelError(formName, ErettsegiEredmenyekResource.ValidationMatematikaNemLehetTipusuErettsegiVizsgatTenni); } matematikaOsszMaxPontszam += kozepErettsegiTantargyAdat.SzobeliMaxPontszam; } if (GyakorlatiPontszam.HasValue) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationNemLehetTipusuErettsegiVizsgatTenni, erettsegiTantargyNev, ErettsegiEredmenyekResource.Gyakorlati)); } matematikaOsszMaxPontszam += kozepErettsegiTantargyAdat.GyakorlatiMaxPontszam; var osszPontszam = 0; osszPontszam += IrasbeliPontszam ?? 0; osszPontszam += SzobeliPontszam ?? 0; osszPontszam += GyakorlatiPontszam ?? 0; //NOTE: Megvizsgáljuk, hogy nem adtak-e több pontot összesen, mint a lehetséges maximális. if (matematikaOsszMaxPontszam < osszPontszam) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationMaximumPontotLehetElerniOsszesenAzErettsegiVizsgan, erettsegiTantargyNev, matematikaOsszMaxPontszam)); } } } } if (!ErettsegiTipusId.IsEntityId()) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationRequired, erettsegiTantargyNev, $"{ErettsegiEredmenyekResource.Tipus}")); } } return modelStateDictionary; } private void ErettsegiSzintSzerintiValidacio(ModelStateDictionary modelStateDictionary, string formName, ErettsegiTantargyAdatokModel erettsegiTantargyAdat, string erettsegiSzintNev, string erettsegiTantargyNev) { //NOTE: Ha igen, megvizsgáljuk, hogy lehet-e adott szintű(Közép/Emelt) érettségit tenni a tantárgyból, ha nem, validációs hibát dobunk. if (erettsegiTantargyAdat == null) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationNemLehetSzintuErettsegiVizsgatTenni, erettsegiTantargyNev, erettsegiSzintNev)); } //NOTE: Ha igen, folytatjuk a további vizsgálatot. else { PontszamValidation(modelStateDictionary, formName, IrasbeliPontszam, erettsegiTantargyAdat.IrasbeliMaxPontszam, erettsegiTantargyAdat.IsIrasbeli, ErettsegiEredmenyekResource.Irasbeli, erettsegiTantargyNev); PontszamValidation(modelStateDictionary, formName, SzobeliPontszam, erettsegiTantargyAdat.SzobeliMaxPontszam, erettsegiTantargyAdat.IsSzobeli, ErettsegiEredmenyekResource.Szobeli, erettsegiTantargyNev); PontszamValidation(modelStateDictionary, formName, GyakorlatiPontszam, erettsegiTantargyAdat.GyakorlatiMaxPontszam, erettsegiTantargyAdat.IsGyakorlati, ErettsegiEredmenyekResource.Gyakorlati, erettsegiTantargyNev); var osszPontszam = 0; osszPontszam += IrasbeliPontszam ?? 0; osszPontszam += SzobeliPontszam ?? 0; osszPontszam += GyakorlatiPontszam ?? 0; //NOTE: Megvizsgáljuk, hogy nem adtak-e több pontot összesen, mint a lehetséges maximális. if (erettsegiTantargyAdat.OsszMaxPontszam < osszPontszam) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationMaximumPontotLehetElerniOsszesenAzErettsegiVizsgan, erettsegiTantargyNev, erettsegiTantargyAdat.OsszMaxPontszam)); } } } private void PontszamValidation(ModelStateDictionary modelStateDictionary, string formName, int? pontszam, int maxPontszam, bool isErettsegiTantargyTipus, string tipusNev, string erettsegiTantargyNev) { //NOTE: Megvizsgáljuk, hogy adtak-e pontot az adott típusból(Írásbeli/Szóbeli/Gyakorlati) if (pontszam.HasValue) { //NOTE: Ha adtak pontot, megvizsgáljuk, hogy az adott típusból(Írásbeli/Szóbeli/Gyakorlati), szabad-e pontot adni. Ha nem, validációs hibát dobunk. if (!isErettsegiTantargyTipus) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationNemLehetTipusuErettsegiVizsgatTenni, erettsegiTantargyNev, tipusNev)); } //NOTE: Megvizsgáljuk, hogy nem adtak-e több pontot, mint az adott típusból(Írásbeli/Szóbeli/Gyakorlati) a lehetséges maximális. else if (maxPontszam < pontszam.Value) { modelStateDictionary.AddModelError(formName, string.Format(ErettsegiEredmenyekResource.ValidationMaximumPontotLehetElerniTipusuErettsegiVizsgan, erettsegiTantargyNev, maxPontszam, tipusNev)); } } } public ErettsegiEredmenyItemCo ConvertModelToCo(int intezmenyId, int tanevId) { ErettsegiEredmenyItemCo co = new ErettsegiEredmenyItemCo { IntezmenyId = intezmenyId, TanevId = tanevId, TanuloId = TanuloId }; if (!IsNew) { co.Id = int.Parse(Id); } if (ErettsegiTantargyId.HasValue) { co.ErettsegiTantargyId = ErettsegiTantargyId.Value; } if (ErettsegiSzintId.HasValue) { co.ErettsegiSzintId = ErettsegiSzintId.Value; } if (ErettsegiTipusId.HasValue) { co.ErettsegiTipusId = ErettsegiTipusId.Value; } if (IrasbeliPontszam.HasValue) { co.IrasbeliPontszam = IrasbeliPontszam.Value; } if (SzobeliPontszam.HasValue) { co.SzobeliPontszam = SzobeliPontszam.Value; } if (GyakorlatiPontszam.HasValue) { co.GyakorlatiPontszam = GyakorlatiPontszam.Value; } co.Megjegyzes = Megjegyzes; int osszPontszam = 0; if (co.IrasbeliPontszam != null) { osszPontszam += co.IrasbeliPontszam.Value; } if (co.SzobeliPontszam != null) { osszPontszam += co.SzobeliPontszam.Value; } if (co.GyakorlatiPontszam != null) { osszPontszam += co.GyakorlatiPontszam.Value; } co.OsszPontszam = co.IrasbeliPontszam == null && co.SzobeliPontszam == null && co.GyakorlatiPontszam == null ? (int?)null : osszPontszam; return co; } } }