diff --git a/LawFirm/LawFirm/Program.cs b/LawFirm/LawFirm/Program.cs index 19322f1..67c2aa2 100644 --- a/LawFirm/LawFirm/Program.cs +++ b/LawFirm/LawFirm/Program.cs @@ -39,13 +39,15 @@ namespace LawFirmView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -58,6 +60,7 @@ namespace LawFirmView services.AddTransient(); services.AddTransient(); services.AddTransient(); - } + services.AddTransient(); + } } } \ No newline at end of file diff --git a/LawFirm/LawFirmBusinessLogic/BusinessLogics/ClientLogic.cs b/LawFirm/LawFirmBusinessLogic/BusinessLogics/ClientLogic.cs new file mode 100644 index 0000000..cf8c5d5 --- /dev/null +++ b/LawFirm/LawFirmBusinessLogic/BusinessLogics/ClientLogic.cs @@ -0,0 +1,114 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.BusinessLogicsContracts; +using LawFirmContracts.SearchModels; +using LawFirmContracts.StoragesContracts; +using LawFirmContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmBusinessLogic.BusinessLogics +{ + public class ClientLogic : IClientLogic + { + private readonly ILogger _logger; + private readonly IClientStorage _clientStorage; + public ClientLogic(ILogger logger, IClientStorage clientStorage) + { + _logger = logger; + _clientStorage = clientStorage; + } + public bool Create(ClientBindingModel model) + { + CheckModel(model); + if (_clientStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool Delete(ClientBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_clientStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + public ClientViewModel? ReadElement(ClientSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. Email:{Email}.Id:{ Id}", + model.Email, model.Id); + var element = _clientStorage.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(ClientSearchModel? model) + { + _logger.LogInformation("ReadList. Email:{Email}.Id:{ Id} ", model?.Email, model?.Id); + var list = (model == null) ? _clientStorage.GetFullList() : + _clientStorage.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(ClientBindingModel model) + { + CheckModel(model); + if (_clientStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + private void CheckModel(ClientBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ClientFIO)) + { + throw new ArgumentNullException("Нет фио клиента", nameof(model.ClientFIO)); + } + if (string.IsNullOrEmpty(model.Email)) + { + throw new ArgumentNullException("Нет логина клиента", nameof(model.Email)); + } + _logger.LogInformation("Client. Id: {Id}, FIO: {fio}, email: {email}", model.Id, model.ClientFIO, model.Email); + var element = _clientStorage.GetElement(new ClientSearchModel + { + Email = model.Email, + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Клиент с таким логином уже есть"); + } + } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmBusinessLogic/BusinessLogics/OrderLogic.cs b/LawFirm/LawFirmBusinessLogic/BusinessLogics/OrderLogic.cs index 36720f6..29cabc1 100644 --- a/LawFirm/LawFirmBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/LawFirm/LawFirmBusinessLogic/BusinessLogics/OrderLogic.cs @@ -111,8 +111,6 @@ namespace LawFirmBusinessLogic.BusinessLogics throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum)); } - _logger.LogInformation("Document. OrderID:{Id}. Sum:{Sum}. DocumentID:{DocumentID}.}", - model.Id, model.Sum, model.DocumentId); } } } \ No newline at end of file diff --git a/LawFirm/LawFirmBusinessLogic/BusinessLogics/ReportLogic.cs b/LawFirm/LawFirmBusinessLogic/BusinessLogics/ReportLogic.cs index ec0aadd..f7c96e3 100644 --- a/LawFirm/LawFirmBusinessLogic/BusinessLogics/ReportLogic.cs +++ b/LawFirm/LawFirmBusinessLogic/BusinessLogics/ReportLogic.cs @@ -47,7 +47,6 @@ namespace LawFirmBusinessLogic.BusinessLogics { record.Blanks.Add((blank.Item1.BlankName, blank.Item2)); record.TotalCount += blank.Item2; - } list.Add(record); } diff --git a/LawFirm/LawFirmContracts/BindingModels/ClientBindingModel.cs b/LawFirm/LawFirmContracts/BindingModels/ClientBindingModel.cs new file mode 100644 index 0000000..8303257 --- /dev/null +++ b/LawFirm/LawFirmContracts/BindingModels/ClientBindingModel.cs @@ -0,0 +1,17 @@ +using LawFirmDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmContracts.BindingModels +{ + public class ClientBindingModel : IClientModel + { + public int Id { get; set; } + public string ClientFIO { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/BindingModels/OrderBindingModel.cs b/LawFirm/LawFirmContracts/BindingModels/OrderBindingModel.cs index 516273d..f1d5fb4 100644 --- a/LawFirm/LawFirmContracts/BindingModels/OrderBindingModel.cs +++ b/LawFirm/LawFirmContracts/BindingModels/OrderBindingModel.cs @@ -7,7 +7,8 @@ namespace LawFirmContracts.BindingModels { public int Id { get; set; } public int DocumentId { get; set; } - public int Count { get; set; } + public int ClientId { get; set; } + public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; public DateTime DateCreate { get; set; } = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); diff --git a/LawFirm/LawFirmContracts/BusinessLogicsContracts/IClientLogic.cs b/LawFirm/LawFirmContracts/BusinessLogicsContracts/IClientLogic.cs new file mode 100644 index 0000000..0e572e4 --- /dev/null +++ b/LawFirm/LawFirmContracts/BusinessLogicsContracts/IClientLogic.cs @@ -0,0 +1,15 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.SearchModels; +using LawFirmContracts.ViewModels; + +namespace LawFirmContracts.BusinessLogicsContracts +{ + public interface IClientLogic + { + List? ReadList(ClientSearchModel? model); + ClientViewModel? ReadElement(ClientSearchModel model); + bool Create(ClientBindingModel model); + bool Update(ClientBindingModel model); + bool Delete(ClientBindingModel model); + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/SearchModels/ClientSearchModel.cs b/LawFirm/LawFirmContracts/SearchModels/ClientSearchModel.cs new file mode 100644 index 0000000..622c0ab --- /dev/null +++ b/LawFirm/LawFirmContracts/SearchModels/ClientSearchModel.cs @@ -0,0 +1,9 @@ +namespace LawFirmContracts.SearchModels +{ + public class ClientSearchModel + { + public int? Id { get; set; } + public string? Email { get; set; } + public string? Password { get; set; } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/SearchModels/OrderSearchModel.cs b/LawFirm/LawFirmContracts/SearchModels/OrderSearchModel.cs index ad51be8..04de8e5 100644 --- a/LawFirm/LawFirmContracts/SearchModels/OrderSearchModel.cs +++ b/LawFirm/LawFirmContracts/SearchModels/OrderSearchModel.cs @@ -5,5 +5,6 @@ public int? Id { get; set; } public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } - } + public int? ClientId { get; set; } + } } \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/StoragesContracts/IClientStorage.cs b/LawFirm/LawFirmContracts/StoragesContracts/IClientStorage.cs new file mode 100644 index 0000000..ab1d518 --- /dev/null +++ b/LawFirm/LawFirmContracts/StoragesContracts/IClientStorage.cs @@ -0,0 +1,21 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.SearchModels; +using LawFirmContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmContracts.StoragesContracts +{ + public interface IClientStorage + { + List GetFullList(); + List GetFilteredList(ClientSearchModel model); + ClientViewModel? GetElement(ClientSearchModel model); + ClientViewModel? Insert(ClientBindingModel model); + ClientViewModel? Update(ClientBindingModel model); + ClientViewModel? Delete(ClientBindingModel model); + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/ViewModels/ClientViewModel.cs b/LawFirm/LawFirmContracts/ViewModels/ClientViewModel.cs new file mode 100644 index 0000000..8c307d2 --- /dev/null +++ b/LawFirm/LawFirmContracts/ViewModels/ClientViewModel.cs @@ -0,0 +1,21 @@ +using LawFirmDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmContracts.ViewModels +{ + public class ClientViewModel : IClientModel + { + public int Id { get; set; } + [DisplayName("ФИО клиента")] + public string ClientFIO { get; set; } = string.Empty; + [DisplayName("Логин (эл. почта)")] + public string Email { get; set; } = string.Empty; + [DisplayName("Пароль")] + public string Password { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmContracts/ViewModels/OrderViewModel.cs b/LawFirm/LawFirmContracts/ViewModels/OrderViewModel.cs index 8dedf8b..e5b076e 100644 --- a/LawFirm/LawFirmContracts/ViewModels/OrderViewModel.cs +++ b/LawFirm/LawFirmContracts/ViewModels/OrderViewModel.cs @@ -10,7 +10,11 @@ namespace LawFirmContracts.ViewModels public int Id { get; set; } public int DocumentId { get; set; } [DisplayName("Документ")] - public string DocumentName { get; set; } = string.Empty; + public int ClientId { get; set; } + [DisplayName("Данные клиента")] + public string ClientFIO { get; set; } = string.Empty; + [DisplayName("Документ")] + public string DocumentName { get; set; } = string.Empty; [DisplayName("Количество")] public int Count { get; set; } [DisplayName("Сумма")] diff --git a/LawFirm/LawFirmDataModels/Models/IClientModel.cs b/LawFirm/LawFirmDataModels/Models/IClientModel.cs new file mode 100644 index 0000000..0b83b54 --- /dev/null +++ b/LawFirm/LawFirmDataModels/Models/IClientModel.cs @@ -0,0 +1,9 @@ +namespace LawFirmDataModels.Models +{ + public interface IClientModel : IId + { + string ClientFIO { get; } + string Email { get; } + string Password { get; } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmDatabaseImplement/Implements/ClientStorage.cs b/LawFirm/LawFirmDatabaseImplement/Implements/ClientStorage.cs new file mode 100644 index 0000000..abd8f18 --- /dev/null +++ b/LawFirm/LawFirmDatabaseImplement/Implements/ClientStorage.cs @@ -0,0 +1,84 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.SearchModels; +using LawFirmContracts.StoragesContracts; +using LawFirmContracts.ViewModels; +using LawFirmDatabaseImplement.Models; + +namespace LawFirmDatabaseImplement.Implements +{ + public class ClientStorage : IClientStorage + { + public ClientViewModel? Delete(ClientBindingModel model) + { + using var context = new LawFirmDatabase(); + var res = context.Clients.FirstOrDefault(x => x.Id == model.Id); + if (res != null) + { + context.Clients.Remove(res); + context.SaveChanges(); + } + return res?.GetViewModel; + } + public ClientViewModel? GetElement(ClientSearchModel model) + { + using var context = new LawFirmDatabase(); + if (model.Id.HasValue) + return context.Clients.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + if (model.Email != null && model.Password != null) + return context.Clients + .FirstOrDefault(x => x.Email.Equals(model.Email) + && x.Password.Equals(model.Password)) + ?.GetViewModel; + if (model.Email != null) + return context.Clients + .FirstOrDefault(x => x.Email + .Equals(model.Email))?.GetViewModel; + return null; + } + public List GetFilteredList(ClientSearchModel model) + { + if (model == null) + { + return new(); + } + if (model.Id.HasValue) + { + var res = GetElement(model); + return res != null ? new() { res } : new(); + } + if (model.Email != null) + { + using var context = new LawFirmDatabase(); + return context.Clients + .Where(x => x.Email.Contains(model.Email)) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + public List GetFullList() + { + using var context = new LawFirmDatabase(); + return context.Clients.Select(x => x.GetViewModel).ToList(); + } + public ClientViewModel? Insert(ClientBindingModel model) + { + using var context = new LawFirmDatabase(); + var res = Client.Create(model); + if (res != null) + { + context.Clients.Add(res); + context.SaveChanges(); + } + return res?.GetViewModel; + } + public ClientViewModel? Update(ClientBindingModel model) + { + using var context = new LawFirmDatabase(); + var res = context.Clients.FirstOrDefault(x => x.Id == model.Id); + res?.Update(model); + context.SaveChanges(); + return res?.GetViewModel; + } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmDatabaseImplement/Implements/OrderStorage.cs b/LawFirm/LawFirmDatabaseImplement/Implements/OrderStorage.cs index 4bd6751..5f34ceb 100644 --- a/LawFirm/LawFirmDatabaseImplement/Implements/OrderStorage.cs +++ b/LawFirm/LawFirmDatabaseImplement/Implements/OrderStorage.cs @@ -16,25 +16,47 @@ namespace LawFirmDatabaseImplement.Implements return null; } using var context = new LawFirmDatabase(); - return context.Orders.Include(x => x.Document).FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + return context.Orders.Include(x => x.Document).Include(x => x.Client).FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; } public List GetFilteredList(OrderSearchModel model) { - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue) - { + using var context = new LawFirmDatabase(); + if (model.Id.HasValue) + { + return context.Orders + .Include(x => x.Document) + .Include(x => x.Client) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + else if (model.DateFrom != null && model.DateTo != null) + { + return context.Orders + .Include(x => x.Document) + .Include(x => x.Client) + .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + .Select(x => x.GetViewModel) + .ToList(); + } + else if (model.ClientId.HasValue) + { + return context.Orders + .Include(x => x.Document) + .Include(x => x.Client) + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + else + { return new(); } - using var context = new LawFirmDatabase(); - return context.Orders - .Include(x => x.Document) - .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo) - .Select(x => x.GetViewModel) - .ToList(); } public List GetFullList() { using var context = new LawFirmDatabase(); - return context.Orders.Include(x => x.Document).Select(x => x.GetViewModel).ToList(); + return context.Orders.Include(x => x.Document).Include(x => x.Client).Select(x => x.GetViewModel).ToList(); } public OrderViewModel? Insert(OrderBindingModel model) { @@ -46,19 +68,19 @@ namespace LawFirmDatabaseImplement.Implements using var context = new LawFirmDatabase(); context.Orders.Add(newOrder); context.SaveChanges(); - return context.Orders.Include(x => x.Document).FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; + return context.Orders.Include(x => x.Document).Include(x => x.Client).FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; } public OrderViewModel? Update(OrderBindingModel model) { using var context = new LawFirmDatabase(); - var order = context.Orders.FirstOrDefault(x => x.Id == model.Id); + var order = context.Orders.Include(x => x.Client).FirstOrDefault(x => x.Id == model.Id); if (order == null) { return null; } order.Update(model); context.SaveChanges(); - return context.Orders.Include(x => x.Document).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + return context.Orders.Include(x => x.Document).Include(x => x.Client).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; } public OrderViewModel? Delete(OrderBindingModel model) { @@ -66,10 +88,14 @@ namespace LawFirmDatabaseImplement.Implements var element = context.Orders.FirstOrDefault(rec => rec.Id == model.Id); if (element != null) { - context.Orders.Remove(element); - context.SaveChanges(); - return element.GetViewModel; - } + var deletedElement = context.Orders + .Include(x => x.Document) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Orders.Remove(element); + context.SaveChanges(); + return deletedElement; + } return null; } } diff --git a/LawFirm/LawFirmDatabaseImplement/LawFirmDatabase.cs b/LawFirm/LawFirmDatabaseImplement/LawFirmDatabase.cs index 7008519..c3acee8 100644 --- a/LawFirm/LawFirmDatabaseImplement/LawFirmDatabase.cs +++ b/LawFirm/LawFirmDatabaseImplement/LawFirmDatabase.cs @@ -17,5 +17,6 @@ namespace LawFirmDatabaseImplement public virtual DbSet Documents { set; get; } public virtual DbSet DocumentBlanks { set; get; } public virtual DbSet Orders { set; get; } - } + public virtual DbSet Clients { set; get; } + } } \ No newline at end of file diff --git a/LawFirm/LawFirmDatabaseImplement/Models/Client.cs b/LawFirm/LawFirmDatabaseImplement/Models/Client.cs new file mode 100644 index 0000000..b2d5574 --- /dev/null +++ b/LawFirm/LawFirmDatabaseImplement/Models/Client.cs @@ -0,0 +1,60 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.ViewModels; +using LawFirmDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmDatabaseImplement.Models +{ + public class Client : IClientModel + { + public int Id { get; set; } + + [Required] + public string ClientFIO { get; set; } = string.Empty; + + [Required] + public string Email { get; set; } = string.Empty; + + [Required] + public string Password { get; set; } = string.Empty; + [ForeignKey("ClientId")] + public virtual List Orders { get; set; } = new(); + public static Client? Create(ClientBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Id = model.Id, + ClientFIO = model.ClientFIO, + Email = model.Email, + Password = model.Password + }; + } + public void Update(ClientBindingModel model) + { + if (model == null) + { + return; + } + ClientFIO = model.ClientFIO; + Email = model.Email; + Password = model.Password; + } + public ClientViewModel GetViewModel => new() + { + Id = Id, + ClientFIO = ClientFIO, + Email = Email, + Password = Password, + }; + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmDatabaseImplement/Models/Order.cs b/LawFirm/LawFirmDatabaseImplement/Models/Order.cs index ba5a680..959ea2b 100644 --- a/LawFirm/LawFirmDatabaseImplement/Models/Order.cs +++ b/LawFirm/LawFirmDatabaseImplement/Models/Order.cs @@ -11,7 +11,9 @@ namespace LawFirmDatabaseImplement.Models { [Required] public int DocumentId { get; set; } - [Required] + [Required] + public int ClientId { get; private set; } + [Required] public int Count { get; set; } [Required] public double Sum { get; set; } @@ -20,9 +22,10 @@ namespace LawFirmDatabaseImplement.Models [Required] public DateTime DateCreate { get; set; } public DateTime? DateImplement { get; set; } - public int Id { get; set; } public virtual Document Document { get; set; } - public static Order? Create(OrderBindingModel? model) + public virtual Client Client { get; set; } + public int Id { get; set; } + public static Order? Create(OrderBindingModel? model) { if (model == null) { @@ -32,7 +35,8 @@ namespace LawFirmDatabaseImplement.Models { Id = model.Id, DocumentId = model.DocumentId, - Count = model.Count, + ClientId = model.ClientId, + Count = model.Count, Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, @@ -52,7 +56,9 @@ namespace LawFirmDatabaseImplement.Models { Id = Id, DocumentId = DocumentId, - Count = Count, + ClientId = ClientId, + ClientFIO = Client.ClientFIO, + Count = Count, Sum = Sum, Status = Status, DateCreate = DateCreate, diff --git a/LawFirm/LawFirmFileImplement/DataFileSingleton.cs b/LawFirm/LawFirmFileImplement/DataFileSingleton.cs index 8c60cc4..ca048a7 100644 --- a/LawFirm/LawFirmFileImplement/DataFileSingleton.cs +++ b/LawFirm/LawFirmFileImplement/DataFileSingleton.cs @@ -9,10 +9,12 @@ namespace LawFirmFileImplement private readonly string BlankFileName = "Blank.xml"; private readonly string OrderFileName = "Order.xml"; private readonly string DocumentFileName = "Document.xml"; - public List Blanks { get; private set; } + private readonly string ClientFileName = "Client.xml"; + public List Blanks { get; private set; } public List Orders { get; private set; } public List Documents { get; private set; } - public static DataFileSingleton GetInstance() + public List Clients { get; private set; } + public static DataFileSingleton GetInstance() { if (instance == null) { @@ -23,13 +25,15 @@ namespace LawFirmFileImplement public void SaveBlanks() => SaveData(Blanks, BlankFileName, "Blanks", x => x.GetXElement); public void SaveDocuments() => SaveData(Documents, DocumentFileName, "Documents", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); - private DataFileSingleton() + public void SaveClients() => SaveData(Clients, OrderFileName, "Clients", x => x.GetXElement); + private DataFileSingleton() { Blanks = LoadData(BlankFileName, "Blank", x => Blank.Create(x)!)!; Documents = LoadData(DocumentFileName, "Document", x => Document.Create(x)!)!; - Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; - } - private static List? LoadData(string filename, string xmlNodeName, + Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; + } + private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { if (File.Exists(filename)) diff --git a/LawFirm/LawFirmFileImplement/Implements/ClientStorage.cs b/LawFirm/LawFirmFileImplement/Implements/ClientStorage.cs new file mode 100644 index 0000000..119baac --- /dev/null +++ b/LawFirm/LawFirmFileImplement/Implements/ClientStorage.cs @@ -0,0 +1,85 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.SearchModels; +using LawFirmContracts.StoragesContracts; +using LawFirmContracts.ViewModels; +using LawFirmFileImplement.Models; + +namespace LawFirmFileImplement.Implements +{ + public class ClientStorage : IClientStorage + { + private readonly DataFileSingleton _source; + public ClientStorage() + { + _source = DataFileSingleton.GetInstance(); + } + public ClientViewModel? Delete(ClientBindingModel model) + { + var res = _source.Clients.FirstOrDefault(x => x.Id == model.Id); + if (res != null) + { + _source.Clients.Remove(res); + _source.SaveClients(); + } + return res?.GetViewModel; + } + public ClientViewModel? GetElement(ClientSearchModel model) + { + if (model.Id.HasValue) + return _source.Clients.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + if (model.Email != null && model.Password != null) + return _source.Clients + .FirstOrDefault(x => x.Email.Equals(model.Email) + && x.Password.Equals(model.Password)) + ?.GetViewModel; + if (model.Email != null) + return _source.Clients.FirstOrDefault(x => x.Email.Equals(model.Email))?.GetViewModel; + return null; + } + public List GetFilteredList(ClientSearchModel model) + { + if (model == null) + { + return new(); + } + if (model.Id.HasValue) + { + var res = GetElement(model); + return res != null ? new() { res } : new(); + } + if (model.Email != null) + { + return _source.Clients + .Where(x => x.Email.Contains(model.Email)) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + public List GetFullList() + { + return _source.Clients.Select(x => x.GetViewModel).ToList(); + } + public ClientViewModel? Insert(ClientBindingModel model) + { + model.Id = _source.Clients.Count > 0 ? _source.Clients.Max(x => x.Id) + 1 : 1; + var res = Client.Create(model); + if (res != null) + { + _source.Clients.Add(res); + _source.SaveClients(); + } + return res?.GetViewModel; + } + public ClientViewModel? Update(ClientBindingModel model) + { + var res = _source.Clients.FirstOrDefault(x => x.Id == model.Id); + if (res != null) + { + res.Update(model); + _source.SaveClients(); + } + return res?.GetViewModel; + } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmFileImplement/Implements/OrderStorage.cs b/LawFirm/LawFirmFileImplement/Implements/OrderStorage.cs index 5b24674..2c6a06e 100644 --- a/LawFirm/LawFirmFileImplement/Implements/OrderStorage.cs +++ b/LawFirm/LawFirmFileImplement/Implements/OrderStorage.cs @@ -19,16 +19,24 @@ namespace LawFirmFileImplement.Implements } public List GetFilteredList(OrderSearchModel model) { - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue) - { - return new(); - } - return source.Orders - .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo) - .Select(x => x.GetViewModel) - .ToList(); - } - public OrderViewModel? GetElement(OrderSearchModel model) + if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) + { + return source.Orders + .Where(x => model.DateFrom <= x.DateCreate.Date && x.DateCreate <= model.DateTo) + .Select(x => x.GetViewModel) + .ToList(); + } + if (!model.Id.HasValue && model.ClientId.HasValue) + { + return source.Orders + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + var result = GetElement(model); + return result != null ? new() { result } : new(); + } + public OrderViewModel? GetElement(OrderSearchModel model) { if (!model.Id.HasValue) { diff --git a/LawFirm/LawFirmFileImplement/Models/Client.cs b/LawFirm/LawFirmFileImplement/Models/Client.cs new file mode 100644 index 0000000..7d36ec9 --- /dev/null +++ b/LawFirm/LawFirmFileImplement/Models/Client.cs @@ -0,0 +1,71 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.ViewModels; +using LawFirmDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace LawFirmFileImplement.Models +{ + public class Client : IClientModel + { + public string ClientFIO { get; private set; } = string.Empty; + public string Email { get; private set; } = string.Empty; + public string Password { get; private set; } = string.Empty; + public int Id { get; private set; } + public static Client? Create(ClientBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Id = model.Id, + ClientFIO = model.ClientFIO, + Email = model.Email, + Password = model.Password + }; + } + public static Client? Create(XElement element) + { + if (element == null) + { + return null; + } + return new() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ClientFIO = element.Element("FIO")!.Value, + Email = element.Element("Email")!.Value, + Password = element.Element("Password")!.Value, + }; + } + public void Update(ClientBindingModel model) + { + if (model == null) + { + return; + } + ClientFIO = model.ClientFIO; + Email = model.Email; + Password = model.Password; + } + public ClientViewModel GetViewModel => new() + { + Id = Id, + ClientFIO = ClientFIO, + Email = Email, + Password = Password, + }; + public XElement GetXElement => new("Client", + new XAttribute("Id", Id), + new XElement("FIO", ClientFIO), + new XElement("Email", Email), + new XElement("Password", Password) + ); + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmFileImplement/Models/Order.cs b/LawFirm/LawFirmFileImplement/Models/Order.cs index 549a84a..b2b8273 100644 --- a/LawFirm/LawFirmFileImplement/Models/Order.cs +++ b/LawFirm/LawFirmFileImplement/Models/Order.cs @@ -10,7 +10,8 @@ namespace LawFirmFileImplement.Models { public int Id { get; private set; } public int DocumentId { get; private set; } - public int Count { get; private set; } + public int ClientId { get; set; } + public int Count { get; private set; } public double Sum { get; private set; } public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; public DateTime DateCreate { get; private set; } = DateTime.Now; @@ -25,7 +26,8 @@ namespace LawFirmFileImplement.Models { Id = model.Id, DocumentId = model.DocumentId, - Count = model.Count, + ClientId = model.ClientId, + Count = model.Count, Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, @@ -44,7 +46,6 @@ namespace LawFirmFileImplement.Models DocumentId = Convert.ToInt32(element.Element("DocumentId")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), - DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null), }; DateTime.TryParse(element.Element("DateImplement")!.Value, out DateTime dateImpl); order.DateImplement = dateImpl; @@ -68,7 +69,8 @@ namespace LawFirmFileImplement.Models public OrderViewModel GetViewModel => new() { DocumentId = DocumentId, - Count = Count, + ClientId = ClientId, + Count = Count, Sum = Sum, DateCreate = DateCreate, DateImplement = DateImplement, diff --git a/LawFirm/LawFirmListImplement/DataListSingleton.cs b/LawFirm/LawFirmListImplement/DataListSingleton.cs index 264ff29..50f82b5 100644 --- a/LawFirm/LawFirmListImplement/DataListSingleton.cs +++ b/LawFirm/LawFirmListImplement/DataListSingleton.cs @@ -8,12 +8,14 @@ namespace LawFirmListImplement public List Blanks { get; set; } public List Orders { get; set; } public List Documents { get; set; } - private DataListSingleton() + public List Clients { get; set; } + private DataListSingleton() { Blanks = new List(); Orders = new List(); Documents = new List(); - } + Clients = new List(); + } public static DataListSingleton GetInstance() { if (_instance == null) diff --git a/LawFirm/LawFirmListImplement/Implements/ClientStorage.cs b/LawFirm/LawFirmListImplement/Implements/ClientStorage.cs new file mode 100644 index 0000000..7df71b4 --- /dev/null +++ b/LawFirm/LawFirmListImplement/Implements/ClientStorage.cs @@ -0,0 +1,98 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.SearchModels; +using LawFirmContracts.StoragesContracts; +using LawFirmContracts.ViewModels; +using LawFirmListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmListImplement.Implements +{ + public class ClientStorage : IClientStorage + { + private readonly DataListSingleton _source; + public ClientStorage() + { + _source = DataListSingleton.GetInstance(); + } + public ClientViewModel? Delete(ClientBindingModel model) + { + for (int i = 0; i < _source.Clients.Count; ++i) + { + if (_source.Clients[i].Id == model.Id) + { + var element = _source.Clients[i]; + _source.Clients.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + public ClientViewModel? GetElement(ClientSearchModel model) + { + foreach (var client in _source.Clients) + { + if (model.Id.HasValue && model.Id == client.Id) + return client.GetViewModel; + if (model.Email != null && model.Password != null && + client.Email.Equals(model.Email) && client.Password.Equals(model.Password)) + return client.GetViewModel; + if (model.Email != null && client.Email.Equals(model.Email)) + return client.GetViewModel; + } + return null; + } + public List GetFilteredList(ClientSearchModel model) + { + if (model == null) + { + return new(); + } + // У нас нет каких либо специфических условий для выборки списка клиентов, + // поэтому получаем лишь один элемент по модели + var res = GetElement(model); + return res != null ? new() { res } : new(); + } + public List GetFullList() + { + var result = new List(); + foreach (var client in _source.Clients) + { + result.Add(client.GetViewModel); + } + return result; + } + public ClientViewModel? Insert(ClientBindingModel model) + { + model.Id = 1; + foreach (var client in _source.Clients) + { + if (model.Id <= client.Id) + { + model.Id = client.Id + 1; + } + } + var res = Client.Create(model); + if (res != null) + { + _source.Clients.Add(res); + } + return res?.GetViewModel; + } + public ClientViewModel? Update(ClientBindingModel model) + { + foreach (var client in _source.Clients) + { + if (client.Id == model.Id) + { + client.Update(model); + return client.GetViewModel; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmListImplement/Implements/OrderStorage.cs b/LawFirm/LawFirmListImplement/Implements/OrderStorage.cs index eb14539..220c8ba 100644 --- a/LawFirm/LawFirmListImplement/Implements/OrderStorage.cs +++ b/LawFirm/LawFirmListImplement/Implements/OrderStorage.cs @@ -25,9 +25,17 @@ namespace LawFirmListImplement.Implements public List GetFilteredList(OrderSearchModel model) { var result = new List(); + if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) + { + return result; + } foreach (var order in _source.Orders) { - if (order.Id == model.Id || model.DateFrom <= order.DateCreate && order.DateCreate <= model.DateTo) + if (order.Id == model.Id || + model.DateFrom <= order.DateCreate && + order.DateCreate <= model.DateTo || + model.ClientId.HasValue && + order.ClientId == model.ClientId) { result.Add(GetViewModel(order)); } @@ -103,7 +111,15 @@ namespace LawFirmListImplement.Implements break; } } - return viewModel; + foreach (var client in _source.Clients) + { + if (client.Id == viewModel.ClientId) + { + viewModel.ClientFIO = client.ClientFIO; + break; + } + } + return viewModel; } } } \ No newline at end of file diff --git a/LawFirm/LawFirmListImplement/Models/Client.cs b/LawFirm/LawFirmListImplement/Models/Client.cs new file mode 100644 index 0000000..9407968 --- /dev/null +++ b/LawFirm/LawFirmListImplement/Models/Client.cs @@ -0,0 +1,50 @@ +using LawFirmContracts.BindingModels; +using LawFirmContracts.ViewModels; +using LawFirmDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LawFirmListImplement.Models +{ + public class Client : IClientModel + { + public string ClientFIO { get; private set; } = string.Empty; + public string Email { get; private set; } = string.Empty; + public string Password { get; private set; } = string.Empty; + public int Id { get; private set; } + public static Client? Create(ClientBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Id = model.Id, + ClientFIO = model.ClientFIO, + Email = model.Email, + Password = model.Password + }; + } + public void Update(ClientBindingModel model) + { + if (model == null) + { + return; + } + ClientFIO = model.ClientFIO; + Email = model.Email; + Password = model.Password; + } + public ClientViewModel GetViewModel => new() + { + Id = Id, + ClientFIO = ClientFIO, + Email = Email, + Password = Password, + }; + } +} \ No newline at end of file diff --git a/LawFirm/LawFirmListImplement/Models/Order.cs b/LawFirm/LawFirmListImplement/Models/Order.cs index 9caf2dd..b6bdf51 100644 --- a/LawFirm/LawFirmListImplement/Models/Order.cs +++ b/LawFirm/LawFirmListImplement/Models/Order.cs @@ -9,7 +9,8 @@ namespace LawFirmListImplement.Models { public int Id { get; private set; } public int DocumentId { get; private set; } - public int Count { get; private set; } + public int ClientId { get; private set; } + public int Count { get; private set; } public double Sum { get; private set; } public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; public DateTime DateCreate { get; private set; } = DateTime.Now; @@ -24,7 +25,8 @@ namespace LawFirmListImplement.Models { Id = model.Id, DocumentId = model.DocumentId, - Count = model.Count, + ClientId = model.ClientId, + Count = model.Count, Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, @@ -44,7 +46,8 @@ namespace LawFirmListImplement.Models { Id = Id, DocumentId = DocumentId, - Count = Count, + ClientId = ClientId, + Count = Count, Sum = Sum, Status = Status, DateCreate = DateCreate,