From a23b6390a4eaeb81242898e12947b67d91f39e22 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Thu, 8 Feb 2024 12:59:58 +0300
Subject: [PATCH 01/12] abuyz

---
 FlowerShopDataModels/FlowerShopDataModels.csproj |  9 +++++++++
 FlowerShopDataModels/IId.cs                      | 12 ++++++++++++
 FlowerShopDataModels/OrderStatus.cs              | 11 +++++++++++
 ProjectFlowerShop.sln                            |  8 +++++++-
 4 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 FlowerShopDataModels/FlowerShopDataModels.csproj
 create mode 100644 FlowerShopDataModels/IId.cs
 create mode 100644 FlowerShopDataModels/OrderStatus.cs

diff --git a/FlowerShopDataModels/FlowerShopDataModels.csproj b/FlowerShopDataModels/FlowerShopDataModels.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/FlowerShopDataModels/FlowerShopDataModels.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/FlowerShopDataModels/IId.cs b/FlowerShopDataModels/IId.cs
new file mode 100644
index 0000000..a8a1916
--- /dev/null
+++ b/FlowerShopDataModels/IId.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopDataModels
+{
+    internal interface IId
+    {
+    }
+}
diff --git a/FlowerShopDataModels/OrderStatus.cs b/FlowerShopDataModels/OrderStatus.cs
new file mode 100644
index 0000000..2095810
--- /dev/null
+++ b/FlowerShopDataModels/OrderStatus.cs
@@ -0,0 +1,11 @@
+namespace FlowerShopDataModels.Enums
+{
+    public enum OrderStatus
+    {
+        Неизвестен = -1,
+        Принят = 0,
+        Выполняется = 1,
+        Готов = 2,
+        Выдан = 3
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop.sln b/ProjectFlowerShop.sln
index 4b6e5ed..ee95802 100644
--- a/ProjectFlowerShop.sln
+++ b/ProjectFlowerShop.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
 VisualStudioVersion = 17.7.34031.279
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectFlowerShop", "ProjectFlowerShop\ProjectFlowerShop.csproj", "{AB184B22-49FC-45E0-A5C0-D68310452DF3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectFlowerShop", "ProjectFlowerShop\ProjectFlowerShop.csproj", "{AB184B22-49FC-45E0-A5C0-D68310452DF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowerShopDataModels", "FlowerShopDataModels\FlowerShopDataModels.csproj", "{9E7C9D26-3932-4020-893D-1757DB2048B6}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
 		{AB184B22-49FC-45E0-A5C0-D68310452DF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AB184B22-49FC-45E0-A5C0-D68310452DF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{AB184B22-49FC-45E0-A5C0-D68310452DF3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
-- 
2.25.1


From 318326ae54f48c4c2178027cf0d73abdcfb45598 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Thu, 8 Feb 2024 15:12:43 +0300
Subject: [PATCH 02/12] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=BE=20?=
 =?UTF-8?q?=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=B1=D1=8B=D0=BB=D0=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 FlowerShopBusinessLogic/ComponentLogic.cs     | 113 ++++++++++++++++++
 FlowerShopBusinessLogic/FlowerLogic.cs        | 112 +++++++++++++++++
 .../FlowerShopBusinessLogic.csproj            |  17 +++
 FlowerShopBusinessLogic/OrderLogic.cs         | 110 +++++++++++++++++
 .../BindingModels/ComponentBindingModel.cs    |  16 +++
 .../BindingModels/FlowerBindingModel.cs       |  21 ++++
 .../BindingModels/OrderBindingModel.cs        |  21 ++++
 .../IComponentLogic.cs                        |  20 ++++
 .../BusinessLogicsContracts/IFlowerLogic.cs   |  20 ++++
 .../BusinessLogicsContracts/IOrderLogic.cs    |  20 ++++
 .../FlowerShopContracts.csproj                |  17 +++
 .../SearchModels/ComponentSearchModel.cs      |  14 +++
 .../SearchModels/FlowerSearchModel.cs         |  14 +++
 .../SearchModels/OrderSearchModel.cs          |  13 ++
 .../StoragesContracts/IComponentStorage.cs    |  21 ++++
 .../StoragesContracts/IFlowerStorage.cs       |  21 ++++
 .../StoragesContracts/IOrderStorage.cs        |  21 ++++
 .../ViewModels/ComponentViewModel.cs          |  19 +++
 .../ViewModels/FlowerViewModel.cs             |  24 ++++
 .../ViewModels/OrderViewModel.cs              |  30 +++++
 .../FlowerShopDataModels.csproj               |   4 +
 FlowerShopDataModels/IComponentModel.cs       |  14 +++
 FlowerShopDataModels/IFlowerModel.cs          |  16 +++
 FlowerShopDataModels/IId.cs                   |   3 +-
 FlowerShopDataModels/IOrderModel.cs           |  20 ++++
 FlowerShopListImplement/Component.cs          |  41 +++++++
 FlowerShopListImplement/Flower.cs             |  54 +++++++++
 .../FlowerShopListImplement.csproj            |  14 +++
 ProjectFlowerShop.sln                         |  20 +++-
 ProjectFlowerShop/ProjectFlowerShop.csproj    |   4 +
 30 files changed, 852 insertions(+), 2 deletions(-)
 create mode 100644 FlowerShopBusinessLogic/ComponentLogic.cs
 create mode 100644 FlowerShopBusinessLogic/FlowerLogic.cs
 create mode 100644 FlowerShopBusinessLogic/FlowerShopBusinessLogic.csproj
 create mode 100644 FlowerShopBusinessLogic/OrderLogic.cs
 create mode 100644 FlowerShopContracts/BindingModels/ComponentBindingModel.cs
 create mode 100644 FlowerShopContracts/BindingModels/FlowerBindingModel.cs
 create mode 100644 FlowerShopContracts/BindingModels/OrderBindingModel.cs
 create mode 100644 FlowerShopContracts/BusinessLogicsContracts/IComponentLogic.cs
 create mode 100644 FlowerShopContracts/BusinessLogicsContracts/IFlowerLogic.cs
 create mode 100644 FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs
 create mode 100644 FlowerShopContracts/FlowerShopContracts.csproj
 create mode 100644 FlowerShopContracts/SearchModels/ComponentSearchModel.cs
 create mode 100644 FlowerShopContracts/SearchModels/FlowerSearchModel.cs
 create mode 100644 FlowerShopContracts/SearchModels/OrderSearchModel.cs
 create mode 100644 FlowerShopContracts/StoragesContracts/IComponentStorage.cs
 create mode 100644 FlowerShopContracts/StoragesContracts/IFlowerStorage.cs
 create mode 100644 FlowerShopContracts/StoragesContracts/IOrderStorage.cs
 create mode 100644 FlowerShopContracts/ViewModels/ComponentViewModel.cs
 create mode 100644 FlowerShopContracts/ViewModels/FlowerViewModel.cs
 create mode 100644 FlowerShopContracts/ViewModels/OrderViewModel.cs
 create mode 100644 FlowerShopDataModels/IComponentModel.cs
 create mode 100644 FlowerShopDataModels/IFlowerModel.cs
 create mode 100644 FlowerShopDataModels/IOrderModel.cs
 create mode 100644 FlowerShopListImplement/Component.cs
 create mode 100644 FlowerShopListImplement/Flower.cs
 create mode 100644 FlowerShopListImplement/FlowerShopListImplement.csproj

diff --git a/FlowerShopBusinessLogic/ComponentLogic.cs b/FlowerShopBusinessLogic/ComponentLogic.cs
new file mode 100644
index 0000000..ed0ddc3
--- /dev/null
+++ b/FlowerShopBusinessLogic/ComponentLogic.cs
@@ -0,0 +1,113 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopBusinessLogic.BusinessLogic
+{
+    public class ComponentLogic : IFlowerLogic 
+    {
+        private readonly ILogger _logger;
+        private readonly IComponentStorage _componentStorage;
+        public ComponentLogic(ILogger<ComponentLogic> logger, IComponentStorage componentStorage)
+        {
+            _logger = logger;
+            _componentStorage = componentStorage;
+        }
+        public List<ComponentViewModel>? ReadList(ComponentSearchModel? model)
+        {
+            _logger.LogInformation("ReadList. ComponentName:{ComponentName}.Id:{ Id}", model?.ComponentName, model?.Id);
+        var list = model == null ? _componentStorage.GetFullList() : _componentStorage.GetFilteredList(model);
+            if (list == null)
+            {
+                _logger.LogWarning("ReadList return null list");
+                return null;
+            }
+            _logger.LogInformation("ReadList. Count:{Count}", list.Count);
+            return list;
+        }
+        public ComponentViewModel? ReadElement(ComponentSearchModel model)
+        {
+            if (model == null)
+            {
+                throw new ArgumentNullException(nameof(model));
+            }
+            _logger.LogInformation("ReadElement. ComponentName:{ComponentName}.Id:{ Id}", model.ComponentName, model.Id);
+        var element = _componentStorage.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(ComponentBindingModel model)
+        {
+            CheckModel(model);
+            if (_componentStorage.Insert(model) == null)
+            {
+                _logger.LogWarning("Insert operation failed");
+                return false;
+            }
+            return true;
+        }
+        public bool Update(ComponentBindingModel model)
+        {
+            CheckModel(model);
+            if (_componentStorage.Update(model) == null)
+            {
+                _logger.LogWarning("Update operation failed");
+                return false;
+            }
+            return true;
+        }
+        public bool Delete(ComponentBindingModel model)
+        {
+            CheckModel(model, false);
+            _logger.LogInformation("Delete. Id:{Id}", model.Id);
+            if (_componentStorage.Delete(model) == null)
+            {
+                _logger.LogWarning("Delete operation failed");
+                return false;
+            }
+            return true;
+        }
+        private void CheckModel(ComponentBindingModel 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("Компонент с таким названиемуже есть");
+            }
+        }
+    }
+}
diff --git a/FlowerShopBusinessLogic/FlowerLogic.cs b/FlowerShopBusinessLogic/FlowerLogic.cs
new file mode 100644
index 0000000..76007ba
--- /dev/null
+++ b/FlowerShopBusinessLogic/FlowerLogic.cs
@@ -0,0 +1,112 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopBusinessLogic.BusinessLogic
+{
+    public class FlowerLogic : IFlowerLogic
+    {
+        private readonly ILogger _logger;
+        private readonly IFlowerStorage _flowerStorage;
+        public FlowerLogic(ILogger<FlowerLogic> logger, IFlowerStorage flowerStorage)
+        {
+            _logger = logger;
+            _flowerStorage = flowerStorage;
+        }
+        public List<FlowerViewModel>? ReadList(FlowerSearchModel? model)
+        {
+            _logger.LogInformation("ReadList. FlowerName:{FlowerName}.Id:{ Id}", model?.FlowerName, model?.Id);
+            var list = model == null ? _flowerStorage.GetFullList() : _flowerStorage.GetFilteredList(model);
+            if (list == null)
+            {
+                _logger.LogWarning("ReadList return null list");
+                return null;
+            }
+            _logger.LogInformation("ReadList. Count:{Count}", list.Count);
+            return list;
+        }
+        public FlowerViewModel? ReadElement(FlowerSearchModel model)
+        {
+            if (model == null)
+            {
+                throw new ArgumentNullException(nameof(model));
+            }
+            _logger.LogInformation("ReadElement. FlowerName:{FlowerName}.Id:{ Id}", model.FlowerName, model.Id);
+            var element = _flowerStorage.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(FlowerBindingModel model)
+        {
+            CheckModel(model);
+            if (_flowerStorage.Insert(model) == null)
+            {
+                _logger.LogWarning("Insert operation failed");
+                return false;
+            }
+            return true;
+        }
+        public bool Update(FlowerBindingModel model)
+        {
+            CheckModel(model);
+            if (_flowerStorage.Update(model) == null)
+            {
+                _logger.LogWarning("Update operation failed");
+                return false;
+            }
+            return true;
+        }
+        public bool Delete(FlowerBindingModel model)
+        {
+            CheckModel(model, false);
+            _logger.LogInformation("Delete. Id:{Id}", model.Id);
+            if (_flowerStorage.Delete(model) == null)
+            {
+                _logger.LogWarning("Delete operation failed");
+                return false;
+            }
+            return true;
+        }
+        private void CheckModel(FlowerBindingModel model, bool withParams = true)
+        {
+            if (model == null)
+            {
+                throw new ArgumentNullException(nameof(model));
+            }
+            if (!withParams)
+            {
+                return;
+            }
+            if (string.IsNullOrEmpty(model.FlowerName))
+            {
+                throw new ArgumentNullException("Нет названия цветка", nameof(model.FlowerName));
+            }
+            if (model.Price <= 0)
+            {
+                throw new ArgumentNullException("Цена цветка должна быть больше 0", nameof(model.Price));
+            }
+            _logger.LogInformation("Flower. FlowerName:{FlowerName}.Cost:{ Cost}. Id: { Id}", model.FlowerName, model.Price, model.Id);
+            var element = _flowerStorage.GetElement(new FlowerSearchModel
+            {
+                FlowerName = model.FlowerName
+            });
+            if (element != null && element.Id != model.Id)
+            {
+                throw new InvalidOperationException("Компонент с таким названием уже есть");
+            }
+        }
+    }
+}
diff --git a/FlowerShopBusinessLogic/FlowerShopBusinessLogic.csproj b/FlowerShopBusinessLogic/FlowerShopBusinessLogic.csproj
new file mode 100644
index 0000000..e3db8e7
--- /dev/null
+++ b/FlowerShopBusinessLogic/FlowerShopBusinessLogic.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\FlowerShopContracts\FlowerShopContracts.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/FlowerShopBusinessLogic/OrderLogic.cs b/FlowerShopBusinessLogic/OrderLogic.cs
new file mode 100644
index 0000000..c19d04d
--- /dev/null
+++ b/FlowerShopBusinessLogic/OrderLogic.cs
@@ -0,0 +1,110 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using FlowerShopDataModels.Enums;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopBusinessLogic.BusinessLogic
+{
+    public class OrderLogic : IOrderLogic
+    {
+        private readonly ILogger _logger;
+        private readonly IOrderStorage _orderStorage;
+
+        public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage)
+        {
+            _logger = logger;
+            _orderStorage = orderStorage;
+        }
+
+        public List<OrderViewModel>? ReadList(OrderSearchModel? model)
+        {
+            _logger.LogInformation("ReadList. 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;
+        }
+
+        public bool CreateOrder(OrderBindingModel model)
+        {
+            CheckModel(model);
+            if (model.Status != OrderStatus.Неизвестен) return false;
+            model.Status = OrderStatus.Принят;
+            if (_orderStorage.Insert(model) == null)
+            {
+                _logger.LogWarning("Insert operation failed");
+                return false;
+            }
+            return true;
+        }
+
+        public bool ChangeStatus(OrderBindingModel model, OrderStatus status)
+        {
+            CheckModel(model);
+            var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id });
+            if (element == null)
+            {
+                _logger.LogWarning("Read operation failed");
+                return false;
+            }
+            if (element.Status != status - 1)
+            {
+                _logger.LogWarning("Status change operation failed");
+                throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный");
+            }
+            model.Status = status;
+            if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now;
+            _orderStorage.Update(model);
+            return true;
+        }
+
+        public bool TakeOrderInWork(OrderBindingModel model)
+        {
+            return ChangeStatus(model, OrderStatus.Выполняется);
+        }
+
+        public bool FinishOrder(OrderBindingModel model)
+        {
+            return ChangeStatus(model, OrderStatus.Готов);
+        }
+
+        public bool DeliveryOrder(OrderBindingModel model)
+        {
+            return ChangeStatus(model, OrderStatus.Выдан);
+        }
+
+        private void CheckModel(OrderBindingModel model, bool withParams = true)
+        {
+            if (model == null)
+            {
+                throw new ArgumentNullException(nameof(model));
+            }
+            if (!withParams)
+            {
+                return;
+            }
+            if (model.Sum <= 0)
+            {
+                throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum));
+            }
+            if (model.Count <= 0)
+            {
+                throw new ArgumentNullException("Количество элементов в заказе должно быть больше 0", nameof(model.Count));
+            }
+            _logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id);
+        }
+    }
+}
diff --git a/FlowerShopContracts/BindingModels/ComponentBindingModel.cs b/FlowerShopContracts/BindingModels/ComponentBindingModel.cs
new file mode 100644
index 0000000..3b3ae89
--- /dev/null
+++ b/FlowerShopContracts/BindingModels/ComponentBindingModel.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FlowerShopDataModels.Models;
+
+namespace FlowerShopContracts.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/FlowerShopContracts/BindingModels/FlowerBindingModel.cs b/FlowerShopContracts/BindingModels/FlowerBindingModel.cs
new file mode 100644
index 0000000..b484875
--- /dev/null
+++ b/FlowerShopContracts/BindingModels/FlowerBindingModel.cs
@@ -0,0 +1,21 @@
+using FlowerShopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.BindingModels
+{
+    public class FlowerBindingModel : IFlowerModel
+    {
+        public int Id { get; set; }
+        public string FlowerName { get; set; } = string.Empty;
+        public double Price { get; set; }
+        public Dictionary<int, (IComponentModel, int)> FlowerComponents
+        {
+            get;
+            set;
+        } = new();
+    }
+}
diff --git a/FlowerShopContracts/BindingModels/OrderBindingModel.cs b/FlowerShopContracts/BindingModels/OrderBindingModel.cs
new file mode 100644
index 0000000..9da12da
--- /dev/null
+++ b/FlowerShopContracts/BindingModels/OrderBindingModel.cs
@@ -0,0 +1,21 @@
+using FlowerShopDataModels.Enums;
+using FlowerShopDataModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.BindingModels
+{
+    public class OrderBindingModel : IOrderModel
+    {
+        public int Id { get; set; }
+        public int ProductId { 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/FlowerShopContracts/BusinessLogicsContracts/IComponentLogic.cs b/FlowerShopContracts/BusinessLogicsContracts/IComponentLogic.cs
new file mode 100644
index 0000000..487a2c0
--- /dev/null
+++ b/FlowerShopContracts/BusinessLogicsContracts/IComponentLogic.cs
@@ -0,0 +1,20 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.BusinessLogicsContracts
+{
+    public interface IComponentLogic
+    {
+        List<ComponentViewModel>? ReadList(ComponentSearchModel? model);
+        ComponentViewModel? ReadElement(ComponentSearchModel model);
+        bool Create(ComponentBindingModel model);
+        bool Update(ComponentBindingModel model);
+        bool Delete(ComponentBindingModel model);
+    }
+}
diff --git a/FlowerShopContracts/BusinessLogicsContracts/IFlowerLogic.cs b/FlowerShopContracts/BusinessLogicsContracts/IFlowerLogic.cs
new file mode 100644
index 0000000..46390ec
--- /dev/null
+++ b/FlowerShopContracts/BusinessLogicsContracts/IFlowerLogic.cs
@@ -0,0 +1,20 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.BusinessLogicsContracts
+{
+    public interface IFlowerLogic
+    {
+        List<FlowerViewModel>? ReadList(FlowerSearchModel? model);
+        FlowerViewModel? ReadElement(FlowerSearchModel model);
+        bool Create(FlowerBindingModel model);
+        bool Update(FlowerBindingModel model);
+        bool Delete(FlowerBindingModel model);
+    }
+}
\ No newline at end of file
diff --git a/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs
new file mode 100644
index 0000000..298066a
--- /dev/null
+++ b/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs
@@ -0,0 +1,20 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.BusinessLogicsContracts
+{
+    public interface IOrderLogic
+    {
+        List<OrderViewModel>? ReadList(OrderSearchModel? model);
+        bool CreateOrder(OrderBindingModel model);
+        bool TakeOrderInWork(OrderBindingModel model);
+        bool FinishOrder(OrderBindingModel model);
+        bool DeliveryOrder(OrderBindingModel model);
+    }
+}
diff --git a/FlowerShopContracts/FlowerShopContracts.csproj b/FlowerShopContracts/FlowerShopContracts.csproj
new file mode 100644
index 0000000..901b7f6
--- /dev/null
+++ b/FlowerShopContracts/FlowerShopContracts.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\FlowerShopDataModels\FlowerShopDataModels.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/FlowerShopContracts/SearchModels/ComponentSearchModel.cs b/FlowerShopContracts/SearchModels/ComponentSearchModel.cs
new file mode 100644
index 0000000..610914a
--- /dev/null
+++ b/FlowerShopContracts/SearchModels/ComponentSearchModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.SearchModels
+{
+    public class ComponentSearchModel
+    {
+        public int? Id { get; set; }
+        public string? ComponentName { get; set; }
+    }
+}
diff --git a/FlowerShopContracts/SearchModels/FlowerSearchModel.cs b/FlowerShopContracts/SearchModels/FlowerSearchModel.cs
new file mode 100644
index 0000000..362a865
--- /dev/null
+++ b/FlowerShopContracts/SearchModels/FlowerSearchModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.SearchModels
+{
+    public class FlowerSearchModel
+    {
+        public int? Id { get; set; }
+        public string? FlowerName { get; set; }
+    }
+}
diff --git a/FlowerShopContracts/SearchModels/OrderSearchModel.cs b/FlowerShopContracts/SearchModels/OrderSearchModel.cs
new file mode 100644
index 0000000..5b569de
--- /dev/null
+++ b/FlowerShopContracts/SearchModels/OrderSearchModel.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.SearchModels
+{
+    public class OrderSearchModel
+    {
+        public int? Id { get; set; }
+    }
+}
diff --git a/FlowerShopContracts/StoragesContracts/IComponentStorage.cs b/FlowerShopContracts/StoragesContracts/IComponentStorage.cs
new file mode 100644
index 0000000..32ddbc4
--- /dev/null
+++ b/FlowerShopContracts/StoragesContracts/IComponentStorage.cs
@@ -0,0 +1,21 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.StoragesContracts
+{
+    public interface IComponentStorage
+    {
+        List<ComponentViewModel> GetFullList();
+        List<ComponentViewModel> GetFilteredList(ComponentSearchModel model);
+        ComponentViewModel? GetElement(ComponentSearchModel model);
+        ComponentViewModel? Insert(ComponentBindingModel model);
+        ComponentViewModel? Update(ComponentBindingModel model);
+        ComponentViewModel? Delete(ComponentBindingModel model);
+    }
+}
diff --git a/FlowerShopContracts/StoragesContracts/IFlowerStorage.cs b/FlowerShopContracts/StoragesContracts/IFlowerStorage.cs
new file mode 100644
index 0000000..6733ad4
--- /dev/null
+++ b/FlowerShopContracts/StoragesContracts/IFlowerStorage.cs
@@ -0,0 +1,21 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.StoragesContracts
+{
+    public interface IFlowerStorage
+    {
+        List<FlowerViewModel> GetFullList();
+        List<FlowerViewModel> GetFilteredList(FlowerSearchModel model);
+        FlowerViewModel? GetElement(FlowerSearchModel model);
+        FlowerViewModel? Insert(FlowerBindingModel model);
+        FlowerViewModel? Update(FlowerBindingModel model);
+        FlowerViewModel? Delete(FlowerBindingModel model);
+    }
+}
diff --git a/FlowerShopContracts/StoragesContracts/IOrderStorage.cs b/FlowerShopContracts/StoragesContracts/IOrderStorage.cs
new file mode 100644
index 0000000..c108c9d
--- /dev/null
+++ b/FlowerShopContracts/StoragesContracts/IOrderStorage.cs
@@ -0,0 +1,21 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.StoragesContracts
+{
+    public interface IOrderStorage
+    {
+        List<OrderViewModel> GetFullList();
+        List<OrderViewModel> GetFilteredList(OrderSearchModel model);
+        OrderViewModel? GetElement(OrderSearchModel model);
+        OrderViewModel? Insert(OrderBindingModel model);
+        OrderViewModel? Update(OrderBindingModel model);
+        OrderViewModel? Delete(OrderBindingModel model);
+    }
+}
diff --git a/FlowerShopContracts/ViewModels/ComponentViewModel.cs b/FlowerShopContracts/ViewModels/ComponentViewModel.cs
new file mode 100644
index 0000000..667f0bb
--- /dev/null
+++ b/FlowerShopContracts/ViewModels/ComponentViewModel.cs
@@ -0,0 +1,19 @@
+using FlowerShopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.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/FlowerShopContracts/ViewModels/FlowerViewModel.cs b/FlowerShopContracts/ViewModels/FlowerViewModel.cs
new file mode 100644
index 0000000..0010c97
--- /dev/null
+++ b/FlowerShopContracts/ViewModels/FlowerViewModel.cs
@@ -0,0 +1,24 @@
+using FlowerShopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.ViewModels
+{
+    public class FlowerViewModel : IFlowerModel
+    {
+        public int Id { get; set; }
+        [DisplayName("Название изделия")]
+        public string FlowerName { get; set; } = string.Empty;
+        [DisplayName("Цена")]
+        public double Price { get; set; }
+        public Dictionary<int, (IComponentModel, int)> FlowerComponents
+        {
+            get;
+            set;
+        } = new();
+    }
+}
diff --git a/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShopContracts/ViewModels/OrderViewModel.cs
new file mode 100644
index 0000000..78dfe46
--- /dev/null
+++ b/FlowerShopContracts/ViewModels/OrderViewModel.cs
@@ -0,0 +1,30 @@
+using FlowerShopDataModels.Enums;
+using FlowerShopDataModels;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopContracts.ViewModels
+{
+    public class OrderViewModel : IOrderModel
+    {
+        [DisplayName("Номер")]
+        public int Id { get; set; }
+        public int ProductId { get; set; }
+        [DisplayName("Изделие")]
+        public string ProductName { 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/FlowerShopDataModels/FlowerShopDataModels.csproj b/FlowerShopDataModels/FlowerShopDataModels.csproj
index 132c02c..dce9680 100644
--- a/FlowerShopDataModels/FlowerShopDataModels.csproj
+++ b/FlowerShopDataModels/FlowerShopDataModels.csproj
@@ -6,4 +6,8 @@
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
+  </ItemGroup>
+
 </Project>
diff --git a/FlowerShopDataModels/IComponentModel.cs b/FlowerShopDataModels/IComponentModel.cs
new file mode 100644
index 0000000..52c8afd
--- /dev/null
+++ b/FlowerShopDataModels/IComponentModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopDataModels.Models
+{
+    public interface IComponentModel : IId
+    {
+        string ComponentName { get; }
+        double Cost { get; }
+    }
+}
diff --git a/FlowerShopDataModels/IFlowerModel.cs b/FlowerShopDataModels/IFlowerModel.cs
new file mode 100644
index 0000000..e785287
--- /dev/null
+++ b/FlowerShopDataModels/IFlowerModel.cs
@@ -0,0 +1,16 @@
+using FlowerShopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopDataModels.Models
+{
+    public interface IFlowerModel : IId
+    {
+        string FlowerName { get; }
+        double Price { get; }
+        Dictionary<int, (IComponentModel, int)> FlowerComponents { get; }
+    }
+}
diff --git a/FlowerShopDataModels/IId.cs b/FlowerShopDataModels/IId.cs
index a8a1916..3d893b7 100644
--- a/FlowerShopDataModels/IId.cs
+++ b/FlowerShopDataModels/IId.cs
@@ -6,7 +6,8 @@ using System.Threading.Tasks;
 
 namespace FlowerShopDataModels
 {
-    internal interface IId
+    public interface IId
     {
+        int Id { get; }
     }
 }
diff --git a/FlowerShopDataModels/IOrderModel.cs b/FlowerShopDataModels/IOrderModel.cs
new file mode 100644
index 0000000..486a29f
--- /dev/null
+++ b/FlowerShopDataModels/IOrderModel.cs
@@ -0,0 +1,20 @@
+using FlowerShopDataModels.Enums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopDataModels
+{
+    public interface IOrderModel : IId
+    {
+        int ProductId { get; }
+        int Count { get; }
+        double Sum { get; }
+        OrderStatus Status { get; }
+        DateTime DateCreate { get; }
+        DateTime? DateImplement { get; }
+    }
+
+}
diff --git a/FlowerShopListImplement/Component.cs b/FlowerShopListImplement/Component.cs
new file mode 100644
index 0000000..7648aa5
--- /dev/null
+++ b/FlowerShopListImplement/Component.cs
@@ -0,0 +1,41 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.ViewModels;
+using FlowerShopDataModels.Models;
+
+namespace FlowerShopListImplement.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/FlowerShopListImplement/Flower.cs b/FlowerShopListImplement/Flower.cs
new file mode 100644
index 0000000..7b95dc5
--- /dev/null
+++ b/FlowerShopListImplement/Flower.cs
@@ -0,0 +1,54 @@
+using FlowerShopDataModels.Models;
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement.Models
+{
+    public class Flower : IFlowerModel
+    {
+        public int Id { get; private set; }
+        public string FlowerName { get; private set; } = string.Empty;
+        public double Price { get; private set; }
+        public Dictionary<int, (IComponentModel, int)> FlowerComponents
+        {
+            get;
+            private set;
+        } = new Dictionary<int, (IComponentModel, int)>();
+        public static Flower? Create(FlowerBindingModel? model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Flower()
+            {
+                 Id = model.Id,
+                 FlowerName = model.FlowerName,
+                 Price = model.Price,
+                 FlowerComponents = model.FlowerComponents
+            };
+        }
+        public void Update(FlowerBindingModel? model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            FlowerName = model.FlowerName;
+            Price = model.Price;
+            FlowerName = model.FlowerName;
+        }
+        public FlowerViewModel GetViewModel => new()
+        {
+            Id = Id,
+            FlowerName = FlowerName,
+            Price = Price,
+            FlowerComponents = FlowerComponents
+        };
+    }
+}
diff --git a/FlowerShopListImplement/FlowerShopListImplement.csproj b/FlowerShopListImplement/FlowerShopListImplement.csproj
new file mode 100644
index 0000000..ca6fa62
--- /dev/null
+++ b/FlowerShopListImplement/FlowerShopListImplement.csproj
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\FlowerShopContracts\FlowerShopContracts.csproj" />
+    <ProjectReference Include="..\FlowerShopDataModels\FlowerShopDataModels.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/ProjectFlowerShop.sln b/ProjectFlowerShop.sln
index ee95802..075c8e0 100644
--- a/ProjectFlowerShop.sln
+++ b/ProjectFlowerShop.sln
@@ -5,7 +5,13 @@ VisualStudioVersion = 17.7.34031.279
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectFlowerShop", "ProjectFlowerShop\ProjectFlowerShop.csproj", "{AB184B22-49FC-45E0-A5C0-D68310452DF3}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowerShopDataModels", "FlowerShopDataModels\FlowerShopDataModels.csproj", "{9E7C9D26-3932-4020-893D-1757DB2048B6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FlowerShopDataModels", "FlowerShopDataModels\FlowerShopDataModels.csproj", "{9E7C9D26-3932-4020-893D-1757DB2048B6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowerShopContracts", "FlowerShopContracts\FlowerShopContracts.csproj", "{843D517F-A9AE-4AF9-90C5-DB3E11D576E7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowerShopBusinessLogic", "FlowerShopBusinessLogic\FlowerShopBusinessLogic.csproj", "{EA8DFC63-7280-4160-8EF8-DDBAF3B64F31}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowerShopListImplement", "FlowerShopListImplement\FlowerShopListImplement.csproj", "{62DAA9A0-9A71-4117-8D06-8825E1678D9D}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -21,6 +27,18 @@ Global
 		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{9E7C9D26-3932-4020-893D-1757DB2048B6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{843D517F-A9AE-4AF9-90C5-DB3E11D576E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{843D517F-A9AE-4AF9-90C5-DB3E11D576E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{843D517F-A9AE-4AF9-90C5-DB3E11D576E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{843D517F-A9AE-4AF9-90C5-DB3E11D576E7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EA8DFC63-7280-4160-8EF8-DDBAF3B64F31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EA8DFC63-7280-4160-8EF8-DDBAF3B64F31}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EA8DFC63-7280-4160-8EF8-DDBAF3B64F31}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EA8DFC63-7280-4160-8EF8-DDBAF3B64F31}.Release|Any CPU.Build.0 = Release|Any CPU
+		{62DAA9A0-9A71-4117-8D06-8825E1678D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{62DAA9A0-9A71-4117-8D06-8825E1678D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{62DAA9A0-9A71-4117-8D06-8825E1678D9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{62DAA9A0-9A71-4117-8D06-8825E1678D9D}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/ProjectFlowerShop/ProjectFlowerShop.csproj b/ProjectFlowerShop/ProjectFlowerShop.csproj
index b57c89e..d47a4bd 100644
--- a/ProjectFlowerShop/ProjectFlowerShop.csproj
+++ b/ProjectFlowerShop/ProjectFlowerShop.csproj
@@ -8,4 +8,8 @@
     <ImplicitUsings>enable</ImplicitUsings>
   </PropertyGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
+  </ItemGroup>
+
 </Project>
\ No newline at end of file
-- 
2.25.1


From c0cd5e4da8f682b804ff0d690018bad99ad35155 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Thu, 8 Feb 2024 16:08:13 +0300
Subject: [PATCH 03/12] ''''''''''''''

---
 .../BindingModels/OrderBindingModel.cs        |   2 +-
 .../ViewModels/OrderViewModel.cs              |   4 +-
 FlowerShopDataModels/IOrderModel.cs           |   2 +-
 FlowerShopListImplement/ComponentStorage.cs   | 105 ++++++++++++++++
 FlowerShopListImplement/DataListSingleton.cs  |  31 +++++
 FlowerShopListImplement/FlowerStorage.cs      | 105 ++++++++++++++++
 FlowerShopListImplement/Order.cs              |  66 ++++++++++
 FlowerShopListImplement/OrderStorage.cs       | 119 ++++++++++++++++++
 8 files changed, 430 insertions(+), 4 deletions(-)
 create mode 100644 FlowerShopListImplement/ComponentStorage.cs
 create mode 100644 FlowerShopListImplement/DataListSingleton.cs
 create mode 100644 FlowerShopListImplement/FlowerStorage.cs
 create mode 100644 FlowerShopListImplement/Order.cs
 create mode 100644 FlowerShopListImplement/OrderStorage.cs

diff --git a/FlowerShopContracts/BindingModels/OrderBindingModel.cs b/FlowerShopContracts/BindingModels/OrderBindingModel.cs
index 9da12da..7b4ca77 100644
--- a/FlowerShopContracts/BindingModels/OrderBindingModel.cs
+++ b/FlowerShopContracts/BindingModels/OrderBindingModel.cs
@@ -11,7 +11,7 @@ namespace FlowerShopContracts.BindingModels
     public class OrderBindingModel : IOrderModel
     {
         public int Id { get; set; }
-        public int ProductId { get; set; }
+        public int FlowerId { get; set; }
         public int Count { get; set; }
         public double Sum { get; set; }
         public OrderStatus Status { get; set; } = OrderStatus.Неизвестен;
diff --git a/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShopContracts/ViewModels/OrderViewModel.cs
index 78dfe46..3f04e8e 100644
--- a/FlowerShopContracts/ViewModels/OrderViewModel.cs
+++ b/FlowerShopContracts/ViewModels/OrderViewModel.cs
@@ -13,9 +13,9 @@ namespace FlowerShopContracts.ViewModels
     {
         [DisplayName("Номер")]
         public int Id { get; set; }
-        public int ProductId { get; set; }
+        public int FlowerId { get; set; }
         [DisplayName("Изделие")]
-        public string ProductName { get; set; } = string.Empty;
+        public string FlowerName { get; set; } = string.Empty;
         [DisplayName("Количество")]
         public int Count { get; set; }
         [DisplayName("Сумма")]
diff --git a/FlowerShopDataModels/IOrderModel.cs b/FlowerShopDataModels/IOrderModel.cs
index 486a29f..3251e08 100644
--- a/FlowerShopDataModels/IOrderModel.cs
+++ b/FlowerShopDataModels/IOrderModel.cs
@@ -9,7 +9,7 @@ namespace FlowerShopDataModels
 {
     public interface IOrderModel : IId
     {
-        int ProductId { get; }
+        int FlowerId { get; }
         int Count { get; }
         double Sum { get; }
         OrderStatus Status { get; }
diff --git a/FlowerShopListImplement/ComponentStorage.cs b/FlowerShopListImplement/ComponentStorage.cs
new file mode 100644
index 0000000..fbdd5b0
--- /dev/null
+++ b/FlowerShopListImplement/ComponentStorage.cs
@@ -0,0 +1,105 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using FlowerShopListImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement.Implements
+{
+    public class ComponentStorage : IComponentStorage
+    {
+        private readonly DataListSingleton _source;
+        public ComponentStorage()
+        {
+            _source = DataListSingleton.GetInstance();
+        }
+        public List<ComponentViewModel> GetFullList()
+        {
+            var result = new List<ComponentViewModel>();
+            foreach (var component in _source.Components)
+            {
+                result.Add(component.GetViewModel);
+            }
+            return result;
+        }
+        public List<ComponentViewModel> GetFilteredList(ComponentSearchModel model)
+        {
+            var result = new List<ComponentViewModel>();
+            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;
+        }
+    }
+}
diff --git a/FlowerShopListImplement/DataListSingleton.cs b/FlowerShopListImplement/DataListSingleton.cs
new file mode 100644
index 0000000..117b155
--- /dev/null
+++ b/FlowerShopListImplement/DataListSingleton.cs
@@ -0,0 +1,31 @@
+using FlowerShopListImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement
+{
+    public class DataListSingleton
+    {
+        private static DataListSingleton? _instance;
+        public List<Component> Components { get; set; }
+        public List<Order> Orders { get; set; }
+        public List<Flower> Flowers { get; set; }
+        private DataListSingleton()
+        {
+            Components = new List<Component>();
+            Orders = new List<Order>();
+            Flowers = new List<Flower>();
+        }
+        public static DataListSingleton GetInstance()
+        {
+            if (_instance == null)
+            {
+                _instance = new DataListSingleton();
+            }
+            return _instance;
+        }
+    }
+}
diff --git a/FlowerShopListImplement/FlowerStorage.cs b/FlowerShopListImplement/FlowerStorage.cs
new file mode 100644
index 0000000..eb8aef6
--- /dev/null
+++ b/FlowerShopListImplement/FlowerStorage.cs
@@ -0,0 +1,105 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using FlowerShopListImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement
+{
+    public class FlowerStorage : IFlowerStorage
+    {
+        private readonly DataListSingleton _source;
+        public FlowerStorage()
+        {
+            _source = DataListSingleton.GetInstance();
+        }
+        public List<FlowerViewModel> GetFullList()
+        {
+            var result = new List<FlowerViewModel>();
+            foreach (var flower in _source.Flowers)
+            {
+                result.Add(flower.GetViewModel);
+            }
+            return result;
+        }
+        public List<FlowerViewModel> GetFilteredList(FlowerSearchModel model)
+        {
+            var result = new List<FlowerViewModel>();
+            if (string.IsNullOrEmpty(model.FlowerName))
+            {
+                return result;
+            }
+            foreach (var flower in _source.Flowers)
+            {
+                if (flower.FlowerName.Contains(model.FlowerName))
+                {
+                    result.Add(flower.GetViewModel);
+                }
+            }
+            return result;
+        }
+        public FlowerViewModel? GetElement(FlowerSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.FlowerName) && !model.Id.HasValue)
+            {
+                return null;
+            }
+            foreach (var flower in _source.Flowers)
+            {
+                if ((!string.IsNullOrEmpty(model.FlowerName) && flower.FlowerName == model.FlowerName) || (model.Id.HasValue && flower.Id == model.Id))
+                {
+                    return flower.GetViewModel;
+                }
+            }
+            return null;
+        }
+        public FlowerViewModel? Insert(FlowerBindingModel model)
+        {
+            model.Id = 1;
+            foreach (var flower in _source.Flowers)
+            {
+                if (model.Id <= flower.Id)
+                {
+                    model.Id = flower.Id + 1;
+                }
+            }
+            var newFlower = Flower.Create(model);
+            if (newFlower == null)
+            {
+                return null;
+            }
+            _source.Flowers.Add(newFlower);
+            return newFlower.GetViewModel;
+        }
+        public FlowerViewModel? Update(FlowerBindingModel model)
+        {
+            foreach (var flower in _source.Flowers)
+            {
+                if (flower.Id == model.Id)
+                {
+                    flower.Update(model);
+                    return flower.GetViewModel;
+                }
+            }
+            return null;
+        }
+        public FlowerViewModel? Delete(FlowerBindingModel model)
+        {
+            for (int i = 0; i < _source.Flowers.Count; ++i)
+            {
+                if (_source.Flowers[i].Id == model.Id)
+                {
+                    var element = _source.Flowers[i];
+                    _source.Flowers.RemoveAt(i);
+                    return element.GetViewModel;
+                }
+            }
+            return null;
+        }
+    }
+}
diff --git a/FlowerShopListImplement/Order.cs b/FlowerShopListImplement/Order.cs
new file mode 100644
index 0000000..947b95a
--- /dev/null
+++ b/FlowerShopListImplement/Order.cs
@@ -0,0 +1,66 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.ViewModels;
+using FlowerShopDataModels.Enums;
+using FlowerShopDataModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement.Models
+{
+    public class Order : IOrderModel
+    {
+        public int Id { get; private set; }
+        public int FlowerId { 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()
+            {
+                Id = model.Id,
+                FlowerId = model.FlowerId,
+                Count = model.Count,
+                Sum = model.Sum,
+                Status = model.Status,
+                DateCreate = model.DateCreate,
+                DateImplement = model.DateImplement,
+            };
+        }
+        public void Update(OrderBindingModel? model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            Id = model.Id;
+            FlowerId = model.FlowerId;
+            Count = model.Count;
+            Sum = model.Sum;
+            Status = model.Status;
+            DateCreate = model.DateCreate;
+            DateImplement = model.DateImplement;
+        }
+        public OrderViewModel GetViewModel => new()
+        {
+            Id = Id,
+            FlowerId = FlowerId,
+            Count = Count,
+            Sum = Sum,
+            Status = Status,
+            DateCreate = DateCreate,
+            DateImplement = DateImplement,
+        };
+
+    }
+}
diff --git a/FlowerShopListImplement/OrderStorage.cs b/FlowerShopListImplement/OrderStorage.cs
new file mode 100644
index 0000000..4e2d6e7
--- /dev/null
+++ b/FlowerShopListImplement/OrderStorage.cs
@@ -0,0 +1,119 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopContracts.ViewModels;
+using FlowerShopListImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlowerShopListImplement.Implements    
+{
+    public class OrderStorage : IOrderStorage
+    {
+        private readonly DataListSingleton _source;
+        public OrderStorage()
+        {
+            _source = DataListSingleton.GetInstance();
+        }
+        public List<OrderViewModel> GetFullList()
+        {
+            var result = new List<OrderViewModel>();
+            foreach (var order in _source.Orders)
+            {
+                result.Add(AccessFlowerStorage(order.GetViewModel));
+            }
+            return result;
+        }
+        public List<OrderViewModel> GetFilteredList(OrderSearchModel
+       model)
+        {
+            var result = new List<OrderViewModel>();
+            if (!model.Id.HasValue)
+            {
+                return result;
+            }
+            foreach (var order in _source.Orders)
+            {
+                if (order.Id == model.Id)
+                {
+                    result.Add(AccessFlowerStorage(order.GetViewModel));
+                }
+            }
+            return result;
+        }
+        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 order.GetViewModel;
+                }
+            }
+            return null;
+        }
+        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;
+        }
+        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 AccessFlowerStorage(OrderViewModel model)
+        {
+            foreach (var iceCream in _source.Flowers)
+            {
+                if (iceCream.Id == model.FlowerId)
+                {
+                    model.FlowerName = iceCream.FlowerName;
+                    break;
+                }
+            }
+            return model;
+        }
+    }
+}
-- 
2.25.1


From c98deeb93a3ff7683d76980755cf47af715468da Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Thu, 8 Feb 2024 16:34:56 +0300
Subject: [PATCH 04/12] in c# we trust

---
 ....Designer.cs => ComponentForm.Designer.cs} | 10 ++--
 ProjectFlowerShop/ComponentForm.cs            | 24 +++++++++
 .../{Form1.resx => ComponentForm.resx}        | 50 +++++++++----------
 ProjectFlowerShop/Form1.cs                    | 10 ----
 ProjectFlowerShop/Program.cs                  |  2 +-
 ProjectFlowerShop/ProjectFlowerShop.csproj    |  7 +++
 6 files changed, 62 insertions(+), 41 deletions(-)
 rename ProjectFlowerShop/{Form1.Designer.cs => ComponentForm.Designer.cs} (77%)
 create mode 100644 ProjectFlowerShop/ComponentForm.cs
 rename ProjectFlowerShop/{Form1.resx => ComponentForm.resx} (93%)
 delete mode 100644 ProjectFlowerShop/Form1.cs

diff --git a/ProjectFlowerShop/Form1.Designer.cs b/ProjectFlowerShop/ComponentForm.Designer.cs
similarity index 77%
rename from ProjectFlowerShop/Form1.Designer.cs
rename to ProjectFlowerShop/ComponentForm.Designer.cs
index 5fd6fda..fa8fe19 100644
--- a/ProjectFlowerShop/Form1.Designer.cs
+++ b/ProjectFlowerShop/ComponentForm.Designer.cs
@@ -1,6 +1,6 @@
 namespace ProjectFlowerShop
 {
-    partial class Form1
+    partial class ComponentForm
     {
         /// <summary>
         ///  Required designer variable.
@@ -28,10 +28,10 @@
         /// </summary>
         private void InitializeComponent()
         {
-            this.components = new System.ComponentModel.Container();
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(800, 450);
-            this.Text = "Form1";
+            components = new System.ComponentModel.Container();
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(800, 450);
+            Text = "Form1";
         }
 
         #endregion
diff --git a/ProjectFlowerShop/ComponentForm.cs b/ProjectFlowerShop/ComponentForm.cs
new file mode 100644
index 0000000..f7ae647
--- /dev/null
+++ b/ProjectFlowerShop/ComponentForm.cs
@@ -0,0 +1,24 @@
+using Microsoft.Extensions.Logging;
+using FlowerShopContracts.BusinessLogicsContracts;
+using Microsoft.VisualBasic.Logging;
+using FlowerShopContracts.SearchModels;
+using System.Windows.Forms;
+
+namespace ProjectFlowerShop
+{
+    public partial class ComponentForm : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IComponentLogic _logic;
+        private int? _id;
+        public int Id { set { _id = value; } }
+        public ComponentForm(ILogger<ComponentForm> logger, IComponentLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/Form1.resx b/ProjectFlowerShop/ComponentForm.resx
similarity index 93%
rename from ProjectFlowerShop/Form1.resx
rename to ProjectFlowerShop/ComponentForm.resx
index 1af7de1..af32865 100644
--- a/ProjectFlowerShop/Form1.resx
+++ b/ProjectFlowerShop/ComponentForm.resx
@@ -1,17 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <root>
-  <!-- 
+  <!--
     Microsoft ResX Schema 
-    
+
     Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
     associated with the data types.
-    
+
     Example:
-    
+
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
     <resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
         <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
         <comment>This is a comment</comment>
     </data>
-                
-    There are any number of "resheader" rows that contain simple 
+
+    There are any number of "resheader" rows that contain simple
     name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
     mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
     extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
     read any of the formats listed below.
-    
+
     mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
+    value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
+    value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
             : and then encoded with base64 encoding.
 
     mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
+    value   : The object must be serialized into a byte array
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
diff --git a/ProjectFlowerShop/Form1.cs b/ProjectFlowerShop/Form1.cs
deleted file mode 100644
index 7519cb8..0000000
--- a/ProjectFlowerShop/Form1.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace ProjectFlowerShop
-{
-    public partial class Form1 : Form
-    {
-        public Form1()
-        {
-            InitializeComponent();
-        }
-    }
-}
\ No newline at end of file
diff --git a/ProjectFlowerShop/Program.cs b/ProjectFlowerShop/Program.cs
index 24357fe..b26be2c 100644
--- a/ProjectFlowerShop/Program.cs
+++ b/ProjectFlowerShop/Program.cs
@@ -11,7 +11,7 @@ namespace ProjectFlowerShop
             // To customize application configuration such as set high DPI settings or default font,
             // see https://aka.ms/applicationconfiguration.
             ApplicationConfiguration.Initialize();
-            Application.Run(new Form1());
+            Application.Run(new ComponentForm());
         }
     }
 }
\ No newline at end of file
diff --git a/ProjectFlowerShop/ProjectFlowerShop.csproj b/ProjectFlowerShop/ProjectFlowerShop.csproj
index d47a4bd..cb55f75 100644
--- a/ProjectFlowerShop/ProjectFlowerShop.csproj
+++ b/ProjectFlowerShop/ProjectFlowerShop.csproj
@@ -12,4 +12,11 @@
     <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
   </ItemGroup>
 
+  <ItemGroup>
+    <ProjectReference Include="..\FlowerShopBusinessLogic\FlowerShopBusinessLogic.csproj" />
+    <ProjectReference Include="..\FlowerShopContracts\FlowerShopContracts.csproj" />
+    <ProjectReference Include="..\FlowerShopDataModels\FlowerShopDataModels.csproj" />
+    <ProjectReference Include="..\FlowerShopListImplement\FlowerShopListImplement.csproj" />
+  </ItemGroup>
+
 </Project>
\ No newline at end of file
-- 
2.25.1


From 9d7448d69f9996669eda005ee88449645a8ad1d7 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Thu, 8 Feb 2024 17:25:14 +0300
Subject: [PATCH 05/12] death commit

---
 ProjectFlowerShop/ComponentForm.Designer.cs   |  85 ++++++++++-
 ProjectFlowerShop/ComponentForm.cs            |  67 ++++++++
 ProjectFlowerShop/FormComponents.Designer.cs  | 144 ++++++++++++++++++
 ProjectFlowerShop/FormComponents.cs           | 119 +++++++++++++++
 ProjectFlowerShop/FormComponents.resx         | 129 ++++++++++++++++
 .../FormProductComponent.Designer.cs          | 119 +++++++++++++++
 ProjectFlowerShop/FormProductComponent.cs     |  97 ++++++++++++
 ProjectFlowerShop/FormProductComponent.resx   | 120 +++++++++++++++
 8 files changed, 877 insertions(+), 3 deletions(-)
 create mode 100644 ProjectFlowerShop/FormComponents.Designer.cs
 create mode 100644 ProjectFlowerShop/FormComponents.cs
 create mode 100644 ProjectFlowerShop/FormComponents.resx
 create mode 100644 ProjectFlowerShop/FormProductComponent.Designer.cs
 create mode 100644 ProjectFlowerShop/FormProductComponent.cs
 create mode 100644 ProjectFlowerShop/FormProductComponent.resx

diff --git a/ProjectFlowerShop/ComponentForm.Designer.cs b/ProjectFlowerShop/ComponentForm.Designer.cs
index fa8fe19..8280a16 100644
--- a/ProjectFlowerShop/ComponentForm.Designer.cs
+++ b/ProjectFlowerShop/ComponentForm.Designer.cs
@@ -28,12 +28,91 @@
         /// </summary>
         private void InitializeComponent()
         {
-            components = new System.ComponentModel.Container();
+            labelName = new Label();
+            labelPrice = new Label();
+            textBoxName = new TextBox();
+            textBoxPrice = new TextBox();
+            buttonSave = new Button();
+            buttonCancel = new Button();
+            SuspendLayout();
+            // 
+            // labelName
+            // 
+            labelName.AutoSize = true;
+            labelName.Location = new Point(12, 9);
+            labelName.Name = "labelName";
+            labelName.Size = new Size(77, 20);
+            labelName.TabIndex = 0;
+            labelName.Text = "Название";
+            // 
+            // labelPrice
+            // 
+            labelPrice.AutoSize = true;
+            labelPrice.Location = new Point(12, 46);
+            labelPrice.Name = "labelPrice";
+            labelPrice.Size = new Size(45, 20);
+            labelPrice.TabIndex = 1;
+            labelPrice.Text = "Цена";
+            // 
+            // textBoxName
+            // 
+            textBoxName.Location = new Point(118, 6);
+            textBoxName.Name = "textBoxName";
+            textBoxName.Size = new Size(243, 27);
+            textBoxName.TabIndex = 2;
+            // 
+            // textBoxPrice
+            // 
+            textBoxPrice.Location = new Point(118, 43);
+            textBoxPrice.Name = "textBoxPrice";
+            textBoxPrice.Size = new Size(243, 27);
+            textBoxPrice.TabIndex = 3;
+            // 
+            // buttonSave
+            // 
+            buttonSave.Location = new Point(267, 103);
+            buttonSave.Name = "buttonSave";
+            buttonSave.Size = new Size(94, 29);
+            buttonSave.TabIndex = 4;
+            buttonSave.Text = "Сохранить ";
+            buttonSave.UseVisualStyleBackColor = true;
+            buttonSave.Click += buttonSave_Click;
+            // 
+            // buttonCancel
+            // 
+            buttonCancel.Location = new Point(367, 103);
+            buttonCancel.Name = "buttonCancel";
+            buttonCancel.Size = new Size(94, 29);
+            buttonCancel.TabIndex = 5;
+            buttonCancel.Text = "Отмена";
+            buttonCancel.UseVisualStyleBackColor = true;
+            buttonCancel.Click += buttonCancel_Click;
+            // 
+            // ComponentForm
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
             AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(800, 450);
-            Text = "Form1";
+            ClientSize = new Size(466, 144);
+            Controls.Add(buttonCancel);
+            Controls.Add(buttonSave);
+            Controls.Add(textBoxPrice);
+            Controls.Add(textBoxName);
+            Controls.Add(labelPrice);
+            Controls.Add(labelName);
+            Name = "ComponentForm";
+            Text = "Компонент";
+            Load += ComponentForm_Load;
+            ResumeLayout(false);
+            PerformLayout();
         }
 
         #endregion
+
+        private Label labelName;
+        private Label labelPrice;
+        private TextBox textBoxName;
+        private TextBox textBoxPrice;
+        private Button buttonSave;
+        private Button buttonCancel;
     }
 }
\ No newline at end of file
diff --git a/ProjectFlowerShop/ComponentForm.cs b/ProjectFlowerShop/ComponentForm.cs
index f7ae647..4c9ffe3 100644
--- a/ProjectFlowerShop/ComponentForm.cs
+++ b/ProjectFlowerShop/ComponentForm.cs
@@ -3,6 +3,7 @@ using FlowerShopContracts.BusinessLogicsContracts;
 using Microsoft.VisualBasic.Logging;
 using FlowerShopContracts.SearchModels;
 using System.Windows.Forms;
+using FlowerShopContracts.BindingModels;
 
 namespace ProjectFlowerShop
 {
@@ -19,6 +20,72 @@ namespace ProjectFlowerShop
             _logic = logic;
         }
 
+        private void ComponentForm_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;
+                        textBoxPrice.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(textBoxPrice.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();
+        }
     }
 }
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormComponents.Designer.cs b/ProjectFlowerShop/FormComponents.Designer.cs
new file mode 100644
index 0000000..72236be
--- /dev/null
+++ b/ProjectFlowerShop/FormComponents.Designer.cs
@@ -0,0 +1,144 @@
+namespace ProjectFlowerShop
+{
+    partial class FormComponents
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            dataGridView = new DataGridView();
+            buttonAdd = new Button();
+            buttonChange = new Button();
+            buttonRemove = new Button();
+            buttonReload = new Button();
+            Id = new DataGridViewTextBoxColumn();
+            Name = new DataGridViewTextBoxColumn();
+            Price = new DataGridViewTextBoxColumn();
+            ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+            SuspendLayout();
+            // 
+            // dataGridView
+            // 
+            dataGridView.BackgroundColor = SystemColors.Control;
+            dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            dataGridView.Columns.AddRange(new DataGridViewColumn[] { Id, Name, Price });
+            dataGridView.Location = new Point(1, 1);
+            dataGridView.Name = "dataGridView";
+            dataGridView.RowHeadersWidth = 51;
+            dataGridView.RowTemplate.Height = 29;
+            dataGridView.Size = new Size(558, 449);
+            dataGridView.TabIndex = 0;
+            // 
+            // buttonAdd
+            // 
+            buttonAdd.Location = new Point(565, 12);
+            buttonAdd.Name = "buttonAdd";
+            buttonAdd.Size = new Size(223, 29);
+            buttonAdd.TabIndex = 1;
+            buttonAdd.Text = "Добавить";
+            buttonAdd.UseVisualStyleBackColor = true;
+            buttonAdd.Click += buttonAdd_Click;
+            // 
+            // buttonChange
+            // 
+            buttonChange.Location = new Point(565, 47);
+            buttonChange.Name = "buttonChange";
+            buttonChange.Size = new Size(223, 29);
+            buttonChange.TabIndex = 2;
+            buttonChange.Text = "Изменить";
+            buttonChange.UseVisualStyleBackColor = true;
+            buttonChange.Click += buttonChange_Click;
+            // 
+            // buttonRemove
+            // 
+            buttonRemove.Location = new Point(565, 82);
+            buttonRemove.Name = "buttonRemove";
+            buttonRemove.Size = new Size(223, 29);
+            buttonRemove.TabIndex = 3;
+            buttonRemove.Text = "Удалить";
+            buttonRemove.UseVisualStyleBackColor = true;
+            buttonRemove.Click += buttonRemove_Click;
+            // 
+            // buttonReload
+            // 
+            buttonReload.Location = new Point(565, 117);
+            buttonReload.Name = "buttonReload";
+            buttonReload.Size = new Size(223, 29);
+            buttonReload.TabIndex = 4;
+            buttonReload.Text = "Обновить";
+            buttonReload.UseVisualStyleBackColor = true;
+            buttonReload.Click += buttonReload_Click;
+            // 
+            // Id
+            // 
+            Id.HeaderText = "Id";
+            Id.MinimumWidth = 6;
+            Id.Name = "Id";
+            Id.Visible = false;
+            Id.Width = 200;
+            // 
+            // Name
+            // 
+            Name.HeaderText = "Name";
+            Name.MinimumWidth = 6;
+            Name.Name = "Name";
+            Name.Width = 380;
+            // 
+            // Price
+            // 
+            Price.HeaderText = "Price";
+            Price.MinimumWidth = 6;
+            Price.Name = "Price";
+            Price.Width = 125;
+            // 
+            // FormComponents
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(800, 450);
+            Controls.Add(buttonReload);
+            Controls.Add(buttonRemove);
+            Controls.Add(buttonChange);
+            Controls.Add(buttonAdd);
+            Controls.Add(dataGridView);
+            Name = "FormComponents";
+            Text = "Компоненты";
+            Load += FormComponents_Load;
+            ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DataGridView dataGridView;
+        private Button buttonAdd;
+        private Button buttonChange;
+        private Button buttonRemove;
+        private Button buttonReload;
+        private DataGridViewTextBoxColumn Id;
+        private DataGridViewTextBoxColumn Name;
+        private DataGridViewTextBoxColumn Price;
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormComponents.cs b/ProjectFlowerShop/FormComponents.cs
new file mode 100644
index 0000000..051a3d1
--- /dev/null
+++ b/ProjectFlowerShop/FormComponents.cs
@@ -0,0 +1,119 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.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 ProjectFlowerShop
+{
+    public partial class FormComponents : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IComponentLogic _logic;
+        public FormComponents(ILogger<FormComponents> 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(ComponentForm));
+            if (service is ComponentForm form)
+            {
+                if (form.ShowDialog() == DialogResult.OK)
+                {
+                    LoadData();
+                }
+            }
+        }
+
+        private void buttonChange_Click(object sender, EventArgs e)
+        {
+            if (dataGridView.SelectedRows.Count == 1)
+            {
+                var service =
+               Program.ServiceProvider?.GetService(typeof(ComponentForm));
+                if (service is ComponentForm form)
+                {
+                    form.Id =
+                   Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+                    if (form.ShowDialog() == DialogResult.OK)
+                    {
+                        LoadData();
+                    }
+                }
+            }
+        }
+
+        private void buttonRemove_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 buttonReload_Click(object sender, EventArgs e)
+        {
+            LoadData();
+        }
+    }
+}
diff --git a/ProjectFlowerShop/FormComponents.resx b/ProjectFlowerShop/FormComponents.resx
new file mode 100644
index 0000000..d1d25ab
--- /dev/null
+++ b/ProjectFlowerShop/FormComponents.resx
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="Id.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Price.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormProductComponent.Designer.cs b/ProjectFlowerShop/FormProductComponent.Designer.cs
new file mode 100644
index 0000000..807a79e
--- /dev/null
+++ b/ProjectFlowerShop/FormProductComponent.Designer.cs
@@ -0,0 +1,119 @@
+namespace ProjectFlowerShop
+{
+    partial class FormProductComponent
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            labelComponent = new Label();
+            labelNumber = new Label();
+            comboBoxComponent = new ComboBox();
+            textBoxNumber = new TextBox();
+            buttonSave = new Button();
+            buttonCancel = new Button();
+            SuspendLayout();
+            // 
+            // labelComponent
+            // 
+            labelComponent.AutoSize = true;
+            labelComponent.Location = new Point(32, 15);
+            labelComponent.Name = "labelComponent";
+            labelComponent.Size = new Size(88, 20);
+            labelComponent.TabIndex = 0;
+            labelComponent.Text = "Компонент";
+            // 
+            // labelNumber
+            // 
+            labelNumber.AutoSize = true;
+            labelNumber.Location = new Point(32, 56);
+            labelNumber.Name = "labelNumber";
+            labelNumber.Size = new Size(90, 20);
+            labelNumber.TabIndex = 1;
+            labelNumber.Text = "Количество";
+            // 
+            // comboBoxComponent
+            // 
+            comboBoxComponent.FormattingEnabled = true;
+            comboBoxComponent.Location = new Point(220, 12);
+            comboBoxComponent.Name = "comboBoxComponent";
+            comboBoxComponent.Size = new Size(362, 28);
+            comboBoxComponent.TabIndex = 2;
+            // 
+            // textBoxNumber
+            // 
+            textBoxNumber.Location = new Point(220, 53);
+            textBoxNumber.Name = "textBoxNumber";
+            textBoxNumber.Size = new Size(362, 27);
+            textBoxNumber.TabIndex = 3;
+            // 
+            // buttonSave
+            // 
+            buttonSave.Location = new Point(338, 191);
+            buttonSave.Name = "buttonSave";
+            buttonSave.Size = new Size(119, 29);
+            buttonSave.TabIndex = 4;
+            buttonSave.Text = "Сохранить";
+            buttonSave.UseVisualStyleBackColor = true;
+            buttonSave.Click += buttonSave_Click;
+            // 
+            // buttonCancel
+            // 
+            buttonCancel.Location = new Point(463, 191);
+            buttonCancel.Name = "buttonCancel";
+            buttonCancel.Size = new Size(119, 29);
+            buttonCancel.TabIndex = 5;
+            buttonCancel.Text = "Отмена";
+            buttonCancel.UseVisualStyleBackColor = true;
+            buttonCancel.Click += buttonCancel_Click;
+            // 
+            // FormProductComponent
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(594, 232);
+            Controls.Add(buttonCancel);
+            Controls.Add(buttonSave);
+            Controls.Add(textBoxNumber);
+            Controls.Add(comboBoxComponent);
+            Controls.Add(labelNumber);
+            Controls.Add(labelComponent);
+            Name = "FormProductComponent";
+            Text = "FormProductComponent";
+            Load += FormProductComponent_Load;
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private Label labelComponent;
+        private Label labelNumber;
+        private ComboBox comboBoxComponent;
+        private TextBox textBoxNumber;
+        private Button buttonSave;
+        private Button buttonCancel;
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormProductComponent.cs b/ProjectFlowerShop/FormProductComponent.cs
new file mode 100644
index 0000000..cafef61
--- /dev/null
+++ b/ProjectFlowerShop/FormProductComponent.cs
@@ -0,0 +1,97 @@
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.ViewModels;
+using FlowerShopDataModels.Models;
+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 ProjectFlowerShop
+{
+    public partial class FormProductComponent : Form
+    {
+        private readonly List<ComponentViewModel>? _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(textBoxNumber.Text); }
+            set
+            { textBoxNumber.Text = value.ToString(); }
+        }
+        public FormProductComponent(IComponentLogic logic)
+        {
+            InitializeComponent();
+            _list = logic.ReadList(null);
+            if (_list != null)
+            {
+                comboBoxComponent.DisplayMember = "ComponentName";
+                comboBoxComponent.ValueMember = "Id";
+                comboBoxComponent.DataSource = _list;
+                comboBoxComponent.SelectedItem = null;
+            }
+        }
+
+        private void FormProductComponent_Load(object sender, EventArgs e)
+        {
+
+        }
+
+        private void buttonSave_Click(object sender, EventArgs e)
+        {
+            if (string.IsNullOrEmpty(textBoxNumber.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();
+        }
+    }
+}
diff --git a/ProjectFlowerShop/FormProductComponent.resx b/ProjectFlowerShop/FormProductComponent.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/ProjectFlowerShop/FormProductComponent.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
-- 
2.25.1


From 4c0de91edbbe3ea117570899c71b12f1daf8cbb8 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Sun, 11 Feb 2024 18:14:57 +0300
Subject: [PATCH 06/12] =?UTF-8?q?=D0=B4=D0=B0=20=D1=85=D0=B2=D0=B0=D1=82?=
 =?UTF-8?q?=D0=B8=D1=82=20=D1=81=D0=BA=D0=B8=D0=B4=D1=8B=D0=B2=D0=B0=D1=82?=
 =?UTF-8?q?=D1=8C=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectFlowerShop/FormComponents.Designer.cs  |   2 +-
 ProjectFlowerShop/FormCreateOrder.Designer.cs |  45 ++++
 ProjectFlowerShop/FormCreateOrder.cs          |  20 ++
 ProjectFlowerShop/FormCreateOrder.resx        | 120 +++++++++
 ProjectFlowerShop/FormProduct.Designer.cs     | 242 ++++++++++++++++++
 ProjectFlowerShop/FormProduct.cs              | 242 ++++++++++++++++++
 ProjectFlowerShop/FormProduct.resx            | 141 ++++++++++
 7 files changed, 811 insertions(+), 1 deletion(-)
 create mode 100644 ProjectFlowerShop/FormCreateOrder.Designer.cs
 create mode 100644 ProjectFlowerShop/FormCreateOrder.cs
 create mode 100644 ProjectFlowerShop/FormCreateOrder.resx
 create mode 100644 ProjectFlowerShop/FormProduct.Designer.cs
 create mode 100644 ProjectFlowerShop/FormProduct.cs
 create mode 100644 ProjectFlowerShop/FormProduct.resx

diff --git a/ProjectFlowerShop/FormComponents.Designer.cs b/ProjectFlowerShop/FormComponents.Designer.cs
index 72236be..e3fffa7 100644
--- a/ProjectFlowerShop/FormComponents.Designer.cs
+++ b/ProjectFlowerShop/FormComponents.Designer.cs
@@ -123,7 +123,7 @@
             Controls.Add(buttonChange);
             Controls.Add(buttonAdd);
             Controls.Add(dataGridView);
-            Name = "FormComponents";
+            //Name = "FormComponents";
             Text = "Компоненты";
             Load += FormComponents_Load;
             ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
diff --git a/ProjectFlowerShop/FormCreateOrder.Designer.cs b/ProjectFlowerShop/FormCreateOrder.Designer.cs
new file mode 100644
index 0000000..12fc38e
--- /dev/null
+++ b/ProjectFlowerShop/FormCreateOrder.Designer.cs
@@ -0,0 +1,45 @@
+namespace ProjectFlowerShop
+{
+    partial class FormCreateOrder
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            SuspendLayout();
+            // 
+            // FormCreateOrder
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(517, 193);
+            Name = "FormCreateOrder";
+            Text = "Заказ";
+            ResumeLayout(false);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormCreateOrder.cs b/ProjectFlowerShop/FormCreateOrder.cs
new file mode 100644
index 0000000..0cd9a8e
--- /dev/null
+++ b/ProjectFlowerShop/FormCreateOrder.cs
@@ -0,0 +1,20 @@
+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 ProjectFlowerShop
+{
+    public partial class FormCreateOrder : Form
+    {
+        public FormCreateOrder()
+        {
+            InitializeComponent();
+        }
+    }
+}
diff --git a/ProjectFlowerShop/FormCreateOrder.resx b/ProjectFlowerShop/FormCreateOrder.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/ProjectFlowerShop/FormCreateOrder.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormProduct.Designer.cs b/ProjectFlowerShop/FormProduct.Designer.cs
new file mode 100644
index 0000000..1d8f653
--- /dev/null
+++ b/ProjectFlowerShop/FormProduct.Designer.cs
@@ -0,0 +1,242 @@
+namespace ProjectFlowerShop
+{
+    partial class FormProduct
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            labelName = new Label();
+            labelPrice = new Label();
+            textBoxName = new TextBox();
+            textBoxPrice = new TextBox();
+            groupBoxComponent = new GroupBox();
+            buttonRefresh = new Button();
+            buttonRemove = new Button();
+            buttonChange = new Button();
+            buttonAdd = new Button();
+            dataGridView = new DataGridView();
+            Save = new Button();
+            buttonCancel = new Button();
+            Name = new DataGridViewTextBoxColumn();
+            Component = new DataGridViewTextBoxColumn();
+            idd = new DataGridViewTextBoxColumn();
+            Numbers = new DataGridViewTextBoxColumn();
+            groupBoxComponent.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+            SuspendLayout();
+            // 
+            // labelName
+            // 
+            labelName.AutoSize = true;
+            labelName.Location = new Point(18, 18);
+            labelName.Name = "labelName";
+            labelName.Size = new Size(77, 20);
+            labelName.TabIndex = 0;
+            labelName.Text = "Название";
+            // 
+            // labelPrice
+            // 
+            labelPrice.AutoSize = true;
+            labelPrice.Location = new Point(18, 59);
+            labelPrice.Name = "labelPrice";
+            labelPrice.Size = new Size(45, 20);
+            labelPrice.TabIndex = 1;
+            labelPrice.Text = "Цена";
+            // 
+            // textBoxName
+            // 
+            textBoxName.Location = new Point(101, 15);
+            textBoxName.Name = "textBoxName";
+            textBoxName.Size = new Size(204, 27);
+            textBoxName.TabIndex = 2;
+            textBoxName.TextChanged += textBox1_TextChanged;
+            // 
+            // textBoxPrice
+            // 
+            textBoxPrice.Location = new Point(101, 56);
+            textBoxPrice.Name = "textBoxPrice";
+            textBoxPrice.Size = new Size(204, 27);
+            textBoxPrice.TabIndex = 3;
+            // 
+            // groupBoxComponent
+            // 
+            groupBoxComponent.Controls.Add(buttonRefresh);
+            groupBoxComponent.Controls.Add(buttonRemove);
+            groupBoxComponent.Controls.Add(buttonChange);
+            groupBoxComponent.Controls.Add(buttonAdd);
+            groupBoxComponent.Controls.Add(dataGridView);
+            groupBoxComponent.Location = new Point(12, 144);
+            groupBoxComponent.Name = "groupBoxComponent";
+            groupBoxComponent.Size = new Size(646, 294);
+            groupBoxComponent.TabIndex = 4;
+            groupBoxComponent.TabStop = false;
+            groupBoxComponent.Text = "Компоненты";
+            // 
+            // buttonRefresh
+            // 
+            buttonRefresh.Location = new Point(450, 173);
+            buttonRefresh.Name = "buttonRefresh";
+            buttonRefresh.Size = new Size(190, 29);
+            buttonRefresh.TabIndex = 4;
+            buttonRefresh.Text = "Обновить";
+            buttonRefresh.UseVisualStyleBackColor = true;
+            buttonRefresh.Click += buttonRefresh_Click;
+            // 
+            // buttonRemove
+            // 
+            buttonRemove.Location = new Point(450, 122);
+            buttonRemove.Name = "buttonRemove";
+            buttonRemove.Size = new Size(190, 29);
+            buttonRemove.TabIndex = 3;
+            buttonRemove.Text = "Удалить";
+            buttonRemove.UseVisualStyleBackColor = true;
+            buttonRemove.Click += buttonRemove_Click;
+            // 
+            // buttonChange
+            // 
+            buttonChange.Location = new Point(450, 74);
+            buttonChange.Name = "buttonChange";
+            buttonChange.Size = new Size(190, 29);
+            buttonChange.TabIndex = 2;
+            buttonChange.Text = "Изменить";
+            buttonChange.UseVisualStyleBackColor = true;
+            buttonChange.Click += buttonChange_Click;
+            // 
+            // buttonAdd
+            // 
+            buttonAdd.Location = new Point(450, 26);
+            buttonAdd.Name = "buttonAdd";
+            buttonAdd.Size = new Size(190, 29);
+            buttonAdd.TabIndex = 1;
+            buttonAdd.Text = "Добавить";
+            buttonAdd.UseVisualStyleBackColor = true;
+            buttonAdd.Click += buttonAdd_Click;
+            // 
+            // dataGridView
+            // 
+            dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            dataGridView.Columns.AddRange(new DataGridViewColumn[] { Component, idd, Numbers });
+            dataGridView.Location = new Point(6, 26);
+            dataGridView.Name = "dataGridView";
+            dataGridView.RowHeadersWidth = 51;
+            dataGridView.RowTemplate.Height = 29;
+            dataGridView.Size = new Size(432, 262);
+            dataGridView.TabIndex = 0;
+            dataGridView.CellContentClick += dataGridView_CellContentClick;
+            // 
+            // Save
+            // 
+            Save.Location = new Point(462, 446);
+            Save.Name = "Save";
+            Save.Size = new Size(94, 29);
+            Save.TabIndex = 5;
+            Save.Text = "Сохранить";
+            Save.UseVisualStyleBackColor = true;
+            Save.Click += Save_Click;
+            // 
+            // buttonCancel
+            // 
+            buttonCancel.Location = new Point(564, 446);
+            buttonCancel.Name = "buttonCancel";
+            buttonCancel.Size = new Size(94, 29);
+            buttonCancel.TabIndex = 6;
+            buttonCancel.Text = "Отмена";
+            buttonCancel.UseVisualStyleBackColor = true;
+            buttonCancel.Click += buttonCancel_Click;
+            // 
+            // Name
+            // 
+            Name.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+            Name.HeaderText = "Компонент";
+            Name.MinimumWidth = 6;
+            Name.Name = "Name";
+            // 
+            // Component
+            // 
+            Component.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+            Component.HeaderText = "Компонент";
+            Component.MinimumWidth = 6;
+            Component.Name = "Component";
+            // 
+            // idd
+            // 
+            idd.HeaderText = "idd";
+            idd.MinimumWidth = 6;
+            idd.Name = "idd";
+            idd.Visible = false;
+            idd.Width = 125;
+            // 
+            // Numbers
+            // 
+            Numbers.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+            Numbers.HeaderText = "Количество";
+            Numbers.MinimumWidth = 6;
+            Numbers.Name = "Numbers";
+            // 
+            // FormProduct
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(670, 479);
+            Controls.Add(buttonCancel);
+            Controls.Add(Save);
+            Controls.Add(groupBoxComponent);
+            Controls.Add(textBoxPrice);
+            Controls.Add(textBoxName);
+            Controls.Add(labelPrice);
+            Controls.Add(labelName);
+           // Name = "FormProduct";
+            Text = "Изделие";
+            Load += FormProduct_Load;
+            groupBoxComponent.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private Label labelName;
+        private Label labelPrice;
+        private TextBox textBoxName;
+        private TextBox textBoxPrice;
+        private GroupBox groupBoxComponent;
+        private Button buttonRefresh;
+        private Button buttonRemove;
+        private Button buttonChange;
+        private Button buttonAdd;
+        private DataGridView dataGridView;
+        private Button Save;
+        private Button buttonCancel;
+        // private DataGridViewTextBoxColumn Id;
+        private DataGridViewTextBoxColumn Name;
+        private DataGridViewTextBoxColumn Number;
+        //private DataGridViewTextBoxColumn Id;
+        private DataGridViewTextBoxColumn Component;
+        private DataGridViewTextBoxColumn idd;
+        private DataGridViewTextBoxColumn Numbers;
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormProduct.cs b/ProjectFlowerShop/FormProduct.cs
new file mode 100644
index 0000000..abc08d3
--- /dev/null
+++ b/ProjectFlowerShop/FormProduct.cs
@@ -0,0 +1,242 @@
+using FlowerShopDataModels.Models;
+using Microsoft.Extensions.Logging;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.BindingModels;
+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 ProjectFlowerShop
+{
+    public partial class FormProduct : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IFlowerLogic _logic;
+        private int? _id;
+        private Dictionary<int, (IComponentModel, int)> _flowerComponents;
+        public int Id { set { _id = value; } }
+
+        public FormProduct(ILogger<FormProduct> logger, IFlowerLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+            _flowerComponents = new Dictionary<int, (IComponentModel, int)>();
+        }
+
+        private void textBox1_TextChanged(object sender, EventArgs e)
+        {
+
+        }
+
+        private void FormProduct_Load(object sender, EventArgs e)
+        {
+            if (_id.HasValue)
+            {
+                _logger.LogInformation("Загрузка изделия");
+                try
+                {
+                    var view = _logic.ReadElement(new FlowerSearchModel
+                    {
+                        Id = _id.Value
+                    });
+                    if (view != null)
+                    {
+                        textBoxName.Text = view.FlowerName;
+                        textBoxPrice.Text = view.Price.ToString();
+                        _flowerComponents = view.FlowerComponents ?? new
+                        Dictionary<int, (IComponentModel, int)>();
+                        LoadData();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка загрузки изделия");
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+                    MessageBoxIcon.Error);
+                }
+            }
+        }
+
+        private void LoadData()
+        {
+            _logger.LogInformation("Загрузка компонент изделия");
+            try
+            {
+                if (_flowerComponents != null)
+                {
+                    dataGridView.Rows.Clear();
+                    foreach (var pc in _flowerComponents)
+                    {
+                        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 dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
+        {
+
+        }
+
+        private void buttonAdd_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(FormProductComponent));
+            if (service is FormProductComponent form)
+            {
+                if (form.ShowDialog() == DialogResult.OK)
+                {
+                    if (form.ComponentModel == null)
+                    {
+                        return;
+                    }
+                    _logger.LogInformation("Добавление нового компонента:{ ComponentName}- { Count} ", form.ComponentModel.ComponentName, form.Count);
+                    if (_flowerComponents.ContainsKey(form.Id))
+                    {
+                        _flowerComponents[form.Id] = (form.ComponentModel, form.Count);
+                    }
+                    else
+                    {
+                        _flowerComponents.Add(form.Id, (form.ComponentModel, form.Count));
+                    }
+                    LoadData();
+                }
+            }
+
+        }
+
+        private void buttonChange_Click(object sender, EventArgs e)
+        {
+            if (dataGridView.SelectedRows.Count == 1)
+            {
+                var service =
+               Program.ServiceProvider?.GetService(typeof(FormProductComponent));
+                if (service is FormProductComponent form)
+                {
+                    int id =
+                   Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value);
+                    form.Id = id;
+                    form.Count = _flowerComponents[id].Item2;
+                    if (form.ShowDialog() == DialogResult.OK)
+                    {
+                        if (form.ComponentModel == null)
+                        {
+                            return;
+                        }
+                        _logger.LogInformation("Изменение компонента:{ ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count);
+                        _flowerComponents[form.Id] = (form.ComponentModel, form.Count);
+                        LoadData();
+                    }
+                }
+            }
+
+        }
+
+        private void buttonRemove_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);
+                        _flowerComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value));
+                    }
+                    catch (Exception ex)
+                    {
+                        MessageBox.Show(ex.Message, "Ошибка",
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    }
+                    LoadData();
+                }
+            }
+        }
+
+        private void buttonRefresh_Click(object sender, EventArgs e)
+        {
+            LoadData();
+        }
+
+        private void Save_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 (_flowerComponents == null || _flowerComponents.Count == 0)
+            {
+                MessageBox.Show("Заполните компоненты", "Ошибка",
+               MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            _logger.LogInformation("Сохранение изделия");
+            try
+            {
+                var model = new FlowerBindingModel
+                {
+                    Id = _id ?? 0,
+                    FlowerName = textBoxName.Text,
+                    Price = Convert.ToDouble(textBoxPrice.Text),
+                    FlowerComponents = _flowerComponents
+                };
+                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 _flowerComponents)
+            {
+                price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2);
+            }
+            return Math.Round(price * 1.1, 2);
+        }
+
+    }
+}
diff --git a/ProjectFlowerShop/FormProduct.resx b/ProjectFlowerShop/FormProduct.resx
new file mode 100644
index 0000000..2a9bdfc
--- /dev/null
+++ b/ProjectFlowerShop/FormProduct.resx
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="Component.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="idd.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Numbers.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Component.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="idd.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Numbers.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
-- 
2.25.1


From f930b4b56c4cafe991c0dcd7b33533371bf3d6e6 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Sun, 11 Feb 2024 18:49:19 +0300
Subject: [PATCH 07/12] =?UTF-8?q?=D0=A3=D0=B6=D0=B5=20=D0=BF=D0=BE=D1=87?=
 =?UTF-8?q?=D1=82=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectFlowerShop/FormCreateOrder.Designer.cs | 102 +++++++++-
 ProjectFlowerShop/FormCreateOrder.cs          | 126 +++++++++++-
 ProjectFlowerShop/MainForm.Designer.cs        | 171 ++++++++++++++++
 ProjectFlowerShop/MainForm.cs                 | 183 ++++++++++++++++++
 ProjectFlowerShop/MainForm.resx               | 123 ++++++++++++
 5 files changed, 702 insertions(+), 3 deletions(-)
 create mode 100644 ProjectFlowerShop/MainForm.Designer.cs
 create mode 100644 ProjectFlowerShop/MainForm.cs
 create mode 100644 ProjectFlowerShop/MainForm.resx

diff --git a/ProjectFlowerShop/FormCreateOrder.Designer.cs b/ProjectFlowerShop/FormCreateOrder.Designer.cs
index 12fc38e..ba89839 100644
--- a/ProjectFlowerShop/FormCreateOrder.Designer.cs
+++ b/ProjectFlowerShop/FormCreateOrder.Designer.cs
@@ -28,18 +28,118 @@
         /// </summary>
         private void InitializeComponent()
         {
+            labelProduct = new Label();
+            labelNumber = new Label();
+            LabelSum = new Label();
+            buttonSave = new Button();
+            buttonCancel = new Button();
+            textBoxCount = new TextBox();
+            comboBoxProduct = new ComboBox();
+            textBoxSum = new TextBox();
             SuspendLayout();
             // 
+            // labelProduct
+            // 
+            labelProduct.AutoSize = true;
+            labelProduct.Location = new Point(12, 29);
+            labelProduct.Name = "labelProduct";
+            labelProduct.Size = new Size(68, 20);
+            labelProduct.TabIndex = 0;
+            labelProduct.Text = "Изделие";
+            // 
+            // labelNumber
+            // 
+            labelNumber.AutoSize = true;
+            labelNumber.Location = new Point(12, 71);
+            labelNumber.Name = "labelNumber";
+            labelNumber.Size = new Size(58, 20);
+            labelNumber.TabIndex = 1;
+            labelNumber.Text = "Кол-во";
+            // 
+            // LabelSum
+            // 
+            LabelSum.AutoSize = true;
+            LabelSum.Location = new Point(12, 113);
+            LabelSum.Name = "LabelSum";
+            LabelSum.Size = new Size(55, 20);
+            LabelSum.TabIndex = 2;
+            LabelSum.Text = "Сумма";
+            // 
+            // buttonSave
+            // 
+            buttonSave.Location = new Point(292, 158);
+            buttonSave.Name = "buttonSave";
+            buttonSave.Size = new Size(94, 29);
+            buttonSave.TabIndex = 3;
+            buttonSave.Text = "Сохранить";
+            buttonSave.UseVisualStyleBackColor = true;
+            buttonSave.Click += buttonSave_Click;
+            // 
+            // buttonCancel
+            // 
+            buttonCancel.Location = new Point(411, 158);
+            buttonCancel.Name = "buttonCancel";
+            buttonCancel.Size = new Size(94, 29);
+            buttonCancel.TabIndex = 4;
+            buttonCancel.Text = "Отмена";
+            buttonCancel.UseVisualStyleBackColor = true;
+            buttonCancel.Click += buttonCancel_Click;
+            // 
+            // textBoxCount
+            // 
+            textBoxCount.Location = new Point(97, 68);
+            textBoxCount.Name = "textBoxCount";
+            textBoxCount.Size = new Size(274, 27);
+            textBoxCount.TabIndex = 5;
+            textBoxCount.TextChanged += textBox1_TextChanged;
+            // 
+            // comboBoxProduct
+            // 
+            comboBoxProduct.FormattingEnabled = true;
+            comboBoxProduct.Location = new Point(97, 26);
+            comboBoxProduct.Name = "comboBoxProduct";
+            comboBoxProduct.Size = new Size(274, 28);
+            comboBoxProduct.TabIndex = 6;
+            comboBoxProduct.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
+            // 
+            // textBoxSum
+            // 
+            textBoxSum.Location = new Point(97, 110);
+            textBoxSum.Name = "textBoxSum";
+            textBoxSum.ReadOnly = true;
+            textBoxSum.Size = new Size(274, 27);
+            textBoxSum.TabIndex = 7;
+            textBoxSum.TextChanged += textBox2_TextChanged;
+            // 
             // FormCreateOrder
             // 
             AutoScaleDimensions = new SizeF(8F, 20F);
             AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(517, 193);
+            ClientSize = new Size(514, 199);
+            Controls.Add(textBoxSum);
+            Controls.Add(comboBoxProduct);
+            Controls.Add(textBoxCount);
+            Controls.Add(buttonCancel);
+            Controls.Add(buttonSave);
+            Controls.Add(LabelSum);
+            Controls.Add(labelNumber);
+            Controls.Add(labelProduct);
             Name = "FormCreateOrder";
             Text = "Заказ";
+            Load += FormCreateOrder_Load;
             ResumeLayout(false);
+            PerformLayout();
         }
 
         #endregion
+
+        private Label labelProduct;
+        private Label labelNumber;
+        private Label LabelSum;
+        private Button buttonSave;
+        private Button buttonCancel;
+        private TextBox textBoxCount;
+        private ComboBox comboBoxProduct;
+        private TextBox textBoxSum;
     }
 }
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormCreateOrder.cs b/ProjectFlowerShop/FormCreateOrder.cs
index 0cd9a8e..10bd326 100644
--- a/ProjectFlowerShop/FormCreateOrder.cs
+++ b/ProjectFlowerShop/FormCreateOrder.cs
@@ -1,4 +1,9 @@
-using System;
+using FlowerShopContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.SearchModels;
+using FlowerShopContracts.BindingModels;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
@@ -12,9 +17,126 @@ namespace ProjectFlowerShop
 {
     public partial class FormCreateOrder : Form
     {
-        public FormCreateOrder()
+        private readonly ILogger _logger;
+        private readonly IFlowerLogic _logicF;
+        private readonly IOrderLogic _logicO;
+
+        public FormCreateOrder(ILogger<FormCreateOrder> logger, IFlowerLogic logicP, IOrderLogic logicO)
         {
             InitializeComponent();
+            _logger = logger;
+            _logicF = logicP;
+            _logicO = logicO;
+        }
+
+        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            CalcSum();
+        }
+
+        private void textBox1_TextChanged(object sender, EventArgs e)
+        {
+            CalcSum();
+        }
+
+        private void textBox2_TextChanged(object sender, EventArgs e)
+        {
+            CalcSum();
+        }
+
+        private void FormCreateOrder_Load(object sender, EventArgs e)
+        {
+            _logger.LogInformation("Загрузка изделий для заказа");
+            try
+            {
+                var list = _logicF.ReadList(null);
+                if (list != null)
+                {
+                    comboBoxProduct.DisplayMember = "FlowerName";
+                    comboBoxProduct.ValueMember = "Id";
+                    comboBoxProduct.DataSource = list;
+                    comboBoxProduct.SelectedItem = null;
+                }
+                _logger.LogInformation("Цветы загружены");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки цветов");
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void CalcSum()
+        {
+            if (comboBoxProduct.SelectedValue != null &&
+           !string.IsNullOrEmpty(textBoxCount.Text))
+            {
+                try
+                {
+                    int id = Convert.ToInt32(comboBoxProduct.SelectedValue);
+                    var product = _logicF.ReadElement(new FlowerSearchModel
+                    {
+                        Id = id
+                    });
+                    int count = Convert.ToInt32(textBoxCount.Text);
+                    textBoxSum.Text = Math.Round(count * (product?.Price ?? 0),
+                    2).ToString();
+                    _logger.LogInformation("Расчет суммы заказа");
+                }
+                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(textBoxCount.Text))
+            {
+                MessageBox.Show("Заполните поле Количество", "Ошибка",
+               MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            if (comboBoxProduct.SelectedValue == null)
+            {
+                MessageBox.Show("Выберите изделие", "Ошибка",
+               MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            _logger.LogInformation("Создание заказа");
+            try
+            {
+                var operationResult = _logicO.CreateOrder(new OrderBindingModel
+                {
+                    FlowerId = Convert.ToInt32(comboBoxProduct.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/ProjectFlowerShop/MainForm.Designer.cs b/ProjectFlowerShop/MainForm.Designer.cs
new file mode 100644
index 0000000..2b62d4f
--- /dev/null
+++ b/ProjectFlowerShop/MainForm.Designer.cs
@@ -0,0 +1,171 @@
+namespace IceCreamShop
+{
+    partial class MainForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            menuStrip1 = new MenuStrip();
+            ToolStripMenu = new ToolStripMenuItem();
+            КомпонентыStripMenuItem = new ToolStripMenuItem();
+            МороженноеStripMenuItem = new ToolStripMenuItem();
+            DataGridView = new DataGridView();
+            CreateOrderButton = new Button();
+            TakeInWorkButton = new Button();
+            ReadyButton = new Button();
+            IssuedButton = new Button();
+            RefreshButton = new Button();
+            menuStrip1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit();
+            SuspendLayout();
+            // 
+            // menuStrip1
+            // 
+            menuStrip1.ImageScalingSize = new Size(20, 20);
+            menuStrip1.Items.AddRange(new ToolStripItem[] { ToolStripMenu });
+            menuStrip1.Location = new Point(0, 0);
+            menuStrip1.Name = "menuStrip1";
+            menuStrip1.Size = new Size(1296, 28);
+            menuStrip1.TabIndex = 0;
+            menuStrip1.Text = "menuStrip1";
+            // 
+            // ToolStripMenu
+            // 
+            ToolStripMenu.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыStripMenuItem, МороженноеStripMenuItem });
+            ToolStripMenu.Name = "ToolStripMenu";
+            ToolStripMenu.Size = new Size(117, 24);
+            ToolStripMenu.Text = "Справочники";
+            // 
+            // КомпонентыStripMenuItem
+            // 
+            КомпонентыStripMenuItem.Name = "КомпонентыStripMenuItem";
+            КомпонентыStripMenuItem.Size = new Size(186, 26);
+            КомпонентыStripMenuItem.Text = "Компоненты";
+            КомпонентыStripMenuItem.Click += КомпонентыStripMenuItem_Click;
+            // 
+            // МороженноеStripMenuItem
+            // 
+            МороженноеStripMenuItem.Name = "МороженноеStripMenuItem";
+            МороженноеStripMenuItem.Size = new Size(186, 26);
+            МороженноеStripMenuItem.Text = "Мороженное";
+            МороженноеStripMenuItem.Click += МороженноеStripMenuItem_Click;
+            // 
+            // DataGridView
+            // 
+            DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            DataGridView.Location = new Point(12, 31);
+            DataGridView.Name = "DataGridView";
+            DataGridView.RowHeadersWidth = 51;
+            DataGridView.Size = new Size(1007, 407);
+            DataGridView.TabIndex = 1;
+            // 
+            // CreateOrderButton
+            // 
+            CreateOrderButton.Location = new Point(1025, 31);
+            CreateOrderButton.Name = "CreateOrderButton";
+            CreateOrderButton.Size = new Size(259, 29);
+            CreateOrderButton.TabIndex = 2;
+            CreateOrderButton.Text = "Создать заказ";
+            CreateOrderButton.UseVisualStyleBackColor = true;
+            CreateOrderButton.Click += CreateOrderButton_Click;
+            // 
+            // TakeInWorkButton
+            // 
+            TakeInWorkButton.Location = new Point(1025, 66);
+            TakeInWorkButton.Name = "TakeInWorkButton";
+            TakeInWorkButton.Size = new Size(259, 29);
+            TakeInWorkButton.TabIndex = 3;
+            TakeInWorkButton.Text = "Отдать заказ в работу";
+            TakeInWorkButton.UseVisualStyleBackColor = true;
+            TakeInWorkButton.Click += TakeInWorkButton_Click;
+            // 
+            // ReadyButton
+            // 
+            ReadyButton.Location = new Point(1025, 101);
+            ReadyButton.Name = "ReadyButton";
+            ReadyButton.Size = new Size(259, 29);
+            ReadyButton.TabIndex = 4;
+            ReadyButton.Text = "Заказ готов";
+            ReadyButton.UseVisualStyleBackColor = true;
+            ReadyButton.Click += ReadyButton_Click;
+            // 
+            // IssuedButton
+            // 
+            IssuedButton.Location = new Point(1025, 136);
+            IssuedButton.Name = "IssuedButton";
+            IssuedButton.Size = new Size(259, 29);
+            IssuedButton.TabIndex = 5;
+            IssuedButton.Text = "Заказ выдан";
+            IssuedButton.UseVisualStyleBackColor = true;
+            IssuedButton.Click += IssuedButton_Click;
+            // 
+            // RefreshButton
+            // 
+            RefreshButton.Location = new Point(1025, 171);
+            RefreshButton.Name = "RefreshButton";
+            RefreshButton.Size = new Size(259, 29);
+            RefreshButton.TabIndex = 6;
+            RefreshButton.Text = "Обновить";
+            RefreshButton.UseVisualStyleBackColor = true;
+            RefreshButton.Click += RefreshButton_Click;
+            // 
+            // MainForm
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(1296, 450);
+            Controls.Add(RefreshButton);
+            Controls.Add(IssuedButton);
+            Controls.Add(ReadyButton);
+            Controls.Add(TakeInWorkButton);
+            Controls.Add(CreateOrderButton);
+            Controls.Add(DataGridView);
+            Controls.Add(menuStrip1);
+            MainMenuStrip = menuStrip1;
+            Name = "MainForm";
+            Text = "MainForm";
+            Load += MainForm_Load;
+            menuStrip1.ResumeLayout(false);
+            menuStrip1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private MenuStrip menuStrip1;
+        private ToolStripMenuItem ToolStripMenu;
+        private ToolStripMenuItem КомпонентыStripMenuItem;
+        private ToolStripMenuItem МороженноеStripMenuItem;
+        private DataGridView DataGridView;
+        private Button CreateOrderButton;
+        private Button TakeInWorkButton;
+        private Button ReadyButton;
+        private Button IssuedButton;
+        private Button RefreshButton;
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs
new file mode 100644
index 0000000..613d82d
--- /dev/null
+++ b/ProjectFlowerShop/MainForm.cs
@@ -0,0 +1,183 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopDataModels;
+using FlowerShopDataModels.Enums;
+using Microsoft.Extensions.Logging;
+using ProjectFlowerShop;
+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 IceCreamShop
+{
+    public partial class MainForm : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IOrderLogic _orderLogic;
+        public MainForm(ILogger<MainForm> logger, IOrderLogic orderLogic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _orderLogic = orderLogic;
+        }
+
+        private void КомпонентыStripMenuItem_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(FormComponents));
+            if (service is FormComponents form)
+            {
+                form.ShowDialog();
+            }
+
+        }
+
+        private void MainForm_Load(object sender, EventArgs e)
+        {
+            LoadData();
+        }
+
+        private void LoadData()
+        {
+            _logger.LogInformation("Загрузка заказов");
+            try
+            {
+                var list = _orderLogic.ReadList(null);
+                if (list != null)
+                {
+                    DataGridView.DataSource = list;
+                    DataGridView.Columns["IceCreamId"].Visible = false;
+                    DataGridView.Columns["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+                }
+                _logger.LogInformation("Загрузка заказов");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки заказов");
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void МороженноеStripMenuItem_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(IceCreamsForm));
+            if (service is IceCreamsForm form)
+            {
+                form.ShowDialog();
+            }
+        }
+
+        private void CreateOrderButton_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder));
+            if (service is FormCreateOrder form)
+            {
+                form.ShowDialog();
+                LoadData();
+            }
+        }
+
+        private OrderBindingModel CreateBindingModel(int id, bool isDone = false)
+        {
+            return new OrderBindingModel
+            {
+                Id = id,
+                FlowerId = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["IceCreamId"].Value),
+                Status = Enum.Parse<OrderStatus>(DataGridView.SelectedRows[0].Cells["Status"].Value.ToString()),
+                Count = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Count"].Value),
+                Sum = double.Parse(DataGridView.SelectedRows[0].Cells["Sum"].Value.ToString()),
+                DateCreate = DateTime.Parse(DataGridView.SelectedRows[0].Cells["DateCreate"].Value.ToString()),
+            };
+        }
+
+        private void TakeInWorkButton_Click(object sender, EventArgs e)
+        {
+            if (DataGridView.SelectedRows.Count == 1)
+            {
+                int id =
+               Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
+                _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id);
+                try
+                {
+                    var operationResult = _orderLogic.TakeOrderInWork(CreateBindingModel(id));
+                    if (!operationResult)
+                    {
+                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+                    }
+                    LoadData();
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка передачи заказа в работу");
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+                    MessageBoxIcon.Error);
+                }
+            }
+
+        }
+
+        private void ReadyButton_Click(object sender, EventArgs e)
+        {
+            if (DataGridView.SelectedRows.Count == 1)
+            {
+                int id =
+               Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
+                _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'",
+               id);
+                try
+                {
+                    var operationResult = _orderLogic.FinishOrder(CreateBindingModel(id));
+                    if (!operationResult)
+                    {
+                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+                    }
+                    LoadData();
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка отметки о готовности заказа");
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+    MessageBoxIcon.Error);
+                }
+            }
+        }
+
+        private void IssuedButton_Click(object sender, EventArgs e)
+        {
+            if (DataGridView.SelectedRows.Count == 1)
+            {
+                int id =
+               Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
+                _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'",
+               id);
+                try
+                {
+                    var operationResult = _orderLogic.DeliveryOrder(CreateBindingModel(id));
+                    if (!operationResult)
+                    {
+                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+                    }
+                    _logger.LogInformation("Заказ №{id} выдан", id);
+                    LoadData();
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка отметки о выдачи заказа");
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+                   MessageBoxIcon.Error);
+                }
+            }
+
+        }
+
+        private void RefreshButton_Click(object sender, EventArgs e)
+        {
+            LoadData();
+        }
+    }
+}
diff --git a/ProjectFlowerShop/MainForm.resx b/ProjectFlowerShop/MainForm.resx
new file mode 100644
index 0000000..a0623c8
--- /dev/null
+++ b/ProjectFlowerShop/MainForm.resx
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
-- 
2.25.1


From 6a305bb8dfcca40e64ba9012e4c010d7c1fdcfaa Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Mon, 12 Feb 2024 16:52:44 +0300
Subject: [PATCH 08/12] '[

---
 FlowerShopBusinessLogic/ComponentLogic.cs  |   2 +-
 FlowerShopListImplement/FlowerStorage.cs   |   2 +-
 ProjectFlowerShop/FormFlowers.Designer.cs  | 113 +++++++++++++++++++
 ProjectFlowerShop/FormFlowers.cs           | 117 ++++++++++++++++++++
 ProjectFlowerShop/FormFlowers.resx         | 120 +++++++++++++++++++++
 ProjectFlowerShop/MainForm.Designer.cs     |  18 ++--
 ProjectFlowerShop/MainForm.cs              |   6 +-
 ProjectFlowerShop/Program.cs               |  44 +++++++-
 ProjectFlowerShop/ProjectFlowerShop.csproj |   1 +
 9 files changed, 405 insertions(+), 18 deletions(-)
 create mode 100644 ProjectFlowerShop/FormFlowers.Designer.cs
 create mode 100644 ProjectFlowerShop/FormFlowers.cs
 create mode 100644 ProjectFlowerShop/FormFlowers.resx

diff --git a/FlowerShopBusinessLogic/ComponentLogic.cs b/FlowerShopBusinessLogic/ComponentLogic.cs
index ed0ddc3..ed18633 100644
--- a/FlowerShopBusinessLogic/ComponentLogic.cs
+++ b/FlowerShopBusinessLogic/ComponentLogic.cs
@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace FlowerShopBusinessLogic.BusinessLogic
 {
-    public class ComponentLogic : IFlowerLogic 
+    public class ComponentLogic : IComponentLogic 
     {
         private readonly ILogger _logger;
         private readonly IComponentStorage _componentStorage;
diff --git a/FlowerShopListImplement/FlowerStorage.cs b/FlowerShopListImplement/FlowerStorage.cs
index eb8aef6..00274ec 100644
--- a/FlowerShopListImplement/FlowerStorage.cs
+++ b/FlowerShopListImplement/FlowerStorage.cs
@@ -9,7 +9,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace FlowerShopListImplement
+namespace FlowerShopListImplement.Implements
 {
     public class FlowerStorage : IFlowerStorage
     {
diff --git a/ProjectFlowerShop/FormFlowers.Designer.cs b/ProjectFlowerShop/FormFlowers.Designer.cs
new file mode 100644
index 0000000..6d482c9
--- /dev/null
+++ b/ProjectFlowerShop/FormFlowers.Designer.cs
@@ -0,0 +1,113 @@
+namespace IceCreamShop
+{
+    partial class FormFlowers
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            DataGridView = new DataGridView();
+            AddButton = new Button();
+            UpdateButton = new Button();
+            DeleteButton = new Button();
+            RefreshButton = new Button();
+            ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit();
+            SuspendLayout();
+            // 
+            // DataGridView
+            // 
+            DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            DataGridView.Location = new Point(12, 12);
+            DataGridView.Name = "DataGridView";
+            DataGridView.RowHeadersWidth = 51;
+            DataGridView.Size = new Size(379, 426);
+            DataGridView.TabIndex = 0;
+            // 
+            // AddButton
+            // 
+            AddButton.Location = new Point(397, 12);
+            AddButton.Name = "AddButton";
+            AddButton.Size = new Size(148, 29);
+            AddButton.TabIndex = 1;
+            AddButton.Text = "Добавить";
+            AddButton.UseVisualStyleBackColor = true;
+            AddButton.Click += AddButton_Click;
+            // 
+            // UpdateButton
+            // 
+            UpdateButton.Location = new Point(397, 47);
+            UpdateButton.Name = "UpdateButton";
+            UpdateButton.Size = new Size(148, 29);
+            UpdateButton.TabIndex = 2;
+            UpdateButton.Text = "Изменить";
+            UpdateButton.UseVisualStyleBackColor = true;
+            UpdateButton.Click += UpdateButton_Click;
+            // 
+            // DeleteButton
+            // 
+            DeleteButton.Location = new Point(397, 82);
+            DeleteButton.Name = "DeleteButton";
+            DeleteButton.Size = new Size(148, 29);
+            DeleteButton.TabIndex = 3;
+            DeleteButton.Text = "Удалить";
+            DeleteButton.UseVisualStyleBackColor = true;
+            DeleteButton.Click += DeleteButton_Click;
+            // 
+            // RefreshButton
+            // 
+            RefreshButton.Location = new Point(397, 117);
+            RefreshButton.Name = "RefreshButton";
+            RefreshButton.Size = new Size(148, 29);
+            RefreshButton.TabIndex = 4;
+            RefreshButton.Text = "Обновить";
+            RefreshButton.UseVisualStyleBackColor = true;
+            RefreshButton.Click += RefreshButton_Click;
+            // 
+            // IceCreamsForm
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(557, 450);
+            Controls.Add(RefreshButton);
+            Controls.Add(DeleteButton);
+            Controls.Add(UpdateButton);
+            Controls.Add(AddButton);
+            Controls.Add(DataGridView);
+            Name = "IceCreamsForm";
+            Text = "IceCreamsForm";
+            Load += IceCreamsForm_Load;
+            ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DataGridView DataGridView;
+        private Button AddButton;
+        private Button UpdateButton;
+        private Button DeleteButton;
+        private Button RefreshButton;
+    }
+}
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormFlowers.cs b/ProjectFlowerShop/FormFlowers.cs
new file mode 100644
index 0000000..9fdcfd2
--- /dev/null
+++ b/ProjectFlowerShop/FormFlowers.cs
@@ -0,0 +1,117 @@
+using FlowerShopContracts.BindingModels;
+using FlowerShopContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+using System;
+using ProjectFlowerShop;
+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 IceCreamShop
+{
+    public partial class FormFlowers : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IFlowerLogic _logic;
+        public FormFlowers(ILogger<FormFlowers> logger, IFlowerLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+        }
+
+        private void IceCreamsForm_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["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+                    DataGridView.Columns["IceCreamComponents"].Visible = false;
+                }
+                _logger.LogInformation("Загрузка цветов");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки цветов");
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void AddButton_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(FormProduct));
+            if (service is FormProduct form)
+            {
+                if (form.ShowDialog() == DialogResult.OK)
+                {
+                    LoadData();
+                }
+            }
+        }
+
+        private void UpdateButton_Click(object sender, EventArgs e)
+        {
+            if (DataGridView.SelectedRows.Count == 1)
+            {
+                var service = Program.ServiceProvider?.GetService(typeof(FormProduct));
+                if (service is FormProduct form)
+                {
+                    var tmp = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
+                    form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
+                    if (form.ShowDialog() == DialogResult.OK)
+                    {
+                        LoadData();
+                    }
+                }
+            }
+        }
+
+        private void DeleteButton_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 FlowerBindingModel
+                        {
+                            Id = id
+                        }))
+                        {
+                            throw new Exception("Ошибка при удалении. Дополнительная информация в логах.");
+                        }
+                        LoadData();
+                    }
+                    catch (Exception ex)
+                    {
+                        _logger.LogError(ex, "Ошибка удаления цветов");
+                        MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    }
+                }
+            }
+        }
+
+        private void RefreshButton_Click(object sender, EventArgs e)
+        {
+            LoadData();
+
+        }
+    }
+}
diff --git a/ProjectFlowerShop/FormFlowers.resx b/ProjectFlowerShop/FormFlowers.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/ProjectFlowerShop/FormFlowers.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/ProjectFlowerShop/MainForm.Designer.cs b/ProjectFlowerShop/MainForm.Designer.cs
index 2b62d4f..d5dc8d4 100644
--- a/ProjectFlowerShop/MainForm.Designer.cs
+++ b/ProjectFlowerShop/MainForm.Designer.cs
@@ -31,7 +31,7 @@
             menuStrip1 = new MenuStrip();
             ToolStripMenu = new ToolStripMenuItem();
             КомпонентыStripMenuItem = new ToolStripMenuItem();
-            МороженноеStripMenuItem = new ToolStripMenuItem();
+            ЦветыStripMenuItem = new ToolStripMenuItem();
             DataGridView = new DataGridView();
             CreateOrderButton = new Button();
             TakeInWorkButton = new Button();
@@ -54,7 +54,7 @@
             // 
             // ToolStripMenu
             // 
-            ToolStripMenu.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыStripMenuItem, МороженноеStripMenuItem });
+            ToolStripMenu.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыStripMenuItem, ЦветыStripMenuItem });
             ToolStripMenu.Name = "ToolStripMenu";
             ToolStripMenu.Size = new Size(117, 24);
             ToolStripMenu.Text = "Справочники";
@@ -62,16 +62,16 @@
             // КомпонентыStripMenuItem
             // 
             КомпонентыStripMenuItem.Name = "КомпонентыStripMenuItem";
-            КомпонентыStripMenuItem.Size = new Size(186, 26);
+            КомпонентыStripMenuItem.Size = new Size(224, 26);
             КомпонентыStripMenuItem.Text = "Компоненты";
             КомпонентыStripMenuItem.Click += КомпонентыStripMenuItem_Click;
             // 
-            // МороженноеStripMenuItem
+            // ЦветыStripMenuItem
             // 
-            МороженноеStripMenuItem.Name = "МороженноеStripMenuItem";
-            МороженноеStripMenuItem.Size = new Size(186, 26);
-            МороженноеStripMenuItem.Text = "Мороженное";
-            МороженноеStripMenuItem.Click += МороженноеStripMenuItem_Click;
+            ЦветыStripMenuItem.Name = "ЦветыStripMenuItem";
+            ЦветыStripMenuItem.Size = new Size(224, 26);
+            ЦветыStripMenuItem.Text = "Цветы";
+            ЦветыStripMenuItem.Click += ЦветыStripMenuItem_Click;
             // 
             // DataGridView
             // 
@@ -160,7 +160,7 @@
         private MenuStrip menuStrip1;
         private ToolStripMenuItem ToolStripMenu;
         private ToolStripMenuItem КомпонентыStripMenuItem;
-        private ToolStripMenuItem МороженноеStripMenuItem;
+        private ToolStripMenuItem ЦветыStripMenuItem;
         private DataGridView DataGridView;
         private Button CreateOrderButton;
         private Button TakeInWorkButton;
diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs
index 613d82d..41f131a 100644
--- a/ProjectFlowerShop/MainForm.cs
+++ b/ProjectFlowerShop/MainForm.cs
@@ -63,10 +63,10 @@ namespace IceCreamShop
             }
         }
 
-        private void МороженноеStripMenuItem_Click(object sender, EventArgs e)
+        private void ЦветыStripMenuItem_Click(object sender, EventArgs e)
         {
-            var service = Program.ServiceProvider?.GetService(typeof(IceCreamsForm));
-            if (service is IceCreamsForm form)
+            var service = Program.ServiceProvider?.GetService(typeof(FormFlowers));
+            if (service is FormFlowers form)
             {
                 form.ShowDialog();
             }
diff --git a/ProjectFlowerShop/Program.cs b/ProjectFlowerShop/Program.cs
index b26be2c..0ba0c05 100644
--- a/ProjectFlowerShop/Program.cs
+++ b/ProjectFlowerShop/Program.cs
@@ -1,17 +1,53 @@
+using FlowerShopBusinessLogic.BusinessLogic;
+using FlowerShopContracts.BusinessLogicsContracts;
+using FlowerShopContracts.StoragesContracts;
+using FlowerShopListImplement.Implements;
+using IceCreamShop;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using NLog.Extensions.Logging;
+using System;
+using System.Drawing;
+
 namespace ProjectFlowerShop
 {
     internal static class Program
     {
+        private static ServiceProvider? _serviceProvider;
+        public static ServiceProvider? ServiceProvider => _serviceProvider;
         /// <summary>
         ///  The main entry point for the application.
         /// </summary>
         [STAThread]
         static void Main()
         {
-            // To customize application configuration such as set high DPI settings or default font,
-            // see https://aka.ms/applicationconfiguration.
             ApplicationConfiguration.Initialize();
-            Application.Run(new ComponentForm());
+            var services = new ServiceCollection();
+            ConfigureServices(services);
+            _serviceProvider = services.BuildServiceProvider();
+            Application.Run(_serviceProvider.GetRequiredService<MainForm>());
         }
+        private static void ConfigureServices(ServiceCollection services)
+        {
+            services.AddLogging(option =>
+            {
+                option.SetMinimumLevel(LogLevel.Information);
+                option.AddNLog("nlog.config");
+            });
+            services.AddTransient<IComponentStorage, ComponentStorage>();
+            services.AddTransient<IOrderStorage, OrderStorage>();
+            services.AddTransient<IFlowerStorage, FlowerStorage>();
+            services.AddTransient<IComponentLogic, ComponentLogic>();
+            services.AddTransient<IOrderLogic, OrderLogic>();
+            services.AddTransient<IFlowerLogic, FlowerLogic>();
+            services.AddTransient<MainForm>();
+            services.AddTransient<ComponentForm>();
+            services.AddTransient<FormComponents>();
+            services.AddTransient<FormCreateOrder>();
+            services.AddTransient<FormProduct>();
+            services.AddTransient<FormProductComponent>();
+            services.AddTransient<FormFlowers>();
+        }
+
     }
-}
\ No newline at end of file
+}
diff --git a/ProjectFlowerShop/ProjectFlowerShop.csproj b/ProjectFlowerShop/ProjectFlowerShop.csproj
index cb55f75..337ad0f 100644
--- a/ProjectFlowerShop/ProjectFlowerShop.csproj
+++ b/ProjectFlowerShop/ProjectFlowerShop.csproj
@@ -10,6 +10,7 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
+    <PackageReference Include="NLog.Extensions.Logging" Version="5.3.8" />
   </ItemGroup>
 
   <ItemGroup>
-- 
2.25.1


From d418c821a1a7420838e19652a30a6c055eb9d326 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Tue, 13 Feb 2024 20:55:59 +0300
Subject: [PATCH 09/12] =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B1=20?=
 =?UTF-8?q?=D0=BC=D0=BE=D1=80=D0=B5=20=D0=B1=D1=8B=D0=BB=D0=BE=20=D0=BF?=
 =?UTF-8?q?=D0=B8=D0=B2=D0=BE=D0=BC...?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectFlowerShop/FormComponents.Designer.cs | 31 +-------------------
 ProjectFlowerShop/FormComponents.resx        |  9 ------
 ProjectFlowerShop/FormFlowers.Designer.cs    |  8 ++---
 ProjectFlowerShop/FormFlowers.cs             |  6 ++--
 ProjectFlowerShop/MainForm.Designer.cs       |  2 +-
 ProjectFlowerShop/MainForm.cs                |  6 ++--
 ProjectFlowerShop/Program.cs                 |  2 +-
 7 files changed, 13 insertions(+), 51 deletions(-)

diff --git a/ProjectFlowerShop/FormComponents.Designer.cs b/ProjectFlowerShop/FormComponents.Designer.cs
index e3fffa7..536794f 100644
--- a/ProjectFlowerShop/FormComponents.Designer.cs
+++ b/ProjectFlowerShop/FormComponents.Designer.cs
@@ -33,9 +33,6 @@
             buttonChange = new Button();
             buttonRemove = new Button();
             buttonReload = new Button();
-            Id = new DataGridViewTextBoxColumn();
-            Name = new DataGridViewTextBoxColumn();
-            Price = new DataGridViewTextBoxColumn();
             ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
             SuspendLayout();
             // 
@@ -43,7 +40,6 @@
             // 
             dataGridView.BackgroundColor = SystemColors.Control;
             dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-            dataGridView.Columns.AddRange(new DataGridViewColumn[] { Id, Name, Price });
             dataGridView.Location = new Point(1, 1);
             dataGridView.Name = "dataGridView";
             dataGridView.RowHeadersWidth = 51;
@@ -91,28 +87,6 @@
             buttonReload.UseVisualStyleBackColor = true;
             buttonReload.Click += buttonReload_Click;
             // 
-            // Id
-            // 
-            Id.HeaderText = "Id";
-            Id.MinimumWidth = 6;
-            Id.Name = "Id";
-            Id.Visible = false;
-            Id.Width = 200;
-            // 
-            // Name
-            // 
-            Name.HeaderText = "Name";
-            Name.MinimumWidth = 6;
-            Name.Name = "Name";
-            Name.Width = 380;
-            // 
-            // Price
-            // 
-            Price.HeaderText = "Price";
-            Price.MinimumWidth = 6;
-            Price.Name = "Price";
-            Price.Width = 125;
-            // 
             // FormComponents
             // 
             AutoScaleDimensions = new SizeF(8F, 20F);
@@ -123,7 +97,7 @@
             Controls.Add(buttonChange);
             Controls.Add(buttonAdd);
             Controls.Add(dataGridView);
-            //Name = "FormComponents";
+            Name = "FormComponents";
             Text = "Компоненты";
             Load += FormComponents_Load;
             ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
@@ -137,8 +111,5 @@
         private Button buttonChange;
         private Button buttonRemove;
         private Button buttonReload;
-        private DataGridViewTextBoxColumn Id;
-        private DataGridViewTextBoxColumn Name;
-        private DataGridViewTextBoxColumn Price;
     }
 }
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormComponents.resx b/ProjectFlowerShop/FormComponents.resx
index d1d25ab..af32865 100644
--- a/ProjectFlowerShop/FormComponents.resx
+++ b/ProjectFlowerShop/FormComponents.resx
@@ -117,13 +117,4 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="Id.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <metadata name="Name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <metadata name="Price.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
 </root>
\ No newline at end of file
diff --git a/ProjectFlowerShop/FormFlowers.Designer.cs b/ProjectFlowerShop/FormFlowers.Designer.cs
index 6d482c9..5d3d3e7 100644
--- a/ProjectFlowerShop/FormFlowers.Designer.cs
+++ b/ProjectFlowerShop/FormFlowers.Designer.cs
@@ -1,4 +1,4 @@
-namespace IceCreamShop
+namespace ProjectFlowerShop
 {
     partial class FormFlowers
     {
@@ -85,7 +85,7 @@
             RefreshButton.UseVisualStyleBackColor = true;
             RefreshButton.Click += RefreshButton_Click;
             // 
-            // IceCreamsForm
+            // FormFlowers
             // 
             AutoScaleDimensions = new SizeF(8F, 20F);
             AutoScaleMode = AutoScaleMode.Font;
@@ -95,8 +95,8 @@
             Controls.Add(UpdateButton);
             Controls.Add(AddButton);
             Controls.Add(DataGridView);
-            Name = "IceCreamsForm";
-            Text = "IceCreamsForm";
+            Name = "FormFlowers";
+            Text = "FlowersForm";
             Load += IceCreamsForm_Load;
             ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit();
             ResumeLayout(false);
diff --git a/ProjectFlowerShop/FormFlowers.cs b/ProjectFlowerShop/FormFlowers.cs
index 9fdcfd2..5d5b18c 100644
--- a/ProjectFlowerShop/FormFlowers.cs
+++ b/ProjectFlowerShop/FormFlowers.cs
@@ -12,7 +12,7 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
-namespace IceCreamShop
+namespace ProjectFlowerShop
 {
     public partial class FormFlowers : Form
     {
@@ -39,8 +39,8 @@ namespace IceCreamShop
                 {
                     DataGridView.DataSource = list;
                     DataGridView.Columns["Id"].Visible = false;
-                    DataGridView.Columns["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
-                    DataGridView.Columns["IceCreamComponents"].Visible = false;
+                    DataGridView.Columns["FlowerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+                    DataGridView.Columns["FlowerComponents"].Visible = false;
                 }
                 _logger.LogInformation("Загрузка цветов");
             }
diff --git a/ProjectFlowerShop/MainForm.Designer.cs b/ProjectFlowerShop/MainForm.Designer.cs
index d5dc8d4..56eb0e9 100644
--- a/ProjectFlowerShop/MainForm.Designer.cs
+++ b/ProjectFlowerShop/MainForm.Designer.cs
@@ -1,4 +1,4 @@
-namespace IceCreamShop
+namespace ProjectFlowerShop
 {
     partial class MainForm
     {
diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs
index 41f131a..5d70efb 100644
--- a/ProjectFlowerShop/MainForm.cs
+++ b/ProjectFlowerShop/MainForm.cs
@@ -14,7 +14,7 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
-namespace IceCreamShop
+namespace ProjectFlowerShop
 {
     public partial class MainForm : Form
     {
@@ -51,8 +51,8 @@ namespace IceCreamShop
                 if (list != null)
                 {
                     DataGridView.DataSource = list;
-                    DataGridView.Columns["IceCreamId"].Visible = false;
-                    DataGridView.Columns["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+                    DataGridView.Columns["FlowerId"].Visible = false;
+                    DataGridView.Columns["FlowerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                 }
                 _logger.LogInformation("Загрузка заказов");
             }
diff --git a/ProjectFlowerShop/Program.cs b/ProjectFlowerShop/Program.cs
index 0ba0c05..d423dcb 100644
--- a/ProjectFlowerShop/Program.cs
+++ b/ProjectFlowerShop/Program.cs
@@ -2,7 +2,7 @@ using FlowerShopBusinessLogic.BusinessLogic;
 using FlowerShopContracts.BusinessLogicsContracts;
 using FlowerShopContracts.StoragesContracts;
 using FlowerShopListImplement.Implements;
-using IceCreamShop;
+using ProjectFlowerShop;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
-- 
2.25.1


From 54eed0d5d7a6ba1557fbc5446e9f369f79045d91 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Tue, 27 Feb 2024 13:04:35 +0300
Subject: [PATCH 10/12] smena

---
 .../{FormProduct.Designer.cs => FormFlower.Designer.cs}   | 0
 ProjectFlowerShop/{FormProduct.cs => FormFlower.cs}       | 8 ++++----
 ProjectFlowerShop/{FormProduct.resx => FormFlower.resx}   | 0
 ...ponent.Designer.cs => FormFlowerComponent.Designer.cs} | 2 +-
 .../{FormProductComponent.cs => FormFlowerComponent.cs}   | 4 ++--
 ...FormProductComponent.resx => FormFlowerComponent.resx} | 0
 6 files changed, 7 insertions(+), 7 deletions(-)
 rename ProjectFlowerShop/{FormProduct.Designer.cs => FormFlower.Designer.cs} (100%)
 rename ProjectFlowerShop/{FormProduct.cs => FormFlower.cs} (97%)
 rename ProjectFlowerShop/{FormProduct.resx => FormFlower.resx} (100%)
 rename ProjectFlowerShop/{FormProductComponent.Designer.cs => FormFlowerComponent.Designer.cs} (99%)
 rename ProjectFlowerShop/{FormProductComponent.cs => FormFlowerComponent.cs} (95%)
 rename ProjectFlowerShop/{FormProductComponent.resx => FormFlowerComponent.resx} (100%)

diff --git a/ProjectFlowerShop/FormProduct.Designer.cs b/ProjectFlowerShop/FormFlower.Designer.cs
similarity index 100%
rename from ProjectFlowerShop/FormProduct.Designer.cs
rename to ProjectFlowerShop/FormFlower.Designer.cs
diff --git a/ProjectFlowerShop/FormProduct.cs b/ProjectFlowerShop/FormFlower.cs
similarity index 97%
rename from ProjectFlowerShop/FormProduct.cs
rename to ProjectFlowerShop/FormFlower.cs
index abc08d3..3350e4a 100644
--- a/ProjectFlowerShop/FormProduct.cs
+++ b/ProjectFlowerShop/FormFlower.cs
@@ -95,8 +95,8 @@ namespace ProjectFlowerShop
 
         private void buttonAdd_Click(object sender, EventArgs e)
         {
-            var service = Program.ServiceProvider?.GetService(typeof(FormProductComponent));
-            if (service is FormProductComponent form)
+            var service = Program.ServiceProvider?.GetService(typeof(FormFlowerComponent));
+            if (service is FormFlowerComponent form)
             {
                 if (form.ShowDialog() == DialogResult.OK)
                 {
@@ -124,8 +124,8 @@ namespace ProjectFlowerShop
             if (dataGridView.SelectedRows.Count == 1)
             {
                 var service =
-               Program.ServiceProvider?.GetService(typeof(FormProductComponent));
-                if (service is FormProductComponent form)
+               Program.ServiceProvider?.GetService(typeof(FormFlowerComponent));
+                if (service is FormFlowerComponent form)
                 {
                     int id =
                    Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value);
diff --git a/ProjectFlowerShop/FormProduct.resx b/ProjectFlowerShop/FormFlower.resx
similarity index 100%
rename from ProjectFlowerShop/FormProduct.resx
rename to ProjectFlowerShop/FormFlower.resx
diff --git a/ProjectFlowerShop/FormProductComponent.Designer.cs b/ProjectFlowerShop/FormFlowerComponent.Designer.cs
similarity index 99%
rename from ProjectFlowerShop/FormProductComponent.Designer.cs
rename to ProjectFlowerShop/FormFlowerComponent.Designer.cs
index 807a79e..8e3378b 100644
--- a/ProjectFlowerShop/FormProductComponent.Designer.cs
+++ b/ProjectFlowerShop/FormFlowerComponent.Designer.cs
@@ -1,6 +1,6 @@
 namespace ProjectFlowerShop
 {
-    partial class FormProductComponent
+    partial class FormFlowerComponent
     {
         /// <summary>
         /// Required designer variable.
diff --git a/ProjectFlowerShop/FormProductComponent.cs b/ProjectFlowerShop/FormFlowerComponent.cs
similarity index 95%
rename from ProjectFlowerShop/FormProductComponent.cs
rename to ProjectFlowerShop/FormFlowerComponent.cs
index cafef61..697ece2 100644
--- a/ProjectFlowerShop/FormProductComponent.cs
+++ b/ProjectFlowerShop/FormFlowerComponent.cs
@@ -13,7 +13,7 @@ using System.Windows.Forms;
 
 namespace ProjectFlowerShop
 {
-    public partial class FormProductComponent : Form
+    public partial class FormFlowerComponent : Form
     {
         private readonly List<ComponentViewModel>? _list;
         public int Id
@@ -52,7 +52,7 @@ namespace ProjectFlowerShop
             set
             { textBoxNumber.Text = value.ToString(); }
         }
-        public FormProductComponent(IComponentLogic logic)
+        public FormFlowerComponent(IComponentLogic logic)
         {
             InitializeComponent();
             _list = logic.ReadList(null);
diff --git a/ProjectFlowerShop/FormProductComponent.resx b/ProjectFlowerShop/FormFlowerComponent.resx
similarity index 100%
rename from ProjectFlowerShop/FormProductComponent.resx
rename to ProjectFlowerShop/FormFlowerComponent.resx
-- 
2.25.1


From 6e237994d4ae8ca80d787963cb93a674c1edb8c3 Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Wed, 28 Feb 2024 13:38:21 +0300
Subject: [PATCH 11/12] =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?=
 =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ProjectFlowerShop/FormFlower.Designer.cs | 2 +-
 ProjectFlowerShop/FormFlower.cs          | 4 ++--
 ProjectFlowerShop/FormFlowers.cs         | 8 ++++----
 ProjectFlowerShop/Program.cs             | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/ProjectFlowerShop/FormFlower.Designer.cs b/ProjectFlowerShop/FormFlower.Designer.cs
index 1d8f653..aa3790a 100644
--- a/ProjectFlowerShop/FormFlower.Designer.cs
+++ b/ProjectFlowerShop/FormFlower.Designer.cs
@@ -1,6 +1,6 @@
 namespace ProjectFlowerShop
 {
-    partial class FormProduct
+    partial class FormFlower
     {
         /// <summary>
         /// Required designer variable.
diff --git a/ProjectFlowerShop/FormFlower.cs b/ProjectFlowerShop/FormFlower.cs
index 3350e4a..40ad362 100644
--- a/ProjectFlowerShop/FormFlower.cs
+++ b/ProjectFlowerShop/FormFlower.cs
@@ -15,7 +15,7 @@ using System.Windows.Forms;
 
 namespace ProjectFlowerShop
 {
-    public partial class FormProduct : Form
+    public partial class FormFlower : Form
     {
         private readonly ILogger _logger;
         private readonly IFlowerLogic _logic;
@@ -23,7 +23,7 @@ namespace ProjectFlowerShop
         private Dictionary<int, (IComponentModel, int)> _flowerComponents;
         public int Id { set { _id = value; } }
 
-        public FormProduct(ILogger<FormProduct> logger, IFlowerLogic logic)
+        public FormFlower(ILogger<FormFlower> logger, IFlowerLogic logic)
         {
             InitializeComponent();
             _logger = logger;
diff --git a/ProjectFlowerShop/FormFlowers.cs b/ProjectFlowerShop/FormFlowers.cs
index 5d5b18c..49c1b87 100644
--- a/ProjectFlowerShop/FormFlowers.cs
+++ b/ProjectFlowerShop/FormFlowers.cs
@@ -53,8 +53,8 @@ namespace ProjectFlowerShop
 
         private void AddButton_Click(object sender, EventArgs e)
         {
-            var service = Program.ServiceProvider?.GetService(typeof(FormProduct));
-            if (service is FormProduct form)
+            var service = Program.ServiceProvider?.GetService(typeof(FormFlower));
+            if (service is FormFlower form)
             {
                 if (form.ShowDialog() == DialogResult.OK)
                 {
@@ -67,8 +67,8 @@ namespace ProjectFlowerShop
         {
             if (DataGridView.SelectedRows.Count == 1)
             {
-                var service = Program.ServiceProvider?.GetService(typeof(FormProduct));
-                if (service is FormProduct form)
+                var service = Program.ServiceProvider?.GetService(typeof(FormFlower));
+                if (service is FormFlower form)
                 {
                     var tmp = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
                     form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value);
diff --git a/ProjectFlowerShop/Program.cs b/ProjectFlowerShop/Program.cs
index d423dcb..a26c173 100644
--- a/ProjectFlowerShop/Program.cs
+++ b/ProjectFlowerShop/Program.cs
@@ -44,8 +44,8 @@ namespace ProjectFlowerShop
             services.AddTransient<ComponentForm>();
             services.AddTransient<FormComponents>();
             services.AddTransient<FormCreateOrder>();
-            services.AddTransient<FormProduct>();
-            services.AddTransient<FormProductComponent>();
+            services.AddTransient<FormFlower>();
+            services.AddTransient<FormFlowerComponent>();
             services.AddTransient<FormFlowers>();
         }
 
-- 
2.25.1


From 5e8132f8dde91a8fcb6347fc7df119357ef7c2cc Mon Sep 17 00:00:00 2001
From: antoc0der <1@DESKTOP-K1L8ND3>
Date: Wed, 28 Feb 2024 14:46:45 +0300
Subject: [PATCH 12/12] y

---
 ProjectFlowerShop/MainForm.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs
index 5d70efb..13fab38 100644
--- a/ProjectFlowerShop/MainForm.cs
+++ b/ProjectFlowerShop/MainForm.cs
@@ -87,7 +87,7 @@ namespace ProjectFlowerShop
             return new OrderBindingModel
             {
                 Id = id,
-                FlowerId = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["IceCreamId"].Value),
+                FlowerId = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["FlowerId"].Value),
                 Status = Enum.Parse<OrderStatus>(DataGridView.SelectedRows[0].Cells["Status"].Value.ToString()),
                 Count = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Count"].Value),
                 Sum = double.Parse(DataGridView.SelectedRows[0].Cells["Sum"].Value.ToString()),
-- 
2.25.1