using System; using System.Collections.Generic; using System.Linq; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.Classes.MobileApi.Naplo.V2.Co.Get.Ora.Common; using Kreta.BusinessLogic.Classes.MobileApi.Naplo.V2.Logic; using Kreta.BusinessLogic.Classes.MobileApi.Naplo.V2.SubqueriesRepo; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.Helpers; using Kreta.BusinessLogic.Helpers.SystemSettings; using Kreta.BusinessLogic.Logic.Naplozas.Elokeszites; using Kreta.Core.ConnectionType; using Kreta.Core.Validation.Exceptions; using Kreta.Core.Validation.Exceptions.Enum; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.Enums; using Kreta.Enums.ManualEnums; using Kreta.Resources; namespace Kreta.BusinessLogic.Logic.Naplozas.Validacio { public class NaploValidacio { private List OrarendLista { get { var helper = new OrarendHelper(ConnectionType); return helper.GetOrarendiOrakEsVagyNapirendekEsTanorak(_parameters.FelhasznaloSzerepkor, _parameters.From, _parameters.To, ConnectionType.FelhasznaloId, osztalyCsoportId: null, tanuloId: null, csakOrarend: false, OrarendTipusEnum.Minden, isTanuloOrGondviselo: false, EventColorEnum.Kek); } } private readonly NaploValidacioParameters _parameters; public IConnectionType ConnectionType { get { return _parameters.ConnectionType; } } public NaploValidacio(NaploValidacioParameters parameters) { _parameters = parameters; } /// INFO @D.Kornél: Mobil használja public void MobilValidateModel(NaplozasElokeszitesModel model) { OrarendCO.ExtendedEvent ora; LezartNaploValidacio(model); if (!model.IsTanora) { ora = GetOra(model); CheckIsOraExists(ora); HelyettesitettOra(ora); } else { ora = GetTanora(model); CheckIsOraExists(ora); //TODO: ha nem az övé vagy helyettese } KorabbanNaplozottOra(model, ora); CheckElmaradtraNaplozas(model, ora); if (!model.IsElmaradtOra) { ValidateMulasztasRekords(model); TemaValidacio(model); } NaplozasDatumValidacio(model); } public void ValidateModel(NaplozasElokeszitesModel model) { if (!model.IsEgyediNaplozas) { if (model.IsTanora) { var ora = GetTanora(model); CheckIsOraExists(ora); //TODO: ha nem az övé vagy helyettese } else { OrarendCO.ExtendedEvent ora; if (model.Helyettesites.IsKeresoAltalTalaltOra) { ora = GetHelyettesOra(model); } else { ora = GetOra(model); } CheckIsOraExists(ora); KorabbanNaplozottOra(model, ora); HelyettesitettOra(ora); } } ValidateMulasztasRekords(model); NaplozasDatumValidacio(model); TemaValidacio(model); } public bool TeremUtkozesEllenorzes(NaplozasElokeszitesModel model) { bool teremutkozes; int tanoraID, orarendiOraID, hetirend; var helper = new TanoraHelper(ConnectionType); if (!model.OraAdat.TeremId.HasValue) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.MenteshezATeremMegadasaKotelezo); } if (model.IsEgyediNaplozas) { tanoraID = 0; orarendiOraID = 0; hetirend = (int)HetiRendTipusEnum.MindegyikHet; } else if (model.IsTanora) { tanoraID = model.OraAdat.TanitasiOraId.Value; (var oraId, var hRend) = helper.GetOrarendIdAndHetirend(tanoraID); if (oraId.HasValue) { orarendiOraID = oraId.Value; if (hRend.HasValue) { hetirend = hRend.Value; } else { hetirend = (int)HetiRendTipusEnum.MindegyikHet; } } else { orarendiOraID = 0; hetirend = (int)HetiRendTipusEnum.MindegyikHet; } } else { tanoraID = 0; orarendiOraID = model.OraAdat.OrarendiOraId.Value; var orarendiOraHelper = new OrarendiOraHelper(ConnectionType); hetirend = orarendiOraHelper.GetHetirend(orarendiOraID); } teremutkozes = helper.TanitasiOraTeremUtkozesEllenorzes(tanoraID, orarendiOraID, model.OraAdat.TeremId.Value, (int)model.OraAdat.HetNapja, hetirend, model.OraAdat.OraKezdete, model.OraAdat.OraVege); return teremutkozes; } public string GetOsztalyEsTanarOraiUtkozes(NaplozasElokeszitesModel model) { int osztalyCsoportId; if (!model.OraAdat.OsztalyCsoportId.HasValue && model.OraAdat.FoglakozasId.HasValue) { var helper = new TantargyFelosztasHelper(ConnectionType); var data = helper.GetTantargyFelosztas(model.OraAdat.FoglakozasId.Value); osztalyCsoportId = data.OsztalyCsoportID; } else { osztalyCsoportId = model.OraAdat.OsztalyCsoportId.Value; } var tanorahelper = new TanoraHelper(ConnectionType); var errorMsg = tanorahelper.GetOsztalyEsTanarOrai(model.OraAdat.TanarId.Value, osztalyCsoportId, model.OraAdat.OraKezdete, model.OraAdat.OraVege, model.OraAdat.TanitasiOraId, model.OraAdat.OrarendiOraId); return errorMsg; } public OrarendCO.ExtendedEvent GetTanora(NaplozasElokeszitesModel model) { return OrarendLista.Find(x => x.id == model.OraAdat.TanitasiOraId && x.datum.Value.Date == model.OraAdat.OraKezdete.Date); } public void CheckElmaradtraNaplozas(NaplozasElokeszitesModel model, OrarendCO.ExtendedEvent ora) { if (ora.OraAllapota == TanoraAllapotaEnum.Elmaradt && !model.IsElmaradtOra) { throw new ValidationException(ValidationErrorType.ResourceAlreadyExists, ErrorResource.NaplozasSikertelenKorabbanMarElmaradtOrakentNaplozasraKerult); } if (ora.OraAllapota == TanoraAllapotaEnum.Naplozott && model.IsElmaradtOra) { throw new ValidationException(ValidationErrorType.ResourceAlreadyExists, ErrorResource.NaplozasSikertelenAzOraMarKorabbanNaplozasraKerult); } } private void CheckIsOraExists(OrarendCO.ExtendedEvent ora) { if (ora == null) { throw new ValidationException(ValidationErrorType.ResourceNotFound, ErrorResource.NaplozasSikertelenAzOraMarNemLetezikAKivalasztottNapon); } } private OrarendCO.ExtendedEvent GetHelyettesOra(NaplozasElokeszitesModel model) { var helper = new OrarendHelper(ConnectionType); var date = model.OraAdat.OraKezdete.Date; var helyettesOralista = helper.GetOrarendiOrakEsVagyNapirendekEsTanorak(_parameters.FelhasznaloSzerepkor, date, date.AddDays(1), model.OraAdat.TanarId, osztalyCsoportId: null, tanuloId: null, csakOrarend: false, OrarendTipusEnum.Minden, isTanuloOrGondviselo: false, EventColorEnum.Kek); return helyettesOralista.Find(x => x.OrarendiOraId == model.OraAdat.OrarendiOraId); } private OrarendCO.ExtendedEvent GetOra(NaplozasElokeszitesModel model) { return OrarendLista.Find(x => x.OrarendiOraId == model.OraAdat.OrarendiOraId && x.datum.Value.Date == model.OraAdat.OraKezdete.Date); } private void HelyettesitettOra(OrarendCO.ExtendedEvent ora) { if (ora.OraAllapota == TanoraAllapotaEnum.Nem_naplozott && ora.helyettesitoId.HasValue && ora.helyettesitoId != ConnectionType.FelhasznaloId) { throw new ValidationException(ValidationErrorType.ResourceNotFound, ErrorResource.NaplozasSikertelenAzOraraHelyettesitesLettKiivaAzAdminAltal); } } private void KorabbanNaplozottOra(NaplozasElokeszitesModel model, OrarendCO.ExtendedEvent ora) { if (model.OraAdat.TanitasiOraId.HasValue) { return; } if (ora.OraAllapota == TanoraAllapotaEnum.Nem_naplozott) { return; } if (ora.OraAllapota == TanoraAllapotaEnum.Elmaradt) { throw new ValidationException(ValidationErrorType.ResourceAlreadyExists, ErrorResource.NaplozasSikertelenKorabbanMarElmaradtOrakentNaplozasraKerult); } if (ora.OraAllapota == TanoraAllapotaEnum.Naplozott) { if (ora.helyettesitoId.HasValue && ora.helyettesitoId != ConnectionType.FelhasznaloId) { throw new ValidationException(ValidationErrorType.ResourceAlreadyExists, ErrorResource.NaplozasSikertelenAzOratKorabbanMarHelyettesitettkentNaploztaEgyMasikTanar); } throw new ValidationException(ValidationErrorType.ResourceAlreadyExists, ErrorResource.NaplozasSikertelenAzOraMarKorabbanNaplozasraKerult); } } private void TemaValidacio(NaplozasElokeszitesModel model) { if (string.IsNullOrWhiteSpace(model.OraAdat.Tema)) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.NaplozasSikertelenTemaMegadasaKotelezo); } if (model.OraAdat.Tema.Length > 1000) /*db ben ez a max char jelenleg*/ { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.TemaTulHosszu); } } /// INFO @D.Kornél: használja a mobil public void NaplozasDatumValidacio(NaplozasElokeszitesModel model) { if (!model.NaplozhatoDatum) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.NaplozasSikertelenJovobeliDatumraNemLehetNaplozni); } if (model.OraAdat.OraKezdete >= model.OraAdat.OraVege) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.OraKezdeteNagyobbMintAVege); } var isNaplozhatZarastolFuggetlenul = new NaplozarasLogic(ConnectionType).IsNaplozhatZarastolFuggetlenul(model.OraAdat.OraKezdete, model.OraAdat.OsztalyCsoportId); if (!isNaplozhatZarastolFuggetlenul && new OrarendHelper(ConnectionType).GetNaplozarasDate(null) >= model.OraAdat.OraKezdete) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.NaplozasSikertelenNemNaplozhatoNaplozarasMiatt); } if (model.OraAdat.OraVege.Date != model.OraAdat.OraKezdete.Date) { throw new ValidationException(ValidationErrorType.Undefined, OrarendResource.AtiveloNaplozasNemEngedelyezett); } var orarendHelper = new OrarendHelper(ConnectionType); if (orarendHelper.GetIsMunkaszunetiNap(model.OraAdat.OraKezdete.Date, model.OraAdat.OsztalyCsoportId.Value)) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.MunkaszunetiNapraTanoraNemVehetoFel); } var sysSettingsHelper = new SystemSettingsHelper(ConnectionType); DateTime? szakGyakKezdDatum, szakGyakVegDatum, utolsoTanitasiNap; var tanevRendHelper = new TanevrendHelper(ConnectionType); var tanevHelper = new TanevHelper(ConnectionType); szakGyakKezdDatum = sysSettingsHelper.GetSystemSettingValue(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum); szakGyakVegDatum = sysSettingsHelper.GetSystemSettingValue(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum); utolsoTanitasiNap = tanevHelper.GetTanevInfo().UtolsoTanitasiNap; var isRendkivuliNap = tanevRendHelper.IsRendkivuliTanitasiNap(model.OraAdat.OraKezdete); if (model.OraAdat.OraKezdete.Date > utolsoTanitasiNap) { if ((model.OraAdat.OraKezdete.Date < szakGyakKezdDatum || model.OraAdat.OraKezdete.Date > szakGyakVegDatum) && !isRendkivuliNap) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.NaplozasSikertelenNyariNaplozasMiatt); } if (!isRendkivuliNap && !new CsoportHelper(ConnectionType).IsNyariSzakmaiGyakorlatos(model.OraAdat.OsztalyCsoportId.Value) && !model.SzervezetTipusId.HasValue) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.EbbenAzIdoszakbanCsakOsszefuggoSzakmaiGyakorlatiCsoportotLehetNaplozni); } } } public void LezartNaploValidacio(NaplozasElokeszitesModel model) { if (model.OraAdat.OsztalyCsoportId.HasValue && new NaplozarasLogic(ConnectionType).GetLezartOsztalyokEsBontottCsoportjaik().Contains(model.OraAdat.OsztalyCsoportId.Value)) { throw new ValidationException(ValidationErrorType.Undefined, ErrorResource.AzElektronikusNaploLezarva); } } private void ValidateMulasztasRekords(NaplozasElokeszitesModel model) { if (model.IsElmaradtOra) { return; } Dal.CustomConnection.Run(ConnectionType, h => { var jelenletList = model.IsEgyediNaplozas ? GetEgyediOraJavasoltJelenlet(model, h) : model.IsTanora ? GetTanitasiOraJavasoltJelenlet(model, h, oktatasNevelesKategoriaEnum: null) : GetOrarendiOraJavasoltJelenlet(model, h); SetMulastasValuesToValid(model, jelenletList); }); } private void SetMulastasValuesToValid(NaplozasElokeszitesModel model, IEnumerable javasoltJelenlet) { var invalidRecords = new List(); var template = model.IsTanora ? new JavasoltJelenletTemplateLogic(TanoraAllapotaEnum.Naplozott) : new JavasoltJelenletTemplateLogic(TanoraAllapotaEnum.Nem_naplozott); foreach (var item in model.Mulasztas.MulasztasList) { var tanuloMulasztas = javasoltJelenlet.SingleOrDefault(t => t.TanuloId == item.TanuloId); if (tanuloMulasztas != null) { var tanuloMulasztasTemplate = template.GetCalculatedJelenletJavaslatConsideringSzuro(tanuloMulasztas.JavasoltJelenletTemplateTipusSzuroLista); MulasztasTipusEnum mulasztasTypus; if (item.Keses.HasValue && item.Keses > 0 && !item.MulasztasTipus.HasValue) { mulasztasTypus = MulasztasTipusEnum.keses; } else { if (item.MulasztasTipus.HasValue) { mulasztasTypus = (MulasztasTipusEnum)item.MulasztasTipus.Value; } else { mulasztasTypus = MulasztasTipusEnum.ures; } } var mulasztasTemplate = tanuloMulasztasTemplate.SzuroElemLista.First(t => t.MulasztasTipusAdatszotar == mulasztasTypus); if (!mulasztasTemplate.IsEnabled) { invalidRecords.Add(item); } } else { invalidRecords.Add(item); } } foreach (var item in invalidRecords) { model.Mulasztas.MulasztasList.Remove(item); } } private IEnumerable GetOrarendiOraJavasoltJelenlet(NaplozasElokeszitesModel model, IDalHandler h, OktNevelesiKategoriaEnum? oktatasNevelesKategoriaEnum = null) { var jelenletList = OrarendiOraSubqueries.ListJavasoltJelenlet(model.UserId, ConnectionType.IntezmenyId, ConnectionType.IntezmenyAzonosito, ConnectionType.TanevId, h, new Classes.MobileApi.Naplo.V2.Co.Get.Ora.OrarendiOra.JavasoltJelenlet.JavasoltJelenletGetRequestCo() { Key = new Classes.MobileApi.Naplo.V2.Co.Get.Ora.OrarendiOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo[] { new Classes.MobileApi.Naplo.V2.Co.Get.Ora.OrarendiOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo(){ OrarendiOraId = model.OraAdat.OrarendiOraId.Value, OraKezdetDatuma = model.OraAdat.OraKezdete, OraVegDatuma = model.OraAdat.OraVege, IsHelyettesitesKeresoAltalTalaltOra = model.Helyettesites.IsKeresoAltalTalaltOra } } }, oktatasNevelesKategoriaEnum); return jelenletList[0].TanuloLista; } private IEnumerable GetEgyediOraJavasoltJelenlet(NaplozasElokeszitesModel model, IDalHandler h, OktNevelesiKategoriaEnum? oktatasNevelesKategoriaEnum = OktNevelesiKategoriaEnum.NevelesOktatas) { var jelenletList = EgyediOraSubqueries.ListJavasoltJelenlet(model.UserId, ConnectionType.IntezmenyAzonosito, ConnectionType.TanevId, h, new Classes.MobileApi.Naplo.V2.Co.Get.Ora.EgyediOra.JavasoltJelenlet.JavasoltJelenletGetRequestCo() { Key = new Classes.MobileApi.Naplo.V2.Co.Get.Ora.EgyediOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo[] { new Classes.MobileApi.Naplo.V2.Co.Get.Ora.EgyediOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo() { OsztalyCsoportId = model.OraAdat.OsztalyCsoportId.Value, TantargyId = model.OraAdat.TantargyId.Value, OraKezdetDatuma = model.OraAdat.OraKezdete, OraVegDatuma = model.OraAdat.OraVege } } }, oktatasNevelesKategoriaEnum, ConnectionType.IntezmenyId); return jelenletList[0].TanuloLista; } private IEnumerable GetTanitasiOraJavasoltJelenlet(NaplozasElokeszitesModel model, IDalHandler h, OktNevelesiKategoriaEnum? oktatasNevelesKategoriaEnum = null) { var jelenletList = TanitasiOraSubqueries.ListJavasoltJelenlet(model.UserId, ConnectionType.IntezmenyId, ConnectionType.IntezmenyAzonosito, ConnectionType.TanevId, h, new Classes.MobileApi.Naplo.V2.Co.Get.Ora.TanitasiOra.JavasoltJelenlet.JavasoltJelenletGetRequestCo() { Key = new Classes.MobileApi.Naplo.V2.Co.Get.Ora.TanitasiOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo[] { new Classes.MobileApi.Naplo.V2.Co.Get.Ora.TanitasiOra.JavasoltJelenlet.JavasoltJelenletKeyGetRequestCo(){ TanitasiOraId = model.OraAdat.TanitasiOraId.Value } } }, oktatasNevelesKategoriaEnum); return jelenletList[0].TanuloLista; } } }