using System; using System.Collections.Generic; using System.Data; using System.Linq; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.Helpers; using Kreta.BusinessLogic.Interfaces; using Kreta.Core; using Kreta.Core.ConnectionType; using Kreta.Core.Exceptions; using Kreta.DataAccessManual.Interfaces; using Kreta.Enums; using Kreta.Enums.ManualEnums; using Kreta.Resources; namespace Kreta.BusinessLogic.HelperClasses.OsztalyCsoportbaSorolas { internal class SorolasValidate { internal static void ValidateModel(IOsztalyCsoportbaSorolas model, bool datum = true, bool fromDdl = true, bool toDdl = true) { List errormessages = new List(); if (toDdl && !model.ToDDL.HasValue) { errormessages.Add(BesorolasResource.CelPanelKitolteseKotelezo); } if (fromDdl && !model.FromDDL.HasValue) { errormessages.Add(BesorolasResource.ForrasPanelKitolteseKotelezo); } if (datum && !model.Datum.HasValue) { errormessages.Add(ErrorResource.DatumMegadasaKotelezo); } if (model.Zaradek == null) { model.Zaradek = new SorolasZaradek(); } if (model.Zaradek.IsZaradekKotelezo && model.ToElements.Any(x => !x.IsVanMentettVegzaradek) && (model.Zaradek.ZaradekSzovegList == null || !model.Zaradek.ZaradekSzovegList.Any(x => x.NyelvId == (int)AnyanyelvEnum.magyar && !string.IsNullOrWhiteSpace(x.Szoveg)))) { errormessages.Add(OsztalyCsoportResource.ZaradekSzovegeKotelezo); } if (model.ToElements.Any(x => x.JogviszonyCount > 0 && (string.IsNullOrWhiteSpace(x.JogviszonyIds) || x.JogviszonyIds == "0"))) { errormessages.Add(OsztalyCsoportResource.Legalabb1JogviszonyValasztasaKotelezo); } if (!model.Zaradek.KeltezesDatuma.HasValue && model.Zaradek.IsZaradekKotelezo) { errormessages.Add(OsztalyCsoportResource.KeltezesDatumaKotelezo); } if (string.IsNullOrWhiteSpace(model.Zaradek.KeltezesHelye) && model.Zaradek.IsZaradekKotelezo) { errormessages.Add(OsztalyCsoportResource.KeltezesHelyeKotelezo); } if (errormessages.Count > 0) { throw new BlException(string.Join(Constants.General.Sortores, errormessages)); } } internal static void SzervezetValidateModel(IConnectionType connectionType, int tanevId, IOsztalyCsoportbaSorolas model) { var errormessages = new List(); var osztalyCsoportHelper = new OsztalyCsoportHelper(connectionType); var tanulokSzakmajegyzekek = osztalyCsoportHelper.GetTanulokSzakmajegyzeke(tanevId, model.ToElements.Select(x => x.Id).ToList(), model.Datum ?? DateTime.Now); var tanuloSzakmaNelkulList = new List(); foreach (var szakmajegyzek in tanulokSzakmajegyzekek) { if (szakmajegyzek.SzakmaTipusId == null || szakmajegyzek.SzakmaTipusId == (int)SzakmaTipusEnum.na) { tanuloSzakmaNelkulList.Add(szakmajegyzek.NevElotagNelkul); } } if(tanuloSzakmaNelkulList.Any()) { errormessages.Add($"{string.Join(", ", tanuloSzakmaNelkulList.ToArray())} {OsztalyCsoportResource.TanuloSzakmaAdatNincsBeallitvaDualisCsoport}"); } var csoportSzakmajegyzekek = osztalyCsoportHelper.GetCsoportTanuloinakSzakmajegyzeke(model.ToDDL.Value, model.Datum ?? DateTime.Now); var groupoltTanulokSzakmajegyzekek = tanulokSzakmajegyzekek.GroupBy(t => new { SzakmaTipusId = t.SzakmaTipusId, SzakmairanyTipusId = t.SzakmairanyTipusId }).ToList(); if (groupoltTanulokSzakmajegyzekek.Count > 1 && csoportSzakmajegyzekek.Count == 0) { errormessages.Add(OsztalyCsoportResource.TanulokNemEgyezoSzakmaSzakmairany); } if (csoportSzakmajegyzekek.Count == 1) { var tanulokNemEgyezoSzakmaSzakmairany = tanulokSzakmajegyzekek.Where(x => !x.SzakmaTipusId.HasValue || !csoportSzakmajegyzekek.First().SzakmaTipusId.HasValue || x.SzakmaTipusId != csoportSzakmajegyzekek.First().SzakmaTipusId || !(x.SzakmairanyTipusId == csoportSzakmajegyzekek.First().SzakmairanyTipusId)).ToList(); if (tanulokNemEgyezoSzakmaSzakmairany.Count > 0) { var csoportSzakmajegyzeke = csoportSzakmajegyzekek[0].SzakmaTipusId.GetDisplayName(tanevId) + (!csoportSzakmajegyzekek[0].SzakmairanyTipusId.HasValue ? "" : "/" + csoportSzakmajegyzekek[0].SzakmairanyTipusId.GetDisplayName(tanevId)); errormessages.Add(string.Format(OsztalyCsoportResource.TanulokSzakmaSzakmairanyNemEgyezikACsoportSzakmaSzakmairanyal, string.Join(", ", tanulokNemEgyezoSzakmaSzakmairany.Select(x => x.NevElotagNelkul).ToList()), csoportSzakmajegyzeke)); } } if (errormessages.Count > 0) { throw new BlException(string.Join(Constants.General.Sortores, errormessages)); } } internal static void IsDatumInTanev(IConnectionType connectionType, DateTime date) { var tanevHelper = new TanevHelper(connectionType); var data = tanevHelper.GetTanevInfo(); if (date < data.KezdoNap || date > data.UtolsoNap) { throw new BlException(string.Format(OsztalyCsoportResource.SorolasDatumTanevbeKellEssen, data.KezdoNap.ToString("yyyy.MM.dd."), data.UtolsoNap.ToString("yyyy.MM.dd."))); } } private readonly int _tanevId; private readonly IDalHandler _dalHandler; private readonly DateTime _actualDate; private readonly DateTime _tanevUtolsoNap; private readonly List _tanuloIds; private readonly OktNevelesiKategoriaEnum? _kategoriaTipus; private List _tanulokOsztalyai; private List _tanulokElozoTanevOsztalyai; private TanulokList _tanuloAdatok; private OsztalyCsoportList _osztalyCsoportAdatok; private List _tanuloOsztalyCSoport; private readonly int _jogviszonyLimit; private IEnumerable TanulokOsztalyai { get { if (_tanulokOsztalyai != null) { return _tanulokOsztalyai; } _tanulokOsztalyai = GetTanulokOsztalyai(); return _tanulokOsztalyai; } } private IEnumerable TanulokElozoTanevOsztalyai(int aktivTanevId) { if (_tanulokElozoTanevOsztalyai != null) { return _tanulokElozoTanevOsztalyai; } _tanulokElozoTanevOsztalyai = GetTanulokElozoTanevOsztalyai(aktivTanevId); return _tanulokElozoTanevOsztalyai; } private IEnumerable TanulokOsztalyaiDate { get { return TanulokOsztalyai.Where(i => i.Belepes <= _actualDate.Date && (!i.Kilepes.HasValue || i.Kilepes.Value > _actualDate.Date)).ToList(); } } private IEnumerable TanulokOsztalyaiFuture { get { return TanulokOsztalyai.Where(i => i.Belepes > _actualDate.Date).ToList(); } } private IEnumerable TanuloOsztalyCSoport { get { if (_tanuloOsztalyCSoport != null) { return _tanuloOsztalyCSoport; } _tanuloOsztalyCSoport = TanulokOsztalyCsoportjai(); return _tanuloOsztalyCSoport; } } private IEnumerable TanuloOsztalyCSoportDate { get { return TanuloOsztalyCSoport.Where(i => i.Belepes <= _actualDate.Date && (!i.Kilepes.HasValue || i.Kilepes.Value > _actualDate.Date)).ToList(); } } private IEnumerable TanuloOsztalyCSoportFuture { get { return TanuloOsztalyCSoport.Where(i => i.Belepes > _actualDate.Date).ToList(); } } internal TanulokList TanuloAdatok { get { if (_tanuloAdatok != null) { return _tanuloAdatok; } _tanuloAdatok = GetTanulokAdatai(); return _tanuloAdatok; } } internal OsztalyCsoportList OsztalyCsoportAdatok { get { if (_osztalyCsoportAdatok != null) { return _osztalyCsoportAdatok; } _osztalyCsoportAdatok = GetOsztalyCsoportAdatok(); return _osztalyCsoportAdatok; } } internal TanuloOsztalyCsoport GetOsztalyCsoportTanuloCsoportAdatok(int osztalyCsoportId, int tanuloId) { var tcss = TanuloOsztalyCSoport.Where(x => (x.TanuloId == tanuloId) && (x.OsztalyCsoportId == osztalyCsoportId)).ToList(); if (tcss.Count > 0) { var first = tcss.OrderByDescending(x => x.Belepes).First(); if (!first.Kilepes.HasValue) { first.Kilepes = GetTanevUtolsoNap(); } return first; } return null; } internal SorolasValidate(DateTime date, List tanuloIds, int tanevId, OktNevelesiKategoriaEnum? kategoriaTipus, IDalHandler dalHandler) { _actualDate = date; _tanuloIds = tanuloIds.Distinct().ToList(); _tanevId = tanevId; _dalHandler = dalHandler; _kategoriaTipus = kategoriaTipus; _jogviszonyLimit = dalHandler.TanuloCsoport().GetJogviszonyLimit(tanevId, kategoriaTipus ?? OktNevelesiKategoriaEnum.NevelesOktatas); _tanevUtolsoNap = GetTanevUtolsoNap(); } internal bool NemTagjaAzOsztalynakABeallitottDatumIdejen(int tanuloId) { return !TanulokOsztalyaiDate.Any(t => t.TanuloId == tanuloId); } internal bool TanuloNemTagjaOCsADatumAlatt(int tanuloId, int ocsId) { return !TanuloOsztalyCSoportDate.Any(t => t.TanuloId == tanuloId && t.OsztalyCsoportId == ocsId); } internal bool JogviszonyLimitTullepes(int tanuloId) { var aktualisOsztalyok = TanulokOsztalyaiDate.Count(t => t.TanuloId == tanuloId); var jovobeliOsztalyok = TanulokOsztalyaiFuture.Count(t => t.TanuloId == tanuloId); return (aktualisOsztalyok + jovobeliOsztalyok) >= _jogviszonyLimit; } internal bool JogviszonyLimitTullepes(int tanuloId, out DateTime? limitBesorolasDatum, out int? limitBesorolasOsztalyId) { var besorolasok = CreateOsztalyBesorolasDateRangeList(tanuloId, withCurrentOne: true); var overlapResult = BesorolasDateRangeUtil.CalculateMaxOverlap(_actualDate, _tanevUtolsoNap, besorolasok); limitBesorolasDatum = overlapResult.OverlapBeginDate; limitBesorolasOsztalyId = overlapResult.MaxOverlapOsztalyId; return overlapResult.OverlapCount > _jogviszonyLimit; } internal bool BesorolasJavitasValidate(int tanuloId, DateTime startDate, out DateTime? limitBesorolasDatum, out int? limitBesorolasOsztalyId) { var besorolasok = CreateOsztalyBesorolasDateRangeList(tanuloId, withCurrentOne: false); var overlapResult = BesorolasDateRangeUtil.CalculateMaxOverlap(startDate, _tanevUtolsoNap, besorolasok); limitBesorolasDatum = overlapResult.OverlapBeginDate; limitBesorolasOsztalyId = overlapResult.MaxOverlapOsztalyId; return overlapResult.OverlapCount > _jogviszonyLimit; } internal bool TanuloMarOsztalyCsoportTagja(int tanuloId, int ocsId) { return TanuloOsztalyCSoportDate.Any(a => a.TanuloId == tanuloId && a.OsztalyCsoportId == ocsId); } internal bool TanuloOsztalyCsoportTagjaLesz(int tanuloId, int ocsId) { return TanuloOsztalyCSoportFuture.Any(a => a.TanuloId == tanuloId && a.OsztalyCsoportId == ocsId); } internal bool MarKiLettAzOsztalybolSorolva(int aktivTanevId, int tanuloId, int ocsId, DateTime kilepesDatuma) { return TanulokElozoTanevOsztalyai(aktivTanevId).Any(a => a.TanuloId == tanuloId && a.OsztalyId == ocsId && a.Kilepes != null && a.Kilepes > kilepesDatuma); } internal int GetTanuloCsoportId(int csoportId, int tanuloId) { var tanuloCSoport = TanuloOsztalyCSoportDate.SingleOrDefault(a => a.TanuloId == tanuloId && a.OsztalyCsoportId == csoportId); if (tanuloCSoport != null) { return tanuloCSoport.Id; } return 0; } internal ValidMethode TanuloMarLetezikKovTanevben(int tanuloId, int kovTanevId) { var tanulo = _dalHandler.Tanulo().Get(tanuloId); var newTanuloId = string.IsNullOrEmpty(tanulo.OktatasiAzonosito) ? (int)default : _dalHandler.TanuloCsoport().CheckOktatasiAzonosito(tanulo.OktatasiAzonosito, kovTanevId); if (newTanuloId.IsEntityId()) { return new ValidMethode { IsValid = false, Message = string.Format(BesorolasResource.TanuloMarLetezikKovetkezoTanevbenOktatasiAzonosito, tanulo.OktatasiAzonosito), }; } newTanuloId = _dalHandler.TanuloCsoport().Check4TValidacio((int)Validation4TEnum.Tanulo, tanulo.Vezeteknev, tanulo.Utonev, tanulo.AnyjaNeve, tanulo.SzuletesiHely, tanulo.SzuletesiDatum, null, kovTanevId, tanulo.Elotag); if (newTanuloId.IsEntityId()) { return new ValidMethode { IsValid = false, Message = string.Format(BesorolasResource.TanuloMarLetezikKovetkezoTanevben4TAdatok, tanulo.NyomtatasiNev), }; } return new ValidMethode { IsValid = true, }; } internal bool TanuloNemTagjaEgyetlenOsztalynakSem(int tanuloId, out DateTime? osztalyNelkulBeginDate) { var besorolasok = CreateOsztalyBesorolasDateRangeList(tanuloId, withCurrentOne: false); var overlapResult = BesorolasDateRangeUtil.CalculateMinOverlap(_actualDate, _tanevUtolsoNap, besorolasok); osztalyNelkulBeginDate = overlapResult.OverlapBeginDate; return overlapResult.OverlapCount == 0; } internal bool TanuloMarTagjaCsoportnak(int tanuloId, int csoportId) { var tanuloCsoportjai = TanuloOsztalyCSoport.Where(tcs => tcs.TanuloId == tanuloId && tcs.OsztalyCsoportId == csoportId && ((tcs.Belepes <= _actualDate && (!tcs.Kilepes.HasValue || tcs.Kilepes.Value > _actualDate)) || tcs.Belepes > _actualDate)); return tanuloCsoportjai.Any(); } internal bool TanuloNemTagjaAzOsztalybontottOsztalynak(int tanuloId, int osztalybontasId, out DateTime? nemTagjaOsztalynakBeginDate) { var besorolasok = CreateOsztalyBesorolasDateRangeList(tanuloId, withCurrentOne: false, examinedOsztalyId: osztalybontasId); var overlapResult = BesorolasDateRangeUtil.CalculateMinOverlap(_actualDate, _tanevUtolsoNap, besorolasok); nemTagjaOsztalynakBeginDate = overlapResult.OverlapBeginDate; return overlapResult.OverlapCount == 0; } internal bool OsztalyokSzamaLimitTullepes(int tanuloId, OktNevelesiKategoriaEnum feladatKategoria) { var limit = _dalHandler.TanuloCsoport().GetJogviszonyLimit(_tanevId, feladatKategoria); var tanulo = _dalHandler.Tanulo().Get(tanuloId); var newTanuloId = string.IsNullOrEmpty(tanulo.OktatasiAzonosito) ? (int)default : _dalHandler.TanuloCsoport().CheckOktatasiAzonosito(tanulo.OktatasiAzonosito, _tanevId); if (newTanuloId <= 0) { newTanuloId = _dalHandler.TanuloCsoport().Check4TValidacio((int)Validation4TEnum.Tanulo, tanulo.Vezeteknev, tanulo.Utonev, tanulo.AnyjaNeve, tanulo.SzuletesiHely, tanulo.SzuletesiDatum, null, _tanevId, tanulo.Elotag); } var osztalyBesorolasainakSzama = _dalHandler.TanuloCsoport().GetTanuloOsztalybaSorolasainakSzama(newTanuloId, _tanevId, feladatKategoria); var result = osztalyBesorolasainakSzama >= limit; return result; } internal bool TanuloMarTagjaMentorcsoportnak(int tanuloId) { var tanulo = _dalHandler.Tanulo().Get(tanuloId); return tanulo.OsztalyCsoport.Any(x => { if (((x.BelepesDatum <= _actualDate && (!x.KilepesDatum.HasValue || x.KilepesDatum.Value > _actualDate)) || x.BelepesDatum > _actualDate) && _dalHandler.OsztalyCsoport().GetIsCsoport(x.OsztalyCsoportId)) { return _dalHandler.Csoport().Get(x.OsztalyCsoportId).Tipusa == (int)CsoportTipusEnum.apaczai_mentorcsoport; } return false; }); } private TanulokList GetTanulokAdatai() { DataSet ds = _dalHandler.TanuloCsoport().GetTanulokAdatai(_tanuloIds); var result = new TanulokList(); foreach (DataRow row in ds.Tables[0].Rows) { result.Add(row.Field("ID"), new TanuloListItem() { Nev = row.Field("Nev"), SzuletesiDatum = row.Field("SzulDatum") }); } return result; } private OsztalyCsoportList GetOsztalyCsoportAdatok() { var result = new OsztalyCsoportList(); var ds = _dalHandler.OsztalyCsoport().GetOsztalyCsoportDataSet(_tanevId, (int?)_kategoriaTipus); foreach (DataRow row in ds.Tables[0].AsEnumerable()) { result.Add(row.Field("ID"), new OsztalyCsoportListItem { Id = row.Field("Id"), Nev = row.Field("Nev") }); } return result; } private List GetTanulokOsztalyai() { var ds = _dalHandler.TanuloCsoport().FilterTanuloIsInClass(_tanevId, _tanuloIds, _kategoriaTipus); return (from row in ds.Tables[0].AsEnumerable() select new TanuloOsztalya { TanuloId = row.Field("ID"), OsztalyId = row.Field("OsztalyID"), Kilepes = row.Field("KilepesDatum"), Belepes = row.Field("BelepesDatum") }).ToList(); } private List GetTanulokElozoTanevOsztalyai(int aktTanevId) { var ds = _dalHandler.TanuloCsoport().FilterTanuloIsInClass(aktTanevId, _tanuloIds, _kategoriaTipus); return (from row in ds.Tables[0].AsEnumerable() select new TanuloOsztalya { TanuloId = row.Field("ID"), OsztalyId = row.Field("OsztalyID"), Kilepes = row.Field("KilepesDatum"), Belepes = row.Field("BelepesDatum") }).ToList(); } private List TanulokOsztalyCsoportjai() { var ds = _dalHandler.TanuloCsoport().GetTanulokOsztalyCSoport(_tanevId, _tanuloIds, _kategoriaTipus); return (from row in ds.Tables[0].AsEnumerable() select new TanuloOsztalyCsoport { TanuloId = row.Field("TanuloId"), OsztalyCsoportId = row.Field("OsztalyCsoportId"), Id = row.Field("ID"), Kilepes = row.Field("KilepesDatum"), Belepes = row.Field("BelepesDatum") }).ToList(); } private DateTime GetTanevUtolsoNap() { var tanev = _dalHandler.TanevDal().Get(_tanevId); if (!tanev.UtolsoNap.HasValue) { throw new ArgumentNullException(); } return tanev.UtolsoNap.Value; } private IEnumerable CreateOsztalyBesorolasDateRangeList(int tanuloId, bool withCurrentOne, int? examinedOsztalyId = null) { var result = new List(); if (withCurrentOne) { result.Add(new BesorolasDateRange { Begin = _actualDate, End = _tanevUtolsoNap, }); } var tanuloOsztalyai = TanulokOsztalyaiDate.Where(t => t.TanuloId == tanuloId).Concat(TanulokOsztalyaiFuture.Where(t => t.TanuloId == tanuloId)); if (examinedOsztalyId.HasValue) { tanuloOsztalyai = tanuloOsztalyai.Where(o => o.OsztalyId == examinedOsztalyId); } result.AddRange(tanuloOsztalyai.Select(o => new BesorolasDateRange { Begin = o.Belepes, End = o.Kilepes ?? _tanevUtolsoNap, OsztalyCsoportId = o.OsztalyId })); return result; } } }