using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml.Serialization; using Aspose.Cells; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.HelperClasses.AscImportExport; using Kreta.BusinessLogic.Logic; using Kreta.Core; using Kreta.Core.ConnectionType; using Kreta.Core.Exceptions; using Kreta.Resources; namespace Kreta.BusinessLogic.Helpers.ImportExport { public class AscImportExportHelper : LogicBase { #region Fields private static readonly AscImport AscImportData = new AscImport(); #endregion Fields #region Properties private static List AscEgeszOsztalyNevuCsoportIdList { get; set; } = new List(); #endregion Properties #region Constructors public AscImportExportHelper(IConnectionType connectionType) : base(connectionType) { } #endregion Constructors public static List> GetTantargyfelosztasImportDataFromAsc(Stream ascImportFileStream) { var importData = new List> { TantargyfelosztasImportExportHelper.ImportHeaderListEgyszeru.Select(x => x.Value).ToList() }; timetable ascTimeTable = new XmlSerializer(typeof(timetable)).Deserialize(ascImportFileStream.StripNonValidXmlCharacters()) as timetable; ValidateAscFile(ascTimeTable, true); List tantargyfelosztasFromAscModelList = GetTantargyfelosztasFromAscModelList(ascTimeTable); importData.AddRange(tantargyfelosztasFromAscModelList.Select(x => new List { x.OsztalyNev.ReplaceMultipleSpacesAndTrim(), x.CsoportNev.ReplaceMultipleSpacesAndTrim(), x.TantargyNev.ReplaceMultipleSpacesAndTrim(), x.Oraszam.ReplaceMultipleSpacesAndTrim(), x.TanarNev.ReplaceMultipleSpacesAndTrim(), 0.ToString(), CommonResource.Nem, CommonResource.Nem, 0.ToString() })); return importData; } public static List> GetOrarendImportDataFromAsc(Stream ascImportFileStream, string oraErvenyessegKezdeteString, string oraErvenyessegVegeString) { var importData = new List> { OrarendImportExportHelper.ImportHeaderListOraErvenyessegiIdovel.Select(x => x.Value).ToList() }; timetable ascTimeTable = new XmlSerializer(typeof(timetable)).Deserialize(ascImportFileStream.StripNonValidXmlCharacters()) as timetable; ValidateAscFile(ascTimeTable, false); List orarendFromAscModelList = GetOrarendFromAscModelList(ascTimeTable); importData.AddRange(orarendFromAscModelList.Select(x => new List { oraErvenyessegKezdeteString.ReplaceMultipleSpacesAndTrim(), oraErvenyessegVegeString.ReplaceMultipleSpacesAndTrim(), x.Hetirend.ReplaceMultipleSpacesAndTrim(), x.Nap.ReplaceMultipleSpacesAndTrim(), x.Ora.ReplaceMultipleSpacesAndTrim(), x.OsztalyNev.ReplaceMultipleSpacesAndTrim(), x.CsoportNev.ReplaceMultipleSpacesAndTrim(), x.TantargyNev.ReplaceMultipleSpacesAndTrim(), x.TanarNev.ReplaceMultipleSpacesAndTrim(), x.TeremNev.ReplaceMultipleSpacesAndTrim() })); return importData; } private static void ValidateAscFile(timetable ascTimeTable, bool isOnlyTtfImport) { var errorList = new List(); if (ascTimeTable.classes?.@class == null && ascTimeTable.groups?.group == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazOsztalyokatEsVagyCsoportokat); } if (ascTimeTable.subjects?.subject == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazTantargyakat); } if (ascTimeTable.teachers?.teacher == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazTanarokat); } if (ascTimeTable.lessons?.lesson == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazFoglalkozasokat); } if (!isOnlyTtfImport) { if (ascTimeTable.cards?.card == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazOrakat); } if (ascTimeTable.classrooms?.classroom == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazTermeket); } //NOTE: Különböző módon kell validálni a 2008-as és az azt követő ASC fájlokat! if (ascTimeTable.displayname == null || ascTimeTable.displayname.Contains("2008")) { if (ascTimeTable.lessons?.lesson != null) { var lesson = ascTimeTable.lessons.lesson; if (lesson.Any(x => string.IsNullOrWhiteSpace(x.weeks))) { errorList.Add(ImportExportOrarendResource.InvalidHetirendNincsKitoltve); } else if (lesson.Any(x => x.weeks.Length != lesson[0].weeks.Length)) { errorList.Add(ImportExportOrarendResource.InvalidHetirendForLesson); } } if (ascTimeTable.days?.days == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazNapirendet); } } else { if (ascTimeTable.weeksdefs?.weeksdef == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazHetirendet); } else { //NOTE: A hetirendek közül képesek az ASC-vel olyan fájlt generálni, ahol az Id megegyezhet, ezeket meg kell vizsgálnunk, hogy ilyen ne fordulhasson elő! List ascHetirendList = GetHetirendListFromAsc(ascTimeTable); Dictionary> duplicatedHetirendByIdIdDictionary = ascHetirendList .GroupBy(x => x.Id) .Where(x => x.Count() > 1) .ToDictionary(x => x.Key, x => x.ToList()); foreach (var duplicatedItem in duplicatedHetirendByIdIdDictionary) { List duplacatedItemNevList = duplicatedItem.Value.Select(x => $"\"{x.Nev}\"").ToList(); errorList.Add(string.Format(ImportExportOrarendResource.InvalidHetirendEgyezes, string.Join(", ", duplacatedItemNevList))); } } if (ascTimeTable.daysdefs?.daysdef == null) { errorList.Add(ImportExportOrarendResource.AzImportalniKivantFileNemTartalmazNapirendet); } } } if (errorList.Count > 0) { throw new BlException(string.Join(Constants.General.Sortores, errorList)); } } private static List GetOrarendFromAscModelList(timetable ascTimeTable) { var orarendFromAscModelList = new List(); List tantargyfelosztasFromAscModelList = GetTantargyfelosztasFromAscModelList(ascTimeTable); List ascHetirendList; Dictionary ascNapDictionary; List ascTimeCardList; if (ascTimeTable.displayname == null || ascTimeTable.displayname.Contains("2008")) { ascHetirendList = GetHetirendListFromAsc2008(ascTimeTable); ascNapDictionary = GetNapDictionaryFromAsc2008(ascTimeTable); ascTimeCardList = GetAscTimeCardList2008(ascTimeTable, ascNapDictionary); } else { ascHetirendList = GetHetirendListFromAsc(ascTimeTable); ascNapDictionary = GetNapDictionaryFromAsc(ascTimeTable); ascTimeCardList = GetAscTimeCardList(ascTimeTable, ascNapDictionary); } List ascTeremList = GetTeremListFromAsc(ascTimeTable); foreach (AscTimeCards ascTimeCard in ascTimeCardList) { List tantargyfelosztasList = tantargyfelosztasFromAscModelList.Where(x => x.Id.Equals(ascTimeCard.LessonId)).ToList(); if (tantargyfelosztasList.Count > 0) { foreach (var tantargyfelosztas in tantargyfelosztasList) { string hetirendId = string.IsNullOrWhiteSpace(ascTimeCard.Het) ? tantargyfelosztas.LessonHetirendIdFromAsc : ascTimeCard.Het; orarendFromAscModelList.Add(new OrarendFromAscModel { Hetirend = ascHetirendList.Single(x => x.Id.Equals(hetirendId)).Nev, Nap = ascTimeCard.Nap, Ora = ascTimeCard.Sorszam, OsztalyNev = tantargyfelosztas.OsztalyNev, CsoportNev = tantargyfelosztas.CsoportNev, TantargyNev = tantargyfelosztas.TantargyNev, TanarNev = tantargyfelosztas.TanarNev, TeremNev = GetTeremNev(ascTimeCard.TeremIdListString, ascTeremList) }); } } } return orarendFromAscModelList; } private static List GetHetirendListFromAsc2008(timetable ascTimeTable) { var ascHetirendList = new List(); var hetirendNevList = new List { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; int hetirendNevIndex = 0; List hetirendIdListFromAsc = new List(); var hetirendCount = ascTimeTable.lessons.lesson[0].weeks.Length; hetirendIdListFromAsc.Insert(0, string.Concat(Enumerable.Repeat("1", hetirendCount))); var defaultHetirend = string.Concat(Enumerable.Repeat("0", hetirendCount)); if (hetirendCount > 1) { for (int i = 0; i < hetirendCount; i++) { StringBuilder stringBuilder = new StringBuilder(defaultHetirend) { [i] = '1' }; hetirendIdListFromAsc.Add(stringBuilder.ToString()); } } foreach (string hetirendIdFromAsc in hetirendIdListFromAsc) { if (!string.IsNullOrWhiteSpace(hetirendIdFromAsc)) { string hetNeve; string hetirendId; if (hetirendIdFromAsc.All(x => x.Equals('1'))) { hetirendId = hetirendIdFromAsc; hetNeve = $"{CommonResource.MindenHeten}"; } else { hetirendId = GenerateHetirendId(hetirendIdListFromAsc, hetirendNevIndex); hetNeve = $"{hetirendNevList[hetirendNevIndex]} {CommonResource.Het}"; hetirendNevIndex++; } ascHetirendList.Add(new AscHetirend { Id = hetirendId, Nev = hetNeve }); } } return ascHetirendList; } private static string GenerateHetirendId(List hetirendIdListByLesson, int hetirendNevIndex) { string tempString = string.Empty; tempString = tempString.PadLeft(hetirendIdListByLesson.Count - 1, '0'); var stringBuilder = new StringBuilder(tempString) { [hetirendNevIndex] = '1' }; string result = stringBuilder.ToString(); return result; } private static List GetHetirendListFromAsc(timetable ascTimeTable) { var ascHetirendList = new List(); foreach (timetableWeeksdefsWeeksdef het in ascTimeTable.weeksdefs.weeksdef) { ascHetirendList.Add(new AscHetirend { Id = het.weeks, Nev = het.name.ReplaceMultipleSpacesAndTrim() }); } return ascHetirendList; } private static Dictionary GetNapDictionaryFromAsc2008(timetable ascTimeTable) { var ascNapDictionary = new Dictionary(); foreach (timetableDaysDays nap in ascTimeTable.days.days) { ascNapDictionary.Add(nap.day, new AscNapok { Id = nap.day, Nev = nap.name.ReplaceMultipleSpacesAndTrim() }); } return ascNapDictionary; } private static Dictionary GetNapDictionaryFromAsc(timetable ascTimeTable) { var ascNapDictionary = new Dictionary(); foreach (timetableDaysdefsDaysdef nap in ascTimeTable.daysdefs.daysdef) { ascNapDictionary.Add(nap.days, new AscNapok { Id = nap.id, Nev = nap.name.ReplaceMultipleSpacesAndTrim(), }); } return ascNapDictionary; } //NOTE: Itt a "card.day" kell! private static List GetAscTimeCardList2008(timetable ascTimeTable, Dictionary ascNapDictionary) { var ascTimeCardList = new List(); foreach (timetableCardsCard card in ascTimeTable.cards.card) { ascTimeCardList.Add(new AscTimeCards { Sorszam = card.period, Het = string.IsNullOrWhiteSpace(card.weeks) ? string.Empty : card.weeks, Nap = ascNapDictionary[card.day].Nev, LessonId = card.lessonid, TeremIdListString = card.classroomids }); } return ascTimeCardList; } //NOTE: Itt a "card.days" kell! private static List GetAscTimeCardList(timetable ascTimeTable, Dictionary ascNapDictionary) { var ascTimeCardList = new List(); foreach (timetableCardsCard card in ascTimeTable.cards.card) { if (!ascTimeCardList.Any(x => x.LessonId == card.lessonid && x.Sorszam == card.period && x.Het == card.weeks && x.Nap == ascNapDictionary[card.days].Nev)) //A periodspercard miatt megegyszer ne fusson bele mert elso korben mar letrehozta (online xmlben tombonkent 1 card, dektopban minden ora kulon card) { var lesson = ascTimeTable.lessons.lesson.SingleOrDefault(x => x.id == card.lessonid); var periodsPerCard = int.TryParse(lesson.periodspercard, out int result) ? result : 0; for (int i = 0; i < periodsPerCard; i++) { var newCard = new AscTimeCards { Sorszam = int.TryParse(card.period, out int period) ? (period + i).ToString() : card.period, Het = string.IsNullOrWhiteSpace(card.weeks) ? string.Empty : card.weeks, Nap = ascNapDictionary[card.days].Nev, LessonId = card.lessonid, TeremIdListString = card.classroomids }; if (!ascTimeCardList.Any(x => x.LessonId == newCard.LessonId && x.Sorszam == newCard.Sorszam && x.Het == newCard.Het && x.Nap == newCard.Nap)) { ascTimeCardList.Add(newCard); } } } } return ascTimeCardList; } private static List GetTeremListFromAsc(timetable ascTimeTable) { var ascTeremList = new List(); foreach (timetableClassroomsClassroom terem in ascTimeTable.classrooms.classroom) { ascTeremList.Add(new AscTerem { Id = terem.id, Nev = terem.name.ReplaceMultipleSpacesAndTrim() }); } return ascTeremList; } private static string GetTeremNev(string teremIdListString, List ascTeremList) { List teremIdList = teremIdListString.Split(',').ToList(); string teremNev = string.Empty; foreach (string teremId in teremIdList) { if (!string.IsNullOrWhiteSpace(teremId)) { teremNev += ascTeremList.First(x => x.Id.Equals(teremId)).Nev; } } return teremNev; } private static List GetTantargyfelosztasFromAscModelList(timetable ascTimeTable) { List lessonList = CreateLessonListFromAscXml(ascTimeTable); var tantargyfelosztasFromAscModelList = new List(); //NOTE: 1A/I List filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: false, isTobbTanar: false, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasEgyOsztalyEgyCsoportEgyTanar(filteredLessonList)); //NOTE: 1A/II filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: false, isTobbTanar: true, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasEgyOsztalyEgyCsoportTobbTanar(filteredLessonList)); //NOTE: 1B/I filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: true, isTobbTanar: false, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasEgyOsztalyTobbCsoportEgyTanar(filteredLessonList)); //NOTE: 1B/II filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: true, isTobbTanar: true, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasEgyOsztalyTobbCsoportTobbTanar(filteredLessonList)); //NOTE: 2B/I filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: true, isTobbCsoport: true, isTobbTanar: false, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasTobbOsztalyTobbCsoportEgyTanar(filteredLessonList)); //NOTE: 2B/II filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: true, isTobbCsoport: true, isTobbTanar: true, isNincsMegadvaOsztaly: false, isNincsMegadvaCsoport: false); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasTobbOsztalyTobbCsoportTobbTanar(filteredLessonList)); //NOTE: 3C/I filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: false, isTobbTanar: false, isNincsMegadvaOsztaly: true, isNincsMegadvaCsoport: true); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasNincsOsztalyNincsCsoportEgyTanar(filteredLessonList)); //NOTE: 3C/II filteredLessonList = GetFilteredLessonList(lessonList, isTobbOsztaly: false, isTobbCsoport: false, isTobbTanar: true, isNincsMegadvaOsztaly: true, isNincsMegadvaCsoport: true); tantargyfelosztasFromAscModelList.AddRange(CreateTantargyfelosztasNincsOsztalyNincsCsoportTobbTanar(filteredLessonList)); return tantargyfelosztasFromAscModelList; } private static List GetFilteredLessonList(List lessonList, bool isTobbOsztaly, bool isTobbCsoport, bool isTobbTanar, bool isNincsMegadvaOsztaly, bool isNincsMegadvaCsoport) { List result = lessonList.Where(x => x.IsTobbOsztaly == isTobbOsztaly && x.IsTobbCsoport == isTobbCsoport && x.IsTobbTanar == isTobbTanar && x.IsNincsMegadvaOsztaly == isNincsMegadvaOsztaly && x.IsNincsMegadvaCsoport == isNincsMegadvaCsoport).ToList(); return result; } private static List CreateTantargyfelosztasEgyOsztalyEgyCsoportEgyTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { string osztalyNevFromLesson = lesson.OsztalyDictionary.SingleOrDefault().Value; string csoportNevFromLesson = GetCsoportNevById(lesson.CsoportDictionary.SingleOrDefault().Key); string osztalyCsoportNevFromLesson = $"{osztalyNevFromLesson} {csoportNevFromLesson}"; string osztalyNev = osztalyNevFromLesson; string csoportNev = osztalyNevFromLesson.ToComparableString() == osztalyCsoportNevFromLesson.ToComparableString() ? string.Empty : osztalyCsoportNevFromLesson; string tanarNev = lesson.TanarDictionary.SingleOrDefault().Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasEgyOsztalyEgyCsoportTobbTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { string osztalyNevFromLesson = lesson.OsztalyDictionary.SingleOrDefault().Value; string csoportNevFromLesson = GetCsoportNevById(lesson.CsoportDictionary.SingleOrDefault().Key); foreach (var tanar in lesson.TanarDictionary) { string osztalyNev = osztalyNevFromLesson; string csoportNev = $"{osztalyNevFromLesson} {csoportNevFromLesson} - {lesson.TantargyNev} - {tanar.Value}"; string tanarNev = tanar.Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasEgyOsztalyTobbCsoportEgyTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { string csoportNevFromLesson = string.Join(", ", lesson.CsoportDictionary.Select(x => GetCsoportNevById(x.Key)).Where(x => !string.IsNullOrWhiteSpace(x))); string osztalyNev = lesson.OsztalyDictionary.SingleOrDefault().Value; string csoportNev = $"{osztalyNev} {csoportNevFromLesson}"; string tanarNev = lesson.TanarDictionary.SingleOrDefault().Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasEgyOsztalyTobbCsoportTobbTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { string csoportNevFromLesson = string.Join(", ", lesson.CsoportDictionary.Select(x => GetCsoportNevById(x.Key)).Where(x => !string.IsNullOrWhiteSpace(x))); foreach (var tanar in lesson.TanarDictionary) { string osztalyNev = lesson.OsztalyDictionary.SingleOrDefault().Value; string csoportNev = $"{osztalyNev} {csoportNevFromLesson} - {lesson.TantargyNev} - {tanar.Value}"; string tanarNev = tanar.Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasTobbOsztalyTobbCsoportEgyTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { List> osztalyonkentiCsoportNevList = GetCsoportNevekOsztalyonkent(lesson); bool isOsztalyonkentAzonosCsoportok = CheckOsztalyonkentAzonosCsoportok(osztalyonkentiCsoportNevList); string osztalyCsoportNevFromLesson; if (isOsztalyonkentAzonosCsoportok) { List osztalyNevList = lesson.OsztalyDictionary.Select(x => x.Value).ToList(); string osztalyNevFromLesson = string.Join(", ", osztalyNevList); Dictionary uniqueCsoportDictionary = GetDictionaryUniqueItemsByValue(lesson.CsoportDictionary); string csoportNevFromLesson = string.Join(", ", uniqueCsoportDictionary.Select(x => GetCsoportNevById(x.Key)).Where(x => !string.IsNullOrWhiteSpace(x))); osztalyCsoportNevFromLesson = $"{osztalyNevFromLesson} {csoportNevFromLesson}"; } else { string csoportNevFromLesson = string.Empty; foreach (var osztaly in lesson.OsztalyDictionary) { IEnumerable osztalyhozTartozoCsoportok = AscImportData.CsoportLista.Where(x => x.OsztalyId.Equals(osztaly.Key, StringComparison.OrdinalIgnoreCase) && lesson.CsoportDictionary.Select(c => c.Key).Contains(x.Id) && !AscEgeszOsztalyNevuCsoportIdList.Contains(x.Id)); List distinctCsoportNevek = osztalyhozTartozoCsoportok.Select(x => x.Nev).Distinct().ToList(); string csoportNevListString = string.Join(", ", distinctCsoportNevek); csoportNevFromLesson += $"{osztaly.Value} {csoportNevListString}; "; } csoportNevFromLesson = csoportNevFromLesson.TrimEnd(' ', ';'); osztalyCsoportNevFromLesson = csoportNevFromLesson; } //NOTE: Az osztály neve itt üres, mert ha több osztály van megadva az ASC-ben, akkor azok nálunk csoportonként jönnek létre pl.: // 8.A, 8.B testnevelés, az nálunk egy közös csoport lesz. string osztalyNev = string.Empty; string csoportNev = osztalyCsoportNevFromLesson; string tanarNev = lesson.TanarDictionary.SingleOrDefault().Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasTobbOsztalyTobbCsoportTobbTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { List> osztalyonkentiCsoportNevList = GetCsoportNevekOsztalyonkent(lesson); bool isOsztalyonkentAzonosCsoportok = CheckOsztalyonkentAzonosCsoportok(osztalyonkentiCsoportNevList); string osztalyCsoportNevFromLesson; if (isOsztalyonkentAzonosCsoportok) { List osztalyNevList = lesson.OsztalyDictionary.Select(x => x.Value).ToList(); string osztalyNevFromLesson = string.Join(", ", osztalyNevList); Dictionary uniqueCsoportDictionary = GetDictionaryUniqueItemsByValue(lesson.CsoportDictionary); string csoportNevFromLesson = string.Join(", ", uniqueCsoportDictionary.Select(x => GetCsoportNevById(x.Key)).Where(x => !string.IsNullOrWhiteSpace(x))); osztalyCsoportNevFromLesson = $"{osztalyNevFromLesson} {csoportNevFromLesson} - {lesson.TantargyNev}"; } else { string csoportNevFromLesson = string.Empty; foreach (var osztaly in lesson.OsztalyDictionary) { IEnumerable osztalyhozTartozoCsoportok = AscImportData.CsoportLista.Where(x => x.OsztalyId.Equals(osztaly.Key, StringComparison.OrdinalIgnoreCase) && lesson.CsoportDictionary.Select(c => c.Key).Contains(x.Id) && !AscEgeszOsztalyNevuCsoportIdList.Contains(x.Id)); List distinctCsoportNevek = osztalyhozTartozoCsoportok.Select(x => x.Nev).Distinct().ToList(); string csoportNevListString = string.Join(", ", distinctCsoportNevek); csoportNevFromLesson += $"{osztaly.Value} {csoportNevListString}; "; } csoportNevFromLesson = csoportNevFromLesson.TrimEnd(' ', ';'); osztalyCsoportNevFromLesson = $"{csoportNevFromLesson} - {lesson.TantargyNev} "; } foreach (var tanar in lesson.TanarDictionary) { //NOTE: Az osztály neve itt üres, mert ha több osztály van megadva az ASC-ben, akkor azok nálunk csoportonként jönnek létre pl.: // 8.A, 8.B testnevelés, az nálunk egy közös csoport lesz. string osztalyNev = string.Empty; string csoportNev = $"{osztalyCsoportNevFromLesson} - {tanar.Value}"; string tanarNev = tanar.Value; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasNincsOsztalyNincsCsoportEgyTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { string tanarNevFromLesson = lesson.TanarDictionary.SingleOrDefault().Value; int counter = tantargyfelosztasFromAscModelList.Select(x => x.CsoportNev).Count(x => x.Contains($"{lesson.TantargyNev} - {tanarNevFromLesson}")) + 1; //NOTE: Az osztály neve itt üres, mert ha több osztály van megadva az ASC-ben, akkor azok nálunk csoportonként jönnek létre pl.: // 8.A, 8.B testnevelés, az nálunk egy közös csoport lesz. string osztalyNev = string.Empty; string csoportNev = $"{lesson.TantargyNev} - {tanarNevFromLesson} {counter}"; string tanarNev = tanarNevFromLesson; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } return tantargyfelosztasFromAscModelList; } private static List CreateTantargyfelosztasNincsOsztalyNincsCsoportTobbTanar(List filteredLessonList) { var tantargyfelosztasFromAscModelList = new List(); foreach (LessonModel lesson in filteredLessonList) { foreach (var tanar in lesson.TanarDictionary) { string tanarNevFromLesson = tanar.Value; int counter = tantargyfelosztasFromAscModelList.Select(x => x.CsoportNev).Count(x => x.Contains($"{lesson.TantargyNev} - {tanarNevFromLesson}")) + 1; //NOTE: Az osztály neve itt üres, mert ha több osztály van megadva az ASC-ben, akkor azok nálunk csoportonként jönnek létre pl.: // 8.A, 8.B testnevelés, az nálunk egy közös csoport lesz. string osztalyNev = string.Empty; string csoportNev = $"{lesson.TantargyNev} - {tanarNevFromLesson} {counter}"; string tanarNev = tanarNevFromLesson; tantargyfelosztasFromAscModelList.Add(GetTantargyfelosztasFromAscModel(lesson, osztalyNev, csoportNev, tanarNev)); } } return tantargyfelosztasFromAscModelList; } private static TantargyfelosztasFromAscModel GetTantargyfelosztasFromAscModel(LessonModel lesson, string osztalyNev, string csoportNev, string tanarNev) { var tantargyfelosztas = new TantargyfelosztasFromAscModel { Id = lesson.LessonIdFromAscXml.ReplaceMultipleSpacesAndTrim(), TantargyNev = lesson.TantargyNev.ReplaceMultipleSpacesAndTrim(), Oraszam = lesson.HetiOraszam.ReplaceMultipleSpacesAndTrim(), LessonHetirendIdFromAsc = lesson.LessonHetirendId.ReplaceMultipleSpacesAndTrim(), OsztalyNev = osztalyNev.ReplaceMultipleSpacesAndTrim(), CsoportNev = csoportNev.ReplaceMultipleSpacesAndTrim(), TanarNev = tanarNev.ReplaceMultipleSpacesAndTrim() }; return tantargyfelosztas; } private static List> GetCsoportNevekOsztalyonkent(LessonModel lesson) { var osztalyonkentiCsoportNevList = new List>(); foreach (var osztaly in lesson.OsztalyDictionary) { IEnumerable osztalyhozTartozoCsoportok = AscImportData.CsoportLista.Where(x => x.OsztalyId.Equals(osztaly.Key, StringComparison.OrdinalIgnoreCase) && lesson.CsoportDictionary.Select(c => c.Key).Contains(x.Id)); osztalyonkentiCsoportNevList.Add(osztalyhozTartozoCsoportok.Select(x => x.Nev).OrderBy(x => x).ToList()); } return osztalyonkentiCsoportNevList; } private static Dictionary GetDictionaryUniqueItemsByValue(Dictionary dictionary) { Dictionary result = dictionary .GroupBy(x => x.Value) .Select(x => x.First()) .OrderBy(x => x.Value) .ToDictionary(x => x.Key, x => x.Value); return result; } private static bool CheckOsztalyonkentAzonosCsoportok(List> osztalyonkentiCsoportNevList) { bool isOsztalyonkentEgyezoCsoport = true; for (int i = 1; i < osztalyonkentiCsoportNevList.Count; i++) { isOsztalyonkentEgyezoCsoport = isOsztalyonkentEgyezoCsoport && osztalyonkentiCsoportNevList[0].ToList().SequenceEqual(osztalyonkentiCsoportNevList[i].ToList()); } return isOsztalyonkentEgyezoCsoport; } private static string GetCsoportNevById(string csoportId) { AscCsoport csoport = AscImportData.CsoportLista.SingleOrDefault(x => x.Id.Equals(csoportId)); string csoportNev = string.Empty; if (csoport != null) { csoportNev = AscEgeszOsztalyNevuCsoportIdList.Contains(csoport.Id) ? string.Empty : csoport.Nev; } return csoportNev; } private static List CreateLessonListFromAscXml(timetable ascTimeTable) { var lessonList = new List(); AscImportData.OsztalyLista = GetOsztalyListFromAsc(ascTimeTable.classes?.@class?.ToList() ?? new List()); AscImportData.CsoportLista = GetCsoportListFromAsc(ascTimeTable.groups?.group?.ToList() ?? new List()); AscImportData.TantargyLista = GetTantargyListFromAsc(ascTimeTable.subjects.subject.ToList()); AscImportData.TanarLista = GetTanarListFromAsc(ascTimeTable.teachers.teacher.ToList()); AscEgeszOsztalyNevuCsoportIdList = AscImportData.CsoportLista.Where(x => x.FelosztasId == "0").Select(x => x.Id).ToList(); foreach (timetableLessonsLesson lessonItem in ascTimeTable.lessons.lesson) { var tantargy = AscImportData.TantargyLista.SingleOrDefault(x => x.Id == lessonItem.subjectid); string tantargyNev = string.Empty; if (tantargy != null) { tantargyNev = tantargy.Nev; } var lesson = new LessonModel { OsztalyDictionary = GetOsztalyDictionary(lessonItem.classids, AscImportData.OsztalyLista), CsoportDictionary = GetCsoportDictionary(lessonItem.groupids, AscImportData.CsoportLista), TanarDictionary = GetTanarDictionary(lessonItem.teacherids, AscImportData.TanarLista), TantargyNev = tantargyNev, HetiOraszam = lessonItem.periodsperweek, LessonHetirendId = string.IsNullOrWhiteSpace(lessonItem.weeksdefid) ? lessonItem.weeks : lessonItem.weeksdefid, LessonIdFromAscXml = lessonItem.id }; lesson.IsTobbOsztaly = lesson.OsztalyDictionary.Count > 1; lesson.IsTobbCsoport = lesson.CsoportDictionary.Count > 1; lesson.IsTobbTanar = lesson.TanarDictionary.Count > 1; lesson.IsNincsMegadvaOsztaly = lesson.OsztalyDictionary.Count == 0; lesson.IsNincsMegadvaCsoport = lesson.CsoportDictionary.Count == 0; lessonList.Add(lesson); } return lessonList; } private static List GetOsztalyListFromAsc(List classList) { var ascOsztalyList = new List(); foreach (timetableClassesClass osztaly in classList) { ascOsztalyList.Add(new AscOsztaly { Id = osztaly.id, Nev = osztaly.name.ReplaceMultipleSpacesAndTrim() }); } return ascOsztalyList; } private static List GetCsoportListFromAsc(List groupList) { var ascCsoportList = new List(); foreach (timetableGroupsGroup csoport in groupList) { csoport.divisiontag = string.IsNullOrWhiteSpace(csoport.divisiontag) ? "0" : csoport.divisiontag; ascCsoportList.Add(new AscCsoport { Id = csoport.id, Nev = csoport.name.ReplaceMultipleSpacesAndTrim(), OsztalyId = csoport.classid, FelosztasId = csoport.divisiontag }); } return ascCsoportList; } private static List GetTantargyListFromAsc(List subjectList) { var ascTantargyList = new List(); foreach (timetableSubjectsSubject tantargy in subjectList) { ascTantargyList.Add(new AscTantargy { Id = tantargy.id, Nev = tantargy.name.ReplaceMultipleSpacesAndTrim(), }); } return ascTantargyList; } private static List GetTanarListFromAsc(List teacherList) { var ascTanarList = new List(); foreach (timetableTeachersTeacher tanar in teacherList) { ascTanarList.Add(new AscTanar { Id = tanar.id, Nev = tanar.name.ReplaceMultipleSpacesAndTrim() }); } return ascTanarList; } private static Dictionary GetOsztalyDictionary(string osztalyIdListString, List ascOsztalyList) { var osztalyDictionary = new Dictionary(); if (!string.IsNullOrWhiteSpace(osztalyIdListString)) { foreach (string osztalyId in osztalyIdListString.Split(',').ToList()) { var osztaly = ascOsztalyList.SingleOrDefault(x => x.Id.Equals(osztalyId)); if (osztaly != null) { osztalyDictionary.Add(osztalyId, osztaly.Nev); } } } return osztalyDictionary; } private static Dictionary GetCsoportDictionary(string csoportIdListString, List ascCsoportList) { var csoportDictionary = new Dictionary(); if (!string.IsNullOrWhiteSpace(csoportIdListString)) { foreach (string csoportId in csoportIdListString.Split(',').ToList()) { var csoport = ascCsoportList.SingleOrDefault(x => x.Id.Equals(csoportId)); if (csoport != null) { csoportDictionary.Add(csoportId, csoport.Nev); } } } return csoportDictionary; } private static Dictionary GetTanarDictionary(string tanarIdListString, List ascTanarList) { var tanarDictionary = new Dictionary(); if (!string.IsNullOrWhiteSpace(tanarIdListString)) { foreach (string tanarId in tanarIdListString.Split(',').ToList()) { var tanar = ascTanarList.SingleOrDefault(x => x.Id.Equals(tanarId)); if (tanar != null && !tanarDictionary.ContainsKey(tanar.Id)) { tanarDictionary.Add(tanarId, tanar.Nev); } } } return tanarDictionary; } public MemoryStream ConvertAscXmlToExcel(Stream ascImportFileStream) { var dropDownColumnSourceDictionary = new OrarendImportExportHelper(ConnectionType).GetDefaultDropDownColumnSourceDictionary(false); List> importData = GetOrarendImportDataFromAsc(ascImportFileStream, DateTime.Now.ToShortDateString(), DateTime.Now.ToShortDateString()); using (var workbook = new Workbook()) { List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(OrarendImportExportHelper.ImportHeaderList, dropDownColumnSourceDictionary); Worksheet worksheet = SimpleExportLogic.GetWorksheet(workbook, ImportExportOrarendResource.OrarendImport, simpleExportColumnCos); int rowIndex = 1; //NOTE: A Skip(1), azért kell, mert az asc-ből generált string listába beletesszük a header-öket az importálásokhoz, de a konvertáláshoz mi saját header-t generálunk! foreach (List importDataRow in importData.Skip(1)) { int columnIndex = 0; //NOTE: A Skip(2), azért kell, mert az óra érvényességi idők(kezdete, vége) nincs benne az xml-ben, viszont, mi belegeneráljuk a string lista első két elemeként! foreach (string importDataCell in importDataRow.Skip(2).ToList()) { worksheet.Cells[rowIndex, columnIndex].Value = importDataCell; columnIndex++; } rowIndex++; } MemoryStream memoryStream = SimpleExportLogic.GetWorkbookMemoryStream(workbook); return memoryStream; } } } public class TantargyfelosztasFromAscModel : BaseTantargyfelosztasFromAscModel { public string Oraszam { get; set; } public string LessonHetirendIdFromAsc { get; set; } } public class OrarendFromAscModel : BaseTantargyfelosztasFromAscModel { public string Hetirend { get; set; } public string Nap { get; set; } public string Ora { get; set; } public string TeremNev { get; set; } } public class BaseTantargyfelosztasFromAscModel { public string Id { get; set; } public string OsztalyNev { get; set; } public string CsoportNev { get; set; } public string TantargyNev { get; set; } public string TanarNev { get; set; } } }