diff --git a/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs b/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs new file mode 100644 index 00000000..97671355 --- /dev/null +++ b/PoliNetwork.Graduatorie.Common/Objects/EnrollType.cs @@ -0,0 +1,27 @@ +#region + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +#endregion + +namespace PoliNetwork.Graduatorie.Common.Objects; + +[Serializable] +[JsonObject(MemberSerialization.Fields, NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class EnrollType +{ + public bool? CanEnroll; + public string? Course; + public string? Type; + + public int GetHashWithoutLastUpdate() + { + var i = "EnrollTypeNotNull".GetHashCode(); + i ^= Course?.GetHashCode() ?? "Course".GetHashCode(); + i ^= Type?.GetHashCode() ?? "Type".GetHashCode(); + i ^= CanEnroll?.GetHashCode() ?? "CanEnroll".GetHashCode(); + + return i; + } +} \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Common/Utils/EnrollUtil.cs b/PoliNetwork.Graduatorie.Common/Utils/EnrollUtil.cs new file mode 100644 index 00000000..3085663e --- /dev/null +++ b/PoliNetwork.Graduatorie.Common/Utils/EnrollUtil.cs @@ -0,0 +1,30 @@ +#region + +using PoliNetwork.Graduatorie.Common.Objects; + +#endregion + +namespace PoliNetwork.Graduatorie.Common.Utils; + +public class EnrollUtil +{ + public static EnrollType GetEnrollType(string? rowCanEnrollInto, bool rowCanEnroll) + { + if (rowCanEnroll == false) + return new EnrollType { CanEnroll = false, Course = null, Type = null }; + + if (string.IsNullOrEmpty(rowCanEnrollInto)) + return new EnrollType { CanEnroll = true, Course = null, Type = null }; + + string[] tester = {"assegnato", "prenotato"}; + const string sep = " - "; + if (!rowCanEnrollInto.Contains(sep) || !tester.Any(t => rowCanEnrollInto.ToLower().Contains(t))) + return new EnrollType { CanEnroll = true, Course = rowCanEnrollInto, Type = null }; + + var s = rowCanEnrollInto.Split(sep).ToList(); + var type = s.FirstOrDefault(x => tester.Any(t => t == x.ToLower())); + s.Remove(type); + var course = String.Join(sep, s); + return new EnrollType { CanEnroll = true, Course = course, Type = type }; + } +} diff --git a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs index e36e7107..26b09dd8 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs @@ -39,7 +39,7 @@ public static RankingSummary From(Ranking ranking) var courseTableStatsList = ranking.ByCourse?.Select(x => x.GetStats()) .OrderBy(x => x.Title).ThenBy(x => x.Location).ToList(); - var howManyCanEnroll = byMeritRows?.Count(x => x.CanEnroll ?? false); + var howManyCanEnroll = byMeritRows?.Count(x => x.EnrollType?.CanEnroll ?? false); var groupBy = courseTableStatsList?.GroupBy(x => diff --git a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs index cb013bc4..af9d224d 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; +using PoliNetwork.Graduatorie.Common.Objects; #endregion @@ -12,9 +13,8 @@ namespace PoliNetwork.Graduatorie.Parser.Objects; public class StudentResult { public DateOnly? BirthDate; - public bool? CanEnroll; - public string? CanEnrollInto; public int? EnglishCorrectAnswers; + public EnrollType? EnrollType; public string? Id; public SortedDictionary? Ofa; // maybe change it public int? PositionAbsolute; @@ -26,13 +26,13 @@ public int GetHashWithoutLastUpdate() { var i = "StudentResult".GetHashCode(); i ^= BirthDate?.GetHashCode() ?? "BirthDate".GetHashCode(); - i ^= CanEnroll?.GetHashCode() ?? "CanEnroll".GetHashCode(); - i ^= CanEnrollInto?.GetHashCode() ?? "CanEnrollInto".GetHashCode(); + i ^= EnrollType?.GetHashWithoutLastUpdate() ?? "EnrollType".GetHashCode(); i ^= EnglishCorrectAnswers?.GetHashCode() ?? "EnglishCorrectAnswers".GetHashCode(); i ^= Id?.GetHashCode() ?? "Id".GetHashCode(); i ^= PositionAbsolute?.GetHashCode() ?? "PositionAbsolute".GetHashCode(); i ^= PositionCourse?.GetHashCode() ?? "PositionCourse".GetHashCode(); i ^= Result?.GetHashCode() ?? "Result".GetHashCode(); + i ^= EnrollType?.GetHashCode() ?? "EnrollType".GetHashCode(); if (Ofa == null) i ^= "Ofa".GetHashCode(); else diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs index 82e0c357..d7172c11 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs @@ -80,7 +80,7 @@ public static CourseTableStats From(CourseTable courseTable) if (howManyStudentsCount == 0 || courseTableRows is null) return stats; - var studentsWhoCanEnroll = courseTableRows.Where(x => x.CanEnroll ?? false).ToList(); + var studentsWhoCanEnroll = courseTableRows.Where(x => x.EnrollType?.CanEnroll ?? false).ToList(); var studentsWhoCanEnrollCount = studentsWhoCanEnroll.Count; var minValueToEnroll = studentsWhoCanEnrollCount > 0 ? studentsWhoCanEnroll.Min(x => x.Result) : null; diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Converter.cs b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Converter.cs index 4164540b..05c3404e 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Converter.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Converter.cs @@ -1,5 +1,6 @@ #region +using PoliNetwork.Graduatorie.Common.Utils; using PoliNetwork.Graduatorie.Parser.Objects; using PoliNetwork.Graduatorie.Parser.Objects.Tables.Course; using PoliNetwork.Graduatorie.Parser.Objects.Tables.Merit; @@ -13,21 +14,22 @@ public static class Converter public static StudentResult FromMeritTableToStudentResult(MeritTableRow row) { var rowCanEnroll = row.CanEnroll ?? false; + var rowCanEnrollInto = rowCanEnroll ? row.CanEnrollInto : null; return new StudentResult { Id = row.Id, Ofa = row.Ofa, Result = row.Result, BirthDate = null, - CanEnroll = rowCanEnroll, - CanEnrollInto = rowCanEnroll ? row.CanEnrollInto : null, PositionAbsolute = row.Position, PositionCourse = null, SectionsResults = null, - EnglishCorrectAnswers = null + EnglishCorrectAnswers = null, + EnrollType = EnrollUtil.GetEnrollType(rowCanEnrollInto, rowCanEnroll) }; } + public static StudentResult FromCourseTableRowToStudentResult(CourseTableRow row, Table course) { var rowCanEnroll = row.CanEnroll ?? false; @@ -37,8 +39,7 @@ public static StudentResult FromCourseTableRowToStudentResult(CourseTableRow row Ofa = row.Ofa, Result = row.Result, BirthDate = row.BirthDate, - CanEnroll = rowCanEnroll, - CanEnrollInto = rowCanEnroll ? course.CourseTitle : null, + EnrollType = EnrollUtil.GetEnrollType(course.CourseTitle, rowCanEnroll), PositionAbsolute = null, PositionCourse = row.Position, SectionsResults = row.SectionsResults, diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs index e6fc2cca..ad41a5fe 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs @@ -8,6 +8,7 @@ using PoliNetwork.Graduatorie.Common.Extensions; using PoliNetwork.Graduatorie.Common.Objects; using PoliNetwork.Graduatorie.Common.Objects.RankingNS; +using PoliNetwork.Graduatorie.Common.Utils; using PoliNetwork.Graduatorie.Common.Utils.HashNS; using PoliNetwork.Graduatorie.Parser.Objects; using PoliNetwork.Graduatorie.Parser.Objects.Json.Indexes.Specific; @@ -585,8 +586,7 @@ Table course Ofa = row.Ofa, Result = row.Result, BirthDate = row.BirthDate, - CanEnroll = canEnroll, - CanEnrollInto = canEnroll ? course.CourseTitle : null, + EnrollType = EnrollUtil.GetEnrollType(course.CourseTitle, canEnroll), PositionCourse = row.Position, SectionsResults = row.SectionsResults, EnglishCorrectAnswers = row.EnglishCorrectAnswers @@ -600,7 +600,7 @@ Table course return student; student.PositionAbsolute = meritRow.Position; - student.CanEnrollInto = canEnroll ? meritRow.CanEnrollInto : null; + student.EnrollType = EnrollUtil.GetEnrollType(meritRow.CanEnrollInto, canEnroll); return student; } @@ -623,8 +623,7 @@ IEnumerable courses var canEnroll = row.CanEnroll ?? false; var student = new StudentResult { - CanEnroll = canEnroll, - CanEnrollInto = canEnroll ? row.CanEnrollInto : null, + EnrollType = EnrollUtil.GetEnrollType(row.CanEnrollInto, canEnroll), Id = row.Id, PositionAbsolute = row.Position, Result = row.Result, @@ -651,7 +650,7 @@ IEnumerable courses return student; var finalRow = canEnroll - ? studentCoursesRows.Find(c => c?.CanEnroll ?? false) + ? studentCoursesRows.Find(c => c?.EnrollType?.CanEnroll ?? false) : studentCoursesRows.OrderBy(c => c?.PositionCourse).First(); if (finalRow == null)