From 38a41d73356870c0fcb854e2ac95904df1895a7e Mon Sep 17 00:00:00 2001
From: artiogf <artemon152001@mail.ru>
Date: Wed, 8 Mar 2023 19:56:35 +0400
Subject: [PATCH 1/3] Lab2_Main

---
 CarpentryWorkshop.sln                         |  8 +-
 .../CarpentryWorkshopFileImplement.csproj     | 14 +++
 .../DataFileSingleton.cs                      | 49 ++++++++++
 .../Implements/ComponentStorage.cs            | 83 ++++++++++++++++
 .../Implements/OrderStorage.cs                | 83 ++++++++++++++++
 .../Implements/WoodStorage.cs                 | 83 ++++++++++++++++
 .../Models/Component.cs                       | 66 +++++++++++++
 .../Models/Order.cs                           | 98 +++++++++++++++++++
 CarpentryWorkshopFileImplement/Models/Wood.cs | 87 ++++++++++++++++
 .../CarpentryWorkshopView.csproj              |  1 +
 CarpentryWorkshopView/Program.cs              |  2 +-
 11 files changed, 572 insertions(+), 2 deletions(-)
 create mode 100644 CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj
 create mode 100644 CarpentryWorkshopFileImplement/DataFileSingleton.cs
 create mode 100644 CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs
 create mode 100644 CarpentryWorkshopFileImplement/Implements/OrderStorage.cs
 create mode 100644 CarpentryWorkshopFileImplement/Implements/WoodStorage.cs
 create mode 100644 CarpentryWorkshopFileImplement/Models/Component.cs
 create mode 100644 CarpentryWorkshopFileImplement/Models/Order.cs
 create mode 100644 CarpentryWorkshopFileImplement/Models/Wood.cs

diff --git a/CarpentryWorkshop.sln b/CarpentryWorkshop.sln
index ec09714..012b628 100644
--- a/CarpentryWorkshop.sln
+++ b/CarpentryWorkshop.sln
@@ -11,7 +11,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopBusinessLo
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopListImplement", "CarpentryWorkshopListImplement\CarpentryWorkshopListImplement.csproj", "{F5B22BD8-C1C4-498F-B6E7-4A6DB2877FE4}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopView", "CarpentryWorkshopView\CarpentryWorkshopView.csproj", "{0C21C81F-7962-4E95-8596-D47C47F03048}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopView", "CarpentryWorkshopView\CarpentryWorkshopView.csproj", "{0C21C81F-7962-4E95-8596-D47C47F03048}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopFileImplement", "CarpentryWorkshopFileImplement\CarpentryWorkshopFileImplement.csproj", "{3CDDDE24-2C40-4773-A674-63473B5E58B3}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -39,6 +41,10 @@ Global
 		{0C21C81F-7962-4E95-8596-D47C47F03048}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0C21C81F-7962-4E95-8596-D47C47F03048}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0C21C81F-7962-4E95-8596-D47C47F03048}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3CDDDE24-2C40-4773-A674-63473B5E58B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3CDDDE24-2C40-4773-A674-63473B5E58B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3CDDDE24-2C40-4773-A674-63473B5E58B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3CDDDE24-2C40-4773-A674-63473B5E58B3}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj b/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj
new file mode 100644
index 0000000..f7e2631
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.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="..\CarpentryWorkshopContracts\CarpentryWorkshopContracts.csproj" />
+    <ProjectReference Include="..\CarpentryWorkshopDataModels\CarpentryWorkshopDataModels.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/CarpentryWorkshopFileImplement/DataFileSingleton.cs b/CarpentryWorkshopFileImplement/DataFileSingleton.cs
new file mode 100644
index 0000000..7b190ee
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/DataFileSingleton.cs
@@ -0,0 +1,49 @@
+using CarpentryWorkshopFileImplement.Models;
+using System.Xml.Linq;
+
+namespace CarpentryWorkshopFileImplement
+{
+    public class DataFileSingleton
+    {
+        private static DataFileSingleton? instance;
+        private readonly string ComponentFileName = "Component.xml";
+        private readonly string OrderFileName = "Order.xml";
+        private readonly string WoodFileName = "Wood.xml";
+        public List<Component> Components { get; private set; }
+        public List<Order> Orders { get; private set; }
+        public List<Wood> Woods { get; private set; }
+        public static DataFileSingleton GetInstance()
+        {
+            if (instance == null)
+            {
+                instance = new DataFileSingleton();
+            }
+            return instance;
+        }
+        public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement);
+        public void SaveWoods() => SaveData(Woods, WoodFileName, "Woods", x => x.GetXElement);
+        public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
+        private DataFileSingleton()
+        {
+            Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
+            Woods = LoadData(WoodFileName, "Wood", x => Wood.Create(x)!)!;
+            Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
+        }
+        private static List<T>? LoadData<T>(string filename, string xmlNodeName, Func<XElement, T> selectFunction)
+        {
+            if (File.Exists(filename))
+            {
+                return XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList();
+            }
+            return new List<T>();
+        }
+        private static void SaveData<T>(List<T> data, string filename, string xmlNodeName, Func<T, XElement> selectFunction)
+        {
+            if (data != null)
+            {
+                new XDocument(new XElement(xmlNodeName, data.Select(selectFunction).ToArray())).Save(filename);
+            }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs b/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs
new file mode 100644
index 0000000..4324c6b
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs
@@ -0,0 +1,83 @@
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.SearchModels;
+using CarpentryWorkshopContracts.StoragesContracts;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopFileImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CarpentryWorkshopFileImplement.Implements
+{
+    public class ComponentStorage : IComponentStorage
+    {
+        private readonly DataFileSingleton source;
+        public ComponentStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+        public List<ComponentViewModel> GetFullList()
+        {
+            return source.Components
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public List<ComponentViewModel> GetFilteredList(ComponentSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.ComponentName))
+            {
+                return new();
+            }
+            return source.Components
+            .Where(x => x.ComponentName.Contains(model.ComponentName))
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public ComponentViewModel? GetElement(ComponentSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue)
+            {
+                return null;
+            }
+            return source.Components
+            .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) ||
+            (model.Id.HasValue && x.Id == model.Id))
+            ?.GetViewModel;
+        }
+        public ComponentViewModel? Insert(ComponentBindingModel model)
+        {
+            model.Id = source.Components.Count > 0 ? source.Components.Max(x => x.Id) + 1 : 1;
+            var newComponent = Component.Create(model); if (newComponent == null)
+            {
+                return null;
+            }
+            source.Components.Add(newComponent);
+            source.SaveComponents();
+            return newComponent.GetViewModel;
+        }
+        public ComponentViewModel? Update(ComponentBindingModel model)
+        {
+            var component = source.Components.FirstOrDefault(x => x.Id == model.Id);
+            if (component == null)
+            {
+                return null;
+            }
+            component.Update(model);
+            source.SaveComponents();
+            return component.GetViewModel;
+        }
+        public ComponentViewModel? Delete(ComponentBindingModel model)
+        {
+            var element = source.Components.FirstOrDefault(x => x.Id == model.Id);
+            if (element != null)
+            {
+                source.Components.Remove(element);
+                source.SaveComponents();
+                return element.GetViewModel;
+            }
+            return null;
+        }
+    }
+}
diff --git a/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs b/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs
new file mode 100644
index 0000000..39f7ba2
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs
@@ -0,0 +1,83 @@
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.SearchModels;
+using CarpentryWorkshopContracts.StoragesContracts;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopFileImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CarpentryWorkshopFileImplement.Implements
+{
+    public class OrderStorage : IOrderStorage
+    {
+        private readonly DataFileSingleton source;
+        public OrderStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+        public List<OrderViewModel> GetFullList()
+        {
+            return source.Orders
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
+        {
+            if (model.Id == null)
+            {
+                return new();
+            }
+            return source.Orders
+            .Where(x => x.Id == model.Id)
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public OrderViewModel? GetElement(OrderSearchModel model)
+        {
+            if (model.Id == null && !model.Id.HasValue)
+            {
+                return null;
+            }
+            return source.Orders
+            .FirstOrDefault(x => (model.Id != null && x.Id == model.Id) ||
+            (model.Id.HasValue && x.Id == model.Id))
+            ?.GetViewModel;
+        }
+        public OrderViewModel? Insert(OrderBindingModel model)
+        {
+            model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1;
+            var newOrder = Order.Create(model); if (newOrder == null)
+            {
+                return null;
+            }
+            source.Orders.Add(newOrder);
+            source.SaveOrders();
+            return newOrder.GetViewModel;
+        }
+        public OrderViewModel? Update(OrderBindingModel model)
+        {
+            var order = source.Orders.FirstOrDefault(x => x.Id == model.Id);
+            if (order == null)
+            {
+                return null;
+            }
+            order.Update(model);
+            source.SaveOrders();
+            return order.GetViewModel;
+        }
+        public OrderViewModel? Delete(OrderBindingModel model)
+        {
+            var element = source.Orders.FirstOrDefault(x => x.Id == model.Id);
+            if (element != null)
+            {
+                source.Orders.Remove(element);
+                source.SaveOrders();
+                return element.GetViewModel;
+            }
+            return null;
+        }
+    }
+}
diff --git a/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs b/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs
new file mode 100644
index 0000000..6964861
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs
@@ -0,0 +1,83 @@
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.SearchModels;
+using CarpentryWorkshopContracts.StoragesContracts;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopFileImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CarpentryWorkshopFileImplement.Implements
+{
+    public class WoodStorage : IWoodStorage
+    {
+        private readonly DataFileSingleton source;
+        public WoodStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+        public List<WoodViewModel> GetFullList()
+        {
+            return source.Woods
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public List<WoodViewModel> GetFilteredList(WoodSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.WoodName))
+            {
+                return new();
+            }
+            return source.Woods
+            .Where(x => x.WoodName.Contains(model.WoodName))
+            .Select(x => x.GetViewModel)
+            .ToList();
+        }
+        public WoodViewModel? GetElement(WoodSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.WoodName) && !model.Id.HasValue)
+            {
+                return null;
+            }
+            return source.Woods
+            .FirstOrDefault(x => (!string.IsNullOrEmpty(model.WoodName) && x.WoodName == model.WoodName) ||
+            (model.Id.HasValue && x.Id == model.Id))
+            ?.GetViewModel;
+        }
+        public WoodViewModel? Insert(WoodBindingModel model)
+        {
+            model.Id = source.Woods.Count > 0 ? source.Components.Max(x => x.Id) + 1 : 1;
+            var newWood = Wood.Create(model); if (newWood == null)
+            {
+                return null;
+            }
+            source.Woods.Add(newWood);
+            source.SaveWoods();
+            return newWood.GetViewModel;
+        }
+        public WoodViewModel? Update(WoodBindingModel model)
+        {
+            var wood = source.Woods.FirstOrDefault(x => x.Id == model.Id);
+            if (wood == null)
+            {
+                return null;
+            }
+            wood.Update(model);
+            source.SaveWoods();
+            return wood.GetViewModel;
+        }
+        public WoodViewModel? Delete(WoodBindingModel model)
+        {
+            var element = source.Woods.FirstOrDefault(x => x.Id == model.Id);
+            if (element != null)
+            {
+                source.Woods.Remove(element);
+                source.SaveWoods();
+                return element.GetViewModel;
+            }
+            return null;
+        }
+    }
+}
diff --git a/CarpentryWorkshopFileImplement/Models/Component.cs b/CarpentryWorkshopFileImplement/Models/Component.cs
new file mode 100644
index 0000000..5fa39c1
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Models/Component.cs
@@ -0,0 +1,66 @@
+
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace CarpentryWorkshopFileImplement.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 static Component? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new Component()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                ComponentName = element.Element("ComponentName")!.Value,
+                Cost = Convert.ToDouble(element.Element("Cost")!.Value)
+            };
+        }
+        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
+        };
+        public XElement GetXElement => new("Component",
+        new XAttribute("Id", Id),
+        new XElement("ComponentName", ComponentName),
+        new XElement("Cost", Cost.ToString()));
+    }
+}
+
diff --git a/CarpentryWorkshopFileImplement/Models/Order.cs b/CarpentryWorkshopFileImplement/Models/Order.cs
new file mode 100644
index 0000000..1d03e65
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Models/Order.cs
@@ -0,0 +1,98 @@
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopDataModels.Enums;
+using CarpentryWorkshopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace CarpentryWorkshopFileImplement.Models
+{
+    public class Order : IOrderModel
+    {
+        public int Id { get; set; }
+        public int WoodId { get; set; }
+        public string WoodName { get; set; } = string.Empty;
+        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; }
+        public static Order? Create(OrderBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Order()
+            {
+                Id = model.Id,
+                WoodId = model.WoodId,
+                WoodName = model.WoodName,
+                Count = model.Count,
+                Sum = model.Sum,
+                Status = model.Status,
+                DateCreate = model.DateCreate,
+                DateImplement = model.DateImplement
+            };
+        }
+        public static Order? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new Order()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                WoodId = Convert.ToInt32(element.Element("WoodId")!.Value),
+                WoodName = element.Element("WoodName")!.Value,
+                Count = Convert.ToInt32(element.Element("Count")!.Value),
+                Sum = Convert.ToDouble(element.Element("Sum")!.Value),
+                Status = (OrderStatus)Convert.ToInt32(element.Element("Status").Value),
+                DateCreate = Convert.ToDateTime(element.Element("DateCreate").Value),
+                DateImplement = String.IsNullOrEmpty(element.Element("DateImplement").Value) ? DateTime.MinValue : Convert.ToDateTime(element.Element("DateImplement").Value)
+                
+            };
+        }
+        public void Update(OrderBindingModel model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            Id = model.Id;
+            WoodId = model.WoodId;
+            WoodName = model.WoodName;
+            Count = model.Count;
+            Sum = model.Sum;
+            Status = model.Status;
+            DateCreate = model.DateCreate;
+            DateImplement = model.DateImplement;
+        }
+        public OrderViewModel GetViewModel => new()
+        {
+            Id = Id,
+            WoodId = WoodId,
+            WoodName = WoodName,
+            Count = Count,
+            Sum = Sum,
+            Status = Status,
+            DateCreate = DateCreate,
+            DateImplement = DateImplement,
+        };
+        public XElement GetXElement => new("Order",
+        new XAttribute("Id", Id),
+        new XElement("WoodId", WoodId),
+        new XElement("WoodName", WoodName),
+        new XElement("Count", Count),
+        new XElement("Sum", Sum.ToString()),
+        new XElement("Status", (int)Status),
+        new XElement("DateCreate", DateCreate),
+        new XElement("DateImplement", DateImplement));
+    }
+}
diff --git a/CarpentryWorkshopFileImplement/Models/Wood.cs b/CarpentryWorkshopFileImplement/Models/Wood.cs
new file mode 100644
index 0000000..1fe898c
--- /dev/null
+++ b/CarpentryWorkshopFileImplement/Models/Wood.cs
@@ -0,0 +1,87 @@
+using CarpentryWorkshopContracts.BindingModels;
+using CarpentryWorkshopContracts.ViewModels;
+using CarpentryWorkshopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace CarpentryWorkshopFileImplement.Models
+{
+    public class Wood : IWoodModel
+    {
+        public int Id { get; private set; }
+        public string WoodName { get; private set; } = string.Empty;
+        public double Price { get; private set; }
+        public Dictionary<int, int> Components { get; private set; } = new();
+        private Dictionary<int, (IComponentModel, int)>? _woodComponents = null;
+        public Dictionary<int, (IComponentModel, int)> WoodComponents
+        {
+            get
+            {
+                if (_woodComponents == null)
+                {
+                    var source = DataFileSingleton.GetInstance();
+                    _woodComponents = Components.ToDictionary(x => x.Key, y => ((source.Components.FirstOrDefault(z => z.Id == y.Key) as IComponentModel)!, y.Value));
+                }
+                return _woodComponents;
+            }
+        }
+        public static Wood? Create(WoodBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Wood()
+            {
+                Id = model.Id,
+                WoodName = model.WoodName,
+                Price = model.Price,
+                Components = model.WoodComponents.ToDictionary(x => x.Key, x => x.Value.Item2)
+            };
+        }
+        public static Wood? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new Wood()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                WoodName = element.Element("WoodName")!.Value,
+                Price = Convert.ToDouble(element.Element("Price")!.Value),
+                Components = element.Element("WoodComponents")!.Elements("WoodComponent").ToDictionary(x => Convert.ToInt32(x.Element("Key")?.Value), x => Convert.ToInt32(x.Element("Value")?.Value))
+            };
+        }
+        public void Update(WoodBindingModel model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            WoodName = model.WoodName;
+            Price = model.Price;
+            Components = model.WoodComponents.ToDictionary(x => x.Key, x => x.Value.Item2);
+            _woodComponents = null;
+        }
+        public WoodViewModel GetViewModel => new()
+        {
+            Id = Id,
+            WoodName = WoodName,
+            Price = Price,
+            WoodComponents = WoodComponents
+        };
+        public XElement GetXElement => new("Wood",
+        new XAttribute("Id", Id),
+        new XElement("WoodName", WoodName),
+        new XElement("Price", Price.ToString()),
+        new XElement("WoodComponents", Components.Select(x => new XElement("WoodComponent",
+        new XElement("Key", x.Key),
+        new XElement("Value", x.Value)))
+        .ToArray()));
+    }
+}
diff --git a/CarpentryWorkshopView/CarpentryWorkshopView.csproj b/CarpentryWorkshopView/CarpentryWorkshopView.csproj
index 7aa773d..d0d744a 100644
--- a/CarpentryWorkshopView/CarpentryWorkshopView.csproj
+++ b/CarpentryWorkshopView/CarpentryWorkshopView.csproj
@@ -19,6 +19,7 @@
     <ProjectReference Include="..\CarpentryWorkshopBusinessLogic\CarpentryWorkshopBusinessLogic.csproj" />
     <ProjectReference Include="..\CarpentryWorkshopContracts\CarpentryWorkshopContracts.csproj" />
     <ProjectReference Include="..\CarpentryWorkshopDataModels\CarpentryWorkshopDataModels.csproj" />
+    <ProjectReference Include="..\CarpentryWorkshopFileImplement\CarpentryWorkshopFileImplement.csproj" />
     <ProjectReference Include="..\CarpentryWorkshopListImplement\CarpentryWorkshopListImplement.csproj" />
   </ItemGroup>
 
diff --git a/CarpentryWorkshopView/Program.cs b/CarpentryWorkshopView/Program.cs
index efb4377..e33e82b 100644
--- a/CarpentryWorkshopView/Program.cs
+++ b/CarpentryWorkshopView/Program.cs
@@ -1,7 +1,7 @@
 using CarpentryWorkshopBusinessLogic.BusinessLogics;
 using CarpentryWorkshopContracts.BusinessLogicsContracts;
 using CarpentryWorkshopContracts.StoragesContracts;
-using CarpentryWorkshopListImplement.Implements;
+using CarpentryWorkshopFileImplement.Implements;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
-- 
2.25.1


From 51e32cc9f96169697fa059803aa88f7524cddb45 Mon Sep 17 00:00:00 2001
From: artiogf <artemon152001@mail.ru>
Date: Tue, 2 May 2023 21:54:16 +0400
Subject: [PATCH 2/3] Lab2_Main_Fix

---
 .../BusinessLogics/OrderLogic.cs              | 220 +++++++++---------
 .../BusinessLogics/WoodLogic.cs               |   6 +-
 CarpentryWorkshopBusinessLogic/Class1.cs      |   7 -
 .../BusinessLogicsContracts/IOrderLogic.cs    |   1 -
 CarpentryWorkshopContracts/Class1.cs          |   7 -
 .../SearchModels/ComponentSearchModel.cs      |   1 -
 .../SearchModels/WoodSearchModel.cs           |   1 -
 .../ViewModels/ComponentViewModel.cs          |   1 -
 .../CarpentryWorkshopDataModels.csproj        |   3 +
 .../Models/IOrderModel.cs                     |   6 +-
 .../Models/Order.cs                           |  23 +-
 .../Models/Order.cs                           |  16 +-
 .../CarpentryWorkshopView.csproj              |   1 -
 .../FormComponent.Designer.cs                 |   2 +-
 14 files changed, 129 insertions(+), 166 deletions(-)
 delete mode 100644 CarpentryWorkshopBusinessLogic/Class1.cs
 delete mode 100644 CarpentryWorkshopContracts/Class1.cs

diff --git a/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs b/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
index 07795aa..1b9cfd8 100644
--- a/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
+++ b/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -15,127 +15,117 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics
 {
     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)
-        {
-            _orderStorage.Insert(new OrderBindingModel
-            {
-                WoodId = model.WoodId,
-                WoodName = model.WoodName,
-                Count = model.Count,
-                Sum = model.Sum,
-                Status = OrderStatus.Принят,
-                DateCreate = DateTime.Now
-            }); ;
-            return true;
-        }
-        public bool TakeOrderInWork(OrderBindingModel model)
-        {
-            var order = _orderStorage.GetElement(new OrderSearchModel
-            {
-                Id = model.Id
-            });
-            if (order == null)
-            {
-                throw new Exception("Элемент не найден");
-            }
-            if (order.Status.ToString() != "Принят")
-            {
-                throw new Exception("Заказ не в статусе \"Принят\"");
-            }
-            _orderStorage.Update(new OrderBindingModel
-            {
-                Id = order.Id,
-                WoodId = order.WoodId,
-                WoodName = order.WoodName,
-                Count = order.Count,
-                Sum = order.Sum,
-                DateCreate = order.DateCreate,
-                
-                Status = OrderStatus.Выполняется
-            });
-            return true;
-        }
-        public bool FinishOrder(OrderBindingModel model)
-        {
-            var order = _orderStorage.GetElement(new OrderSearchModel
-            {
-                Id = model.Id
-            });
-            if (order == null)
-            {
-                throw new Exception("Не найден заказ");
-            }
-            if (order.Status.ToString() != "Выполняется")
-            {
-                throw new Exception("Заказ не в статусе \"Выполняется\"");
-            }
-            _orderStorage.Update(new OrderBindingModel
-            {
-                Id = order.Id,
-                WoodId = order.WoodId,
-                WoodName = order.WoodName,
-                Count = order.Count,
-                Sum = order.Sum,
-                DateCreate = order.DateCreate,
-                DateImplement = DateTime.Now,
-                Status = OrderStatus.Готов
-            });
-            return true;
-        }
-        public bool DeliveryOrder(OrderBindingModel model)
-        {
-            var order = _orderStorage.GetElement(new OrderSearchModel
-            {
-                Id = model.Id
-            });
-            if (order == null)
-            {
-                throw new Exception("Не найден заказ");
-            }
+		private readonly ILogger _logger;
+		private readonly IOrderStorage _orderStorage;
 
-            if (order.Status.ToString() != "Готов")
-            {
-                throw new Exception("Заказ не в статусе \"Готов\"");
-            }
+		public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage)
+		{
+			_logger = logger;
+			_orderStorage = orderStorage;
+		}
 
-            _orderStorage.Update(new OrderBindingModel
-            {
-                Id = order.Id,
-                WoodId = order.WoodId,
-                WoodName = order.WoodName,
-                Count = order.Count,
-                Sum = order.Sum,
-                DateCreate = order.DateCreate,
-                DateImplement = order.DateImplement,
-                Status = OrderStatus.Выдан
-            });
-            return true;
+		public bool CreateOrder(OrderBindingModel model)
+		{
+			CheckModel(model);
 
-        }
+			if (model.Status != OrderStatus.Неизвестен)
+			{
+				_logger.LogWarning("Insert operation failed. Order status incorrect.");
+				return false;
+			}
 
+			model.Status = OrderStatus.Принят;
 
+			if (_orderStorage.Insert(model) == null)
+			{
+				model.Status = OrderStatus.Неизвестен;
+				_logger.LogWarning("Insert operation failed");
+				return false;
+			}
 
+			return true;
+		}
 
-      
+		public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus)
+		{
+			CheckModel(model);
 
-    }
+			if (model.Status + 1 != newStatus)
+			{
+				_logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order status incorrect.");
+				return false;
+			}
+
+			model.Status = newStatus;
+
+			if (model.Status == OrderStatus.Выдан)
+				model.DateImplement = DateTime.Now;
+
+			if (_orderStorage.Update(model) == null)
+			{
+				model.Status--;
+				_logger.LogWarning("Update operation failed");
+				return false;
+			}
+
+			return true;
+		}
+		public bool TakeOrderInWork(OrderBindingModel model)
+		{
+			return StatusUpdate(model, OrderStatus.Выполняется);
+		}
+		public bool DeliveryOrder(OrderBindingModel model)
+		{
+			return StatusUpdate(model, OrderStatus.Готов);
+		}
+
+		public bool FinishOrder(OrderBindingModel model)
+		{
+			return StatusUpdate(model, OrderStatus.Выдан);
+		}
+		public List<OrderViewModel>? ReadList(OrderSearchModel? model)
+		{
+			_logger.LogInformation("Order. OrderId:{Id}", model?.Id);
+
+			var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model);
+
+			if (list == null)
+			{
+				_logger.LogWarning("ReadList return null list");
+				return null;
+			}
+
+			_logger.LogInformation("ReadList. Count:{Count}", list.Count);
+			return list;
+		}
+		private void CheckModel(OrderBindingModel model, bool withParams = true)
+		{
+			if (model == null)
+			{
+				throw new ArgumentNullException(nameof(model));
+			}
+
+			if (!withParams)
+			{
+				return;
+			}
+
+			if (model.WoodId < 0)
+			{
+				throw new ArgumentNullException("Некорректный идентификатор изделия", nameof(model.WoodId));
+			}
+
+			if (model.Count <= 0)
+			{
+				throw new ArgumentNullException("Количество изделий в заказе должно быть больше 0", nameof(model.Count));
+			}
+
+			if (model.Sum <= 0)
+			{
+				throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum));
+			}
+
+			_logger.LogInformation("Order. OrderId:{Id}.Sum:{ Sum}. WoodId: { WoodId}", model.Id, model.Sum, model.WoodId);
+		}
+	}
 }
diff --git a/CarpentryWorkshopBusinessLogic/BusinessLogics/WoodLogic.cs b/CarpentryWorkshopBusinessLogic/BusinessLogics/WoodLogic.cs
index dc5b8bd..e78c8ea 100644
--- a/CarpentryWorkshopBusinessLogic/BusinessLogics/WoodLogic.cs
+++ b/CarpentryWorkshopBusinessLogic/BusinessLogics/WoodLogic.cs
@@ -88,11 +88,11 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics
             }
             if (string.IsNullOrEmpty(model.WoodName))
             {
-                throw new ArgumentNullException("Нет названия компонента", nameof(model.WoodName));
+                throw new ArgumentNullException("Нет названия изделия", nameof(model.WoodName));
             }
             if (model.Price <= 0)
             {
-                throw new ArgumentNullException("Цена компонента должна быть больше 0", nameof(model.Price));
+                throw new ArgumentNullException("Цена изделия должна быть больше 0", nameof(model.Price));
             }
             _logger.LogInformation("Wood. WoodName:{WoodName}. Cost:{ Cost}. Id: { Id}", model.WoodName, model.Price, model.Id);
             var element = _woodStorage.GetElement(new WoodSearchModel
@@ -101,7 +101,7 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics
             });
             if (element != null && element.Id != model.Id)
             {
-                throw new InvalidOperationException("Компонент с таким названием уже есть");
+                throw new InvalidOperationException("Изделие с таким названием уже есть");
             }
         }
     }
diff --git a/CarpentryWorkshopBusinessLogic/Class1.cs b/CarpentryWorkshopBusinessLogic/Class1.cs
deleted file mode 100644
index 41846ac..0000000
--- a/CarpentryWorkshopBusinessLogic/Class1.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace CarpentryWorkshopBusinessLogic
-{
-    public class Class1
-    {
-
-    }
-}
\ No newline at end of file
diff --git a/CarpentryWorkshopContracts/BusinessLogicsContracts/IOrderLogic.cs b/CarpentryWorkshopContracts/BusinessLogicsContracts/IOrderLogic.cs
index 99635fc..8ce823b 100644
--- a/CarpentryWorkshopContracts/BusinessLogicsContracts/IOrderLogic.cs
+++ b/CarpentryWorkshopContracts/BusinessLogicsContracts/IOrderLogic.cs
@@ -16,6 +16,5 @@ namespace CarpentryWorkshopContracts.BusinessLogicsContracts
         bool TakeOrderInWork(OrderBindingModel model);
         bool FinishOrder(OrderBindingModel model);
         bool DeliveryOrder(OrderBindingModel model);
-
     }
 }
diff --git a/CarpentryWorkshopContracts/Class1.cs b/CarpentryWorkshopContracts/Class1.cs
deleted file mode 100644
index 26e1951..0000000
--- a/CarpentryWorkshopContracts/Class1.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace CarpentryWorkshopContracts
-{
-    public class Class1
-    {
-
-    }
-}
\ No newline at end of file
diff --git a/CarpentryWorkshopContracts/SearchModels/ComponentSearchModel.cs b/CarpentryWorkshopContracts/SearchModels/ComponentSearchModel.cs
index d584872..d9e1fe0 100644
--- a/CarpentryWorkshopContracts/SearchModels/ComponentSearchModel.cs
+++ b/CarpentryWorkshopContracts/SearchModels/ComponentSearchModel.cs
@@ -11,5 +11,4 @@ namespace CarpentryWorkshopContracts.SearchModels
         public int? Id { get; set; }
         public string? ComponentName { get; set; }
     }
-
 }
diff --git a/CarpentryWorkshopContracts/SearchModels/WoodSearchModel.cs b/CarpentryWorkshopContracts/SearchModels/WoodSearchModel.cs
index b5ac7bd..e1a1a65 100644
--- a/CarpentryWorkshopContracts/SearchModels/WoodSearchModel.cs
+++ b/CarpentryWorkshopContracts/SearchModels/WoodSearchModel.cs
@@ -11,5 +11,4 @@ namespace CarpentryWorkshopContracts.SearchModels
         public int? Id { get; set; }
         public string? WoodName { get; set; }
     }
-
 }
diff --git a/CarpentryWorkshopContracts/ViewModels/ComponentViewModel.cs b/CarpentryWorkshopContracts/ViewModels/ComponentViewModel.cs
index 0c17489..31f15c0 100644
--- a/CarpentryWorkshopContracts/ViewModels/ComponentViewModel.cs
+++ b/CarpentryWorkshopContracts/ViewModels/ComponentViewModel.cs
@@ -16,5 +16,4 @@ namespace CarpentryWorkshopContracts.ViewModels
         [DisplayName("Цена")]
         public double Cost { get; set; }
     }
-
 }
diff --git a/CarpentryWorkshopDataModels/CarpentryWorkshopDataModels.csproj b/CarpentryWorkshopDataModels/CarpentryWorkshopDataModels.csproj
index 132c02c..7fa6a8d 100644
--- a/CarpentryWorkshopDataModels/CarpentryWorkshopDataModels.csproj
+++ b/CarpentryWorkshopDataModels/CarpentryWorkshopDataModels.csproj
@@ -6,4 +6,7 @@
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
+  <ItemGroup>
+  </ItemGroup>
+
 </Project>
diff --git a/CarpentryWorkshopDataModels/Models/IOrderModel.cs b/CarpentryWorkshopDataModels/Models/IOrderModel.cs
index 7276b02..3b691f6 100644
--- a/CarpentryWorkshopDataModels/Models/IOrderModel.cs
+++ b/CarpentryWorkshopDataModels/Models/IOrderModel.cs
@@ -10,11 +10,7 @@ namespace CarpentryWorkshopDataModels.Models
     public interface IOrderModel : IId
     {
         int WoodId { get; }
-        string WoodName
-        {
-            get;
-        }
-
+        string WoodName { get; }
         int Count { get; }
         double Sum { get; }
         OrderStatus Status { get; }
diff --git a/CarpentryWorkshopFileImplement/Models/Order.cs b/CarpentryWorkshopFileImplement/Models/Order.cs
index 1d03e65..a3625ba 100644
--- a/CarpentryWorkshopFileImplement/Models/Order.cs
+++ b/CarpentryWorkshopFileImplement/Models/Order.cs
@@ -14,14 +14,14 @@ namespace CarpentryWorkshopFileImplement.Models
 {
     public class Order : IOrderModel
     {
-        public int Id { get; set; }
-        public int WoodId { get; set; }
-        public string WoodName { get; set; } = string.Empty;
-        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; }
+        public int Id { get; private set; }
+        public int WoodId { get; private set; }
+        public string WoodName { get; private set; }
+        public int Count { get; private set; }
+        public double Sum { get; private set; }
+        public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен;
+        public DateTime DateCreate { get; private set; } = DateTime.Now;
+        public DateTime? DateImplement { get; private set; }
         public static Order? Create(OrderBindingModel model)
         {
             if (model == null)
@@ -65,14 +65,7 @@ namespace CarpentryWorkshopFileImplement.Models
             {
                 return;
             }
-            Id = model.Id;
-            WoodId = model.WoodId;
-            WoodName = model.WoodName;
-            Count = model.Count;
-            Sum = model.Sum;
             Status = model.Status;
-            DateCreate = model.DateCreate;
-            DateImplement = model.DateImplement;
         }
         public OrderViewModel GetViewModel => new()
         {
diff --git a/CarpentryWorkshopListImplement/Models/Order.cs b/CarpentryWorkshopListImplement/Models/Order.cs
index f48279e..df34b1a 100644
--- a/CarpentryWorkshopListImplement/Models/Order.cs
+++ b/CarpentryWorkshopListImplement/Models/Order.cs
@@ -13,14 +13,14 @@ namespace CarpentryWorkshopListImplement.Models
 {
     public class Order : IOrderModel
     {
-        public int Id { get; set; }
-        public int WoodId { get; set; }
-        public string WoodName { get; set; } = string.Empty;
-        public int Count { get; set; }
-        public double Sum { get; set; }
-        public OrderStatus Status { get; set; }
-        public DateTime DateCreate { get; set; }
-        public DateTime? DateImplement { get; set; }
+        public int Id { get; private set; }
+        public int WoodId { get; private set; }
+        public string WoodName { 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)
diff --git a/CarpentryWorkshopView/CarpentryWorkshopView.csproj b/CarpentryWorkshopView/CarpentryWorkshopView.csproj
index d0d744a..329c97f 100644
--- a/CarpentryWorkshopView/CarpentryWorkshopView.csproj
+++ b/CarpentryWorkshopView/CarpentryWorkshopView.csproj
@@ -22,5 +22,4 @@
     <ProjectReference Include="..\CarpentryWorkshopFileImplement\CarpentryWorkshopFileImplement.csproj" />
     <ProjectReference Include="..\CarpentryWorkshopListImplement\CarpentryWorkshopListImplement.csproj" />
   </ItemGroup>
-
 </Project>
\ No newline at end of file
diff --git a/CarpentryWorkshopView/FormComponent.Designer.cs b/CarpentryWorkshopView/FormComponent.Designer.cs
index df40fe6..97566b9 100644
--- a/CarpentryWorkshopView/FormComponent.Designer.cs
+++ b/CarpentryWorkshopView/FormComponent.Designer.cs
@@ -100,7 +100,7 @@
             this.Controls.Add(this.ButtonCancel);
             this.Controls.Add(this.ButtonSave);
             this.Name = "FormComponent";
-            this.Text = "FormComponent";
+            this.Text = "Форма Компонента";
             this.Load += new System.EventHandler(this.FormComponent_Load);
             this.ResumeLayout(false);
             this.PerformLayout();
-- 
2.25.1


From e6bea0685660ddf970668c49ed436b34a1e54856 Mon Sep 17 00:00:00 2001
From: artiogf <artemon152001@mail.ru>
Date: Tue, 2 May 2023 22:16:49 +0400
Subject: [PATCH 3/3] Lab2_Main_Fix

---
 .../BusinessLogics/OrderLogic.cs              | 177 +++++++++---------
 1 file changed, 91 insertions(+), 86 deletions(-)

diff --git a/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs b/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
index 1b9cfd8..09b576b 100644
--- a/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
+++ b/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -13,119 +13,124 @@ using System.Threading.Tasks;
 
 namespace CarpentryWorkshopBusinessLogic.BusinessLogics
 {
-    public class OrderLogic : IOrderLogic
-    {
+	public class OrderLogic : IOrderLogic
+	{
 		private readonly ILogger _logger;
 		private readonly IOrderStorage _orderStorage;
-
 		public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage)
 		{
 			_logger = logger;
 			_orderStorage = orderStorage;
 		}
-
-		public bool CreateOrder(OrderBindingModel model)
-		{
-			CheckModel(model);
-
-			if (model.Status != OrderStatus.Неизвестен)
-			{
-				_logger.LogWarning("Insert operation failed. Order status incorrect.");
-				return false;
-			}
-
-			model.Status = OrderStatus.Принят;
-
-			if (_orderStorage.Insert(model) == null)
-			{
-				model.Status = OrderStatus.Неизвестен;
-				_logger.LogWarning("Insert operation failed");
-				return false;
-			}
-
-			return true;
-		}
-
-		public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus)
-		{
-			CheckModel(model);
-
-			if (model.Status + 1 != newStatus)
-			{
-				_logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order status incorrect.");
-				return false;
-			}
-
-			model.Status = newStatus;
-
-			if (model.Status == OrderStatus.Выдан)
-				model.DateImplement = DateTime.Now;
-
-			if (_orderStorage.Update(model) == null)
-			{
-				model.Status--;
-				_logger.LogWarning("Update operation failed");
-				return false;
-			}
-
-			return true;
-		}
-		public bool TakeOrderInWork(OrderBindingModel model)
-		{
-			return StatusUpdate(model, OrderStatus.Выполняется);
-		}
-		public bool DeliveryOrder(OrderBindingModel model)
-		{
-			return StatusUpdate(model, OrderStatus.Готов);
-		}
-
-		public bool FinishOrder(OrderBindingModel model)
-		{
-			return StatusUpdate(model, OrderStatus.Выдан);
-		}
 		public List<OrderViewModel>? ReadList(OrderSearchModel? model)
 		{
-			_logger.LogInformation("Order. OrderId:{Id}", model?.Id);
-
+			_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;
 		}
-		private void CheckModel(OrderBindingModel model, bool withParams = true)
+		public bool CreateOrder(OrderBindingModel model)
 		{
-			if (model == null)
+			_orderStorage.Insert(new OrderBindingModel
 			{
-				throw new ArgumentNullException(nameof(model));
+				WoodId = model.WoodId,
+				WoodName = model.WoodName,
+				Count = model.Count,
+				Sum = model.Sum,
+				Status = OrderStatus.Принят,
+				DateCreate = DateTime.Now
+			}); ;
+			return true;
+		}
+		public bool TakeOrderInWork(OrderBindingModel model)
+		{
+			var order = _orderStorage.GetElement(new OrderSearchModel
+			{
+				Id = model.Id
+			});
+			if (order == null)
+			{
+				throw new Exception("Элемент не найден");
+			}
+			if (order.Status.ToString() != "Принят")
+			{
+				throw new Exception("Заказ не в статусе \"Принят\"");
+			}
+			_orderStorage.Update(new OrderBindingModel
+			{
+				Id = order.Id,
+				WoodId = order.WoodId,
+				WoodName = order.WoodName,
+				Count = order.Count,
+				Sum = order.Sum,
+				DateCreate = order.DateCreate,
+
+				Status = OrderStatus.Выполняется
+			});
+			return true;
+		}
+		public bool FinishOrder(OrderBindingModel model)
+		{
+			var order = _orderStorage.GetElement(new OrderSearchModel
+			{
+				Id = model.Id
+			});
+			if (order == null)
+			{
+				throw new Exception("Не найден заказ");
+			}
+			if (order.Status.ToString() != "Выполняется")
+			{
+				throw new Exception("Заказ не в статусе \"Выполняется\"");
+			}
+			_orderStorage.Update(new OrderBindingModel
+			{
+				Id = order.Id,
+				WoodId = order.WoodId,
+				WoodName = order.WoodName,
+				Count = order.Count,
+				Sum = order.Sum,
+				DateCreate = order.DateCreate,
+				DateImplement = DateTime.Now,
+				Status = OrderStatus.Готов
+			});
+			return true;
+		}
+		public bool DeliveryOrder(OrderBindingModel model)
+		{
+			var order = _orderStorage.GetElement(new OrderSearchModel
+			{
+				Id = model.Id
+			});
+			if (order == null)
+			{
+				throw new Exception("Не найден заказ");
 			}
 
-			if (!withParams)
+			if (order.Status.ToString() != "Готов")
 			{
-				return;
+				throw new Exception("Заказ не в статусе \"Готов\"");
 			}
 
-			if (model.WoodId < 0)
+			_orderStorage.Update(new OrderBindingModel
 			{
-				throw new ArgumentNullException("Некорректный идентификатор изделия", nameof(model.WoodId));
-			}
+				Id = order.Id,
+				WoodId = order.WoodId,
+				WoodName = order.WoodName,
+				Count = order.Count,
+				Sum = order.Sum,
+				DateCreate = order.DateCreate,
+				DateImplement = order.DateImplement,
+				Status = OrderStatus.Выдан
+			});
+			return true;
 
-			if (model.Count <= 0)
-			{
-				throw new ArgumentNullException("Количество изделий в заказе должно быть больше 0", nameof(model.Count));
-			}
-
-			if (model.Sum <= 0)
-			{
-				throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum));
-			}
-
-			_logger.LogInformation("Order. OrderId:{Id}.Sum:{ Sum}. WoodId: { WoodId}", model.Id, model.Sum, model.WoodId);
 		}
 	}
 }
+
-- 
2.25.1