using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Runtime.Caching; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.HelperClasses.ImportCo; using Kreta.BusinessLogic.Logic; using Kreta.Core; using Kreta.Core.ConnectionType; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Util; using Kreta.Enums; using Kreta.Enums.ManualEnums.ImportExport; using Kreta.Resources; using Newtonsoft.Json; namespace Kreta.BusinessLogic.Helpers.ImportExport { public class TanuloBesorolasImportExportHelper : LogicBase { #region Fields private readonly string _importObjectCacheKey; #endregion Fields #region Properties public static Dictionary ImportHeaderList => new Dictionary { { 00, ImportExportTanuloBesorolasResource.ImportHeaderNameTanuloNeve }, { 01, ImportExportTanuloBesorolasResource.ImportHeaderNameTanuloOktatasiAzonosito }, { 02, ImportExportTanuloBesorolasResource.ImportHeaderNameOsztalyCsoport } }; public TanuloBesorolasImportCo ImportCo { get => (TanuloBesorolasImportCo)Cache.Get(_importObjectCacheKey); set { if (ImportCo != null) { Cache.Remove(_importObjectCacheKey); } Cache.Add(_importObjectCacheKey, value, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(30) }); } } #endregion Properties #region Constructors public TanuloBesorolasImportExportHelper(IConnectionType connectionType) : base(connectionType) { _importObjectCacheKey = $"{nameof(TanuloBesorolasImportCo)}_{IntezmenyId}_{FelhasznaloId}_ImportObjectCacheKey"; } #endregion Constructors public void SetImportCo(List> importData, DateTime besorolasDatum, bool? isJuttatasUpdate, bool isIntezmenySzakkepzoJuttatas, DateTime? kisorolasDatum, bool isSzakkepzoIntezmeny) { TanuloBesorolasImportCo importCo = GetImportCoFromImportData(importData, besorolasDatum, kisorolasDatum, isSzakkepzoIntezmeny); importCo.ImportMuvelet = (int)ImportMuveletEnum.Insert; SetNemImportalhatoSorokByValidation(importCo); SetOperationAndNemImportalhatoSorokByOperation(importCo); var tanuloBesorolasTanuloTanugyiAdatokImportJsonItemList = new List(); var mainImportJsonItemList = new List(); foreach (TanuloBesorolasImportItemCo importItem in importCo.MainImportItemList) { if (importItem.IsOsztaly.Value) { if (!importItem.Tanulo.TantervId.IsEntityId()) { importItem.Tanulo.TantervId = new TantervHelper(ConnectionType).GetTop1TantervId(); } tanuloBesorolasTanuloTanugyiAdatokImportJsonItemList.Add(new TanuloBesorolasTanuloTanugyiAdatokImportJsonItemCo(importItem.OsztalyCsoportId.Value, importItem.Tanulo, TanevId, IntezmenyId, FelhasznaloId)); } mainImportJsonItemList.Add(new TanuloBesorolasImportJsonItemCo(importItem, besorolasDatum, kisorolasDatum, TanevId, IntezmenyId, FelhasznaloId)); } importCo.TanuloBesorolasTanuloTanugyiAdatokImportJsonItemList = tanuloBesorolasTanuloTanugyiAdatokImportJsonItemList; importCo.MainImportJsonItemList = mainImportJsonItemList .OrderByDescending(x => x.IsOsztaly) .ThenBy(x => x.TanuloVezeteknev) .ThenBy(x => x.TanuloKeresztnev) .ThenBy(x => x.OsztalyCsoportNev) .ToList(); importCo.IsJuttatasUpdate = isJuttatasUpdate; importCo.IsIntezmenySzakkepzoJuttatas = isIntezmenySzakkepzoJuttatas; ImportCo = importCo; } private static void SetNemImportalhatoSorokByValidation(TanuloBesorolasImportCo importCo) { Dictionary> validationResultDictionary = importCo.Validate(); //NOTE: Azokat a sorokat, amelyek hibásak beletesszük a NemImportalhatoItemList-be! foreach (TanuloBesorolasImportItemCo importItem in importCo.MainImportItemList.Where(x => validationResultDictionary.Keys.Contains(x.LineNumber))) { IEnumerable validationResultList = validationResultDictionary[importItem.LineNumber]; importItem.ErrorList = validationResultList.Select(x => x.ErrorMessage).ToList(); importCo.NemImportalhatoItemList.Add(importItem); } //NOTE: Azokat a sorokat, amelyek bekerültek a NemImportalhatoItemList-be, azokat kiveszzük a MainImportItemList-ből! importCo.MainImportItemList.RemoveRange(importCo.NemImportalhatoItemList); } private void SetOperationAndNemImportalhatoSorokByOperation(TanuloBesorolasImportCo importCo) { //NOTE: Azért van szükség Dictionary-re, mert így sokkal gyorsabb a keresés! Dictionary compareHashImportItemCompareCoDictionary = GetCompareHashImportItemCompareCoDictionary(importCo.TanuloCsoportCoList); foreach (TanuloBesorolasImportItemCo importItem in importCo.MainImportItemList) { string compareHash = importItem.CompareHash; //NOTE: Ha nem találtunk egyezést, akkor mindeképpen Insert! if (!compareHashImportItemCompareCoDictionary.ContainsKey(compareHash)) { importItem.Operation = (int)ImportItemOperationEnum.Insert; } //NOTE: Ha találtunk egyezést, akkor hozzá kell adni a nem NemImportalhatoItemList-hez és jelezni, hogy már szerepel az adatbázisban! else { importItem.ErrorList.Add(ImportExportCommonResource.NemImportalhatoMertMarSzerepelAzAdatbazisban); importCo.NemImportalhatoItemList.Add(importItem); } } //NOTE: Azokat a sorokat, amelyek bekerültek a NemImportalhatoItemList-be, azokat kiveszzük a MainImportItemList-ből! importCo.MainImportItemList.RemoveRange(importCo.NemImportalhatoItemList); } private TanuloBesorolasImportCo GetImportCoFromImportData(List> importData, DateTime besorolasDatum, DateTime? kisorolasDatum, bool isSzakkepzoIntezmeny) { var importCo = new TanuloBesorolasImportCo(); importCo.BesorolasDatum = besorolasDatum; importCo.KisorolasDatum = kisorolasDatum; importCo.TanevUtolsoNapja = new TanevHelper(ConnectionType).GetTanevInfo().UtolsoNap; List tanuloCoList = new TanuloHelper(ConnectionType).GetTanuloCoList(); importCo.OsztalyCsoportCoList = new OsztalyCsoportHelper(ConnectionType).GetOsztalyCsoportCoList(); var tanuloCsoportHelper = new TanuloCsoportHelper(ConnectionType); importCo.TanuloCsoportCoList = tanuloCsoportHelper.GetTanuloCsoportCoList(); importCo.JogviszonyLimits = tanuloCsoportHelper.GetJogviszonyLimits(); int lineNumber = 1; foreach (List importDataRow in importData.Skip(1)) { var importItemCo = new TanuloBesorolasImportItemCo(isSzakkepzoIntezmeny) { LineNumber = lineNumber, TanuloNeveImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportTanuloBesorolasResource.ImportHeaderNameTanuloNeve)], TanuloOktatasiAzonositoImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportTanuloBesorolasResource.ImportHeaderNameTanuloOktatasiAzonosito)], OsztalyCsoportImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportTanuloBesorolasResource.ImportHeaderNameOsztalyCsoport)] }; importItemCo.Tanulo = tanuloCoList.SingleOrDefault(x => x.FelhasznaloNyomtatasiNevComparableString == importItemCo.TanuloNeveImportData?.ToComparableString() && x.FelhasznaloOktatasiAzonositoComparableString == importItemCo.TanuloOktatasiAzonosito?.ToComparableString()); OsztalyCsoportItemCo osztalyCsoport = importCo.OsztalyCsoportCoList.SingleOrDefault(x => x.NevComparableString == importItemCo.OsztalyCsoportNev?.ToComparableString()); importItemCo.OsztalyCsoportId = osztalyCsoport?.Id; importItemCo.IsOsztaly = osztalyCsoport?.IsOsztaly; //NOTE: A tanuló csoport lista további validációkhoz kellenek, ha nincs tanuló vagy osztály csoport id, akkor nincs értelme feltölteni a listát! if (importItemCo.TanuloId.IsEntityId() && importItemCo.OsztalyCsoportId.IsEntityId()) { importItemCo.TanuloOsztalyCsoportIdList = importCo.TanuloCsoportCoList.Where(x => x.FelhasznaloId == importItemCo.TanuloId.Value).Select(x => x.OsztalyCsoportId).ToList(); } string md5HashInput = importItemCo.TanuloId + importItemCo.TanuloNeveImportData?.ToComparableString() + importItemCo.TanuloOktatasiAzonosito?.ToComparableString() + importItemCo.OsztalyCsoportId + importItemCo.OsztalyCsoportNev?.ToComparableString(); importItemCo.CompareHash = ImportExportHelper.GetMd5Hash(md5HashInput); importCo.MainImportItemList.Add(importItemCo); lineNumber++; } return importCo; } #region Template public MemoryStream GetTemplate() { List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(TanuloCsoportItemCo.TanuloCsoportTemplateExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return SimpleExportLogic.GetTemplate(ImportExportTanuloBesorolasResource.ImportDefaultSheetName, simpleExportColumnCos); } #endregion Template #region Export public MemoryStream GetExport() { List coList = new TanuloCsoportHelper(ConnectionType).GetTanuloCsoportCoList().OrderBy(x => x.FelhasznaloVezeteknev).ThenBy(x => x.FelhasznaloKeresztnev).ThenBy(x => x.OsztalyCsoportNev).ToList(); List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(TanuloCsoportItemCo.TanuloCsoportExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return SimpleExportLogic.GetExport(ImportExportTanuloBesorolasResource.ImportDefaultSheetName, simpleExportColumnCos, coList, TanevId); } public MemoryStream GetNemImportalhatoSorokExport() { List coList = ImportCo.NemImportalhatoItemList; List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(TanuloBesorolasImportItemCo.NemImportalhatoSorokExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return ImportExportHelper.NemImportalhatoSorokExport(ImportExportTanuloBesorolasResource.ImportDefaultSheetName, simpleExportColumnCos, coList, TanevId); } #endregion Export private Dictionary GetCompareHashImportItemCompareCoDictionary(List coList) { var compareHashImportItemCompareCoDictionary = new Dictionary(); foreach (TanuloCsoportItemCo co in coList) { string md5HashInput = co.FelhasznaloId + co.FelhasznaloNyomtatasiNevComparableString + co.FelhasznaloOktatasiAzonositoComparableString + co.OsztalyCsoportId + co.OsztalyCsoportNevComparableString + $"{co.BelepesDatum.ToShortDateString()} - {co.KilepesDatum?.ToShortDateString()}"; string compareHash = ImportExportHelper.GetMd5Hash(md5HashInput); var importItemCompareCo = new ImportItemCompareCo { Id = co.Id, CompareHash = compareHash, Importalt = co.Importalt }; //NOTE: Elvileg nem fordulhatna elő, de ha az adatbázisban duplikált adat van, akkor csak az elsőt adjuk hozzá! if (!compareHashImportItemCompareCoDictionary.ContainsKey(compareHash)) { compareHashImportItemCompareCoDictionary.Add(compareHash, importItemCompareCo); } } return compareHashImportItemCompareCoDictionary; } public void Import(object importJsonObject, DateTime besorolasDatum) { var importJson = JsonConvert.SerializeObject(importJsonObject); Dal.CustomConnection.Run(ConnectionType, dalHandler => { dalHandler.ImportExportDal().TanuloBesorolasImport(IntezmenyId, TanevId, FelhasznaloId, importJson, besorolasDatum); if (ImportCo.IsIntezmenySzakkepzoJuttatas && ImportCo.IsJuttatasUpdate.HasValue && ImportCo.IsJuttatasUpdate.Value) { var dal = dalHandler.JuttatasDAL(); dal.UpdateTanulokSzakkepzesiJuttatasok(TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas); dal.UpdateTanulokSzakkepzesiJuttatasok(TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij); } }); } private Dictionary> GetDefaultDropDownColumnSourceDictionary() { //NOTE: Create dropdown lists var dropDownColumnSourceDictionary = new Dictionary>(); Dal.CustomConnection.Run(ConnectionType, dalHandler => { var helper = new ImportExportHelper(new DalHandlerConnectionType(ConnectionType, dalHandler)); dropDownColumnSourceDictionary.Add(ImportExportTanuloBesorolasResource.ImportHeaderNameTanuloNeve, helper.GetTanuloList()); dropDownColumnSourceDictionary.Add(ImportExportTanuloBesorolasResource.ImportHeaderNameOsztalyCsoport, helper.GetOsztalyCsoportList()); }); return dropDownColumnSourceDictionary; } } }