From 310f02160bc2d42ecfb66f40e755346814c6ccac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=8F=D1=80=20=D0=90=D0=B3=D0=BB?= =?UTF-8?q?=D0=B8=D1=83=D0=BB=D0=BB=D0=BE=D0=B2?= Date: Fri, 2 Feb 2024 11:10:52 +0400 Subject: [PATCH] =?UTF-8?q?1=20=D1=80=D0=B0=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...gic.csproj => EkzamenBusinessLogic.csproj} | 2 +- ConfectionaryBusinessLogic/GroupLogic.cs | 56 ++++ ConfectionaryBusinessLogic/OrderLogic.cs | 114 -------- ConfectionaryBusinessLogic/PastryLogic.cs | 112 -------- .../{ComponentLogic.cs => StudentLogic.cs} | 57 ++-- ConfectionaryListImplement/Component.cs | 41 --- .../ComponentStorage.cs | 102 ------- .../DataListSingleton.cs | 12 +- ...ent.csproj => EkzamenListImplement.csproj} | 4 +- ConfectionaryListImplement/Group.cs | 46 +++ ConfectionaryListImplement/GroupStorage.cs | 73 +++++ ConfectionaryListImplement/Order.cs | 66 ----- ConfectionaryListImplement/OrderStorage.cs | 120 -------- ConfectionaryListImplement/Pastry.cs | 49 ---- ConfectionaryListImplement/PastryStorage.cs | 108 -------- ConfectionaryListImplement/Student.cs | 53 ++++ ConfectionaryListImplement/StudentStorage.cs | 64 +++++ ...ctioneryView.csproj => EkzamenView.csproj} | 9 +- Confectionery/FormComponent.Designer.cs | 118 -------- Confectionery/FormComponent.cs | 89 ------ Confectionery/FormComponent.resx | 60 ---- Confectionery/FormComponents.Designer.cs | 121 -------- Confectionery/FormComponents.cs | 104 ------- Confectionery/FormComponents.resx | 60 ---- Confectionery/FormCreateOrder.Designer.cs | 147 ---------- Confectionery/FormCreateOrder.cs | 117 -------- Confectionery/FormCreateOrder.resx | 60 ---- Confectionery/FormMain.Designer.cs | 182 ------------ Confectionery/FormMain.cs | 157 ----------- Confectionery/FormMain.resx | 63 ----- Confectionery/FormPastry.Designer.cs | 236 ---------------- Confectionery/FormPastry.cs | 213 -------------- Confectionery/FormPastry.resx | 69 ----- Confectionery/FormPastryComponent.Designer.cs | 119 -------- Confectionery/FormPastryComponent.cs | 79 ------ Confectionery/FormPastryComponent.resx | 60 ---- Confectionery/FormViewPastry.Designer.cs | 121 -------- Confectionery/FormViewPastry.cs | 113 -------- Confectionery/FormViewPastry.resx | 60 ---- Confectionery/Program.cs | 30 +- .../BindingModels/ComponentBindingModel.cs | 11 - .../BindingModels/GroupBindingModel.cs | 12 + .../BindingModels/OrderBindingModel.cs | 16 -- .../BindingModels/PastryBindingModel.cs | 16 -- .../BindingModels/StudentBindingModel.cs | 17 ++ .../IComponentLogic.cs | 15 - .../BusinessLogicsContracts/IGroupLogic.cs | 12 + .../BusinessLogicsContracts/IOrderLogic.cs | 15 - .../BusinessLogicsContracts/IPastryLogic.cs | 15 - .../BusinessLogicsContracts/IStudentLogic.cs | 15 + ...ntracts.csproj => EkzamenContracts.csproj} | 2 +- .../SearchModels/ComponentSearchModel.cs | 8 - .../SearchModels/GroupSearchModel.cs | 8 + .../SearchModels/OrderSearchModel.cs | 7 - .../SearchModels/PastrySearchModel.cs | 8 - .../SearchModels/StudentSearchModel.cs | 11 + .../StoragesContract/IComponentStorage.cs | 16 -- .../StoragesContract/IGroupStorage.cs | 16 ++ .../StoragesContract/IOrderStorage.cs | 16 -- .../StoragesContract/IPastryStorage.cs | 16 -- .../StoragesContract/IStudentStorage.cs | 16 ++ .../ViewModels/ComponentViewModel.cs | 21 -- .../ViewModels/GroupViewModel.cs | 19 ++ .../ViewModels/OrderViewModel.cs | 36 --- .../ViewModels/PastryViewModel.cs | 24 -- .../ViewModels/StudentViewModel.cs | 22 ++ ...Models.csproj => EkzamenDataModels.csproj} | 0 ConfectioneryDataModels/IComponentModel.cs | 8 - ConfectioneryDataModels/IGroupModel.cs | 11 + ConfectioneryDataModels/IId.cs | 2 +- ConfectioneryDataModels/IOrderModel.cs | 14 - ConfectioneryDataModels/IPastryModel.cs | 9 - ConfectioneryDataModels/IStudentModel.cs | 13 + ConfectioneryDataModels/OrderStatus.cs | 11 - ConfectioneryDatabaseImplement/Component.cs | 58 ---- .../ComponentStorage.cs | 80 ------ .../ConfectioneryDatabase.cs | 14 +- ...csproj => EkzamenDatabaseImplement.csproj} | 4 +- ConfectioneryDatabaseImplement/Group.cs | 53 ++++ .../{OrderStorage.cs => GroupStorage.cs} | 39 ++- .../20230219142123_InitialCreate.cs | 125 --------- ...=> 20230228200344_create_shop.Designer.cs} | 95 ++++++- .../Migrations/20230228200344_create_shop.cs | 89 ++++++ .../20230228204422_create_shop1.Designer.cs | 262 ++++++++++++++++++ .../Migrations/20230228204422_create_shop1.cs | 112 ++++++++ .../20240202070935_Init.Designer.cs | 101 +++++++ .../Migrations/20240202070935_Init.cs | 68 +++++ .../ConfectioneryDatabaseModelSnapshot.cs | 128 ++------- ConfectioneryDatabaseImplement/Order.cs | 91 ------ ConfectioneryDatabaseImplement/Pastry.cs | 103 ------- .../PastryComponent.cs | 18 -- .../PastryStorage.cs | 104 ------- ConfectioneryDatabaseImplement/Student.cs | 57 ++++ .../StudentStorage.cs | 77 +++++ Confectionery.sln => Ekzamen.sln | 18 +- .../ConfectioneryBusinessLogic.dll | Bin 0 -> 77312 bytes .../ConfectioneryContracts.dll | Bin 0 -> 37888 bytes .../ConfectioneryDataModels.dll | Bin 0 -> 6656 bytes .../ConfectioneryDatabaseImplement.dll | Bin 0 -> 112640 bytes .../ConfectioneryFileImplement.dll | Bin 0 -> 50176 bytes .../ConfectioneryListImplement.dll | Bin 0 -> 30720 bytes 101 files changed, 1480 insertions(+), 4140 deletions(-) rename ConfectionaryBusinessLogic/{ConfectioneryBusinessLogic.csproj => EkzamenBusinessLogic.csproj} (79%) create mode 100644 ConfectionaryBusinessLogic/GroupLogic.cs delete mode 100644 ConfectionaryBusinessLogic/OrderLogic.cs delete mode 100644 ConfectionaryBusinessLogic/PastryLogic.cs rename ConfectionaryBusinessLogic/{ComponentLogic.cs => StudentLogic.cs} (53%) delete mode 100644 ConfectionaryListImplement/Component.cs delete mode 100644 ConfectionaryListImplement/ComponentStorage.cs rename ConfectionaryListImplement/{ConfectioneryListImplement.csproj => EkzamenListImplement.csproj} (56%) create mode 100644 ConfectionaryListImplement/Group.cs create mode 100644 ConfectionaryListImplement/GroupStorage.cs delete mode 100644 ConfectionaryListImplement/Order.cs delete mode 100644 ConfectionaryListImplement/OrderStorage.cs delete mode 100644 ConfectionaryListImplement/Pastry.cs delete mode 100644 ConfectionaryListImplement/PastryStorage.cs create mode 100644 ConfectionaryListImplement/Student.cs create mode 100644 ConfectionaryListImplement/StudentStorage.cs rename Confectionery/{ConfectioneryView.csproj => EkzamenView.csproj} (65%) delete mode 100644 Confectionery/FormComponent.Designer.cs delete mode 100644 Confectionery/FormComponent.cs delete mode 100644 Confectionery/FormComponent.resx delete mode 100644 Confectionery/FormComponents.Designer.cs delete mode 100644 Confectionery/FormComponents.cs delete mode 100644 Confectionery/FormComponents.resx delete mode 100644 Confectionery/FormCreateOrder.Designer.cs delete mode 100644 Confectionery/FormCreateOrder.cs delete mode 100644 Confectionery/FormCreateOrder.resx delete mode 100644 Confectionery/FormMain.Designer.cs delete mode 100644 Confectionery/FormMain.cs delete mode 100644 Confectionery/FormMain.resx delete mode 100644 Confectionery/FormPastry.Designer.cs delete mode 100644 Confectionery/FormPastry.cs delete mode 100644 Confectionery/FormPastry.resx delete mode 100644 Confectionery/FormPastryComponent.Designer.cs delete mode 100644 Confectionery/FormPastryComponent.cs delete mode 100644 Confectionery/FormPastryComponent.resx delete mode 100644 Confectionery/FormViewPastry.Designer.cs delete mode 100644 Confectionery/FormViewPastry.cs delete mode 100644 Confectionery/FormViewPastry.resx delete mode 100644 ConfectioneryContracts/BindingModels/ComponentBindingModel.cs create mode 100644 ConfectioneryContracts/BindingModels/GroupBindingModel.cs delete mode 100644 ConfectioneryContracts/BindingModels/OrderBindingModel.cs delete mode 100644 ConfectioneryContracts/BindingModels/PastryBindingModel.cs create mode 100644 ConfectioneryContracts/BindingModels/StudentBindingModel.cs delete mode 100644 ConfectioneryContracts/BusinessLogicsContracts/IComponentLogic.cs create mode 100644 ConfectioneryContracts/BusinessLogicsContracts/IGroupLogic.cs delete mode 100644 ConfectioneryContracts/BusinessLogicsContracts/IOrderLogic.cs delete mode 100644 ConfectioneryContracts/BusinessLogicsContracts/IPastryLogic.cs create mode 100644 ConfectioneryContracts/BusinessLogicsContracts/IStudentLogic.cs rename ConfectioneryContracts/{ConfectioneryContracts.csproj => EkzamenContracts.csproj} (71%) delete mode 100644 ConfectioneryContracts/SearchModels/ComponentSearchModel.cs create mode 100644 ConfectioneryContracts/SearchModels/GroupSearchModel.cs delete mode 100644 ConfectioneryContracts/SearchModels/OrderSearchModel.cs delete mode 100644 ConfectioneryContracts/SearchModels/PastrySearchModel.cs create mode 100644 ConfectioneryContracts/SearchModels/StudentSearchModel.cs delete mode 100644 ConfectioneryContracts/StoragesContract/IComponentStorage.cs create mode 100644 ConfectioneryContracts/StoragesContract/IGroupStorage.cs delete mode 100644 ConfectioneryContracts/StoragesContract/IOrderStorage.cs delete mode 100644 ConfectioneryContracts/StoragesContract/IPastryStorage.cs create mode 100644 ConfectioneryContracts/StoragesContract/IStudentStorage.cs delete mode 100644 ConfectioneryContracts/ViewModels/ComponentViewModel.cs create mode 100644 ConfectioneryContracts/ViewModels/GroupViewModel.cs delete mode 100644 ConfectioneryContracts/ViewModels/OrderViewModel.cs delete mode 100644 ConfectioneryContracts/ViewModels/PastryViewModel.cs create mode 100644 ConfectioneryContracts/ViewModels/StudentViewModel.cs rename ConfectioneryDataModels/{ConfectioneryDataModels.csproj => EkzamenDataModels.csproj} (100%) delete mode 100644 ConfectioneryDataModels/IComponentModel.cs create mode 100644 ConfectioneryDataModels/IGroupModel.cs delete mode 100644 ConfectioneryDataModels/IOrderModel.cs delete mode 100644 ConfectioneryDataModels/IPastryModel.cs create mode 100644 ConfectioneryDataModels/IStudentModel.cs delete mode 100644 ConfectioneryDataModels/OrderStatus.cs delete mode 100644 ConfectioneryDatabaseImplement/Component.cs delete mode 100644 ConfectioneryDatabaseImplement/ComponentStorage.cs rename ConfectioneryDatabaseImplement/{ConfectioneryDatabaseImplement.csproj => EkzamenDatabaseImplement.csproj} (79%) create mode 100644 ConfectioneryDatabaseImplement/Group.cs rename ConfectioneryDatabaseImplement/{OrderStorage.cs => GroupStorage.cs} (56%) delete mode 100644 ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.cs rename ConfectioneryDatabaseImplement/Migrations/{20230219142123_InitialCreate.Designer.cs => 20230228200344_create_shop.Designer.cs} (64%) create mode 100644 ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.cs create mode 100644 ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.Designer.cs create mode 100644 ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.cs create mode 100644 ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.Designer.cs create mode 100644 ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.cs delete mode 100644 ConfectioneryDatabaseImplement/Order.cs delete mode 100644 ConfectioneryDatabaseImplement/Pastry.cs delete mode 100644 ConfectioneryDatabaseImplement/PastryComponent.cs delete mode 100644 ConfectioneryDatabaseImplement/PastryStorage.cs create mode 100644 ConfectioneryDatabaseImplement/Student.cs create mode 100644 ConfectioneryDatabaseImplement/StudentStorage.cs rename Confectionery.sln => Ekzamen.sln (62%) create mode 100644 ImplementationExtensions/ConfectioneryBusinessLogic.dll create mode 100644 ImplementationExtensions/ConfectioneryContracts.dll create mode 100644 ImplementationExtensions/ConfectioneryDataModels.dll create mode 100644 ImplementationExtensions/ConfectioneryDatabaseImplement.dll create mode 100644 ImplementationExtensions/ConfectioneryFileImplement.dll create mode 100644 ImplementationExtensions/ConfectioneryListImplement.dll diff --git a/ConfectionaryBusinessLogic/ConfectioneryBusinessLogic.csproj b/ConfectionaryBusinessLogic/EkzamenBusinessLogic.csproj similarity index 79% rename from ConfectionaryBusinessLogic/ConfectioneryBusinessLogic.csproj rename to ConfectionaryBusinessLogic/EkzamenBusinessLogic.csproj index 7aee55c..5b4bd62 100644 --- a/ConfectionaryBusinessLogic/ConfectioneryBusinessLogic.csproj +++ b/ConfectionaryBusinessLogic/EkzamenBusinessLogic.csproj @@ -11,7 +11,7 @@ - + diff --git a/ConfectionaryBusinessLogic/GroupLogic.cs b/ConfectionaryBusinessLogic/GroupLogic.cs new file mode 100644 index 0000000..42173ff --- /dev/null +++ b/ConfectionaryBusinessLogic/GroupLogic.cs @@ -0,0 +1,56 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.BusinessLogicsContracts; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace EkzamenBusinessLogic +{ + public class GroupLogic : IGroupLogic + { + private readonly ILogger _logger; + private readonly IGroupStorage _orderStorage; + + public GroupLogic(ILogger logger, IGroupStorage orderStorage) + { + _logger = logger; + _orderStorage = orderStorage; + } + + public bool CreateGroup(GroupBindingModel model) + { + CheckModel(model); + if (_orderStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public List? ReadList(GroupSearchModel? model) + { + _logger.LogInformation("ReadList. OrderName.Id:{ Id} ", model?.Id); + var list = (model == null) ? _orderStorage.GetFullList() : + _orderStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + private bool CheckModel(GroupBindingModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + return true; + } + } +} diff --git a/ConfectionaryBusinessLogic/OrderLogic.cs b/ConfectionaryBusinessLogic/OrderLogic.cs deleted file mode 100644 index 1471185..0000000 --- a/ConfectionaryBusinessLogic/OrderLogic.cs +++ /dev/null @@ -1,114 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDataModels.Enums; -using Microsoft.Extensions.Logging; - -namespace ConfectioneryBusinessLogic.BusinessLogics -{ - public class OrderLogic : IOrderLogic - { - private readonly ILogger _logger; - private readonly IOrderStorage _orderStorage; - - public OrderLogic(ILogger logger, IOrderStorage orderStorage) - { - _logger = logger; - _orderStorage = orderStorage; - } - - public bool CreateOrder(OrderBindingModel model) - { - CheckModel(model); - if (model.Status != OrderStatus.Неизвестен) - { - throw new ArgumentException( - $"Статус заказа должен быть {OrderStatus.Неизвестен}", nameof(model)); - } - model.Status = OrderStatus.Принят; - model.DateCreate = DateTime.Now; - if (_orderStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } - - public bool TakeOrderInWork(OrderBindingModel model) => SetOrderStatus(model, OrderStatus.Выполняется); - public bool DeliveryOrder(OrderBindingModel model) => SetOrderStatus(model, OrderStatus.Выдан); - public bool FinishOrder(OrderBindingModel model) - { - model.DateImplement = DateTime.Now; - return SetOrderStatus(model, OrderStatus.Готов); - } - - public List? ReadList(OrderSearchModel? model) - { - _logger.LogInformation("ReadList. OrderName.Id:{ Id} ", model?.Id); - var list = (model == null) ? _orderStorage.GetFullList() : - _orderStorage.GetFilteredList(model); - if (list == null) - { - _logger.LogWarning("ReadList return null list"); - return null; - } - _logger.LogInformation("ReadList. Count:{Count}", list.Count); - return list; - } - - private bool CheckModel(OrderBindingModel model) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (model.Count <= 0) - { - throw new ArgumentException("Количество изделий в заказе должно быть больше 0", nameof(model.Count)); - } - if (model.Sum <= 0) - { - throw new ArgumentException("Суммарная стоимость заказа должна быть больше 0", nameof(model.Sum)); - } - if (model.DateCreate > model.DateImplement) - { - throw new ArgumentException("Время создания заказа не может быть больше времени его выполнения", nameof(model.DateImplement)); - } - return true; - } - - private bool SetOrderStatus(OrderBindingModel model, OrderStatus orderStatus) - { - // Находим статус заказа по его айди - var vmodel = _orderStorage.GetElement(new() { Id = model.Id }); - if (vmodel == null) - { - throw new ArgumentNullException(nameof(model)); - } - if ((int)vmodel.Status + 1 != (int)orderStatus) - { - throw new ArgumentException($"Попытка перевести заказ не в следующий статус: " + - $"Текущий статус: {vmodel.Status} \n" + - $"Планируемый статус: {orderStatus} \n" + - $"Доступный статус: {(OrderStatus)((int)vmodel.Status + 1)}", - nameof(vmodel)); - } - model.Status = orderStatus; - model.DateCreate = vmodel.DateCreate; - if (model.DateImplement == null) - model.DateImplement = vmodel.DateImplement; - model.PastryId = vmodel.PastryId; - model.Sum = vmodel.Sum; - model.Count= vmodel.Count; - if (_orderStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } - } -} diff --git a/ConfectionaryBusinessLogic/PastryLogic.cs b/ConfectionaryBusinessLogic/PastryLogic.cs deleted file mode 100644 index 042d5c9..0000000 --- a/ConfectionaryBusinessLogic/PastryLogic.cs +++ /dev/null @@ -1,112 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using Microsoft.Extensions.Logging; - -namespace ConfectioneryBusinessLogic.BusinessLogics -{ - public class PastryLogic : IPastryLogic - { - private readonly ILogger _logger; - private readonly IPastryStorage _pastryStorage; - public PastryLogic(ILogger logger, IPastryStorage pastryStorage) - { - _logger = logger; - _pastryStorage = pastryStorage; - } - public List? ReadList(PastrySearchModel? model) - { - _logger.LogInformation("ReadList. PastryName:{PastryName}.Id:{ Id} ", - model?.PastryName, model?.Id); - var list = (model == null) ? _pastryStorage.GetFullList() : - _pastryStorage.GetFilteredList(model); - if (list == null) - { - _logger.LogWarning("ReadList return null list"); - return null; - } - _logger.LogInformation("ReadList. Count:{Count}", list.Count); - return list; - } - public PastryViewModel? ReadElement(PastrySearchModel model) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - _logger.LogInformation("ReadElement. PastryName:{PastryName}.Id:{ Id}", - model.PastryName, model.Id); - var element = _pastryStorage.GetElement(model); - if (element == null) - { - _logger.LogWarning("ReadElement element not found"); - return null; - } - _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); - return element; - } - public bool Create(PastryBindingModel model) - { - CheckModel(model); - if (_pastryStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } - public bool Update(PastryBindingModel model) - { - CheckModel(model); - if (_pastryStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } - public bool Delete(PastryBindingModel model) - { - CheckModel(model, false); - _logger.LogInformation("Delete. Id:{Id}", model.Id); - if (_pastryStorage.Delete(model) == null) - { - _logger.LogWarning("Delete operation failed"); - return false; - } - return true; - } - private void CheckModel(PastryBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (string.IsNullOrEmpty(model.PastryName)) - { - throw new ArgumentNullException("Нет названия кондитерского изделия", - nameof(model.PastryName)); - } - if (model.Price <= 0) - { - throw new ArgumentNullException("Цена кондитерского изделия должна быть больше 0", nameof(model.Price)); - } - _logger.LogInformation("Pastry. PastryName:{PastryName}.Cost:{ Cost}. Id: { Id}", - model.PastryName, model.Price, model.Id); - var element = _pastryStorage.GetElement(new PastrySearchModel - { - PastryName = model.PastryName - }); - if (element != null && element.Id != model.Id) - { - throw new InvalidOperationException("Кондитерское изделие с таким названием уже есть"); - } - } - } -} diff --git a/ConfectionaryBusinessLogic/ComponentLogic.cs b/ConfectionaryBusinessLogic/StudentLogic.cs similarity index 53% rename from ConfectionaryBusinessLogic/ComponentLogic.cs rename to ConfectionaryBusinessLogic/StudentLogic.cs index 27e25ab..1d8b44a 100644 --- a/ConfectionaryBusinessLogic/ComponentLogic.cs +++ b/ConfectionaryBusinessLogic/StudentLogic.cs @@ -1,25 +1,25 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; +using EkzamenContracts.BindingModels; +using EkzamenContracts.BusinessLogicsContracts; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; using Microsoft.Extensions.Logging; -namespace ConfectioneryBusinessLogic.BusinessLogics +namespace EkzamenBusinessLogic { - public class ComponentLogic : IComponentLogic + public class StudentLogic : IStudentLogic { private readonly ILogger _logger; - private readonly IComponentStorage _componentStorage; - public ComponentLogic(ILogger logger, IComponentStorage componentStorage) + private readonly IStudentStorage _componentStorage; + public StudentLogic(ILogger logger, IStudentStorage componentStorage) { _logger = logger; _componentStorage = componentStorage; } - public List? ReadList(ComponentSearchModel? model) + public List? ReadList(StudentSearchModel? model) { _logger.LogInformation("ReadList. ComponentName:{ComponentName}.Id:{ Id} ", - model?.ComponentName, model?.Id); + model?.CreatedDateFrom, model?.Id); var list = (model == null) ? _componentStorage.GetFullList() : _componentStorage.GetFilteredList(model); if (list == null) @@ -30,14 +30,14 @@ namespace ConfectioneryBusinessLogic.BusinessLogics _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; } - public ComponentViewModel? ReadElement(ComponentSearchModel model) + public StudentViewModel? ReadElement(StudentSearchModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } _logger.LogInformation("ReadElement. ComponentName:{ComponentName}.Id:{ Id}", - model.ComponentName, model.Id); + model.CreatedDateFrom, model.Id); var element = _componentStorage.GetElement(model); if (element == null) { @@ -47,7 +47,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); return element; } - public bool Create(ComponentBindingModel model) + public bool Create(StudentBindingModel model) { CheckModel(model); if (_componentStorage.Insert(model) == null) @@ -57,7 +57,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics } return true; } - public bool Update(ComponentBindingModel model) + public bool Update(StudentBindingModel model) { CheckModel(model); if (_componentStorage.Update(model) == null) @@ -67,7 +67,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics } return true; } - public bool Delete(ComponentBindingModel model) + public bool Delete(StudentBindingModel model) { CheckModel(model, false); _logger.LogInformation("Delete. Id:{Id}", model.Id); @@ -78,36 +78,19 @@ namespace ConfectioneryBusinessLogic.BusinessLogics } return true; } - private void CheckModel(ComponentBindingModel model, bool withParams = - true) + + private void CheckModel(StudentBindingModel model, bool withParams = + true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } + if (!withParams) { return; } - if (string.IsNullOrEmpty(model.ComponentName)) - { - throw new ArgumentNullException("Нет названия компонента", - nameof(model.ComponentName)); - } - if (model.Cost <= 0) - { - throw new ArgumentNullException("Цена компонента должна быть больше 0", nameof(model.Cost)); - } - _logger.LogInformation("Component. ComponentName:{ComponentName}.Cost:{ Cost}. Id: { Id}", - model.ComponentName, model.Cost, model.Id); - var element = _componentStorage.GetElement(new ComponentSearchModel - { - ComponentName = model.ComponentName - }); - if (element != null && element.Id != model.Id) - { - throw new InvalidOperationException("Компонент с таким названием уже есть"); - } } } } \ No newline at end of file diff --git a/ConfectionaryListImplement/Component.cs b/ConfectionaryListImplement/Component.cs deleted file mode 100644 index 008ac97..0000000 --- a/ConfectionaryListImplement/Component.cs +++ /dev/null @@ -1,41 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDataModels.Models; - -namespace ConfectioneryListImplement.Models -{ - public class Component : IComponentModel - { - public int Id { get; private set; } - public string ComponentName { get; private set; } = string.Empty; - public double Cost { get; set; } - public static Component? Create(ComponentBindingModel? model) - { - if (model == null) - { - return null; - } - return new Component() - { - Id = model.Id, - ComponentName = model.ComponentName, - Cost = model.Cost - }; - } - public void Update(ComponentBindingModel? model) - { - if (model == null) - { - return; - } - ComponentName = model.ComponentName; - Cost = model.Cost; - } - public ComponentViewModel GetViewModel => new() - { - Id = Id, - ComponentName = ComponentName, - Cost = Cost - }; - } -} \ No newline at end of file diff --git a/ConfectionaryListImplement/ComponentStorage.cs b/ConfectionaryListImplement/ComponentStorage.cs deleted file mode 100644 index fe845ab..0000000 --- a/ConfectionaryListImplement/ComponentStorage.cs +++ /dev/null @@ -1,102 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryListImplement.Models; - -namespace ConfectioneryListImplement.Implements -{ - public class ComponentStorage : IComponentStorage - { - private readonly DataListSingleton _source; - public ComponentStorage() - { - _source = DataListSingleton.GetInstance(); - } - public List GetFullList() - { - var result = new List(); - foreach (var component in _source.Components) - { - result.Add(component.GetViewModel); - } - return result; - } - public List GetFilteredList(ComponentSearchModel model) - { - var result = new List(); - if (string.IsNullOrEmpty(model.ComponentName)) - { - return result; - } - foreach (var component in _source.Components) - { - if (component.ComponentName.Contains(model.ComponentName)) - { - result.Add(component.GetViewModel); - } - } - return result; - } - public ComponentViewModel? GetElement(ComponentSearchModel model) - { - if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue) - { - return null; - } - foreach (var component in _source.Components) - { - if ((!string.IsNullOrEmpty(model.ComponentName) && - component.ComponentName == model.ComponentName) || - (model.Id.HasValue && component.Id == model.Id)) - { - return component.GetViewModel; - } - } - return null; - } - public ComponentViewModel? Insert(ComponentBindingModel model) - { - model.Id = 1; - foreach (var component in _source.Components) - { - if (model.Id <= component.Id) - { - model.Id = component.Id + 1; - } - } - var newComponent = Component.Create(model); - if (newComponent == null) - { - return null; - } - _source.Components.Add(newComponent); - return newComponent.GetViewModel; - } - public ComponentViewModel? Update(ComponentBindingModel model) - { - foreach (var component in _source.Components) - { - if (component.Id == model.Id) - { - component.Update(model); - return component.GetViewModel; - } - } - return null; - } - public ComponentViewModel? Delete(ComponentBindingModel model) - { - for (int i = 0; i < _source.Components.Count; ++i) - { - if (_source.Components[i].Id == model.Id) - { - var element = _source.Components[i]; - _source.Components.RemoveAt(i); - return element.GetViewModel; - } - } - return null; - } - } -} \ No newline at end of file diff --git a/ConfectionaryListImplement/DataListSingleton.cs b/ConfectionaryListImplement/DataListSingleton.cs index 24ae616..efcc2c6 100644 --- a/ConfectionaryListImplement/DataListSingleton.cs +++ b/ConfectionaryListImplement/DataListSingleton.cs @@ -1,18 +1,16 @@ -using ConfectioneryListImplement.Models; +using EkzamenListImplement; namespace ConfectioneryListImplement { public class DataListSingleton { private static DataListSingleton? _instance; - public List Components { get; set; } - public List Orders { get; set; } - public List Pastry { get; set; } + public List Students { get; set; } + public List Groups { get; set; } private DataListSingleton() { - Components = new List(); - Orders = new List(); - Pastry = new List(); + Students = new List(); + Groups = new (); } public static DataListSingleton GetInstance() { diff --git a/ConfectionaryListImplement/ConfectioneryListImplement.csproj b/ConfectionaryListImplement/EkzamenListImplement.csproj similarity index 56% rename from ConfectionaryListImplement/ConfectioneryListImplement.csproj rename to ConfectionaryListImplement/EkzamenListImplement.csproj index 41b6c3e..441ca24 100644 --- a/ConfectionaryListImplement/ConfectioneryListImplement.csproj +++ b/ConfectionaryListImplement/EkzamenListImplement.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/ConfectionaryListImplement/Group.cs b/ConfectionaryListImplement/Group.cs new file mode 100644 index 0000000..e5bb917 --- /dev/null +++ b/ConfectionaryListImplement/Group.cs @@ -0,0 +1,46 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.ViewModels; +using EkzamenDataModels; + +namespace EkzamenListImplement +{ + public class Group : IGroupModel + { + public int Id { get; private set; } + + public static Group? Create(GroupBindingModel? model) + { + if (model == null) + { + return null; + } + return new Group() + { + Name = model.Name, + Direction = model.Direction, + Created = model.Created, + Id = model.Id, + }; + } + public void Update(GroupBindingModel? model) + { + if (model == null) + { + return; + } + Direction = model.Direction; + Id = model.Id; + } + public GroupViewModel GetViewModel => new() + { + Name = Name, + Direction = Direction, + Created = Created, + Id = Id, + }; + + public string Name { get; set; } + public string Direction { get; set; } + public DateTime Created { get; set; } + } +} diff --git a/ConfectionaryListImplement/GroupStorage.cs b/ConfectionaryListImplement/GroupStorage.cs new file mode 100644 index 0000000..f897621 --- /dev/null +++ b/ConfectionaryListImplement/GroupStorage.cs @@ -0,0 +1,73 @@ +using ConfectioneryListImplement; +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; + +namespace EkzamenListImplement +{ + public class GroupStorage : IGroupStorage + { + private readonly DataListSingleton _source; + public GroupStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public GroupViewModel? Delete(GroupBindingModel model) + { + var group = _source.Groups.FirstOrDefault(x => x.Id == model.Id); + if (group != null) + { + _source.Groups.Remove(group); + } + return group?.GetViewModel; + } + + public GroupViewModel? GetElement(GroupSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + + return _source.Groups.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + } + + public List GetFilteredList(GroupSearchModel model) + { + var result = new List(); + if (!model.Id.HasValue) + { + return result; + } + + return new() { GetElement(model) }; + } + + public List GetFullList() + { + return _source.Groups.Select(x => x.GetViewModel).ToList(); + } + + public GroupViewModel? Insert(GroupBindingModel model) + { + model.Id = _source.Groups.Max(x => x.Id); + var newOrder = Group.Create(model); + if (newOrder == null) + { + return null; + } + _source.Groups.Add(newOrder); + return newOrder.GetViewModel; + } + + public GroupViewModel? Update(GroupBindingModel model) + { + var group = _source.Groups.FirstOrDefault(x => x.Id == model.Id); + group?.Update(model); + return group?.GetViewModel; + return null; + } + } +} diff --git a/ConfectionaryListImplement/Order.cs b/ConfectionaryListImplement/Order.cs deleted file mode 100644 index a6e154f..0000000 --- a/ConfectionaryListImplement/Order.cs +++ /dev/null @@ -1,66 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDataModels.Enums; -using ConfectioneryDataModels.Models; - -namespace ConfectioneryListImplement.Models -{ - public class Order : IOrderModel - { - public int Id { get; private set; } - - public int PastryId { get; private set; } - - public int Count { get; private set; } - - public double Sum { get; private set; } - - public OrderStatus Status { get; private set; } - - public DateTime DateCreate { get; private set; } - - public DateTime? DateImplement { get; private set; } - - public static Order? Create(OrderBindingModel? model) - { - if (model == null) - { - return null; - } - return new Order() - { - PastryId = model.PastryId, - Count = model.Count, - Sum = model.Sum, - Status = model.Status, - DateCreate = model.DateCreate, - DateImplement = model.DateImplement, - Id = model.Id, - }; - } - public void Update(OrderBindingModel? model) - { - if (model == null) - { - return; - } - PastryId = model.PastryId; - Count = model.Count; - Sum = model.Sum; - Status = model.Status; - DateCreate = model.DateCreate; - DateImplement = model.DateImplement; - Id = model.Id; - } - public OrderViewModel GetViewModel => new() - { - PastryId = PastryId, - Count = Count, - Sum = Sum, - Status = Status, - DateCreate = DateCreate, - DateImplement = DateImplement, - Id = Id, - }; - } -} diff --git a/ConfectionaryListImplement/OrderStorage.cs b/ConfectionaryListImplement/OrderStorage.cs deleted file mode 100644 index d6a964e..0000000 --- a/ConfectionaryListImplement/OrderStorage.cs +++ /dev/null @@ -1,120 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryListImplement.Models; - -namespace ConfectioneryListImplement -{ - public class OrderStorage : IOrderStorage - { - private readonly DataListSingleton _source; - public OrderStorage() - { - _source = DataListSingleton.GetInstance(); - } - - public OrderViewModel? Delete(OrderBindingModel model) - { - for (int i = 0; i < _source.Orders.Count; ++i) - { - if (_source.Orders[i].Id == model.Id) - { - var element = _source.Orders[i]; - _source.Orders.RemoveAt(i); - return element.GetViewModel; - } - } - return null; - } - - public OrderViewModel? GetElement(OrderSearchModel model) - { - if (!model.Id.HasValue) - { - return null; - } - foreach (var order in _source.Orders) - { - if (model.Id.HasValue && order.Id == model.Id) - { - return GetViewModel(order); - } - } - return null; - } - - public List GetFilteredList(OrderSearchModel model) - { - var result = new List(); - if (!model.Id.HasValue) - { - return result; - } - foreach (var order in _source.Orders) - { - if (order.Id == model.Id) - { - return new() { GetViewModel(order) }; - } - } - return new(); - } - - public List GetFullList() - { - var result = new List(); - foreach (var order in _source.Orders) - { - result.Add(GetViewModel(order)); - } - return result; - } - - public OrderViewModel? Insert(OrderBindingModel model) - { - model.Id = 1; - foreach (var order in _source.Orders) - { - if (model.Id <= order.Id) - { - model.Id = order.Id + 1; - } - } - var newOrder = Order.Create(model); - if (newOrder == null) - { - return null; - } - _source.Orders.Add(newOrder); - return newOrder.GetViewModel; - } - - public OrderViewModel? Update(OrderBindingModel model) - { - foreach (var order in _source.Orders) - { - if (order.Id == model.Id) - { - order.Update(model); - return order.GetViewModel; - } - } - return null; - } - - private OrderViewModel GetViewModel(Order model) - { - var res = model.GetViewModel; - foreach (var pastry in _source.Pastry) - { - if (pastry.Id == model.PastryId) - { - res.PastryName = pastry.PastryName; - break; - } - } - return res; - } - } -} diff --git a/ConfectionaryListImplement/Pastry.cs b/ConfectionaryListImplement/Pastry.cs deleted file mode 100644 index 28c593b..0000000 --- a/ConfectionaryListImplement/Pastry.cs +++ /dev/null @@ -1,49 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDataModels.Models; - -namespace ConfectioneryListImplement.Models -{ - public class Pastry : IPastryModel - { - public int Id { get; private set; } - public string PastryName { get; private set; } = string.Empty; - public double Price { get; private set; } - public Dictionary PastryComponents - { - get; - private set; - } = new Dictionary(); - public static Pastry? Create(PastryBindingModel? model) - { - if (model == null) - { - return null; - } - return new Pastry() - { - Id = model.Id, - PastryName = model.PastryName, - Price = model.Price, - PastryComponents = model.PastryComponents - }; - } - public void Update(PastryBindingModel? model) - { - if (model == null) - { - return; - } - PastryName = model.PastryName; - Price = model.Price; - PastryComponents = model.PastryComponents; - } - public PastryViewModel GetViewModel => new() - { - Id = Id, - PastryName = PastryName, - Price = Price, - PastryComponents = PastryComponents - }; - } -} \ No newline at end of file diff --git a/ConfectionaryListImplement/PastryStorage.cs b/ConfectionaryListImplement/PastryStorage.cs deleted file mode 100644 index 0fab514..0000000 --- a/ConfectionaryListImplement/PastryStorage.cs +++ /dev/null @@ -1,108 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryListImplement.Models; - -namespace ConfectioneryListImplement -{ - public class PastryStorage : IPastryStorage - { - private readonly DataListSingleton _source; - public PastryStorage() - { - _source = DataListSingleton.GetInstance(); - } - - public PastryViewModel? Delete(PastryBindingModel model) - { - for (int i = 0; i < _source.Pastry.Count; ++i) - { - if (_source.Pastry[i].Id == model.Id) - { - var element = _source.Pastry[i]; - _source.Pastry.RemoveAt(i); - return element.GetViewModel; - } - } - return null; - } - - public PastryViewModel? GetElement(PastrySearchModel model) - { - if (string.IsNullOrEmpty(model.PastryName) && !model.Id.HasValue) - { - return null; - } - foreach (var pastry in _source.Pastry) - { - if ((!string.IsNullOrEmpty(model.PastryName) && - pastry.PastryName == model.PastryName) || - (model.Id.HasValue && pastry.Id == model.Id)) - { - return pastry.GetViewModel; - } - } - return null; - } - - public List GetFilteredList(PastrySearchModel model) - { - var result = new List(); - if (string.IsNullOrEmpty(model.PastryName)) - { - return result; - } - foreach (var pastry in _source.Pastry) - { - if (pastry.PastryName.Contains(model.PastryName ?? string.Empty)) - { - result.Add(pastry.GetViewModel); - } - } - return result; - } - - public List GetFullList() - { - var result = new List(); - foreach (var pastry in _source.Pastry) - { - result.Add(pastry.GetViewModel); - } - return result; - } - - public PastryViewModel? Insert(PastryBindingModel model) - { - model.Id = 1; - foreach (var pastry in _source.Pastry) - { - if (model.Id <= pastry.Id) - { - model.Id = pastry.Id + 1; - } - } - var newPastry = Pastry.Create(model); - if (newPastry == null) - { - return null; - } - _source.Pastry.Add(newPastry); - return newPastry.GetViewModel; - } - - public PastryViewModel? Update(PastryBindingModel model) - { - foreach (var pastry in _source.Pastry) - { - if (pastry.Id == model.Id) - { - pastry.Update(model); - return pastry.GetViewModel; - } - } - return null; - } - } -} diff --git a/ConfectionaryListImplement/Student.cs b/ConfectionaryListImplement/Student.cs new file mode 100644 index 0000000..9daed65 --- /dev/null +++ b/ConfectionaryListImplement/Student.cs @@ -0,0 +1,53 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.ViewModels; +using EkzamenDataModels; + +namespace EkzamenListImplement +{ + public class Student : IStudentModel + { + public int Id { get; private set; } + public static Student? Create(StudentBindingModel? model) + { + if (model == null) + { + return null; + } + return new Student() + { + Id = model.Id, + fio = model.fio, + DateEnrollment = model.DateEnrollment, + GroupId = model.GroupId, + PassMark = model.PassMark, + RecordBookId = model.RecordBookId, + }; + } + public void Update(StudentBindingModel? model) + { + if (model == null) + { + return; + } + + fio = model.fio; + + } + public StudentViewModel GetViewModel => new() + { + Id = Id, + fio = fio, + DateEnrollment = DateEnrollment, + GroupId = GroupId, + PassMark = PassMark, + RecordBookId = RecordBookId, + + }; + + public string fio { get; set; } = string.Empty; + public int GroupId { get; set; } + public int RecordBookId { get; set; } + public int PassMark { get; set; } + public DateTime DateEnrollment { get; set; } + } +} \ No newline at end of file diff --git a/ConfectionaryListImplement/StudentStorage.cs b/ConfectionaryListImplement/StudentStorage.cs new file mode 100644 index 0000000..31e1934 --- /dev/null +++ b/ConfectionaryListImplement/StudentStorage.cs @@ -0,0 +1,64 @@ +using ConfectioneryListImplement; +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; + +namespace EkzamenListImplement +{ + public class StudentStorage : IStudentStorage + { + private readonly DataListSingleton _source = DataListSingleton.GetInstance(); + + public List GetFullList() + { + return _source.Students.Select(x => x.GetViewModel).ToList(); + } + public List GetFilteredList(StudentSearchModel model) + { + var result = new List(); + if (model.CreatedDateFrom is null || model.CreatedDateTo is null) + { + return result; + } + return _source.Students.Where(x => model.CreatedDateFrom <= x.DateEnrollment && x.DateEnrollment <= model.CreatedDateTo).Select(x => x.GetViewModel).ToList(); + } + public StudentViewModel? GetElement(StudentSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + return _source.Students.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + } + public StudentViewModel? Insert(StudentBindingModel model) + { + model.Id = _source.Students.Max(x => x.Id); + var newComponent = Student.Create(model); + if (newComponent == null) + { + return null; + } + _source.Students.Add(newComponent); + return newComponent.GetViewModel; + } + public StudentViewModel? Update(StudentBindingModel model) + { + var student = _source.Students.FirstOrDefault(x => x.Id == model.Id); + if (student != null) + { + student.Update(model); + } + return student?.GetViewModel; + } + public StudentViewModel? Delete(StudentBindingModel model) + { + var student = _source.Students.FirstOrDefault(x => x.Id == model.Id); + if (student != null) + { + _source.Students.Remove(student); + } + return student?.GetViewModel; + } + } +} \ No newline at end of file diff --git a/Confectionery/ConfectioneryView.csproj b/Confectionery/EkzamenView.csproj similarity index 65% rename from Confectionery/ConfectioneryView.csproj rename to Confectionery/EkzamenView.csproj index eaec16f..2f94a42 100644 --- a/Confectionery/ConfectioneryView.csproj +++ b/Confectionery/EkzamenView.csproj @@ -18,11 +18,10 @@ - - - - - + + + + \ No newline at end of file diff --git a/Confectionery/FormComponent.Designer.cs b/Confectionery/FormComponent.Designer.cs deleted file mode 100644 index 5d51eab..0000000 --- a/Confectionery/FormComponent.Designer.cs +++ /dev/null @@ -1,118 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormComponent - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.textBoxName = new System.Windows.Forms.TextBox(); - this.textBoxCost = new System.Windows.Forms.TextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSave = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(62, 15); - this.label1.TabIndex = 0; - this.label1.Text = "Название:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(36, 37); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(38, 15); - this.label2.TabIndex = 1; - this.label2.Text = "Цена:"; - // - // textBoxName - // - this.textBoxName.Location = new System.Drawing.Point(80, 6); - this.textBoxName.Name = "textBoxName"; - this.textBoxName.Size = new System.Drawing.Size(292, 23); - this.textBoxName.TabIndex = 2; - // - // textBoxCost - // - this.textBoxCost.Location = new System.Drawing.Point(80, 35); - this.textBoxCost.Name = "textBoxCost"; - this.textBoxCost.Size = new System.Drawing.Size(149, 23); - this.textBoxCost.TabIndex = 3; - // - // buttonCancel - // - this.buttonCancel.Location = new System.Drawing.Point(297, 73); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "Отмена"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - // - // buttonSave - // - this.buttonSave.Location = new System.Drawing.Point(216, 73); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(75, 23); - this.buttonSave.TabIndex = 5; - this.buttonSave.Text = "Сохранить"; - this.buttonSave.UseVisualStyleBackColor = true; - this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); - // - // FormComponent - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(384, 108); - this.Controls.Add(this.buttonSave); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.textBoxCost); - this.Controls.Add(this.textBoxName); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Name = "FormComponent"; - this.Text = "Создание компонента"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Label label1; - private Label label2; - private TextBox textBoxName; - private TextBox textBoxCost; - private Button buttonCancel; - private Button buttonSave; - } -} \ No newline at end of file diff --git a/Confectionery/FormComponent.cs b/Confectionery/FormComponent.cs deleted file mode 100644 index 66747be..0000000 --- a/Confectionery/FormComponent.cs +++ /dev/null @@ -1,89 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using Microsoft.Extensions.Logging; - -namespace ConfectioneryView -{ - public partial class FormComponent : Form - { - private readonly ILogger _logger; - private readonly IComponentLogic _logic; - private int? _id; - public int Id { set { _id = value; } } - - public FormComponent(ILogger logger, IComponentLogic logic) - { - InitializeComponent(); - _logger = logger; - _logic = logic; - } - private void FormComponent_Load(object sender, EventArgs e) - { - if (_id.HasValue) - { - try - { - _logger.LogInformation("Получение компонента"); - var view = _logic.ReadElement(new ComponentSearchModel - { - Id = - _id.Value - }); - if (view != null) - { - textBoxName.Text = view.ComponentName; - textBoxCost.Text = view.Cost.ToString(); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка получения компонента"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } - private void ButtonSave_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxName.Text)) - { - MessageBox.Show("Заполните название", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - _logger.LogInformation("Сохранение компонента"); - try - { - var model = new ComponentBindingModel - { - Id = _id ?? 0, - ComponentName = textBoxName.Text, - Cost = Convert.ToDouble(textBoxCost.Text) - }; - var operationResult = _id.HasValue ? _logic.Update(model) : - _logic.Create(model); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - MessageBox.Show("Сохранение прошло успешно", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - DialogResult = DialogResult.OK; - Close(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка сохранения компонента"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ButtonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} - diff --git a/Confectionery/FormComponent.resx b/Confectionery/FormComponent.resx deleted file mode 100644 index f298a7b..0000000 --- a/Confectionery/FormComponent.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Confectionery/FormComponents.Designer.cs b/Confectionery/FormComponents.Designer.cs deleted file mode 100644 index 967f22a..0000000 --- a/Confectionery/FormComponents.Designer.cs +++ /dev/null @@ -1,121 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormComponents - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonRef = new System.Windows.Forms.Button(); - this.buttonDel = new System.Windows.Forms.Button(); - this.buttonUpd = new System.Windows.Forms.Button(); - this.buttonAdd = new System.Windows.Forms.Button(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); - // - // buttonRef - // - this.buttonRef.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRef.Location = new System.Drawing.Point(626, 202); - this.buttonRef.Name = "buttonRef"; - this.buttonRef.Size = new System.Drawing.Size(90, 37); - this.buttonRef.TabIndex = 9; - this.buttonRef.Text = "Обновить"; - this.buttonRef.UseVisualStyleBackColor = true; - this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click); - // - // buttonDel - // - this.buttonDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDel.Location = new System.Drawing.Point(626, 151); - this.buttonDel.Name = "buttonDel"; - this.buttonDel.Size = new System.Drawing.Size(90, 33); - this.buttonDel.TabIndex = 8; - this.buttonDel.Text = "Удалить"; - this.buttonDel.UseVisualStyleBackColor = true; - this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click); - // - // buttonUpd - // - this.buttonUpd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpd.Location = new System.Drawing.Point(626, 102); - this.buttonUpd.Name = "buttonUpd"; - this.buttonUpd.Size = new System.Drawing.Size(90, 34); - this.buttonUpd.TabIndex = 7; - this.buttonUpd.Text = "Изменить"; - this.buttonUpd.UseVisualStyleBackColor = true; - this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click); - // - // buttonAdd - // - this.buttonAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAdd.Location = new System.Drawing.Point(626, 57); - this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(90, 30); - this.buttonAdd.TabIndex = 6; - this.buttonAdd.Text = "Добавить"; - this.buttonAdd.UseVisualStyleBackColor = true; - this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); - // - // dataGridView - // - this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(12, 12); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowTemplate.Height = 25; - this.dataGridView.Size = new System.Drawing.Size(553, 302); - this.dataGridView.TabIndex = 5; - // - // FormComponents - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(722, 319); - this.Controls.Add(this.buttonRef); - this.Controls.Add(this.buttonDel); - this.Controls.Add(this.buttonUpd); - this.Controls.Add(this.buttonAdd); - this.Controls.Add(this.dataGridView); - this.Name = "FormComponents"; - this.Text = "Редактирование компонентов"; - this.Load += new System.EventHandler(this.FormComponents_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private Button buttonRef; - private Button buttonDel; - private Button buttonUpd; - private Button buttonAdd; - private DataGridView dataGridView; - } -} \ No newline at end of file diff --git a/Confectionery/FormComponents.cs b/Confectionery/FormComponents.cs deleted file mode 100644 index 2f20d12..0000000 --- a/Confectionery/FormComponents.cs +++ /dev/null @@ -1,104 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using Microsoft.Extensions.Logging; - -namespace ConfectioneryView -{ - public partial class FormComponents : Form - { - private readonly ILogger _logger; - private readonly IComponentLogic _logic; - public FormComponents(ILogger logger, IComponentLogic logic) - { - InitializeComponent(); - _logger = logger; - _logic = logic; - } - private void FormComponents_Load(object sender, EventArgs e) - { - LoadData(); - } - private void LoadData() - { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки компонентов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ButtonAdd_Click(object sender, EventArgs e) - { - var service = - Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - private void ButtonUpd_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - } - private void ButtonDel_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - if (MessageBox.Show("Удалить запись?", "Вопрос", - MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Удаление компонента"); - try - { - if (!_logic.Delete(new ComponentBindingModel - { - Id = id - })) - { - throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка удаления компонента"); - MessageBox.Show(ex.Message, "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - } - private void ButtonRef_Click(object sender, EventArgs e) - { - LoadData(); - } - } -} diff --git a/Confectionery/FormComponents.resx b/Confectionery/FormComponents.resx deleted file mode 100644 index f298a7b..0000000 --- a/Confectionery/FormComponents.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Confectionery/FormCreateOrder.Designer.cs b/Confectionery/FormCreateOrder.Designer.cs deleted file mode 100644 index ab9a95b..0000000 --- a/Confectionery/FormCreateOrder.Designer.cs +++ /dev/null @@ -1,147 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormCreateOrder - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSave = new System.Windows.Forms.Button(); - this.comboBoxPastry = new System.Windows.Forms.ComboBox(); - this.textBoxCount = new System.Windows.Forms.NumericUpDown(); - this.textBoxSum = new System.Windows.Forms.TextBox(); - ((System.ComponentModel.ISupportInitialize)(this.textBoxCount)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(56, 15); - this.label1.TabIndex = 0; - this.label1.Text = "Изделие:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 40); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(75, 15); - this.label2.TabIndex = 1; - this.label2.Text = "Количество:"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(12, 68); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(48, 15); - this.label3.TabIndex = 2; - this.label3.Text = "Сумма:"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.Location = new System.Drawing.Point(221, 109); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(95, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "Отмена"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - // - // buttonSave - // - this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSave.Location = new System.Drawing.Point(141, 109); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(77, 23); - this.buttonSave.TabIndex = 4; - this.buttonSave.Text = "Сохранить"; - this.buttonSave.UseVisualStyleBackColor = true; - this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); - // - // comboBoxPastry - // - this.comboBoxPastry.FormattingEnabled = true; - this.comboBoxPastry.Location = new System.Drawing.Point(101, 9); - this.comboBoxPastry.Name = "comboBoxPastry"; - this.comboBoxPastry.Size = new System.Drawing.Size(214, 23); - this.comboBoxPastry.TabIndex = 5; - this.comboBoxPastry.SelectedIndexChanged += new System.EventHandler(this.ComboBoxPastry_SelectedIndexChanged); - // - // textBoxCount - // - this.textBoxCount.Location = new System.Drawing.Point(101, 38); - this.textBoxCount.Name = "textBoxCount"; - this.textBoxCount.Size = new System.Drawing.Size(214, 23); - this.textBoxCount.TabIndex = 6; - this.textBoxCount.ValueChanged += new System.EventHandler(this.TextBoxCount_TextChanged); - // - // textBoxSum - // - this.textBoxSum.Location = new System.Drawing.Point(101, 65); - this.textBoxSum.Name = "textBoxSum"; - this.textBoxSum.Size = new System.Drawing.Size(214, 23); - this.textBoxSum.TabIndex = 7; - // - // FormCreateOrder - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(327, 144); - this.Controls.Add(this.textBoxSum); - this.Controls.Add(this.textBoxCount); - this.Controls.Add(this.comboBoxPastry); - this.Controls.Add(this.buttonSave); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Name = "FormCreateOrder"; - this.Text = "Создание заказа"; - ((System.ComponentModel.ISupportInitialize)(this.textBoxCount)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Label label1; - private Label label2; - private Label label3; - private Button buttonCancel; - private Button buttonSave; - private ComboBox comboBoxPastry; - private NumericUpDown textBoxCount; - private TextBox textBoxSum; - } -} \ No newline at end of file diff --git a/Confectionery/FormCreateOrder.cs b/Confectionery/FormCreateOrder.cs deleted file mode 100644 index 703c7b2..0000000 --- a/Confectionery/FormCreateOrder.cs +++ /dev/null @@ -1,117 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; -using Microsoft.Extensions.Logging; - - -namespace ConfectioneryView -{ - public partial class FormCreateOrder : Form - { - private readonly ILogger _logger; - private readonly IPastryLogic _logicP; - private readonly IOrderLogic _logicO; - private readonly List? _list; - - public FormCreateOrder(ILogger logger, IPastryLogic logicP, IOrderLogic logicO) - { - InitializeComponent(); - _logger = logger; - _logicP = logicP; - _logicO = logicO; - _list = logicP.ReadList(null); - if (_list != null) - { - comboBoxPastry.DisplayMember = "PastryName"; - comboBoxPastry.ValueMember = "Id"; - comboBoxPastry.DataSource = _list; - comboBoxPastry.SelectedItem = null; - } - } - private void FormCreateOrder_Load(object sender, EventArgs e) - { - _logger.LogInformation("Загрузка изделий для заказа"); - foreach (var el in _logicP.ReadList(null) ?? new()) - { - comboBoxPastry.Items.Add(el.PastryName); - } - } - private void CalcSum() - { - if (comboBoxPastry.SelectedValue != null && !string.IsNullOrEmpty(textBoxCount.Text)) - { - try - { - int id = Convert.ToInt32(comboBoxPastry.SelectedValue); - var pastry = _logicP.ReadElement(new() - { - Id = id - }); - int count = Convert.ToInt32(textBoxCount.Value); - textBoxSum.Text = Math.Round(count * (pastry?.Price ?? 0), 2).ToString(); - _logger.LogInformation("Расчет суммы заказа"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка расчета суммы заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } - private void TextBoxCount_TextChanged(object sender, EventArgs e) - { - CalcSum(); - } - private void ComboBoxPastry_SelectedIndexChanged(object sender, EventArgs e) - { - CalcSum(); - } - private void ButtonSave_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxCount.Text)) - { - MessageBox.Show("Заполните поле Количество", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - if (comboBoxPastry.SelectedValue == null) - { - MessageBox.Show("Выберите изделие", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - _logger.LogInformation("Создание заказа"); - try - { - var operationResult = _logicO.CreateOrder(new OrderBindingModel - { - PastryId = Convert.ToInt32(comboBoxPastry.SelectedValue), - Count = Convert.ToInt32(textBoxCount.Text), - Sum = Convert.ToDouble(textBoxSum.Text) - }); - if (!operationResult) - { - throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); - } - MessageBox.Show("Сохранение прошло успешно", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - DialogResult = DialogResult.OK; - Close(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка создания заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ButtonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} - diff --git a/Confectionery/FormCreateOrder.resx b/Confectionery/FormCreateOrder.resx deleted file mode 100644 index f298a7b..0000000 --- a/Confectionery/FormCreateOrder.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Confectionery/FormMain.Designer.cs b/Confectionery/FormMain.Designer.cs deleted file mode 100644 index c90ca46..0000000 --- a/Confectionery/FormMain.Designer.cs +++ /dev/null @@ -1,182 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormMain - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pastryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.componentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.buttonCreateOrder = new System.Windows.Forms.Button(); - this.buttonTakeOrderInWork = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); - this.button3 = new System.Windows.Forms.Button(); - this.button4 = new System.Windows.Forms.Button(); - this.menuStrip1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); - // - // menuStrip1 - // - this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.справочникиToolStripMenuItem}); - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(783, 24); - this.menuStrip1.TabIndex = 0; - this.menuStrip1.Text = "menuStrip1"; - // - // справочникиToolStripMenuItem - // - this.справочникиToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.pastryToolStripMenuItem, - this.componentToolStripMenuItem}); - this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(94, 20); - this.справочникиToolStripMenuItem.Text = "Справочники"; - // - // pastryToolStripMenuItem - // - this.pastryToolStripMenuItem.Name = "pastryToolStripMenuItem"; - this.pastryToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.pastryToolStripMenuItem.Text = "Изделия"; - this.pastryToolStripMenuItem.Click += new System.EventHandler(this.PastryToolStripMenuItem_Click); - // - // componentToolStripMenuItem - // - this.componentToolStripMenuItem.Name = "componentToolStripMenuItem"; - this.componentToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.componentToolStripMenuItem.Text = "Компоненты"; - this.componentToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click); - // - // dataGridView - // - this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(12, 27); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowTemplate.Height = 25; - this.dataGridView.Size = new System.Drawing.Size(606, 341); - this.dataGridView.TabIndex = 1; - // - // buttonCreateOrder - // - this.buttonCreateOrder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCreateOrder.Location = new System.Drawing.Point(624, 39); - this.buttonCreateOrder.Name = "buttonCreateOrder"; - this.buttonCreateOrder.Size = new System.Drawing.Size(147, 32); - this.buttonCreateOrder.TabIndex = 2; - this.buttonCreateOrder.Text = "Создать заказ"; - this.buttonCreateOrder.UseVisualStyleBackColor = true; - this.buttonCreateOrder.Click += new System.EventHandler(this.ButtonCreateOrder_Click); - // - // buttonTakeOrderInWork - // - this.buttonTakeOrderInWork.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonTakeOrderInWork.Location = new System.Drawing.Point(624, 98); - this.buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - this.buttonTakeOrderInWork.Size = new System.Drawing.Size(147, 32); - this.buttonTakeOrderInWork.TabIndex = 3; - this.buttonTakeOrderInWork.Text = "Отдать на выполнение"; - this.buttonTakeOrderInWork.UseVisualStyleBackColor = true; - this.buttonTakeOrderInWork.Click += new System.EventHandler(this.ButtonTakeOrderInWork_Click); - // - // button2 - // - this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button2.Location = new System.Drawing.Point(624, 157); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(147, 32); - this.button2.TabIndex = 4; - this.button2.Text = "Заказ готов"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.ButtonOrderReady_Click); - // - // button3 - // - this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button3.Location = new System.Drawing.Point(624, 215); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(147, 32); - this.button3.TabIndex = 5; - this.button3.Text = "Заказ выдан"; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.ButtonIssuedOrder_Click); - // - // button4 - // - this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button4.Location = new System.Drawing.Point(624, 274); - this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(147, 32); - this.button4.TabIndex = 6; - this.button4.Text = "Обновить список"; - this.button4.UseVisualStyleBackColor = true; - this.button4.Click += new System.EventHandler(this.ButtonRef_Click); - // - // FormMain - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(783, 380); - this.Controls.Add(this.button4); - this.Controls.Add(this.button3); - this.Controls.Add(this.button2); - this.Controls.Add(this.buttonTakeOrderInWork); - this.Controls.Add(this.buttonCreateOrder); - this.Controls.Add(this.dataGridView); - this.Controls.Add(this.menuStrip1); - this.MainMenuStrip = this.menuStrip1; - this.Name = "FormMain"; - this.Text = "Кондитерская"; - this.Load += new System.EventHandler(this.FormMain_Load); - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private MenuStrip menuStrip1; - private ToolStripMenuItem справочникиToolStripMenuItem; - private DataGridView dataGridView; - private Button buttonCreateOrder; - private Button buttonTakeOrderInWork; - private Button button2; - private Button button3; - private Button button4; - private ToolStripMenuItem pastryToolStripMenuItem; - private ToolStripMenuItem componentToolStripMenuItem; - } -} \ No newline at end of file diff --git a/Confectionery/FormMain.cs b/Confectionery/FormMain.cs deleted file mode 100644 index 190621c..0000000 --- a/Confectionery/FormMain.cs +++ /dev/null @@ -1,157 +0,0 @@ -using ConfectioneryBusinessLogic.BusinessLogics; -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryDataModels.Enums; -using Microsoft.Extensions.Logging; -using System.Windows.Forms; - -namespace ConfectioneryView -{ - public partial class FormMain : Form - { - private readonly ILogger _logger; - private readonly IOrderLogic _orderLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic) - { - InitializeComponent(); - _logger = logger; - _orderLogic = orderLogic; - } - private void FormMain_Load(object sender, EventArgs e) - { - LoadData(); - } - private void LoadData() - { - try - { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].HeaderText = " "; - dataGridView.Columns["PastryId"].Visible = false; - dataGridView.Columns["PastryName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation(" "); - } - catch (Exception ex) - { - _logger.LogError(ex, " "); - MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ComponentsToolStripMenuItem_Click(object sender, EventArgs - e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - if (service is FormComponents form) - { - form.ShowDialog(); - } - } - private void PastryToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormViewPastry)); - if (service is FormViewPastry form) - { - form.ShowDialog(); - } - } - - private void ButtonCreateOrder_Click(object sender, EventArgs e) - { - var service = - Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } - } - - private void ButtonTakeOrderInWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation(" No{id}. ' '", id); - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel{ Id = id }); - if (!operationResult) - { - throw new Exception(" . ."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, " "); - MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } - private void ButtonOrderReady_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - OrderStatus orderStatus = (OrderStatus)dataGridView.SelectedRows[0].Cells["Status"].Value; - _logger.LogInformation(" No{id}. ''", id); - try - { - var operationResult = _orderLogic.FinishOrder(new OrderBindingModel - { - Id = id, - Status = orderStatus - }); - if (!operationResult) - { - throw new Exception(" . ."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, " "); - MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - private void ButtonIssuedOrder_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation(" No{id}. ''", id); - try - { - var operationResult = _orderLogic.DeliveryOrder(new - OrderBindingModel - { Id = id }); - if (!operationResult) - { - throw new Exception(" . ."); - } - _logger.LogInformation(" No{id} ", id); - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, " "); - MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } - private void ButtonRef_Click(object sender, EventArgs e) - { - LoadData(); - } - } -} \ No newline at end of file diff --git a/Confectionery/FormMain.resx b/Confectionery/FormMain.resx deleted file mode 100644 index 938108a..0000000 --- a/Confectionery/FormMain.resx +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/Confectionery/FormPastry.Designer.cs b/Confectionery/FormPastry.Designer.cs deleted file mode 100644 index 1c6ecaf..0000000 --- a/Confectionery/FormPastry.Designer.cs +++ /dev/null @@ -1,236 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormPastry - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.buttonRef = new System.Windows.Forms.Button(); - this.buttonDel = new System.Windows.Forms.Button(); - this.buttonUpd = new System.Windows.Forms.Button(); - this.buttonAdd = new System.Windows.Forms.Button(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.id = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Component = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Count = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.textBoxName = new System.Windows.Forms.TextBox(); - this.textBoxPrice = new System.Windows.Forms.TextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSave = new System.Windows.Forms.Button(); - this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(62, 15); - this.label1.TabIndex = 0; - this.label1.Text = "Название:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 40); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(70, 15); - this.label2.TabIndex = 1; - this.label2.Text = "Стоимость:"; - // - // groupBox1 - // - this.groupBox1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.groupBox1.Controls.Add(this.buttonRef); - this.groupBox1.Controls.Add(this.buttonDel); - this.groupBox1.Controls.Add(this.buttonUpd); - this.groupBox1.Controls.Add(this.buttonAdd); - this.groupBox1.Controls.Add(this.dataGridView); - this.groupBox1.Location = new System.Drawing.Point(12, 67); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.groupBox1.Size = new System.Drawing.Size(776, 330); - this.groupBox1.TabIndex = 2; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Компоненты:"; - // - // buttonRef - // - this.buttonRef.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRef.Location = new System.Drawing.Point(680, 207); - this.buttonRef.Name = "buttonRef"; - this.buttonRef.Size = new System.Drawing.Size(90, 37); - this.buttonRef.TabIndex = 4; - this.buttonRef.Text = "Обновить"; - this.buttonRef.UseVisualStyleBackColor = true; - this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click); - // - // buttonDel - // - this.buttonDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDel.Location = new System.Drawing.Point(680, 158); - this.buttonDel.Name = "buttonDel"; - this.buttonDel.Size = new System.Drawing.Size(90, 33); - this.buttonDel.TabIndex = 3; - this.buttonDel.Text = "Удалить"; - this.buttonDel.UseVisualStyleBackColor = true; - this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click); - // - // buttonUpd - // - this.buttonUpd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpd.Location = new System.Drawing.Point(680, 108); - this.buttonUpd.Name = "buttonUpd"; - this.buttonUpd.Size = new System.Drawing.Size(90, 34); - this.buttonUpd.TabIndex = 2; - this.buttonUpd.Text = "Изменить"; - this.buttonUpd.UseVisualStyleBackColor = true; - this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click); - // - // buttonAdd - // - this.buttonAdd.Location = new System.Drawing.Point(680, 62); - this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(90, 30); - this.buttonAdd.TabIndex = 1; - this.buttonAdd.Text = "Добавить"; - this.buttonAdd.UseVisualStyleBackColor = true; - this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); - // - // dataGridView - // - this.dataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.ColumnHeader; - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.id, - this.Component, - this.Count}); - this.dataGridView.Location = new System.Drawing.Point(7, 22); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowTemplate.Height = 25; - this.dataGridView.Size = new System.Drawing.Size(571, 302); - this.dataGridView.TabIndex = 0; - // - // id - // - this.id.HeaderText = "id"; - this.id.Name = "id"; - this.id.Visible = false; - // - // Component - // - this.Component.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.Component.FillWeight = 1000F; - this.Component.HeaderText = "Компонент"; - this.Component.Name = "Component"; - // - // Count - // - this.Count.HeaderText = "Количество"; - this.Count.Name = "Count"; - this.Count.Width = 97; - // - // textBoxName - // - this.textBoxName.Location = new System.Drawing.Point(89, 9); - this.textBoxName.Name = "textBoxName"; - this.textBoxName.Size = new System.Drawing.Size(170, 23); - this.textBoxName.TabIndex = 3; - // - // textBoxPrice - // - this.textBoxPrice.Location = new System.Drawing.Point(89, 38); - this.textBoxPrice.Name = "textBoxPrice"; - this.textBoxPrice.Size = new System.Drawing.Size(120, 23); - this.textBoxPrice.TabIndex = 4; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.Location = new System.Drawing.Point(692, 403); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(90, 35); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "Отмена"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - // - // buttonSave - // - this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSave.Location = new System.Drawing.Point(596, 403); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(90, 35); - this.buttonSave.TabIndex = 6; - this.buttonSave.Text = "Сохранить"; - this.buttonSave.UseVisualStyleBackColor = true; - this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); - // - // FormPastry - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Controls.Add(this.buttonSave); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.textBoxPrice); - this.Controls.Add(this.textBoxName); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Name = "FormPastry"; - this.Text = "Кондитерское изделие"; - this.Load += new System.EventHandler(this.FormPastry_Load); - this.groupBox1.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Label label1; - private Label label2; - private GroupBox groupBox1; - private TextBox textBoxName; - private TextBox textBoxPrice; - private Button buttonRef; - private Button buttonDel; - private Button buttonUpd; - private Button buttonAdd; - private DataGridView dataGridView; - private DataGridViewTextBoxColumn id; - private DataGridViewTextBoxColumn Component; - private DataGridViewTextBoxColumn Count; - private Button buttonCancel; - private Button buttonSave; - } -} \ No newline at end of file diff --git a/Confectionery/FormPastry.cs b/Confectionery/FormPastry.cs deleted file mode 100644 index e3e7bfd..0000000 --- a/Confectionery/FormPastry.cs +++ /dev/null @@ -1,213 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.SearchModels; -using ConfectioneryDataModels.Models; -using Microsoft.Extensions.Logging; - -namespace ConfectioneryView -{ - public partial class FormPastry : Form - { - private readonly ILogger _logger; - private readonly IPastryLogic _logic; - private int? _id; - private Dictionary _pastryComponents; - public int Id { set { _id = value; } } - public FormPastry(ILogger logger, IPastryLogic logic) - { - InitializeComponent(); - _logger = logger; - _logic = logic; - _pastryComponents = new Dictionary(); - } - private void FormPastry_Load(object sender, EventArgs e) - { - if (_id.HasValue) - { - _logger.LogInformation("Загрузка изделия"); - try - { - var view = _logic.ReadElement(new PastrySearchModel - { - Id = _id.Value - }); - if (view != null) - { - textBoxName.Text = view.PastryName; - textBoxPrice.Text = view.Price.ToString(); - _pastryComponents = view.PastryComponents ?? new - Dictionary(); - LoadData(); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки изделия"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } - private void LoadData() - { - _logger.LogInformation("Загрузка компонент изделия"); - try - { - if (_pastryComponents != null) - { - dataGridView.Rows.Clear(); - foreach (var pc in _pastryComponents) - { - dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); - } - textBoxPrice.Text = CalcPrice().ToString(); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки компонент изделия"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ButtonAdd_Click(object sender, EventArgs e) - { - var service = - Program.ServiceProvider?.GetService(typeof(FormPastryComponent)); - if (service is FormPastryComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента: { ComponentName}- { Count}", - form.ComponentModel.ComponentName, form.Count); - if (_pastryComponents.ContainsKey(form.Id)) - { - _pastryComponents[form.Id] = (form.ComponentModel, - form.Count); - } - else - { - _pastryComponents.Add(form.Id, (form.ComponentModel, - form.Count)); - } - LoadData(); - } - } - } - private void ButtonUpd_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormPastryComponent)); - if (service is FormPastryComponent form) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _pastryComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count} ", - form.ComponentModel.ComponentName, form.Count); - _pastryComponents[id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } - private void ButtonDel_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - if (MessageBox.Show("Удалить запись?", "Вопрос", - MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - try - { - _logger.LogInformation("Удаление компонента: { ComponentName}- { Count}", - dataGridView.SelectedRows[0].Cells[1].Value); - _pastryComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - LoadData(); - } - } - } - private void ButtonRef_Click(object sender, EventArgs e) - { - LoadData(); - } - private void ButtonSave_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxName.Text)) - { - MessageBox.Show("Заполните название", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - if (string.IsNullOrEmpty(textBoxPrice.Text)) - { - MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - return; - } - if (_pastryComponents == null || _pastryComponents.Count == 0) - { - MessageBox.Show("Заполните компоненты", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - _logger.LogInformation("Сохранение изделия"); - try - { - var model = new PastryBindingModel - { - Id = _id ?? 0, - PastryName = textBoxName.Text, - Price = Convert.ToDouble(textBoxPrice.Text), - PastryComponents = _pastryComponents - }; - var operationResult = _id.HasValue ? _logic.Update(model) : - _logic.Create(model); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - MessageBox.Show("Сохранение прошло успешно", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - DialogResult = DialogResult.OK; - Close(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка сохранения изделия"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - private void ButtonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - private double CalcPrice() - { - double price = 0; - foreach (var elem in _pastryComponents) - { - price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); - } - return Math.Round(price * 1.1, 2); - } - } -} diff --git a/Confectionery/FormPastry.resx b/Confectionery/FormPastry.resx deleted file mode 100644 index 1bfa2bf..0000000 --- a/Confectionery/FormPastry.resx +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - True - - \ No newline at end of file diff --git a/Confectionery/FormPastryComponent.Designer.cs b/Confectionery/FormPastryComponent.Designer.cs deleted file mode 100644 index 3a39e37..0000000 --- a/Confectionery/FormPastryComponent.Designer.cs +++ /dev/null @@ -1,119 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormPastryComponent - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.comboBoxComponent = new System.Windows.Forms.ComboBox(); - this.ButtonCancel = new System.Windows.Forms.Button(); - this.ButtonSave = new System.Windows.Forms.Button(); - this.textBoxCount = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(72, 15); - this.label1.TabIndex = 0; - this.label1.Text = "Компонент:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 45); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(75, 15); - this.label2.TabIndex = 1; - this.label2.Text = "Количество:"; - // - // comboBoxComponent - // - this.comboBoxComponent.FormattingEnabled = true; - this.comboBoxComponent.Location = new System.Drawing.Point(107, 9); - this.comboBoxComponent.Name = "comboBoxComponent"; - this.comboBoxComponent.Size = new System.Drawing.Size(231, 23); - this.comboBoxComponent.TabIndex = 2; - // - // ButtonCancel - // - this.ButtonCancel.Location = new System.Drawing.Point(234, 87); - this.ButtonCancel.Name = "ButtonCancel"; - this.ButtonCancel.Size = new System.Drawing.Size(104, 23); - this.ButtonCancel.TabIndex = 4; - this.ButtonCancel.Text = "Отмена"; - this.ButtonCancel.UseVisualStyleBackColor = true; - this.ButtonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - // - // ButtonSave - // - this.ButtonSave.Location = new System.Drawing.Point(133, 87); - this.ButtonSave.Name = "ButtonSave"; - this.ButtonSave.Size = new System.Drawing.Size(95, 23); - this.ButtonSave.TabIndex = 5; - this.ButtonSave.Text = "Сохранить"; - this.ButtonSave.UseVisualStyleBackColor = true; - this.ButtonSave.Click += new System.EventHandler(this.ButtonSave_Click); - // - // textBoxCount - // - this.textBoxCount.Location = new System.Drawing.Point(107, 43); - this.textBoxCount.Name = "textBoxCount"; - this.textBoxCount.Size = new System.Drawing.Size(231, 23); - this.textBoxCount.TabIndex = 3; - // - // FormPastryComponent - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(350, 122); - this.Controls.Add(this.ButtonSave); - this.Controls.Add(this.ButtonCancel); - this.Controls.Add(this.textBoxCount); - this.Controls.Add(this.comboBoxComponent); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Name = "FormPastryComponent"; - this.Text = "Компонент"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Label label1; - private Label label2; - private ComboBox comboBoxComponent; - private Button ButtonCancel; - private Button ButtonSave; - private TextBox textBoxCount; - } -} \ No newline at end of file diff --git a/Confectionery/FormPastryComponent.cs b/Confectionery/FormPastryComponent.cs deleted file mode 100644 index 11933f1..0000000 --- a/Confectionery/FormPastryComponent.cs +++ /dev/null @@ -1,79 +0,0 @@ -using ConfectioneryContracts.ViewModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryDataModels.Models; - -namespace ConfectioneryView -{ - public partial class FormPastryComponent : Form - { - private readonly List? _list; - public int Id - { - get - { - return Convert.ToInt32(comboBoxComponent.SelectedValue); - } - set - { - comboBoxComponent.SelectedValue = value; - } - } - public IComponentModel? ComponentModel - { - get - { - if (_list == null) - { - return null; - } - foreach (var elem in _list) - { - if (elem.Id == Id) - { - return elem; - } - } - return null; - } - } - public int Count - { - get { return Convert.ToInt32(textBoxCount.Text); } - set { textBoxCount.Text = value.ToString(); } - } - public FormPastryComponent(IComponentLogic logic) - { - InitializeComponent(); - _list = logic.ReadList(null); - if (_list != null) - { - comboBoxComponent.DisplayMember = "ComponentName"; - comboBoxComponent.ValueMember = "Id"; - comboBoxComponent.DataSource = _list; - comboBoxComponent.SelectedItem = null; - } - } - private void ButtonSave_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxCount.Text)) - { - MessageBox.Show("Заполните поле Количество", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - if (comboBoxComponent.SelectedValue == null) - { - MessageBox.Show("Выберите компонент", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - DialogResult = DialogResult.OK; - Close(); - } - private void ButtonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} \ No newline at end of file diff --git a/Confectionery/FormPastryComponent.resx b/Confectionery/FormPastryComponent.resx deleted file mode 100644 index f298a7b..0000000 --- a/Confectionery/FormPastryComponent.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Confectionery/FormViewPastry.Designer.cs b/Confectionery/FormViewPastry.Designer.cs deleted file mode 100644 index 67d3480..0000000 --- a/Confectionery/FormViewPastry.Designer.cs +++ /dev/null @@ -1,121 +0,0 @@ -namespace ConfectioneryView -{ - partial class FormViewPastry - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonRef = new System.Windows.Forms.Button(); - this.buttonDel = new System.Windows.Forms.Button(); - this.buttonUpd = new System.Windows.Forms.Button(); - this.buttonAdd = new System.Windows.Forms.Button(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); - // - // buttonRef - // - this.buttonRef.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRef.Location = new System.Drawing.Point(626, 202); - this.buttonRef.Name = "buttonRef"; - this.buttonRef.Size = new System.Drawing.Size(90, 37); - this.buttonRef.TabIndex = 9; - this.buttonRef.Text = "Обновить"; - this.buttonRef.UseVisualStyleBackColor = true; - this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click); - // - // buttonDel - // - this.buttonDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDel.Location = new System.Drawing.Point(626, 151); - this.buttonDel.Name = "buttonDel"; - this.buttonDel.Size = new System.Drawing.Size(90, 33); - this.buttonDel.TabIndex = 8; - this.buttonDel.Text = "Удалить"; - this.buttonDel.UseVisualStyleBackColor = true; - this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click); - // - // buttonUpd - // - this.buttonUpd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpd.Location = new System.Drawing.Point(626, 102); - this.buttonUpd.Name = "buttonUpd"; - this.buttonUpd.Size = new System.Drawing.Size(90, 34); - this.buttonUpd.TabIndex = 7; - this.buttonUpd.Text = "Изменить"; - this.buttonUpd.UseVisualStyleBackColor = true; - this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click); - // - // buttonAdd - // - this.buttonAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAdd.Location = new System.Drawing.Point(626, 57); - this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(90, 30); - this.buttonAdd.TabIndex = 6; - this.buttonAdd.Text = "Добавить"; - this.buttonAdd.UseVisualStyleBackColor = true; - this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); - // - // dataGridView - // - this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(12, 12); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowTemplate.Height = 25; - this.dataGridView.Size = new System.Drawing.Size(553, 302); - this.dataGridView.TabIndex = 5; - // - // FormViewPastry - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(722, 319); - this.Controls.Add(this.buttonRef); - this.Controls.Add(this.buttonDel); - this.Controls.Add(this.buttonUpd); - this.Controls.Add(this.buttonAdd); - this.Controls.Add(this.dataGridView); - this.Name = "FormViewPastry"; - this.Text = "Редактирование изделий"; - this.Load += new System.EventHandler(this.FormViewPastry_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private Button buttonRef; - private Button buttonDel; - private Button buttonUpd; - private Button buttonAdd; - private DataGridView dataGridView; - } -} \ No newline at end of file diff --git a/Confectionery/FormViewPastry.cs b/Confectionery/FormViewPastry.cs deleted file mode 100644 index cdcbec6..0000000 --- a/Confectionery/FormViewPastry.cs +++ /dev/null @@ -1,113 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.BusinessLogicsContracts; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ConfectioneryView -{ - public partial class FormViewPastry : Form - { - private readonly ILogger _logger; - private readonly IPastryLogic _logic; - public FormViewPastry(ILogger logger, IPastryLogic logic) - { - InitializeComponent(); - _logger = logger; - _logic = logic; - } - private void FormViewPastry_Load(object sender, EventArgs e) - { - LoadData(); - } - private void LoadData() - { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["PastryComponents"].Visible = false; - dataGridView.Columns["PastryName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка изделий"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки изделий"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - private void ButtonAdd_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormPastry)); - if (service is FormPastry form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - private void ButtonUpd_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormPastry)); - if (service is FormPastry form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - } - private void ButtonDel_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - if (MessageBox.Show("Удалить запись?", "Вопрос", - MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Удаление изделия"); - try - { - if (!_logic.Delete(new PastryBindingModel - { - Id = id - })) - { - throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка удаления изделия"); - MessageBox.Show(ex.Message, "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - } - private void ButtonRef_Click(object sender, EventArgs e) - { - LoadData(); - } - } -} diff --git a/Confectionery/FormViewPastry.resx b/Confectionery/FormViewPastry.resx deleted file mode 100644 index f298a7b..0000000 --- a/Confectionery/FormViewPastry.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Confectionery/Program.cs b/Confectionery/Program.cs index 0ccb4c2..24a4e0b 100644 --- a/Confectionery/Program.cs +++ b/Confectionery/Program.cs @@ -1,14 +1,12 @@ -using ConfectioneryDatabaseImplement.Implements; -using ConfectioneryDatabaseImplement; -using ConfectioneryBusinessLogic.BusinessLogics; -using ConfectioneryContracts.BusinessLogicsContracts; -using ConfectioneryContracts.StoragesContract; +using EkzamenBusinessLogic; +using EkzamenContracts.BusinessLogicsContracts; +using EkzamenContracts.StoragesContract; +using EkzamenListImplement; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; - -namespace ConfectioneryView +namespace EkzamenView { internal static class Program { @@ -26,7 +24,6 @@ namespace ConfectioneryView var services = new ServiceCollection(); ConfigureServices(services); _serviceProvider = services.BuildServiceProvider(); - Application.Run(_serviceProvider.GetRequiredService()); } private static void ConfigureServices(ServiceCollection services) { @@ -35,19 +32,10 @@ namespace ConfectioneryView option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - 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(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/ConfectioneryContracts/BindingModels/ComponentBindingModel.cs b/ConfectioneryContracts/BindingModels/ComponentBindingModel.cs deleted file mode 100644 index a52ea8b..0000000 --- a/ConfectioneryContracts/BindingModels/ComponentBindingModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using ConfectioneryDataModels.Models; - -namespace ConfectioneryContracts.BindingModels -{ - public class ComponentBindingModel : IComponentModel - { - public int Id { get; set; } - public string ComponentName { get; set; } = string.Empty; - public double Cost { get; set; } - } -} diff --git a/ConfectioneryContracts/BindingModels/GroupBindingModel.cs b/ConfectioneryContracts/BindingModels/GroupBindingModel.cs new file mode 100644 index 0000000..31be1f4 --- /dev/null +++ b/ConfectioneryContracts/BindingModels/GroupBindingModel.cs @@ -0,0 +1,12 @@ +using EkzamenDataModels; + +namespace EkzamenContracts.BindingModels +{ + public class GroupBindingModel : IGroupModel + { + public int Id { get; set; } + public string Name { get; set; } + public string Direction { get; set; } + public DateTime Created { get; set; } + } +} diff --git a/ConfectioneryContracts/BindingModels/OrderBindingModel.cs b/ConfectioneryContracts/BindingModels/OrderBindingModel.cs deleted file mode 100644 index 0e3ce64..0000000 --- a/ConfectioneryContracts/BindingModels/OrderBindingModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ConfectioneryDataModels.Enums; -using ConfectioneryDataModels.Models; - -namespace ConfectioneryContracts.BindingModels -{ - public class OrderBindingModel : IOrderModel - { - public int Id { get; set; } - public int PastryId { get; set; } - public int Count { get; set; } - public double Sum { get; set; } - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - public DateTime DateCreate { get; set; } = DateTime.Now; - public DateTime? DateImplement { get; set; } - } -} diff --git a/ConfectioneryContracts/BindingModels/PastryBindingModel.cs b/ConfectioneryContracts/BindingModels/PastryBindingModel.cs deleted file mode 100644 index 7266e1c..0000000 --- a/ConfectioneryContracts/BindingModels/PastryBindingModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ConfectioneryDataModels.Models; - -namespace ConfectioneryContracts.BindingModels -{ - public class PastryBindingModel : IPastryModel - { - public int Id { get; set; } - public string PastryName { get; set; } = string.Empty; - public double Price { get; set; } - public Dictionary PastryComponents - { - get; - set; - } = new(); - } -} diff --git a/ConfectioneryContracts/BindingModels/StudentBindingModel.cs b/ConfectioneryContracts/BindingModels/StudentBindingModel.cs new file mode 100644 index 0000000..389a7a8 --- /dev/null +++ b/ConfectioneryContracts/BindingModels/StudentBindingModel.cs @@ -0,0 +1,17 @@ +using EkzamenDataModels; + +namespace EkzamenContracts.BindingModels +{ + public class StudentBindingModel : IStudentModel + { + public string fio { get; set; } + + public int GroupId { get; set; } + public int RecordBookId { get; set; } + public int PassMark { get; set; } + + public DateTime DateEnrollment { get; set; } + + public int Id { get; set; } + } +} diff --git a/ConfectioneryContracts/BusinessLogicsContracts/IComponentLogic.cs b/ConfectioneryContracts/BusinessLogicsContracts/IComponentLogic.cs deleted file mode 100644 index 59b96cb..0000000 --- a/ConfectioneryContracts/BusinessLogicsContracts/IComponentLogic.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.BusinessLogicsContracts -{ - public interface IComponentLogic - { - List? ReadList(ComponentSearchModel? model); - ComponentViewModel? ReadElement(ComponentSearchModel model); - bool Create(ComponentBindingModel model); - bool Update(ComponentBindingModel model); - bool Delete(ComponentBindingModel model); - } -} diff --git a/ConfectioneryContracts/BusinessLogicsContracts/IGroupLogic.cs b/ConfectioneryContracts/BusinessLogicsContracts/IGroupLogic.cs new file mode 100644 index 0000000..0b3175c --- /dev/null +++ b/ConfectioneryContracts/BusinessLogicsContracts/IGroupLogic.cs @@ -0,0 +1,12 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.ViewModels; + +namespace EkzamenContracts.BusinessLogicsContracts +{ + public interface IGroupLogic + { + List? ReadList(GroupSearchModel? model); + bool CreateGroup(GroupBindingModel model); + } +} diff --git a/ConfectioneryContracts/BusinessLogicsContracts/IOrderLogic.cs b/ConfectioneryContracts/BusinessLogicsContracts/IOrderLogic.cs deleted file mode 100644 index 221258a..0000000 --- a/ConfectioneryContracts/BusinessLogicsContracts/IOrderLogic.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.BusinessLogicsContracts -{ - public interface IOrderLogic - { - List? ReadList(OrderSearchModel? model); - bool CreateOrder(OrderBindingModel model); - bool TakeOrderInWork(OrderBindingModel model); - bool FinishOrder(OrderBindingModel model); - bool DeliveryOrder(OrderBindingModel model); - } -} diff --git a/ConfectioneryContracts/BusinessLogicsContracts/IPastryLogic.cs b/ConfectioneryContracts/BusinessLogicsContracts/IPastryLogic.cs deleted file mode 100644 index e01ad56..0000000 --- a/ConfectioneryContracts/BusinessLogicsContracts/IPastryLogic.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.BusinessLogicsContracts -{ - public interface IPastryLogic - { - List? ReadList(PastrySearchModel? model); - PastryViewModel? ReadElement(PastrySearchModel model); - bool Create(PastryBindingModel model); - bool Update(PastryBindingModel model); - bool Delete(PastryBindingModel model); - } -} diff --git a/ConfectioneryContracts/BusinessLogicsContracts/IStudentLogic.cs b/ConfectioneryContracts/BusinessLogicsContracts/IStudentLogic.cs new file mode 100644 index 0000000..7c585e2 --- /dev/null +++ b/ConfectioneryContracts/BusinessLogicsContracts/IStudentLogic.cs @@ -0,0 +1,15 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.ViewModels; + +namespace EkzamenContracts.BusinessLogicsContracts +{ + public interface IStudentLogic + { + List? ReadList(StudentSearchModel? model); + StudentViewModel? ReadElement(StudentSearchModel model); + bool Create(StudentBindingModel model); + bool Update(StudentBindingModel model); + bool Delete(StudentBindingModel model); + } +} diff --git a/ConfectioneryContracts/ConfectioneryContracts.csproj b/ConfectioneryContracts/EkzamenContracts.csproj similarity index 71% rename from ConfectioneryContracts/ConfectioneryContracts.csproj rename to ConfectioneryContracts/EkzamenContracts.csproj index b0b970c..4844835 100644 --- a/ConfectioneryContracts/ConfectioneryContracts.csproj +++ b/ConfectioneryContracts/EkzamenContracts.csproj @@ -7,7 +7,7 @@ - + diff --git a/ConfectioneryContracts/SearchModels/ComponentSearchModel.cs b/ConfectioneryContracts/SearchModels/ComponentSearchModel.cs deleted file mode 100644 index 2325c7f..0000000 --- a/ConfectioneryContracts/SearchModels/ComponentSearchModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace ConfectioneryContracts.SearchModels -{ - public class ComponentSearchModel - { - public int? Id { get; set; } - public string? ComponentName { get; set; } - } -} diff --git a/ConfectioneryContracts/SearchModels/GroupSearchModel.cs b/ConfectioneryContracts/SearchModels/GroupSearchModel.cs new file mode 100644 index 0000000..6062e8e --- /dev/null +++ b/ConfectioneryContracts/SearchModels/GroupSearchModel.cs @@ -0,0 +1,8 @@ +namespace EkzamenContracts.SearchModels +{ + public class GroupSearchModel + { + public int? Id { get; set; } + + } +} diff --git a/ConfectioneryContracts/SearchModels/OrderSearchModel.cs b/ConfectioneryContracts/SearchModels/OrderSearchModel.cs deleted file mode 100644 index 6df7699..0000000 --- a/ConfectioneryContracts/SearchModels/OrderSearchModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace ConfectioneryContracts.SearchModels -{ - public class OrderSearchModel - { - public int? Id { get; set; } - } -} diff --git a/ConfectioneryContracts/SearchModels/PastrySearchModel.cs b/ConfectioneryContracts/SearchModels/PastrySearchModel.cs deleted file mode 100644 index 542cf03..0000000 --- a/ConfectioneryContracts/SearchModels/PastrySearchModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace ConfectioneryContracts.SearchModels -{ - public class PastrySearchModel - { - public int? Id { get; set; } - public string? PastryName { get; set; } - } -} diff --git a/ConfectioneryContracts/SearchModels/StudentSearchModel.cs b/ConfectioneryContracts/SearchModels/StudentSearchModel.cs new file mode 100644 index 0000000..f0edb5b --- /dev/null +++ b/ConfectioneryContracts/SearchModels/StudentSearchModel.cs @@ -0,0 +1,11 @@ +namespace EkzamenContracts.SearchModels +{ + public class StudentSearchModel + { + public int? Id { get; set; } + public DateTime? CreatedDateFrom { get; set; } + public DateTime? CreatedDateTo { get; set; } + + + } +} diff --git a/ConfectioneryContracts/StoragesContract/IComponentStorage.cs b/ConfectioneryContracts/StoragesContract/IComponentStorage.cs deleted file mode 100644 index e1d0004..0000000 --- a/ConfectioneryContracts/StoragesContract/IComponentStorage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.StoragesContract -{ - public interface IComponentStorage - { - List GetFullList(); - List GetFilteredList(ComponentSearchModel model); - ComponentViewModel? GetElement(ComponentSearchModel model); - ComponentViewModel? Insert(ComponentBindingModel model); - ComponentViewModel? Update(ComponentBindingModel model); - ComponentViewModel? Delete(ComponentBindingModel model); - } -} diff --git a/ConfectioneryContracts/StoragesContract/IGroupStorage.cs b/ConfectioneryContracts/StoragesContract/IGroupStorage.cs new file mode 100644 index 0000000..8396fe5 --- /dev/null +++ b/ConfectioneryContracts/StoragesContract/IGroupStorage.cs @@ -0,0 +1,16 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.ViewModels; + +namespace EkzamenContracts.StoragesContract +{ + public interface IGroupStorage + { + List GetFullList(); + List GetFilteredList(GroupSearchModel model); + GroupViewModel? GetElement(GroupSearchModel model); + GroupViewModel? Insert(GroupBindingModel model); + GroupViewModel? Update(GroupBindingModel model); + GroupViewModel? Delete(GroupBindingModel model); + } +} diff --git a/ConfectioneryContracts/StoragesContract/IOrderStorage.cs b/ConfectioneryContracts/StoragesContract/IOrderStorage.cs deleted file mode 100644 index 9d5bd2f..0000000 --- a/ConfectioneryContracts/StoragesContract/IOrderStorage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.StoragesContract -{ - public interface IOrderStorage - { - List GetFullList(); - List GetFilteredList(OrderSearchModel model); - OrderViewModel? GetElement(OrderSearchModel model); - OrderViewModel? Insert(OrderBindingModel model); - OrderViewModel? Update(OrderBindingModel model); - OrderViewModel? Delete(OrderBindingModel model); - } -} diff --git a/ConfectioneryContracts/StoragesContract/IPastryStorage.cs b/ConfectioneryContracts/StoragesContract/IPastryStorage.cs deleted file mode 100644 index 710526c..0000000 --- a/ConfectioneryContracts/StoragesContract/IPastryStorage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryContracts.StoragesContract -{ - public interface IPastryStorage - { - List GetFullList(); - List GetFilteredList(PastrySearchModel model); - PastryViewModel? GetElement(PastrySearchModel model); - PastryViewModel? Insert(PastryBindingModel model); - PastryViewModel? Update(PastryBindingModel model); - PastryViewModel? Delete(PastryBindingModel model); - } -} diff --git a/ConfectioneryContracts/StoragesContract/IStudentStorage.cs b/ConfectioneryContracts/StoragesContract/IStudentStorage.cs new file mode 100644 index 0000000..dd9b796 --- /dev/null +++ b/ConfectioneryContracts/StoragesContract/IStudentStorage.cs @@ -0,0 +1,16 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.ViewModels; + +namespace EkzamenContracts.StoragesContract +{ + public interface IStudentStorage + { + List GetFullList(); + List GetFilteredList(StudentSearchModel model); + StudentViewModel? GetElement(StudentSearchModel model); + StudentViewModel? Insert(StudentBindingModel model); + StudentViewModel? Update(StudentBindingModel model); + StudentViewModel? Delete(StudentBindingModel model); + } +} diff --git a/ConfectioneryContracts/ViewModels/ComponentViewModel.cs b/ConfectioneryContracts/ViewModels/ComponentViewModel.cs deleted file mode 100644 index 8706c51..0000000 --- a/ConfectioneryContracts/ViewModels/ComponentViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ConfectioneryDataModels.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ConfectioneryContracts.ViewModels -{ - public class ComponentViewModel : IComponentModel - { - public int Id { get; set; } - - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - - [DisplayName("Цена")] - public double Cost { get; set; } - } -} diff --git a/ConfectioneryContracts/ViewModels/GroupViewModel.cs b/ConfectioneryContracts/ViewModels/GroupViewModel.cs new file mode 100644 index 0000000..507464a --- /dev/null +++ b/ConfectioneryContracts/ViewModels/GroupViewModel.cs @@ -0,0 +1,19 @@ +using System.ComponentModel; +using EkzamenDataModels; + +namespace EkzamenContracts.ViewModels +{ + public class GroupViewModel : IGroupModel + { + public int Id { get; set; } + [DisplayName("Название группы")] + + public string Name { get; set; } + [DisplayName("Направление")] + + public string Direction { get; set; } + [DisplayName("Дата создания")] + + public DateTime Created { get; set; } + } +} diff --git a/ConfectioneryContracts/ViewModels/OrderViewModel.cs b/ConfectioneryContracts/ViewModels/OrderViewModel.cs deleted file mode 100644 index 1afadd8..0000000 --- a/ConfectioneryContracts/ViewModels/OrderViewModel.cs +++ /dev/null @@ -1,36 +0,0 @@ -using ConfectioneryDataModels.Enums; -using ConfectioneryDataModels.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ConfectioneryContracts.ViewModels -{ - public class OrderViewModel : IOrderModel - { - [DisplayName("Номер")] - public int Id { get; set; } - public int PastryId { get; set; } - - [DisplayName("Изделие")] - public string PastryName { get; set; } = string.Empty; - - [DisplayName("Количество")] - public int Count { get; set; } - - [DisplayName("Сумма")] - public double Sum { get; set; } - - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } - } -} diff --git a/ConfectioneryContracts/ViewModels/PastryViewModel.cs b/ConfectioneryContracts/ViewModels/PastryViewModel.cs deleted file mode 100644 index 32831ba..0000000 --- a/ConfectioneryContracts/ViewModels/PastryViewModel.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ConfectioneryDataModels.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ConfectioneryContracts.ViewModels -{ - public class PastryViewModel : IPastryModel - { - public int Id { get; set; } - [DisplayName("Название изделия")] - public string PastryName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary PastryComponents - { - get; - set; - } = new(); - } -} diff --git a/ConfectioneryContracts/ViewModels/StudentViewModel.cs b/ConfectioneryContracts/ViewModels/StudentViewModel.cs new file mode 100644 index 0000000..b6ee423 --- /dev/null +++ b/ConfectioneryContracts/ViewModels/StudentViewModel.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; +using EkzamenDataModels; + +namespace EkzamenContracts.ViewModels +{ + public class StudentViewModel : IStudentModel + { + public int Id { get; set; } + [DisplayName("ФИО")] + public string fio { get; set; } + public int GroupId { get; set; } + [DisplayName("Зачетная книжка")] + + public int RecordBookId { get; set; } + [DisplayName("Проходной балл")] + + public int PassMark { get; set; } + [DisplayName("Дата поступления")] + + public DateTime DateEnrollment { get; set; } + } +} diff --git a/ConfectioneryDataModels/ConfectioneryDataModels.csproj b/ConfectioneryDataModels/EkzamenDataModels.csproj similarity index 100% rename from ConfectioneryDataModels/ConfectioneryDataModels.csproj rename to ConfectioneryDataModels/EkzamenDataModels.csproj diff --git a/ConfectioneryDataModels/IComponentModel.cs b/ConfectioneryDataModels/IComponentModel.cs deleted file mode 100644 index 1981909..0000000 --- a/ConfectioneryDataModels/IComponentModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace ConfectioneryDataModels.Models -{ - public interface IComponentModel : IId - { - string ComponentName { get; } - double Cost { get; } - } -} diff --git a/ConfectioneryDataModels/IGroupModel.cs b/ConfectioneryDataModels/IGroupModel.cs new file mode 100644 index 0000000..d43fc18 --- /dev/null +++ b/ConfectioneryDataModels/IGroupModel.cs @@ -0,0 +1,11 @@ + + +namespace EkzamenDataModels +{ + public interface IGroupModel : IId + { + string Name { get; set; } + string Direction { get; set; } + DateTime Created { get; set; } + } +} diff --git a/ConfectioneryDataModels/IId.cs b/ConfectioneryDataModels/IId.cs index 3f58c8a..1370a33 100644 --- a/ConfectioneryDataModels/IId.cs +++ b/ConfectioneryDataModels/IId.cs @@ -1,4 +1,4 @@ -namespace ConfectioneryDataModels +namespace EkzamenDataModels { public interface IId { diff --git a/ConfectioneryDataModels/IOrderModel.cs b/ConfectioneryDataModels/IOrderModel.cs deleted file mode 100644 index 01118fd..0000000 --- a/ConfectioneryDataModels/IOrderModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using ConfectioneryDataModels.Enums; - -namespace ConfectioneryDataModels.Models -{ - public interface IOrderModel : IId - { - int PastryId { get; } - int Count { get; } - double Sum { get; } - OrderStatus Status { get; } - DateTime DateCreate { get; } - DateTime? DateImplement { get; } - } -} diff --git a/ConfectioneryDataModels/IPastryModel.cs b/ConfectioneryDataModels/IPastryModel.cs deleted file mode 100644 index b13c2c5..0000000 --- a/ConfectioneryDataModels/IPastryModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ConfectioneryDataModels.Models -{ - public interface IPastryModel : IId - { - string PastryName { get; } - double Price { get; } - Dictionary PastryComponents { get; } - } -} diff --git a/ConfectioneryDataModels/IStudentModel.cs b/ConfectioneryDataModels/IStudentModel.cs new file mode 100644 index 0000000..bacbd8c --- /dev/null +++ b/ConfectioneryDataModels/IStudentModel.cs @@ -0,0 +1,13 @@ +namespace EkzamenDataModels +{ + public interface IStudentModel : IId + { + string fio { get; } + + int GroupId { get; } + int RecordBookId { get; } + int PassMark { get; } + + DateTime DateEnrollment { get; } + } +} diff --git a/ConfectioneryDataModels/OrderStatus.cs b/ConfectioneryDataModels/OrderStatus.cs deleted file mode 100644 index bb0ce5a..0000000 --- a/ConfectioneryDataModels/OrderStatus.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace ConfectioneryDataModels.Enums -{ - public enum OrderStatus - { - Неизвестен = -1, - Принят = 0, - Выполняется = 1, - Готов = 2, - Выдан = 3 - } -} \ No newline at end of file diff --git a/ConfectioneryDatabaseImplement/Component.cs b/ConfectioneryDatabaseImplement/Component.cs deleted file mode 100644 index e12c8f9..0000000 --- a/ConfectioneryDatabaseImplement/Component.cs +++ /dev/null @@ -1,58 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryDataModels.Models; -using System.ComponentModel.DataAnnotations.Schema; -using System.ComponentModel.DataAnnotations; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryDatabaseImplement.Models -{ - public class Component : IComponentModel - { - public int Id { get; private set; } - [Required] - public string ComponentName { get; private set; } = string.Empty; - [Required] - public double Cost { get; set; } - - [ForeignKey("ComponentId")] - public virtual List PastryComponents { get; set; } = new(); - - public static Component? Create(ComponentBindingModel model) - { - if (model == null) - { - return null; - } - return new Component() - { - Id = model.Id, - ComponentName = model.ComponentName, - Cost = model.Cost - }; - } - public static Component Create(ComponentViewModel model) - { - return new Component - { - Id = model.Id, - ComponentName = model.ComponentName, - Cost = model.Cost - }; - } - public void Update(ComponentBindingModel model) - { - if (model == null) - { - return; - } - ComponentName = model.ComponentName; - Cost = model.Cost; - } - public ComponentViewModel GetViewModel => new() - { - Id = Id, - ComponentName = ComponentName, - Cost = Cost - }; - } -} diff --git a/ConfectioneryDatabaseImplement/ComponentStorage.cs b/ConfectioneryDatabaseImplement/ComponentStorage.cs deleted file mode 100644 index 495ecf7..0000000 --- a/ConfectioneryDatabaseImplement/ComponentStorage.cs +++ /dev/null @@ -1,80 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDatabaseImplement.Models; - -namespace ConfectioneryDatabaseImplement.Implements -{ - public class ComponentStorage : IComponentStorage - { - public List GetFullList() - { - using var context = new ConfectioneryDatabase(); - return context.Components - .Select(x => x.GetViewModel) - .ToList(); - } - public List GetFilteredList(ComponentSearchModel model) - { - if (string.IsNullOrEmpty(model.ComponentName)) - { - return new(); - } - using var context = new ConfectioneryDatabase(); - return context.Components - .Where(x => x.ComponentName.Contains(model.ComponentName)) - .Select(x => x.GetViewModel) - .ToList(); - } - public ComponentViewModel? GetElement(ComponentSearchModel model) - { - if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue) - { - return null; - } - using var context = new ConfectioneryDatabase(); - return context.Components - .FirstOrDefault(x => - (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) || - (model.Id.HasValue && x.Id == model.Id)) - ?.GetViewModel; - } - public ComponentViewModel? Insert(ComponentBindingModel model) - { - var newComponent = Component.Create(model); - if (newComponent == null) - { - return null; - } - using var context = new ConfectioneryDatabase(); - context.Components.Add(newComponent); - context.SaveChanges(); - return newComponent.GetViewModel; - } - public ComponentViewModel? Update(ComponentBindingModel model) - { - using var context = new ConfectioneryDatabase(); - var component = context.Components.FirstOrDefault(x => x.Id == model.Id); - if (component == null) - { - return null; - } - component.Update(model); - context.SaveChanges(); - return component.GetViewModel; - } - public ComponentViewModel? Delete(ComponentBindingModel model) - { - using var context = new ConfectioneryDatabase(); - var element = context.Components.FirstOrDefault(rec => rec.Id == model.Id); - if (element != null) - { - context.Components.Remove(element); - context.SaveChanges(); - return element.GetViewModel; - } - return null; - } - } -} diff --git a/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs b/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs index 08095db..92c4515 100644 --- a/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs +++ b/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs @@ -1,8 +1,6 @@ -using ConfectioneryDatabaseImplement.Models; -using Microsoft.EntityFrameworkCore; -using System.Diagnostics.Metrics; +using Microsoft.EntityFrameworkCore; -namespace ConfectioneryDatabaseImplement +namespace EkzamenDatabaseImplement { public class ConfectioneryDatabase : DbContext { @@ -13,16 +11,14 @@ namespace ConfectioneryDatabaseImplement { optionsBuilder.UseSqlServer(@" Server = localhost\SQLEXPRESS; - Initial Catalog = ConfectioneryDatabaseFull; + Initial Catalog = EkzamenDatabaseFull; Integrated Security = True; MultipleActiveResultSets = True; TrustServerCertificate = True"); } base.OnConfiguring(optionsBuilder); } - public virtual DbSet Components { set; get; } - public virtual DbSet Pastries { set; get; } - public virtual DbSet PastryComponents { set; get; } - public virtual DbSet Orders { set; get; } + public virtual DbSet Students { set; get; } + public virtual DbSet Groups { set; get; } } } diff --git a/ConfectioneryDatabaseImplement/ConfectioneryDatabaseImplement.csproj b/ConfectioneryDatabaseImplement/EkzamenDatabaseImplement.csproj similarity index 79% rename from ConfectioneryDatabaseImplement/ConfectioneryDatabaseImplement.csproj rename to ConfectioneryDatabaseImplement/EkzamenDatabaseImplement.csproj index 6c6f63a..24402cb 100644 --- a/ConfectioneryDatabaseImplement/ConfectioneryDatabaseImplement.csproj +++ b/ConfectioneryDatabaseImplement/EkzamenDatabaseImplement.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/ConfectioneryDatabaseImplement/Group.cs b/ConfectioneryDatabaseImplement/Group.cs new file mode 100644 index 0000000..a985e98 --- /dev/null +++ b/ConfectioneryDatabaseImplement/Group.cs @@ -0,0 +1,53 @@ +using System.ComponentModel.DataAnnotations; +using EkzamenContracts.BindingModels; +using EkzamenContracts.ViewModels; +using EkzamenDataModels; + +namespace EkzamenDatabaseImplement +{ + public class Group : IGroupModel + { + public int Id { get; private set; } + + public static Group? Create(GroupBindingModel? model) + { + if (model == null) + { + return null; + } + return new Group() + { + Name = model.Name, + Direction = model.Direction, + Created = model.Created, + Id = model.Id, + }; + } + + public void Update(GroupBindingModel? model) + { + if (model == null) + { + return; + } + Direction = model.Direction; + Id = model.Id; + } + public GroupViewModel GetViewModel => + new() + { + Name = Name, + Direction = Direction, + Created = Created, + Id = Id, + }; + + [Required] + public string Name { get; set; } + [Required] + public string Direction { get; set; } + public DateTime Created { get; set; } + + public List Students { get; set; } + } +} diff --git a/ConfectioneryDatabaseImplement/OrderStorage.cs b/ConfectioneryDatabaseImplement/GroupStorage.cs similarity index 56% rename from ConfectioneryDatabaseImplement/OrderStorage.cs rename to ConfectioneryDatabaseImplement/GroupStorage.cs index 4e87161..ea9881a 100644 --- a/ConfectioneryDatabaseImplement/OrderStorage.cs +++ b/ConfectioneryDatabaseImplement/GroupStorage.cs @@ -1,67 +1,66 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDatabaseImplement.Models; +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; -namespace ConfectioneryDatabaseImplement.Implements +namespace EkzamenDatabaseImplement { - public class OrderStorage : IOrderStorage + public class GroupStorage : IGroupStorage { - public OrderViewModel? Delete(OrderBindingModel model) + public GroupViewModel? Delete(GroupBindingModel model) { using var context = new ConfectioneryDatabase(); - var element = context.Orders.FirstOrDefault(x => x.Id == model.Id); + var element = context.Groups.FirstOrDefault(x => x.Id == model.Id); if (element != null) { - context.Orders.Remove(element); + context.Groups.Remove(element); context.SaveChanges(); return element.GetViewModel; } return null; } - public OrderViewModel? GetElement(OrderSearchModel model) + public GroupViewModel? GetElement(GroupSearchModel model) { using var context = new ConfectioneryDatabase(); if (!model.Id.HasValue) { return null; } - return context.Orders.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)?.GetViewModel; + return context.Groups.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)?.GetViewModel; } - public List GetFilteredList(OrderSearchModel model) + public List GetFilteredList(GroupSearchModel model) { var result = GetElement(model); return result != null ? new() { result } : new(); } - public List GetFullList() + public List GetFullList() { using var context = new ConfectioneryDatabase(); - return context.Orders + return context.Groups .Select(x => x.GetViewModel) .ToList(); } - public OrderViewModel? Insert(OrderBindingModel model) + public GroupViewModel? Insert(GroupBindingModel model) { - var newOrder = Order.Create(model); + var newOrder = Group.Create(model); if (newOrder == null) { return null; } using var context = new ConfectioneryDatabase(); - context.Orders.Add(newOrder); + context.Groups.Add(newOrder); context.SaveChanges(); return newOrder.GetViewModel; } - public OrderViewModel? Update(OrderBindingModel model) + public GroupViewModel? Update(GroupBindingModel model) { using var context = new ConfectioneryDatabase(); - var order = context.Orders.FirstOrDefault(x => x.Id == model.Id); + var order = context.Groups.FirstOrDefault(x => x.Id == model.Id); if (order == null) { return null; diff --git a/ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.cs b/ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.cs deleted file mode 100644 index d633f68..0000000 --- a/ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ConfectioneryDatabaseImplement.Migrations -{ - /// - public partial class InitialCreate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Components", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ComponentName = table.Column(type: "nvarchar(max)", nullable: false), - Cost = table.Column(type: "float", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Components", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Pastries", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - PastryName = table.Column(type: "nvarchar(max)", nullable: false), - Price = table.Column(type: "float", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Pastries", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Orders", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - PastryId = table.Column(type: "int", nullable: false), - Count = table.Column(type: "int", nullable: false), - Sum = table.Column(type: "float", nullable: false), - Status = table.Column(type: "int", nullable: false), - DateCreate = table.Column(type: "datetime2", nullable: false), - DateImplement = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Orders", x => x.Id); - table.ForeignKey( - name: "FK_Orders_Pastries_PastryId", - column: x => x.PastryId, - principalTable: "Pastries", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "PastryComponents", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - PastryId = table.Column(type: "int", nullable: false), - ComponentId = table.Column(type: "int", nullable: false), - Count = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PastryComponents", x => x.Id); - table.ForeignKey( - name: "FK_PastryComponents_Components_ComponentId", - column: x => x.ComponentId, - principalTable: "Components", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_PastryComponents_Pastries_PastryId", - column: x => x.PastryId, - principalTable: "Pastries", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_Orders_PastryId", - table: "Orders", - column: "PastryId"); - - migrationBuilder.CreateIndex( - name: "IX_PastryComponents_ComponentId", - table: "PastryComponents", - column: "ComponentId"); - - migrationBuilder.CreateIndex( - name: "IX_PastryComponents_PastryId", - table: "PastryComponents", - column: "PastryId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Orders"); - - migrationBuilder.DropTable( - name: "PastryComponents"); - - migrationBuilder.DropTable( - name: "Components"); - - migrationBuilder.DropTable( - name: "Pastries"); - } - } -} diff --git a/ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.Designer.cs b/ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.Designer.cs similarity index 64% rename from ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.Designer.cs rename to ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.Designer.cs index 4922144..ab30b13 100644 --- a/ConfectioneryDatabaseImplement/Migrations/20230219142123_InitialCreate.Designer.cs +++ b/ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.Designer.cs @@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace ConfectioneryDatabaseImplement.Migrations { [DbContext(typeof(ConfectioneryDatabase))] - [Migration("20230219142123_InitialCreate")] - partial class InitialCreate + [Migration("20230228200344_create_shop")] + partial class create_shop { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -124,6 +124,64 @@ namespace ConfectioneryDatabaseImplement.Migrations b.ToTable("PastryComponents"); }); + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DateOpening") + .HasColumnType("datetime2"); + + b.Property("MaxCountPastries") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PastryId"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.ShopPastry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PastryId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopPastry"); + }); + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Order", b => { b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") @@ -154,6 +212,32 @@ namespace ConfectioneryDatabaseImplement.Migrations b.Navigation("Pastry"); }); + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", null) + .WithMany("Shops") + .HasForeignKey("PastryId"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.ShopPastry", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") + .WithMany() + .HasForeignKey("PastryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ConfectioneryDatabaseImplement.Models.Shop", "Shop") + .WithMany("ShopPastry") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Pastry"); + + b.Navigation("Shop"); + }); + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Component", b => { b.Navigation("PastryComponents"); @@ -164,6 +248,13 @@ namespace ConfectioneryDatabaseImplement.Migrations b.Navigation("Components"); b.Navigation("Orders"); + + b.Navigation("Shops"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.Navigation("ShopPastry"); }); #pragma warning restore 612, 618 } diff --git a/ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.cs b/ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.cs new file mode 100644 index 0000000..1546c98 --- /dev/null +++ b/ConfectioneryDatabaseImplement/Migrations/20230228200344_create_shop.cs @@ -0,0 +1,89 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ConfectioneryDatabaseImplement.Migrations +{ + /// + public partial class create_shop : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Shops", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false), + Address = table.Column(type: "nvarchar(max)", nullable: false), + MaxCountPastries = table.Column(type: "int", nullable: false), + DateOpening = table.Column(type: "datetime2", nullable: false), + PastryId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Shops", x => x.Id); + table.ForeignKey( + name: "FK_Shops_Pastries_PastryId", + column: x => x.PastryId, + principalTable: "Pastries", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "ShopPastry", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + PastryId = table.Column(type: "int", nullable: false), + ShopId = table.Column(type: "int", nullable: false), + Count = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ShopPastry", x => x.Id); + table.ForeignKey( + name: "FK_ShopPastry_Pastries_PastryId", + column: x => x.PastryId, + principalTable: "Pastries", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ShopPastry_Shops_ShopId", + column: x => x.ShopId, + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ShopPastry_PastryId", + table: "ShopPastry", + column: "PastryId"); + + migrationBuilder.CreateIndex( + name: "IX_ShopPastry_ShopId", + table: "ShopPastry", + column: "ShopId"); + + migrationBuilder.CreateIndex( + name: "IX_Shops_PastryId", + table: "Shops", + column: "PastryId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ShopPastry"); + + migrationBuilder.DropTable( + name: "Shops"); + } + } +} diff --git a/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.Designer.cs b/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.Designer.cs new file mode 100644 index 0000000..d47f4b1 --- /dev/null +++ b/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.Designer.cs @@ -0,0 +1,262 @@ +// +using System; +using ConfectioneryDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace ConfectioneryDatabaseImplement.Migrations +{ + [DbContext(typeof(ConfectioneryDatabase))] + [Migration("20230228204422_create_shop1")] + partial class create_shop1 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("PastryId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Pastry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("PastryName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Pastries"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.PastryComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("PastryId"); + + b.ToTable("PastryComponents"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DateOpening") + .HasColumnType("datetime2"); + + b.Property("MaxCountPastries") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PastryId"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.ShopPastry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PastryId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PastryId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopPastries"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Order", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") + .WithMany("Orders") + .HasForeignKey("PastryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Pastry"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.PastryComponent", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Component", "Component") + .WithMany("PastryComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") + .WithMany("Components") + .HasForeignKey("PastryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Pastry"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", null) + .WithMany("Shops") + .HasForeignKey("PastryId"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.ShopPastry", b => + { + b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") + .WithMany() + .HasForeignKey("PastryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ConfectioneryDatabaseImplement.Models.Shop", "Shop") + .WithMany("ShopPastries") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Pastry"); + + b.Navigation("Shop"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Component", b => + { + b.Navigation("PastryComponents"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Pastry", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + + b.Navigation("Shops"); + }); + + modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Shop", b => + { + b.Navigation("ShopPastries"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.cs b/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.cs new file mode 100644 index 0000000..107508b --- /dev/null +++ b/ConfectioneryDatabaseImplement/Migrations/20230228204422_create_shop1.cs @@ -0,0 +1,112 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ConfectioneryDatabaseImplement.Migrations +{ + /// + public partial class create_shop1 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ShopPastry_Pastries_PastryId", + table: "ShopPastry"); + + migrationBuilder.DropForeignKey( + name: "FK_ShopPastry_Shops_ShopId", + table: "ShopPastry"); + + migrationBuilder.DropPrimaryKey( + name: "PK_ShopPastry", + table: "ShopPastry"); + + migrationBuilder.RenameTable( + name: "ShopPastry", + newName: "ShopPastries"); + + migrationBuilder.RenameIndex( + name: "IX_ShopPastry_ShopId", + table: "ShopPastries", + newName: "IX_ShopPastries_ShopId"); + + migrationBuilder.RenameIndex( + name: "IX_ShopPastry_PastryId", + table: "ShopPastries", + newName: "IX_ShopPastries_PastryId"); + + migrationBuilder.AddPrimaryKey( + name: "PK_ShopPastries", + table: "ShopPastries", + column: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_ShopPastries_Pastries_PastryId", + table: "ShopPastries", + column: "PastryId", + principalTable: "Pastries", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ShopPastries_Shops_ShopId", + table: "ShopPastries", + column: "ShopId", + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ShopPastries_Pastries_PastryId", + table: "ShopPastries"); + + migrationBuilder.DropForeignKey( + name: "FK_ShopPastries_Shops_ShopId", + table: "ShopPastries"); + + migrationBuilder.DropPrimaryKey( + name: "PK_ShopPastries", + table: "ShopPastries"); + + migrationBuilder.RenameTable( + name: "ShopPastries", + newName: "ShopPastry"); + + migrationBuilder.RenameIndex( + name: "IX_ShopPastries_ShopId", + table: "ShopPastry", + newName: "IX_ShopPastry_ShopId"); + + migrationBuilder.RenameIndex( + name: "IX_ShopPastries_PastryId", + table: "ShopPastry", + newName: "IX_ShopPastry_PastryId"); + + migrationBuilder.AddPrimaryKey( + name: "PK_ShopPastry", + table: "ShopPastry", + column: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_ShopPastry_Pastries_PastryId", + table: "ShopPastry", + column: "PastryId", + principalTable: "Pastries", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ShopPastry_Shops_ShopId", + table: "ShopPastry", + column: "ShopId", + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.Designer.cs b/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.Designer.cs new file mode 100644 index 0000000..ef2db2b --- /dev/null +++ b/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.Designer.cs @@ -0,0 +1,101 @@ +// +using System; +using EkzamenDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EkzamenDatabaseImplement.Migrations +{ + [DbContext(typeof(ConfectioneryDatabase))] + [Migration("20240202070935_Init")] + partial class Init + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EkzamenDatabaseImplement.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Direction") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("EkzamenDatabaseImplement.Student", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateEnrollment") + .HasColumnType("datetime2"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("PassMark") + .HasColumnType("int"); + + b.Property("RecordBookId") + .HasColumnType("int"); + + b.Property("fio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("EkzamenDatabaseImplement.Student", b => + { + b.HasOne("EkzamenDatabaseImplement.Group", "Group") + .WithMany("Students") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("EkzamenDatabaseImplement.Group", b => + { + b.Navigation("Students"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.cs b/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.cs new file mode 100644 index 0000000..6b10080 --- /dev/null +++ b/ConfectioneryDatabaseImplement/Migrations/20240202070935_Init.cs @@ -0,0 +1,68 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EkzamenDatabaseImplement.Migrations +{ + /// + public partial class Init : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Groups", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false), + Direction = table.Column(type: "nvarchar(max)", nullable: false), + Created = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Groups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Students", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + fio = table.Column(type: "nvarchar(max)", nullable: false), + GroupId = table.Column(type: "int", nullable: false), + RecordBookId = table.Column(type: "int", nullable: false), + PassMark = table.Column(type: "int", nullable: false), + DateEnrollment = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Students", x => x.Id); + table.ForeignKey( + name: "FK_Students_Groups_GroupId", + column: x => x.GroupId, + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Students_GroupId", + table: "Students", + column: "GroupId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Students"); + + migrationBuilder.DropTable( + name: "Groups"); + } + } +} diff --git a/ConfectioneryDatabaseImplement/Migrations/ConfectioneryDatabaseModelSnapshot.cs b/ConfectioneryDatabaseImplement/Migrations/ConfectioneryDatabaseModelSnapshot.cs index a67eb4a..ae07478 100644 --- a/ConfectioneryDatabaseImplement/Migrations/ConfectioneryDatabaseModelSnapshot.cs +++ b/ConfectioneryDatabaseImplement/Migrations/ConfectioneryDatabaseModelSnapshot.cs @@ -1,6 +1,6 @@ // using System; -using ConfectioneryDatabaseImplement; +using EkzamenDatabaseImplement; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace ConfectioneryDatabaseImplement.Migrations +namespace EkzamenDatabaseImplement.Migrations { [DbContext(typeof(ConfectioneryDatabase))] partial class ConfectioneryDatabaseModelSnapshot : ModelSnapshot @@ -22,7 +22,7 @@ namespace ConfectioneryDatabaseImplement.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Component", b => + modelBuilder.Entity("EkzamenDatabaseImplement.Group", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -30,72 +30,23 @@ namespace ConfectioneryDatabaseImplement.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("ComponentName") + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Direction") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("Cost") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("DateCreate") - .HasColumnType("datetime2"); - - b.Property("DateImplement") - .HasColumnType("datetime2"); - - b.Property("PastryId") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.HasIndex("PastryId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Pastry", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("PastryName") + b.Property("Name") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("Price") - .HasColumnType("float"); - b.HasKey("Id"); - b.ToTable("Pastries"); + b.ToTable("Groups"); }); - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.PastryComponent", b => + modelBuilder.Entity("EkzamenDatabaseImplement.Student", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -103,64 +54,43 @@ namespace ConfectioneryDatabaseImplement.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("ComponentId") + b.Property("DateEnrollment") + .HasColumnType("datetime2"); + + b.Property("GroupId") .HasColumnType("int"); - b.Property("Count") + b.Property("PassMark") .HasColumnType("int"); - b.Property("PastryId") + b.Property("RecordBookId") .HasColumnType("int"); + b.Property("fio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + b.HasKey("Id"); - b.HasIndex("ComponentId"); + b.HasIndex("GroupId"); - b.HasIndex("PastryId"); - - b.ToTable("PastryComponents"); + b.ToTable("Students"); }); - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Order", b => + modelBuilder.Entity("EkzamenDatabaseImplement.Student", b => { - b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") - .WithMany("Orders") - .HasForeignKey("PastryId") + b.HasOne("EkzamenDatabaseImplement.Group", "Group") + .WithMany("Students") + .HasForeignKey("GroupId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Pastry"); + b.Navigation("Group"); }); - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.PastryComponent", b => + modelBuilder.Entity("EkzamenDatabaseImplement.Group", b => { - b.HasOne("ConfectioneryDatabaseImplement.Models.Component", "Component") - .WithMany("PastryComponents") - .HasForeignKey("ComponentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ConfectioneryDatabaseImplement.Models.Pastry", "Pastry") - .WithMany("Components") - .HasForeignKey("PastryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Pastry"); - }); - - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Component", b => - { - b.Navigation("PastryComponents"); - }); - - modelBuilder.Entity("ConfectioneryDatabaseImplement.Models.Pastry", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); + b.Navigation("Students"); }); #pragma warning restore 612, 618 } diff --git a/ConfectioneryDatabaseImplement/Order.cs b/ConfectioneryDatabaseImplement/Order.cs deleted file mode 100644 index 59cbfb0..0000000 --- a/ConfectioneryDatabaseImplement/Order.cs +++ /dev/null @@ -1,91 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDataModels.Enums; -using ConfectioneryDataModels.Models; -using Microsoft.EntityFrameworkCore; -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; -using System.Xml.Linq; - -namespace ConfectioneryDatabaseImplement.Models -{ - public class Order : IOrderModel - { - public int Id { get; private set; } - - [Required] - public int PastryId { get; private set; } - - [Required] - public int Count { get; private set; } - - [Required] - public double Sum { get; private set; } - - [Required] - public OrderStatus Status { get; private set; } - - [Required] - public DateTime DateCreate { get; private set; } - - public DateTime? DateImplement { get; private set; } - - public Pastry Pastry { get; private set; } - - public static Order? Create(OrderBindingModel? model) - { - if (model == null) - { - return null; - } - return new Order() - { - PastryId = model.PastryId, - Count = model.Count, - Sum = model.Sum, - Status = model.Status, - DateCreate = model.DateCreate, - DateImplement = model.DateImplement, - Id = model.Id, - }; - } - - public void Update(OrderBindingModel? model) - { - if (model == null) - { - return; - } - PastryId = model.PastryId; - Count = model.Count; - Sum = model.Sum; - Status = model.Status; - DateCreate = model.DateCreate; - DateImplement = model.DateImplement; - Id = model.Id; - } - public OrderViewModel GetViewModel - { - get - { - var context = new ConfectioneryDatabase(); - return new() - { - PastryName = context.Pastries.FirstOrDefault(x => x.Id == PastryId)?.PastryName ?? string.Empty, - PastryId = PastryId, - Count = Count, - Sum = Sum, - Status = Status, - DateCreate = DateCreate, - DateImplement = DateImplement, - Id = Id, - }; - } - } - } -} diff --git a/ConfectioneryDatabaseImplement/Pastry.cs b/ConfectioneryDatabaseImplement/Pastry.cs deleted file mode 100644 index 8f69a58..0000000 --- a/ConfectioneryDatabaseImplement/Pastry.cs +++ /dev/null @@ -1,103 +0,0 @@ -using ConfectioneryDataModels.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations.Schema; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.ViewModels; - -namespace ConfectioneryDatabaseImplement.Models -{ - public class Pastry : IPastryModel - { - public int Id { get; set; } - [Required] - public string PastryName { get; set; } = string.Empty; - [Required] - public double Price { get; set; } - private Dictionary? _pastryComponents = null; - - [NotMapped] - public Dictionary PastryComponents - { - get - { - if (_pastryComponents == null) - { - _pastryComponents = Components - .ToDictionary(recPC => recPC.ComponentId, recPC => - (recPC.Component as IComponentModel, recPC.Count)); - } - return _pastryComponents; - } - } - - [ForeignKey("PastryId")] - public virtual List Components { get; set; } = new(); - [ForeignKey("PastryId")] - public virtual List Orders { get; set; } = new(); - - public static Pastry Create(ConfectioneryDatabase context, PastryBindingModel model) - { - return new Pastry() - { - Id = model.Id, - PastryName = model.PastryName, - Price = model.Price, - Components = model.PastryComponents.Select(x => new PastryComponent - { - Component = context.Components.First(y => y.Id == x.Key), - Count = x.Value.Item2 - }).ToList() - }; - } - public void Update(PastryBindingModel model) - { - PastryName = model.PastryName; - Price = model.Price; - } - public PastryViewModel GetViewModel => new() - { - Id = Id, - PastryName = PastryName, - Price = Price, - PastryComponents = PastryComponents - }; - public void UpdateComponents(ConfectioneryDatabase context, PastryBindingModel model) - { - var pastryComponents = context.PastryComponents - .Where(rec => rec.PastryId == model.Id) - .ToList(); - if (pastryComponents != null && pastryComponents.Count > 0) - { // удалили те, которых нет в модели - context.PastryComponents - .RemoveRange(pastryComponents - .Where(rec => !model.PastryComponents - .ContainsKey(rec.ComponentId))); - context.SaveChanges(); - // обновили количество у существующих записей - foreach (var updateComponent in pastryComponents.Where(x => model.PastryComponents.ContainsKey(x.ComponentId))) - { - updateComponent.Count = model.PastryComponents[updateComponent.ComponentId].Item2; - model.PastryComponents.Remove(updateComponent.ComponentId); - } - context.SaveChanges(); - } - var pastry = context.Pastries.First(x => x.Id == Id); - foreach (var pc in model.PastryComponents) - { - context.PastryComponents.Add(new PastryComponent - { - Pastry = pastry, - Component = context.Components.First(x => x.Id == pc.Key), - Count = pc.Value.Item2 - }); - context.SaveChanges(); - } - _pastryComponents = null; - } - } -} diff --git a/ConfectioneryDatabaseImplement/PastryComponent.cs b/ConfectioneryDatabaseImplement/PastryComponent.cs deleted file mode 100644 index d7ca43d..0000000 --- a/ConfectioneryDatabaseImplement/PastryComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace ConfectioneryDatabaseImplement.Models -{ - public class PastryComponent - { - public int Id { get; set; } - [Required] - public int PastryId { get; set; } - [Required] - public int ComponentId { get; set; } - [Required] - public int Count { get; set; } - - public virtual Component Component { get; set; } = new(); - public virtual Pastry Pastry { get; set; } = new(); - } -} diff --git a/ConfectioneryDatabaseImplement/PastryStorage.cs b/ConfectioneryDatabaseImplement/PastryStorage.cs deleted file mode 100644 index b5a60b0..0000000 --- a/ConfectioneryDatabaseImplement/PastryStorage.cs +++ /dev/null @@ -1,104 +0,0 @@ -using ConfectioneryContracts.BindingModels; -using ConfectioneryContracts.SearchModels; -using ConfectioneryContracts.StoragesContract; -using ConfectioneryContracts.ViewModels; -using ConfectioneryDatabaseImplement; -using ConfectioneryDatabaseImplement.Models; -using Microsoft.EntityFrameworkCore; - -namespace ConfectioneryDatabaseImplement.Implements -{ - public class PastryStorage : IPastryStorage - { - public PastryViewModel? Delete(PastryBindingModel model) - { - using var context = new ConfectioneryDatabase(); - var element = context.Pastries.FirstOrDefault(x => x.Id == model.Id); - if (element != null) - { - context.Pastries.Remove(element); - context.SaveChanges(); - return element.GetViewModel; - } - return null; - } - - public PastryViewModel? GetElement(PastrySearchModel model) - { - if (string.IsNullOrEmpty(model.PastryName) && !model.Id.HasValue) - { - return null; - } - using var context = new ConfectioneryDatabase(); - return context.Pastries - .Include(x => x.Components) - .ThenInclude(x => x.Component) - .FirstOrDefault - (x => (!string.IsNullOrEmpty(model.PastryName) && x.PastryName == model.PastryName) || - (model.Id.HasValue && x.Id == model.Id) - )?.GetViewModel; - } - - public List GetFilteredList(PastrySearchModel model) - { - if (string.IsNullOrEmpty(model.PastryName)) - { - return new(); - } - using var context = new ConfectioneryDatabase(); - return context.Pastries - .Include(x => x.Components) - .ThenInclude(x => x.Component) - .Select(x => x.GetViewModel) - .Where(x => x.PastryName.Contains(model.PastryName)) - .ToList(); - } - - public List GetFullList() - { - using var context = new ConfectioneryDatabase(); - return context.Pastries - .Include(x => x.Components) - .ThenInclude(x => x.Component) - .Select(x => x.GetViewModel) - .ToList(); - } - - public PastryViewModel? Insert(PastryBindingModel model) - { - using var context = new ConfectioneryDatabase(); - var newPastry = Pastry.Create(context, model); - if (newPastry == null) - { - return null; - } - context.Pastries.Add(newPastry); - context.SaveChanges(); - return newPastry.GetViewModel; - } - - public PastryViewModel? Update(PastryBindingModel model) - { - using var context = new ConfectioneryDatabase(); - using var transaction = context.Database.BeginTransaction(); - try - { - var pastry = context.Pastries.FirstOrDefault(x => x.Id == model.Id); - if (pastry == null) - { - return null; - } - pastry.Update(model); - context.SaveChanges(); - pastry.UpdateComponents(context, model); - transaction.Commit(); - return pastry.GetViewModel; - } - catch - { - transaction.Rollback(); - throw; - } - } - } -} diff --git a/ConfectioneryDatabaseImplement/Student.cs b/ConfectioneryDatabaseImplement/Student.cs new file mode 100644 index 0000000..9362c79 --- /dev/null +++ b/ConfectioneryDatabaseImplement/Student.cs @@ -0,0 +1,57 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text.RegularExpressions; +using EkzamenContracts.BindingModels; +using EkzamenContracts.ViewModels; +using EkzamenDataModels; + +namespace EkzamenDatabaseImplement +{ + public class Student : IStudentModel + { + public int Id { get; private set; } + + public static Student? Create(StudentBindingModel model) + { + if (model == null) + { + return null; + } + return new Student() + { + Id = model.Id, + fio = model.fio, + DateEnrollment = model.DateEnrollment, + GroupId = model.GroupId, + PassMark = model.PassMark, + RecordBookId = model.RecordBookId, + }; + } + public void Update(StudentBindingModel model) + { + if (model == null) + { + return; + } + fio = model.fio; + + } + public StudentViewModel GetViewModel => new() + { + Id = Id, + fio = fio, + DateEnrollment = DateEnrollment, + GroupId = GroupId, + PassMark = PassMark, + RecordBookId = RecordBookId, + }; + + public string fio { get; set; } + public int GroupId { get; set; } + public int RecordBookId { get; set; } + public int PassMark { get; set; } + public DateTime DateEnrollment { get; set; } + + public Group Group { get; set; } + } +} diff --git a/ConfectioneryDatabaseImplement/StudentStorage.cs b/ConfectioneryDatabaseImplement/StudentStorage.cs new file mode 100644 index 0000000..0430563 --- /dev/null +++ b/ConfectioneryDatabaseImplement/StudentStorage.cs @@ -0,0 +1,77 @@ +using EkzamenContracts.BindingModels; +using EkzamenContracts.SearchModels; +using EkzamenContracts.StoragesContract; +using EkzamenContracts.ViewModels; + +namespace EkzamenDatabaseImplement +{ + public class StudentStorage : IStudentStorage + { + public List GetFullList() + { + using var context = new ConfectioneryDatabase(); + return context.Students + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(StudentSearchModel model) + { + if (model.CreatedDateFrom is null || model.CreatedDateTo is null) + { + return new(); + } + using var context = new ConfectioneryDatabase(); + return context.Students + .Where(x => model.CreatedDateFrom <= x.DateEnrollment && x.DateEnrollment <= model.CreatedDateTo) + .Select(x => x.GetViewModel) + .ToList(); + } + public StudentViewModel? GetElement(StudentSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + using var context = new ConfectioneryDatabase(); + return context.Students + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + public StudentViewModel? Insert(StudentBindingModel model) + { + var newComponent = Student.Create(model); + if (newComponent == null) + { + return null; + } + using var context = new ConfectioneryDatabase(); + context.Students.Add(newComponent); + context.SaveChanges(); + return newComponent.GetViewModel; + } + public StudentViewModel? Update(StudentBindingModel model) + { + using var context = new ConfectioneryDatabase(); + var component = context.Students.FirstOrDefault(x => x.Id == model.Id); + if (component == null) + { + return null; + } + component.Update(model); + context.SaveChanges(); + return component.GetViewModel; + } + public StudentViewModel? Delete(StudentBindingModel model) + { + using var context = new ConfectioneryDatabase(); + var element = context.Students.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Students.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/Confectionery.sln b/Ekzamen.sln similarity index 62% rename from Confectionery.sln rename to Ekzamen.sln index cb0512c..6d8ce2e 100644 --- a/Confectionery.sln +++ b/Ekzamen.sln @@ -3,19 +3,17 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.4.33103.184 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryView", "Confectionery\ConfectioneryView.csproj", "{4C293123-3570-4E76-A241-E28EB1498585}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenView", "Confectionery\EkzamenView.csproj", "{4C293123-3570-4E76-A241-E28EB1498585}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryDataModels", "ConfectioneryDataModels\ConfectioneryDataModels.csproj", "{C5FCA6F0-A6D0-47CB-B507-4A6EAA89E645}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenDataModels", "ConfectioneryDataModels\EkzamenDataModels.csproj", "{C5FCA6F0-A6D0-47CB-B507-4A6EAA89E645}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryContracts", "ConfectioneryContracts\ConfectioneryContracts.csproj", "{28EC043D-88E8-48DA-B5E8-2DE5659EB1BD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenContracts", "ConfectioneryContracts\EkzamenContracts.csproj", "{28EC043D-88E8-48DA-B5E8-2DE5659EB1BD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryBusinessLogic", "ConfectionaryBusinessLogic\ConfectioneryBusinessLogic.csproj", "{82EF78A8-98EC-490A-8D66-66909E5431E2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenBusinessLogic", "ConfectionaryBusinessLogic\EkzamenBusinessLogic.csproj", "{82EF78A8-98EC-490A-8D66-66909E5431E2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryListImplement", "ConfectionaryListImplement\ConfectioneryListImplement.csproj", "{0A7B118B-9B7C-4796-9846-66026159723E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenListImplement", "ConfectionaryListImplement\EkzamenListImplement.csproj", "{0A7B118B-9B7C-4796-9846-66026159723E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfectioneryFileImplement", "ConfectionaryFileImplement\ConfectioneryFileImplement.csproj", "{47A2EA59-4443-487E-85F4-AC49C04B7211}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConfectioneryDatabaseImplement", "ConfectioneryDatabaseImplement\ConfectioneryDatabaseImplement.csproj", "{2BB59FBD-AA9F-4005-8B0B-6E5176EED6A1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EkzamenDatabaseImplement", "ConfectioneryDatabaseImplement\EkzamenDatabaseImplement.csproj", "{2BB59FBD-AA9F-4005-8B0B-6E5176EED6A1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -43,10 +41,6 @@ Global {0A7B118B-9B7C-4796-9846-66026159723E}.Debug|Any CPU.Build.0 = Debug|Any CPU {0A7B118B-9B7C-4796-9846-66026159723E}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A7B118B-9B7C-4796-9846-66026159723E}.Release|Any CPU.Build.0 = Release|Any CPU - {47A2EA59-4443-487E-85F4-AC49C04B7211}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47A2EA59-4443-487E-85F4-AC49C04B7211}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47A2EA59-4443-487E-85F4-AC49C04B7211}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47A2EA59-4443-487E-85F4-AC49C04B7211}.Release|Any CPU.Build.0 = Release|Any CPU {2BB59FBD-AA9F-4005-8B0B-6E5176EED6A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2BB59FBD-AA9F-4005-8B0B-6E5176EED6A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {2BB59FBD-AA9F-4005-8B0B-6E5176EED6A1}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/ImplementationExtensions/ConfectioneryBusinessLogic.dll b/ImplementationExtensions/ConfectioneryBusinessLogic.dll new file mode 100644 index 0000000000000000000000000000000000000000..b55e9d4b75fe11efb9090d0db1264763e24f4b19 GIT binary patch literal 77312 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

?58DgDk<|}JsG>(!nS};;ZH@6#X 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 Omg@TVfB)Zc;Qs&zW9a1o literal 0 HcmV?d00001 diff --git a/ImplementationExtensions/ConfectioneryContracts.dll b/ImplementationExtensions/ConfectioneryContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..841540e24355342403dd590c87104d1ab6ff6727 GIT binary patch literal 37888 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

BR)i&{O#Rsb^#)eK?wORW5Di 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 literal 0 HcmV?d00001 diff --git a/ImplementationExtensions/ConfectioneryFileImplement.dll b/ImplementationExtensions/ConfectioneryFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..30e29d9d420f0b55e7718aefbfbf4128cde9e842 GIT binary patch literal 50176 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 Yn}0826q_ib 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 XPrv%RK=;V+tN%tD|5NP$+aCDeXTnIu literal 0 HcmV?d00001