diff --git a/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ImplementerLogic.cs b/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..6042bbe --- /dev/null +++ b/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,124 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.BusinessLogicsContracts; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.StoragesContracts; +using CarRepairShopContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopBusinessLogic.BusinessLogics +{ + public class ImplementerLogic : IImplementerLogic + { + + private readonly ILogger _logger; + private readonly IImplementerStorage _implementerStorage; + + public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage) + { + _logger = logger; + _implementerStorage = implementerStorage; + } + + public List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model) + { + _logger.LogInformation("ReadList. Implementer:{FIO}. Id:{Id}", model?.ImplementerFIO, model?.Id); + var list = model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(model); + if(list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public ImplementerViewModel? ReadElement(ImplementerSearchModel? model) + { + if (model == null) throw new ArgumentNullException(nameof(model)); + _logger.LogInformation("ReadElement. Implementer:{ClientFIO}. Id:{Id}", model.ImplementerFIO, model?.Id); + var element = _implementerStorage.GetElement(model); + if(element == null) + { + _logger.LogWarning("ReadElement element is not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + + public bool Create(ImplementerBindingModel model) + { + CheckModel(model); + if(_implementerStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Update(ImplementerBindingModel model) + { + CheckModel(model); + if(_implementerStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + public bool Delete(ImplementerBindingModel model) + { + CheckModel(model, false); + if (_implementerStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + private void CheckModel(ImplementerBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + throw new ArgumentNullException("Нет ФИО исполнителя", nameof(model.ImplementerFIO)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля клиента", nameof(model.Password)); + } + if (model.WorkExperience < 0) + { + throw new ArgumentNullException("Опыт работы должен быть больше 0", nameof(model.WorkExperience)); + } + if (model.Qualification < 0) + { + throw new ArgumentNullException("Квалификация должна быть больше 0", nameof(model.Qualification)); + } + _logger.LogInformation("Implementer. Implementer:{ImplementerFIO}. WorkExperience:{WorkExperience}. Id{Id}", model.ImplementerFIO, model.WorkExperience, model.Id); + var element = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = model.ImplementerFIO, + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Исполнитель с таким ФИО уже есть"); + } + } + } +} diff --git a/CarRepairShop/CarRepairShopContracts/BindingModels/ImplementerBindingModel.cs b/CarRepairShop/CarRepairShopContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..c77d477 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,22 @@ +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.BindingModels +{ + public class ImplementerBindingModel : IImplementerModel + { + public int Id { get; set; } + public string ImplementerFIO { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public int WorkExperience { get; set; } + + public int Qualification { get; set; } + + } +} diff --git a/CarRepairShop/CarRepairShopContracts/BindingModels/OrderBindingModel.cs b/CarRepairShop/CarRepairShopContracts/BindingModels/OrderBindingModel.cs index be3d586..fb14306 100644 --- a/CarRepairShop/CarRepairShopContracts/BindingModels/OrderBindingModel.cs +++ b/CarRepairShop/CarRepairShopContracts/BindingModels/OrderBindingModel.cs @@ -13,6 +13,7 @@ namespace CarRepairShopContracts.BindingModels public int Id { get; set; } public int RepairId { get; set; } public int ClientId { get; set; } + public int ImplementerId { get; set; } public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; diff --git a/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IImplementerLogic.cs b/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..530d61c --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,24 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.BusinessLogicsContracts +{ + public interface IImplementerLogic + { + List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model); + + ImplementerViewModel? ReadElement(ImplementerSearchModel? model); + + bool Create(ImplementerBindingModel model); + + bool Update(ImplementerBindingModel model); + + bool Delete(ImplementerBindingModel model); + } +} diff --git a/CarRepairShop/CarRepairShopContracts/SearchModels/ImplementerSearchModel.cs b/CarRepairShop/CarRepairShopContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..f83cfb6 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,17 @@ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.SearchModels +{ + public class ImplementerSearchModel + { + public int? Id { get; set; } + public string? ImplementerFIO { get; set; } + public string? Password { get; set; } + } +} diff --git a/CarRepairShop/CarRepairShopContracts/StoragesContracts/IImplementerStorage.cs b/CarRepairShop/CarRepairShopContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..a272efa --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,26 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.StoragesContracts +{ + public interface IImplementerStorage + { + List<ImplementerViewModel> GetFullList(); + + List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model); + + ImplementerViewModel? GetElement(ImplementerSearchModel model); + + ImplementerViewModel? Insert(ImplementerBindingModel model); + + ImplementerViewModel? Update(ImplementerBindingModel model); + + ImplementerViewModel? Delete(ImplementerBindingModel model); + } +} diff --git a/CarRepairShop/CarRepairShopContracts/ViewModels/ImplementerViewModel.cs b/CarRepairShop/CarRepairShopContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..c6c2c19 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,28 @@ +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.ViewModels +{ + public class ImplementerViewModel : IImplementerModel + { + public int Id { get; set; } + + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; } = string.Empty; + + [DisplayName("Пароль")] + public string Password { get; set; } = string.Empty; + + [DisplayName("Опыт работы")] + public int WorkExperience { get; set; } + + [DisplayName("Квалификация")] + public int Qualification { get; set; } + + } +} diff --git a/CarRepairShop/CarRepairShopContracts/ViewModels/OrderViewModel.cs b/CarRepairShop/CarRepairShopContracts/ViewModels/OrderViewModel.cs index b303510..ee8f2ca 100644 --- a/CarRepairShop/CarRepairShopContracts/ViewModels/OrderViewModel.cs +++ b/CarRepairShop/CarRepairShopContracts/ViewModels/OrderViewModel.cs @@ -17,6 +17,7 @@ namespace CarRepairShopContracts.ViewModels public int RepairId { get; set; } public int ClientId { get; set; } + public int ImplementerId { get; set; } [DisplayName("ФИО клиента")] public string ClientFIO { get; set; } = string.Empty; diff --git a/CarRepairShop/CarRepairShopDataModels/Models/IImplementerModel.cs b/CarRepairShop/CarRepairShopDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..241a233 --- /dev/null +++ b/CarRepairShop/CarRepairShopDataModels/Models/IImplementerModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopDataModels.Models +{ + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + string Password { get; } + int WorkExperience { get; } + int Qualification { get; } + } +} diff --git a/CarRepairShop/CarRepairShopDataModels/Models/IOrderModel.cs b/CarRepairShop/CarRepairShopDataModels/Models/IOrderModel.cs index b7ccdba..aa89702 100644 --- a/CarRepairShop/CarRepairShopDataModels/Models/IOrderModel.cs +++ b/CarRepairShop/CarRepairShopDataModels/Models/IOrderModel.cs @@ -10,6 +10,8 @@ namespace CarRepairShopDataModels.Models public interface IOrderModel : IId { int RepairId { get; } + int ClientId { get; } + int ImplementerId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/CarRepairShop/CarRepairShopDatabaseImplement/CarRepairShopDatabase.cs b/CarRepairShop/CarRepairShopDatabaseImplement/CarRepairShopDatabase.cs index 99652f6..ab5d3e2 100644 --- a/CarRepairShop/CarRepairShopDatabaseImplement/CarRepairShopDatabase.cs +++ b/CarRepairShop/CarRepairShopDatabaseImplement/CarRepairShopDatabase.cs @@ -27,5 +27,6 @@ namespace CarRepairShopDatabaseImplement public virtual DbSet<Order> Orders { get; set; } public virtual DbSet<Client> Clients { get; set; } + public virtual DbSet<Implementer> Implementers { get; set; } } } \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopDatabaseImplement/Implements/ImplementerStorage.cs b/CarRepairShop/CarRepairShopDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..1a2c3b4 --- /dev/null +++ b/CarRepairShop/CarRepairShopDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,76 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.StoragesContracts; +using CarRepairShopContracts.ViewModels; +using CarRepairShopDatabaseImplement.Models; +using DocumentFormat.OpenXml.Office.CustomUI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public List<ImplementerViewModel> GetFullList() + { + using var context = new CarRepairShopDatabase(); + return context.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + return new(); + } + using var context = new CarRepairShopDatabase(); + return context.Implementers.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)).Select(x => x.GetViewModel).ToList(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if(string.IsNullOrEmpty(model.ImplementerFIO)) + { + return null; + } + using var context = new CarRepairShopDatabase(); + return context.Implementers.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ImplementerFIO)) && x.ImplementerFIO == model.ImplementerFIO || model.Id.HasValue && x.Id == model.Id)?.GetViewModel; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + var newImplementer = Implementer.Create(model); + if (newImplementer == null) return null; + using var context = new CarRepairShopDatabase(); + context.Implementers.Add(newImplementer); + context.SaveChanges(); + return newImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var context = new CarRepairShopDatabase(); + var Implementer = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if(Implementer == null) return null; + Implementer.Update(model); + context.SaveChanges(); + return Implementer.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var context = new CarRepairShopDatabase(); + var element = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if(element != null) + { + context.Implementers.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/CarRepairShop/CarRepairShopDatabaseImplement/Models/Implementer.cs b/CarRepairShop/CarRepairShopDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..c129773 --- /dev/null +++ b/CarRepairShop/CarRepairShopDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,67 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.BusinessLogicsContracts; +using CarRepairShopContracts.ViewModels; +using CarRepairShopDataModels.Models; +using DocumentFormat.OpenXml.Wordprocessing; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + + [Required] + public string ImplementerFIO { get; private set; } = string.Empty; + + [Required] + public string Password { get; private set; } = string.Empty; + + [Required] + public int WorkExperience { get; private set; } + + [Required] + public int Qualification { get; private set; } + + [ForeignKey("ClientId")] + public virtual List<Order> Orders { get; set; } = new(); + + public static Implementer? Create(ImplementerBindingModel model) + { + if (model == null) return null; + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Password = model.Password, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification + }; + } + + public void Update(ImplementerBindingModel model) + { + if (model == null) return; + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + } + + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = WorkExperience + }; + } +} diff --git a/CarRepairShop/CarRepairShopDatabaseImplement/Models/Order.cs b/CarRepairShop/CarRepairShopDatabaseImplement/Models/Order.cs index 3377881..04edf7a 100644 --- a/CarRepairShop/CarRepairShopDatabaseImplement/Models/Order.cs +++ b/CarRepairShop/CarRepairShopDatabaseImplement/Models/Order.cs @@ -21,6 +21,9 @@ namespace CarRepairShopDatabaseImplement.Models [Required] public int ClientId { get; set; } + [Required] + public int ImplementerId { get; set; } + [Required] public int Count { get; set; } diff --git a/CarRepairShop/CarRepairShopFileImplement/Models/Order.cs b/CarRepairShop/CarRepairShopFileImplement/Models/Order.cs index 60f3ab8..1af0867 100644 --- a/CarRepairShop/CarRepairShopFileImplement/Models/Order.cs +++ b/CarRepairShop/CarRepairShopFileImplement/Models/Order.cs @@ -16,6 +16,7 @@ namespace CarRepairShopFileImplement.Models public int Id { get; private set; } public int RepairId { get; private set; } public int ClientId { get; private set; } + public int ImplementerId { get; set; } public int Count { get; private set; } public double Sum { get; private set; } public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; diff --git a/CarRepairShop/CarRepairShopListImplement/Models/Order.cs b/CarRepairShop/CarRepairShopListImplement/Models/Order.cs index 7d53908..51f7602 100644 --- a/CarRepairShop/CarRepairShopListImplement/Models/Order.cs +++ b/CarRepairShop/CarRepairShopListImplement/Models/Order.cs @@ -4,6 +4,7 @@ using CarRepairShopDataModels.Enums; using CarRepairShopDataModels.Models; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; using System.Text; @@ -17,6 +18,7 @@ namespace CarRepairShopListImplement.Models public int RepairId { get; private set; } public int ClientId { get; private set; } + public int ImplementerId { get; set; } public int Count { get; private set; } diff --git a/CarRepairShop/CarRepairShopView/Program.cs b/CarRepairShop/CarRepairShopView/Program.cs index ac6aa8a..9337142 100644 --- a/CarRepairShop/CarRepairShopView/Program.cs +++ b/CarRepairShop/CarRepairShopView/Program.cs @@ -43,12 +43,14 @@ namespace CarRepairShopView services.AddTransient<IOrderStorage, OrderStorage>(); services.AddTransient<IRepairStorage, RepairStorage>(); services.AddTransient<IClientStorage, ClientStorage>(); + services.AddTransient<IImplementerStorage, ImplementerStorage>(); services.AddTransient<IComponentLogic, ComponentLogic>(); services.AddTransient<IOrderLogic, OrderLogic>(); services.AddTransient<IRepairLogic, RepairLogic>(); services.AddTransient<IReportLogic, ReportLogic>(); services.AddTransient<IClientLogic, ClientLogic>(); + services.AddTransient<IImplementerLogic, ImplementerLogic>(); services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); services.AddTransient<AbstractSaveToWord, SaveToWord>();