diff --git a/University/UniversityBuisnessLogic/ActivityLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/ActivityLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/ActivityLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/ActivityLogic.cs index 77c9494..a145745 100644 --- a/University/UniversityBuisnessLogic/ActivityLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/ActivityLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogic +namespace UniversityBuisnessLogic.BuisnessLogic { public class ActivityLogic : IActivityLogic { diff --git a/University/UniversityBuisnessLogic/DisciplineLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/DisciplineLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/DisciplineLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/DisciplineLogic.cs index 96c643a..af96521 100644 --- a/University/UniversityBuisnessLogic/DisciplineLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/DisciplineLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogic +namespace UniversityBuisnessLogic.BuisnessLogic { public class DisciplineLogic : IDisciplineLogic { diff --git a/University/UniversityBuisnessLogic/ExaminationResultLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/ExaminationResultLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/ExaminationResultLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/ExaminationResultLogic.cs index 2bacc00..51657c3 100644 --- a/University/UniversityBuisnessLogic/ExaminationResultLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/ExaminationResultLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogic +namespace UniversityBuisnessLogic.BuisnessLogic { public class ExaminationResultLogic : IExaminationResultLogic { diff --git a/University/UniversityBuisnessLogic/BuisnessLogic/ReportLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/ReportLogic.cs new file mode 100644 index 0000000..7a64775 --- /dev/null +++ b/University/UniversityBuisnessLogic/BuisnessLogic/ReportLogic.cs @@ -0,0 +1,115 @@ +using UniversityContracts.BindingModels; +using UniversityContracts.BuisnessLogicContracts; +using UniversityContracts.SearchModels; +using UniversityContracts.StoragesContracts; +using UniversityContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace UniversityBuisnessLogic.BuisnessLogic +{ + public class ReportLogic : IReportLogic + { + ILogger _logger; + IDisciplineStorage _disciplineStorage; + IStatementStorage _statementStorage; + IExaminationResultStorage _examinationResultStorage; + + public ReportLogic(ILogger logger, IDisciplineStorage disciplineStorage, + IStatementStorage statementStorage, IExaminationResultStorage examinationResultStorage) + { + _logger = logger; + _disciplineStorage = disciplineStorage; + _statementStorage = statementStorage; + _examinationResultStorage = examinationResultStorage; + } + + public List GetStudens(ReportBindingModel model) + { + if (model == null) return new(); + + var results = _examinationResultStorage.GetFilteredList(new ExaminationResultSearchModel + { + From = model.From, + To = model.To, + }); + + var statements = _statementStorage.GetFilteredList(new StatementSearchModel + { + From = model.From, + To = model.To, + }); + + List list = new(); + + foreach (var result in results) + { + foreach(var student in result.Students.Values) + { + foreach(var statement in statements) + { + if (!student.Statements.ContainsKey(statement.Id)) continue; + + list.Add(new ReportStudentsViewModel + { + StudentName = student.Name, + ExaminationForm = result.ExaminationForm, + mark = result.Mark, + ExaminationResultDate = result.Date, + HoursCount = statement.HoursCount, + StatementDate = statement.Date + }); + } + } + } + + return list; + } + + public List GetStudentDiscipline(ReportBindingModel model) + { + if (model == null || model.Students == null) return new(); + + var disciplines = _disciplineStorage.GetFullList(); + List result = new(); + + foreach(var student in model.Students) + { + var record = new ReportStudentDisciplineViewModel + { + StudentName = student.Name, + }; + + foreach(var discipline in disciplines) + { + foreach (var statement in discipline.DisciplineStatements) + { + if(student.Statements.ContainsKey(statement.Key)) + { + record.Disciplines.Add(discipline.Name); + break; + } + } + } + + result.Add(record); + } + + return result; + } + + public void SaveStudentsToExcel() + { + throw new NotImplementedException("Реализация в следующем этапе"); + } + + public void SaveStudentsToPdf() + { + throw new NotImplementedException("Реализация в следующем этапе"); + } + + public void SaveStudentsToWord() + { + throw new NotImplementedException("Реализация в следующем этапе"); + } + } +} diff --git a/University/UniversityBuisnessLogic/ReportTypeLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/ReportTypeLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/ReportTypeLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/ReportTypeLogic.cs index 810ab19..d7120ee 100644 --- a/University/UniversityBuisnessLogic/ReportTypeLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/ReportTypeLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogic +namespace UniversityBuisnessLogic.BuisnessLogic { public class ReportTypeLogic : IReportTypeLogic { diff --git a/University/UniversityBuisnessLogic/StatementLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/StatementLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/StatementLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/StatementLogic.cs index b2fb525..e834537 100644 --- a/University/UniversityBuisnessLogic/StatementLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/StatementLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogicf +namespace UniversityBuisnessLogic.BuisnessLogic { public class StatementLogic : IStatementLogic { diff --git a/University/UniversityBuisnessLogic/StudentLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/StudentLogic.cs similarity index 98% rename from University/UniversityBuisnessLogic/StudentLogic.cs rename to University/UniversityBuisnessLogic/BuisnessLogic/StudentLogic.cs index d321f98..08145a7 100644 --- a/University/UniversityBuisnessLogic/StudentLogic.cs +++ b/University/UniversityBuisnessLogic/BuisnessLogic/StudentLogic.cs @@ -5,7 +5,7 @@ using UniversityContracts.StoragesContracts; using UniversityContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace UniversityBuisnessLogic +namespace UniversityBuisnessLogic.BuisnessLogic { public class StudentLogic : IStudentLogic { diff --git a/University/UniversityBuisnessLogic/BuisnessLogic/UserLogic.cs b/University/UniversityBuisnessLogic/BuisnessLogic/UserLogic.cs new file mode 100644 index 0000000..f59dbd0 --- /dev/null +++ b/University/UniversityBuisnessLogic/BuisnessLogic/UserLogic.cs @@ -0,0 +1,130 @@ +using UniversityContracts.BindingModels; +using UniversityContracts.BuisnessLogicContracts; +using UniversityContracts.SearchModels; +using UniversityContracts.StoragesContracts; +using UniversityContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace UniversityBuisnessLogic.BuisnessLogic +{ + public class UserLogic : IUserLogic + { + private readonly ILogger _logger; + private readonly IUserStorage _userStorage; + + public UserLogic(ILogger logger, IUserStorage userStorage) + { + _logger = logger; + _userStorage = userStorage; + } + + public bool Create(UserBindingModel model) + { + CheckModel(model); + if (_userStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Delete(UserBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_userStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + public UserViewModel? ReadElement(UserSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. Id:{Id}", model.Id); + var element = _userStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + + public List? ReadList(UserSearchModel? model) + { + _logger.LogInformation("ReadList. Id:{Id}", model?.Id); + var list = model == null ? _userStorage.GetFullList() : _userStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public bool Update(UserBindingModel model) + { + CheckModel(model); + if (_userStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + private void CheckModel(UserBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.Name)) + { + throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name)); + } + if (string.IsNullOrEmpty(model.Surname)) + { + throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Name)); + } + if (string.IsNullOrEmpty(model.Login)) + { + throw new ArgumentNullException("Нет логина", nameof(model.Name)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет фамилии пароля", nameof(model.Name)); + } + else if (model.Password.Length < 6) + { + throw new ArgumentNullException("В пароле должно быть не менее 6 символов", nameof(model.Name)); + } + + _logger.LogInformation("User. Name:{Name}. Surname:{Surname}. Login: {Login} " + + "Password: {Password}. Id: {Id}", model.Name, model.Surname, model.Login, model.Password, model.Id); + + var element = _userStorage.GetElement(new UserSearchModel + { + Login = model.Login, + }); + + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Пользователь с таким логином уже есть"); + } + } + } +}