kreta/Kreta.BusinessLogic/Logic/Naplozas/Validacio/NaploValidacio.cs
2024-03-13 00:33:46 +01:00

447 lines
20 KiB
C#

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<OrarendCO.ExtendedEvent> 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<DateTime?>(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum);
szakGyakVegDatum = sysSettingsHelper.GetSystemSettingValue<DateTime?>(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<IJavasoltJelenletTanuloGetResponseCo> javasoltJelenlet)
{
var invalidRecords = new List<MulasztasItem>();
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<IJavasoltJelenletTanuloGetResponseCo> 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<IJavasoltJelenletTanuloGetResponseCo> 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<IJavasoltJelenletTanuloGetResponseCo> 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;
}
}
}