kreta/Kreta.BusinessLogic/HelperClasses/OsztalyCsoportbaSorolas/SorolasValidate.cs
2024-03-13 00:33:46 +01:00

527 lines
22 KiB
C#

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<string> errormessages = new List<string>();
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<string>();
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<string>();
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<SzakmaTipusEnum>(tanevId) +
(!csoportSzakmajegyzekek[0].SzakmairanyTipusId.HasValue ? "" : "/" + csoportSzakmajegyzekek[0].SzakmairanyTipusId.GetDisplayName<SzakmaTipusEnum>(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<int> _tanuloIds;
private readonly OktNevelesiKategoriaEnum? _kategoriaTipus;
private List<TanuloOsztalya> _tanulokOsztalyai;
private List<TanuloOsztalya> _tanulokElozoTanevOsztalyai;
private TanulokList _tanuloAdatok;
private OsztalyCsoportList _osztalyCsoportAdatok;
private List<TanuloOsztalyCsoport> _tanuloOsztalyCSoport;
private readonly int _jogviszonyLimit;
private IEnumerable<TanuloOsztalya> TanulokOsztalyai
{
get
{
if (_tanulokOsztalyai != null)
{
return _tanulokOsztalyai;
}
_tanulokOsztalyai = GetTanulokOsztalyai();
return _tanulokOsztalyai;
}
}
private IEnumerable<TanuloOsztalya> TanulokElozoTanevOsztalyai(int aktivTanevId)
{
if (_tanulokElozoTanevOsztalyai != null)
{
return _tanulokElozoTanevOsztalyai;
}
_tanulokElozoTanevOsztalyai = GetTanulokElozoTanevOsztalyai(aktivTanevId);
return _tanulokElozoTanevOsztalyai;
}
private IEnumerable<TanuloOsztalya> TanulokOsztalyaiDate
{
get
{
return TanulokOsztalyai.Where(i => i.Belepes <= _actualDate.Date && (!i.Kilepes.HasValue || i.Kilepes.Value > _actualDate.Date)).ToList();
}
}
private IEnumerable<TanuloOsztalya> TanulokOsztalyaiFuture
{
get
{
return TanulokOsztalyai.Where(i => i.Belepes > _actualDate.Date).ToList();
}
}
private IEnumerable<TanuloOsztalyCsoport> TanuloOsztalyCSoport
{
get
{
if (_tanuloOsztalyCSoport != null)
{
return _tanuloOsztalyCSoport;
}
_tanuloOsztalyCSoport = TanulokOsztalyCsoportjai();
return _tanuloOsztalyCSoport;
}
}
private IEnumerable<TanuloOsztalyCsoport> TanuloOsztalyCSoportDate
{
get
{
return TanuloOsztalyCSoport.Where(i => i.Belepes <= _actualDate.Date && (!i.Kilepes.HasValue || i.Kilepes.Value > _actualDate.Date)).ToList();
}
}
private IEnumerable<TanuloOsztalyCsoport> 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<int> 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<int>("ID"), new TanuloListItem()
{
Nev = row.Field<string>("Nev"),
SzuletesiDatum = row.Field<DateTime>("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<int>("ID"), new OsztalyCsoportListItem
{
Id = row.Field<int>("Id"),
Nev = row.Field<string>("Nev")
});
}
return result;
}
private List<TanuloOsztalya> GetTanulokOsztalyai()
{
var ds = _dalHandler.TanuloCsoport().FilterTanuloIsInClass(_tanevId, _tanuloIds, _kategoriaTipus);
return (from row in ds.Tables[0].AsEnumerable()
select new TanuloOsztalya
{
TanuloId = row.Field<int>("ID"),
OsztalyId = row.Field<int>("OsztalyID"),
Kilepes = row.Field<DateTime?>("KilepesDatum"),
Belepes = row.Field<DateTime>("BelepesDatum")
}).ToList();
}
private List<TanuloOsztalya> 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<int>("ID"),
OsztalyId = row.Field<int>("OsztalyID"),
Kilepes = row.Field<DateTime?>("KilepesDatum"),
Belepes = row.Field<DateTime>("BelepesDatum")
}).ToList();
}
private List<TanuloOsztalyCsoport> TanulokOsztalyCsoportjai()
{
var ds = _dalHandler.TanuloCsoport().GetTanulokOsztalyCSoport(_tanevId, _tanuloIds, _kategoriaTipus);
return (from row in ds.Tables[0].AsEnumerable()
select new TanuloOsztalyCsoport
{
TanuloId = row.Field<int>("TanuloId"),
OsztalyCsoportId = row.Field<int>("OsztalyCsoportId"),
Id = row.Field<int>("ID"),
Kilepes = row.Field<DateTime?>("KilepesDatum"),
Belepes = row.Field<DateTime>("BelepesDatum")
}).ToList();
}
private DateTime GetTanevUtolsoNap()
{
var tanev = _dalHandler.TanevDal().Get(_tanevId);
if (!tanev.UtolsoNap.HasValue)
{
throw new ArgumentNullException();
}
return tanev.UtolsoNap.Value;
}
private IEnumerable<BesorolasDateRange> CreateOsztalyBesorolasDateRangeList(int tanuloId, bool withCurrentOne, int? examinedOsztalyId = null)
{
var result = new List<BesorolasDateRange>();
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;
}
}
}