using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; 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 OratervImportExportHelper : LogicBase { #region Fields private readonly string _importObjectCacheKey; #endregion Fields #region Properties public static Dictionary ImportHeaderList => new Dictionary { { 00, ImportExportOratervResource.ImportHeaderNameTantervNeve }, { 01, ImportExportOratervResource.ImportHeaderNameOratervNeve }, { 02, ImportExportOratervResource.ImportHeaderNameEvfolyamNeve }, { 03, ImportExportOratervResource.ImportHeaderNameTantargyNeve }, { 04, ImportExportOratervResource.ImportHeaderNameEvesOraszam } }; public OratervImportCo ImportCo { get => (OratervImportCo)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 OratervImportExportHelper(IConnectionType connectionType) : base(connectionType) { _importObjectCacheKey = $"{nameof(OratervImportCo)}_{IntezmenyId}_{FelhasznaloId}_ImportObjectCacheKey"; } #endregion Constructors public void SetImportCo(List> importData, int importMuvelet) { OratervImportCo importCo = GetImportCoFromImportData(importData); importCo.ImportMuvelet = importMuvelet; SetNemImportalhatoSorokByValidation(importCo); //NOTE: Azért van szükség Dictionary-kre, mert így sokkal gyorsabb a keresés! Dictionary tantargyCompareHashImportItemCompareCoDictionary = GetTantargyCompareHashImportItemCompareCoDictionary(importCo.TantargyCOList); Dictionary oratervCompareHashImportItemCompareCoDictionary = GetOratervCompareHashImportItemCompareCoDictionary(importCo.OratervCOList); Dictionary oratervTantargyCompareHashImportItemCompareCoDictionary = GetOratervTantargyCompareHashImportItemCompareCoDictionary(importCo.OratervTantargyCOList); foreach (OratervImportItemCo importItem in importCo.MainImportItemList) { SetOperationTantargy(importItem, tantargyCompareHashImportItemCompareCoDictionary); SetOperationOraterv(importItem, oratervCompareHashImportItemCompareCoDictionary, importCo.ImportMuvelet); SetOperationOratervTantargy(importItem, oratervTantargyCompareHashImportItemCompareCoDictionary, importCo.ImportMuvelet); } //NOTE: Azokat a sorokat, amelyek bekerültek a NemImportalhatoItemList-be, azokat kiveszzük a MainImportItemList-ből! importCo.MainImportItemList.RemoveRange(importCo.NemImportalhatoItemList); var tantargyImportJsonItemList = new List(); var oratervImportJsonItemList = new List(); var oratervTantargyJsonItemList = new List(); var tantargyImportJsonItemCoList = importCo.MainImportItemList.GroupBy(x => x.TantargyNeve).Select(x => x.First()).Select(x => new TantargyImportJsonItemCo(x, TanevId, IntezmenyId, FelhasznaloId)).ToList(); var oratervImportJsonItemCoList = importCo.MainImportItemList.GroupBy(x => x.OratervNeve).Select(x => x.First()).Select(x => new OratervImportJsonItemCo(x, TanevId, IntezmenyId, FelhasznaloId)).ToList(); var oratervTantargyImportJsonItemCoList = importCo.MainImportItemList.Select(x => new OratervTargyImportJsonItemCo(x, TanevId, IntezmenyId, FelhasznaloId)).ToList(); tantargyImportJsonItemList.AddRange(tantargyImportJsonItemCoList); oratervImportJsonItemList.AddRange(oratervImportJsonItemCoList); oratervTantargyJsonItemList.AddRange(oratervTantargyImportJsonItemCoList); importCo.TantargyImportJsonItemList = tantargyImportJsonItemList; importCo.OratervImportJsonItemList = oratervImportJsonItemList; importCo.OratervTantargyImportJsonItemList = oratervTantargyJsonItemList; ImportCo = importCo; } private static void SetNemImportalhatoSorokByValidation(OratervImportCo importCo) { Dictionary> validationResultDictionary = importCo.Validate(); //NOTE: Azokat a sorokat, amelyek hibásak beletesszük a NemImportalhatoItemList-be! foreach (OratervImportItemCo 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 OratervImportCo GetImportCoFromImportData(List> importData) { List tantervCoList = null; List tantargyCoList = null; List oratervCoList = null; List oratervTantargyCoList = null; Dal.CustomConnection.Run(ConnectionType, h => { tantervCoList = new TantervHelper(new DalHandlerConnectionType(ConnectionType, h)).GetAktivTantervDataSet().Tables[0].AsEnumerable().Select(row => new TantervCO() { ID = SDAConvert.ToInt32(row["ID"]), Nev = SDAConvert.ToString(row["Nev"]), }).ToList(); tantargyCoList = new TantargyHelper(new DalHandlerConnectionType(ConnectionType, h)).GetTantargyCoList(); var oratervHelper = new OratervHelper(new DalHandlerConnectionType(ConnectionType, h)); oratervCoList = oratervHelper.GetOratervCoList(); oratervTantargyCoList = oratervHelper.GetOratervTantargyCoList(); }); var importCo = new OratervImportCo { TantervCOList = tantervCoList, TantargyCOList = tantargyCoList, OratervCOList = oratervCoList, OratervTantargyCOList = oratervTantargyCoList, }; int lineNumber = 1; foreach (List importDataRow in importData.Skip(1)) { var importItemCo = new OratervImportItemCo(TanevId) { LineNumber = lineNumber, TantervNeveImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportOratervResource.ImportHeaderNameTantervNeve)], OratervNeveImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportOratervResource.ImportHeaderNameOratervNeve)], EvfolyamNeveImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportOratervResource.ImportHeaderNameEvfolyamNeve)], TantargyNeveImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportOratervResource.ImportHeaderNameTantargyNeve)], EvesOraszamImportData = importDataRow[ImportHeaderList.GetKeyByUniqueValue(ImportExportOratervResource.ImportHeaderNameEvesOraszam)], }; importItemCo.TantervId = importCo.TantervCOList.SingleOrDefault(x => x.Nev?.ToComparableString() == importItemCo.TantervNeve?.ToComparableString())?.ID; importItemCo.TantargyId = importCo.TantargyCOList.SingleOrDefault(x => x.Nev?.ToComparableString() == importItemCo.TantargyNeve?.ToComparableString())?.Id; importItemCo.OratervId = importCo.OratervCOList.SingleOrDefault(x => x.Nev?.ToComparableString() == importItemCo.OratervNeve?.ToComparableString())?.OratervId; string lineMd5HashInput = importItemCo.OratervId + importItemCo.OratervNeve?.ToComparableString() + importItemCo.TantargyId + importItemCo.TantargyNeve?.ToComparableString(); importItemCo.CompareHash = ImportExportHelper.GetMd5Hash(lineMd5HashInput); string tantargyMd5HashInput = importItemCo.TantargyId + importItemCo.TantargyNeve?.ToComparableString(); importItemCo.CompareHashTantargy = ImportExportHelper.GetMd5Hash(tantargyMd5HashInput); string oratervMd5HashInput = importItemCo.OratervId + importItemCo.OratervNeve?.ToComparableString(); importItemCo.CompareHashOraterv = ImportExportHelper.GetMd5Hash(oratervMd5HashInput); importCo.MainImportItemList.Add(importItemCo); lineNumber++; } return importCo; } #region Template public MemoryStream GetTemplate() { List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(OratervTantargyCO.OratervTantargyExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return SimpleExportLogic.GetTemplate(ImportExportOratervResource.ImportDefaultSheetName, simpleExportColumnCos); } #endregion Template #region Export public MemoryStream GetExport() { List coList = new OratervHelper(ConnectionType).GetOratervTantargyCoList().OrderBy(x => x.TantervNev).ThenBy(x => x.OratervNev).ThenBy(x => x.TantargyNev).ToList(); List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(OratervTantargyCO.OratervTantargyExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return SimpleExportLogic.GetExport(ImportExportOratervResource.ImportDefaultSheetName, simpleExportColumnCos, coList, TanevId); } public MemoryStream GetNemImportalhatoSorokExport() { List coList = ImportCo.NemImportalhatoItemList; List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(OratervImportItemCo.NemImportalhatoSorokExportAttributeId, GetDefaultDropDownColumnSourceDictionary()); return ImportExportHelper.NemImportalhatoSorokExport(ImportExportOratervResource.ImportDefaultSheetName, simpleExportColumnCos, coList, TanevId); } #endregion Export private Dictionary GetTantargyCompareHashImportItemCompareCoDictionary(List tantargyItemCoList) { var compareHashImportItemCompareCoDictionary = new Dictionary(); foreach (TantargyItemCo tantargyItemCo in tantargyItemCoList) { var md5HashInput = tantargyItemCo.Id + tantargyItemCo.Nev?.ToComparableString(); string compareHash = ImportExportHelper.GetMd5Hash(md5HashInput); var importItemCompareCo = new ImportItemCompareCo { Id = tantargyItemCo.Id, CompareHash = compareHash }; //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; } private Dictionary GetOratervTantargyCompareHashImportItemCompareCoDictionary(List oratervTantargyCoList) { var compareHashImportItemCompareCoDictionary = new Dictionary(); foreach (OratervTantargyCO oratervTantargyItemCo in oratervTantargyCoList) { var md5HashInput = oratervTantargyItemCo.OratervId + oratervTantargyItemCo.OratervNev?.ToComparableString() + oratervTantargyItemCo.Tantargy + oratervTantargyItemCo.TantargyNev?.ToComparableString(); string compareHash = ImportExportHelper.GetMd5Hash(md5HashInput); var importItemCompareCo = new ImportItemCompareCo { Id = oratervTantargyItemCo.OratervTantargyId, CompareHash = compareHash }; //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; } private Dictionary GetOratervCompareHashImportItemCompareCoDictionary(List oratervCoList) { var compareHashImportItemCompareCoDictionary = new Dictionary(); foreach (OratervCO oratervItemCo in oratervCoList) { var md5HashInput = oratervItemCo.OratervId + oratervItemCo.Nev?.ToComparableString(); string compareHash = ImportExportHelper.GetMd5Hash(md5HashInput); var importItemCompareCo = new ImportItemCompareCo { Id = oratervItemCo.OratervId, CompareHash = compareHash }; //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; } private static void SetOperationTantargy(OratervImportItemCo importItem, Dictionary compareHashImportItemCompareCoDictionary) { var compareHash = importItem.CompareHashTantargy; //NOTE: Ha nem találtunk egyezést, akkor mindeképpen Insert! if (!compareHashImportItemCompareCoDictionary.ContainsKey(compareHash)) { importItem.OperationTantargy = (int)ImportItemOperationEnum.Insert; } } private static void SetOperationOratervTantargy(OratervImportItemCo importItem, Dictionary compareHashImportItemCompareCoDictionary, int importMuvelet) { var 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... else { ImportItemCompareCo importItemCompareCo = compareHashImportItemCompareCoDictionary[compareHash]; //NOTE: ...ha a művelet InsertAndUpdate, akkor Update és beállítjuk az Id-t! if (importMuvelet == (int)ImportMuveletEnum.InsertAndUpdate) { importItem.OratervTantargyId = importItemCompareCo.Id; importItem.Operation = (int)ImportItemOperationEnum.Update; } } } private static void SetOperationOraterv(OratervImportItemCo importItem, Dictionary compareHashImportItemCompareCoDictionary, int importMuvelet) { var compareHash = importItem.CompareHashOraterv; //NOTE: Ha nem találtunk egyezést, akkor mindeképpen Insert! if (!compareHashImportItemCompareCoDictionary.ContainsKey(compareHash)) { importItem.OperationOraterv = (int)ImportItemOperationEnum.Insert; } //NOTE: Ha találtunk egyezést, akkor... else { ImportItemCompareCo importItemCompareCo = compareHashImportItemCompareCoDictionary[compareHash]; //NOTE: ...ha a művelet InsertAndUpdate, akkor Update és beállítjuk az Id-t! if (importMuvelet == (int)ImportMuveletEnum.InsertAndUpdate) { importItem.OratervId = importItemCompareCo.Id; importItem.OperationOraterv = (int)ImportItemOperationEnum.Update; } else { importItem.OratervId = null; } } } public void Import(object importJsonObject) { string importJson = JsonConvert.SerializeObject(importJsonObject); Dal.CustomConnection.Run(ConnectionType, dalHandler => dalHandler.ImportExportDal().OratervImport(IntezmenyId, TanevId, FelhasznaloId, importJson)); } private Dictionary> GetDefaultDropDownColumnSourceDictionary() { //NOTE: Create dropdown lists var dropDownColumnSourceDictionary = new Dictionary>(); Dal.CustomConnection.Run(ConnectionType, dalHandler => { var connectionType = new DalHandlerConnectionType(ConnectionType, dalHandler); dropDownColumnSourceDictionary.Add(ImportExportOratervResource.ImportHeaderNameEvfolyamNeve, EnumExtensions.GetAdatszotarElemekForTipus(TanevId, GeneratedAdatszotarTipusEnum.EvfolyamTipus)); var tantervHelper = new TantervHelper(connectionType); var tantargyHelper = new TantargyHelper(connectionType); dropDownColumnSourceDictionary.Add(ImportExportOratervResource.ImportHeaderNameTantervNeve, tantervHelper.GetAktivTantervDataSet().Tables[0].AsEnumerable().Select(t => t.Field("Nev")).ToList()); dropDownColumnSourceDictionary.Add(ImportExportOratervResource.ImportHeaderNameTantargyNeve, tantargyHelper.GetTantargyCoList(true).OrderBy(x => x.Rendez0).ThenBy(x => x.Rendez1).ThenBy(x => x.Rendez2).ThenBy(x => x.Rendez3).ThenBy(x => x.Rendez4).ThenBy(x => x.Rendez5).Select(t => t.Nev).ToList()); }); return dropDownColumnSourceDictionary; } } }