From d5a0edc89b8206291e770fe57f9682f12c834d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B5=D0=B5=D0=B2?= Date: Tue, 18 Jun 2024 22:00:33 +0400 Subject: [PATCH] =?UTF-8?q?=D1=8D=D1=85,=20=D0=B5=D1=81=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B1=D1=8B=20=D1=8F=20=D0=BD=D0=B5=20=D0=B7=D0=B0=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfectioneryBusinessLogic/ShopLogic.cs | 171 ++++++++++++++ .../BindingModels/ShopBindingModel.cs | 27 +++ .../BussinessLogicsContracts/IShopLogic.cs | 27 +++ .../SearchModels/ShopSearchModel.cs | 15 ++ .../StoragesContracts/IShopStorage.cs | 26 ++ .../ViewModels/ShopViewModel.cs | 31 +++ .../ConfectioneryDataModels/IShopModel.cs | 20 ++ .../DataListSingleton.cs | 2 + .../Implements/ShopStorage .cs | 114 +++++++++ .../ConfectioneryListImplement/Models/Shop.cs | 66 ++++++ .../ConfectioneryView.csproj | 2 + .../ConfectioneryView/FormMain.Designer.cs | 216 +++++++++-------- Confectionery/ConfectioneryView/FormMain.cs | 18 ++ Confectionery/ConfectioneryView/FormMain.resx | 62 ++++- .../ConfectioneryView/FormShop.Designer.cs | 223 ++++++++++++++++++ Confectionery/ConfectioneryView/FormShop.cs | 133 +++++++++++ Confectionery/ConfectioneryView/FormShop.resx | 60 +++++ .../ConfectioneryView/FormShops.Designer.cs | 127 ++++++++++ Confectionery/ConfectioneryView/FormShops.cs | 111 +++++++++ .../ConfectioneryView/FormShops.resx | 60 +++++ .../ConfectioneryView/FormSupply.Designer.cs | 153 ++++++++++++ Confectionery/ConfectioneryView/FormSupply.cs | 124 ++++++++++ .../ConfectioneryView/FormSupply.resx | 60 +++++ Confectionery/ConfectioneryView/Program.cs | 5 + .../ConfectioneryContracts.dll | Bin 0 -> 32256 bytes .../ConfectioneryDataModels.dll | Bin 0 -> 6656 bytes .../ConfectioneryDatabaseImplement.dll | Bin 0 -> 77824 bytes .../ConfectioneryFileImplement.dll | Bin 0 -> 41472 bytes .../ConfectioneryListImplement.dll | Bin 0 -> 27136 bytes 29 files changed, 1756 insertions(+), 97 deletions(-) create mode 100644 Confectionery/ConfectioneryBusinessLogic/ShopLogic.cs create mode 100644 Confectionery/ConfectioneryContracts/BindingModels/ShopBindingModel.cs create mode 100644 Confectionery/ConfectioneryContracts/BussinessLogicsContracts/IShopLogic.cs create mode 100644 Confectionery/ConfectioneryContracts/SearchModels/ShopSearchModel.cs create mode 100644 Confectionery/ConfectioneryContracts/StoragesContracts/IShopStorage.cs create mode 100644 Confectionery/ConfectioneryContracts/ViewModels/ShopViewModel.cs create mode 100644 Confectionery/ConfectioneryDataModels/IShopModel.cs create mode 100644 Confectionery/ConfectioneryListImplement/Implements/ShopStorage .cs create mode 100644 Confectionery/ConfectioneryListImplement/Models/Shop.cs create mode 100644 Confectionery/ConfectioneryView/FormShop.Designer.cs create mode 100644 Confectionery/ConfectioneryView/FormShop.cs create mode 100644 Confectionery/ConfectioneryView/FormShop.resx create mode 100644 Confectionery/ConfectioneryView/FormShops.Designer.cs create mode 100644 Confectionery/ConfectioneryView/FormShops.cs create mode 100644 Confectionery/ConfectioneryView/FormShops.resx create mode 100644 Confectionery/ConfectioneryView/FormSupply.Designer.cs create mode 100644 Confectionery/ConfectioneryView/FormSupply.cs create mode 100644 Confectionery/ConfectioneryView/FormSupply.resx create mode 100644 Confectionery/ImplementationExtensions/ConfectioneryContracts.dll create mode 100644 Confectionery/ImplementationExtensions/ConfectioneryDataModels.dll create mode 100644 Confectionery/ImplementationExtensions/ConfectioneryDatabaseImplement.dll create mode 100644 Confectionery/ImplementationExtensions/ConfectioneryFileImplement.dll create mode 100644 Confectionery/ImplementationExtensions/ConfectioneryListImplement.dll diff --git a/Confectionery/ConfectioneryBusinessLogic/ShopLogic.cs b/Confectionery/ConfectioneryBusinessLogic/ShopLogic.cs new file mode 100644 index 0000000..62b473e --- /dev/null +++ b/Confectionery/ConfectioneryBusinessLogic/ShopLogic.cs @@ -0,0 +1,171 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.BussinessLogicsContracts; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.StoragesContracts; +using ConfectioneryContracts.ViewModels; +using ConfectioneryDataModels.Models; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryBusinessLogic +{ + public class ShopLogic : IShopLogic + { + private readonly ILogger _logger; + + private readonly IShopStorage _shopStorage; + + public ShopLogic(ILogger logger, IShopStorage shopStorage) + { + _logger = logger; + _shopStorage = shopStorage; + } + + public List? ReadList(ShopSearchModel? model) + { + _logger.LogInformation("ReadList. ShopName: {ShopName}. Id: {Id}", model?.ShopName, model?.Id); + var list = model == null ? _shopStorage.GetFullList() : _shopStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count: {Count}", list.Count); + return list; + } + + public ShopViewModel? ReadElement(ShopSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ShopName: {ShopName}. Id: {Id}", model.ShopName, model.Id); + var element = _shopStorage.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(ShopBindingModel model) + { + CheckModel(model); + if (_shopStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Update(ShopBindingModel model) + { + CheckModel(model); + if (_shopStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + public bool Delete(ShopBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id: {Id}", model.Id); + if (_shopStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + public bool Supply(ShopSearchModel shopModel, IPastryModel Pastry, int count) + { + if (shopModel == null) + { + throw new ArgumentNullException(nameof(shopModel)); + } + if (Pastry == null) + { + throw new ArgumentNullException(nameof(Pastry)); + } + if (count <= 0) + { + throw new ArgumentException("Количество товаров(выпечки) в магазине должно быть больше нуля", nameof(count)); + } + _logger.LogInformation("Supply(GetElement). ShopName: {ShopName}. Id: {Id}", shopModel.ShopName, shopModel.Id); + var shop = _shopStorage.GetElement(shopModel); + if (shop == null) + { + _logger.LogWarning("Supply(GetElement). Element not found"); + return false; + } + if (shop.ShopPastries.ContainsKey(Pastry.Id)) + { + var shopP = shop.ShopPastries[Pastry.Id]; + shopP.Item2 += count; + shop.ShopPastries[Pastry.Id] = shopP; + _logger.LogInformation("Supply. Added {count} '{Pastry}' to '{ShopName}' shop", count, Pastry.PastryName, + shop.ShopName); + } + else + { + shop.ShopPastries.Add(Pastry.Id, (Pastry, count)); + _logger.LogInformation("Supply. Added {count} new '{Pastry}' to '{ShopName}' shop", count, Pastry.PastryName, + shop.ShopName); + } + if (_shopStorage.Update(new ShopBindingModel() + { + Id = shop.Id, + ShopName = shop.ShopName, + Address = shop.Address, + DateOpening = shop.DateOpening, + ShopPastries = shop.ShopPastries, + }) == null) + { + _logger.LogWarning("Supply. Update operation failed"); + return false; + } + return true; + } + + private void CheckModel(ShopBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ShopName)) + { + throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName)); + } + if (string.IsNullOrEmpty(model.Address)) + { + throw new ArgumentNullException("Нет адреса магазина", nameof(model.Address)); + } + _logger.LogInformation("Shop. ShopName: {ShopName}. Address: {Address}. Id: {Id}", model.ShopName, model.Address, model.Id); + var element = _shopStorage.GetElement(new ShopSearchModel + { + ShopName = model.ShopName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Магазин с таким названием уже есть"); + } + } + } +} diff --git a/Confectionery/ConfectioneryContracts/BindingModels/ShopBindingModel.cs b/Confectionery/ConfectioneryContracts/BindingModels/ShopBindingModel.cs new file mode 100644 index 0000000..2cf6120 --- /dev/null +++ b/Confectionery/ConfectioneryContracts/BindingModels/ShopBindingModel.cs @@ -0,0 +1,27 @@ +using ConfectioneryDataModels; +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.BindingModels +{ + public class ShopBindingModel : IShopModel + { + public int Id { get; set; } + + public string ShopName { get; set; } = string.Empty; + + public string Address { get; set; } = string.Empty; + + public DateTime DateOpening { get; set; } = DateTime.Now; + + public Dictionary ShopPastries + { + get; + set; + } = new(); + } +} diff --git a/Confectionery/ConfectioneryContracts/BussinessLogicsContracts/IShopLogic.cs b/Confectionery/ConfectioneryContracts/BussinessLogicsContracts/IShopLogic.cs new file mode 100644 index 0000000..ebdeef1 --- /dev/null +++ b/Confectionery/ConfectioneryContracts/BussinessLogicsContracts/IShopLogic.cs @@ -0,0 +1,27 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.BussinessLogicsContracts +{ + public interface IShopLogic + { + List? ReadList(ShopSearchModel? model); + + ShopViewModel? ReadElement(ShopSearchModel model); + + bool Create(ShopBindingModel model); + + bool Update(ShopBindingModel model); + + bool Delete(ShopBindingModel model); + + bool Supply(ShopSearchModel shopModel, IPastryModel pastry, int count); + } +} diff --git a/Confectionery/ConfectioneryContracts/SearchModels/ShopSearchModel.cs b/Confectionery/ConfectioneryContracts/SearchModels/ShopSearchModel.cs new file mode 100644 index 0000000..8f21316 --- /dev/null +++ b/Confectionery/ConfectioneryContracts/SearchModels/ShopSearchModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.SearchModels +{ + public class ShopSearchModel + { + public int? Id { get; set; } + + public string? ShopName { get; set; } + } +} diff --git a/Confectionery/ConfectioneryContracts/StoragesContracts/IShopStorage.cs b/Confectionery/ConfectioneryContracts/StoragesContracts/IShopStorage.cs new file mode 100644 index 0000000..37d9b83 --- /dev/null +++ b/Confectionery/ConfectioneryContracts/StoragesContracts/IShopStorage.cs @@ -0,0 +1,26 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.StoragesContracts +{ + public interface IShopStorage + { + List GetFullList(); + + List GetFilteredList(ShopSearchModel model); + + ShopViewModel? GetElement(ShopSearchModel model); + + ShopViewModel? Insert(ShopBindingModel model); + + ShopViewModel? Update(ShopBindingModel model); + + ShopViewModel? Delete(ShopBindingModel model); + } +} diff --git a/Confectionery/ConfectioneryContracts/ViewModels/ShopViewModel.cs b/Confectionery/ConfectioneryContracts/ViewModels/ShopViewModel.cs new file mode 100644 index 0000000..a95d49c --- /dev/null +++ b/Confectionery/ConfectioneryContracts/ViewModels/ShopViewModel.cs @@ -0,0 +1,31 @@ +using ConfectioneryDataModels; +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.ViewModels +{ + public class ShopViewModel : IShopModel + { + public int Id { get; set; } + + [DisplayName("Название магазина")] + public string ShopName { get; set; } = string.Empty; + + [DisplayName("Адрес")] + public string Address { get; set; } = string.Empty; + + [DisplayName("Дата открытия")] + public DateTime DateOpening { get; set; } = DateTime.Now; + + public Dictionary ShopPastries + { + get; + set; + } = new(); + } +} diff --git a/Confectionery/ConfectioneryDataModels/IShopModel.cs b/Confectionery/ConfectioneryDataModels/IShopModel.cs new file mode 100644 index 0000000..cd72f78 --- /dev/null +++ b/Confectionery/ConfectioneryDataModels/IShopModel.cs @@ -0,0 +1,20 @@ +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryDataModels +{ + public interface IShopModel : IId + { + string ShopName { get; } + + string Address { get; } + + DateTime DateOpening { get; } + + Dictionary ShopPastries { get; } + } +} diff --git a/Confectionery/ConfectioneryListImplement/DataListSingleton.cs b/Confectionery/ConfectioneryListImplement/DataListSingleton.cs index 306d827..97a4ee4 100644 --- a/Confectionery/ConfectioneryListImplement/DataListSingleton.cs +++ b/Confectionery/ConfectioneryListImplement/DataListSingleton.cs @@ -13,12 +13,14 @@ namespace ConfectioneryListImplement public List Components { get; set; } public List Orders { get; set; } public List Pastries { get; set; } + public List Shops { get; set; } private DataListSingleton() { Components = new List(); Orders = new List(); Pastries = new List(); + Shops = new List(); } public static DataListSingleton GetInstance() diff --git a/Confectionery/ConfectioneryListImplement/Implements/ShopStorage .cs b/Confectionery/ConfectioneryListImplement/Implements/ShopStorage .cs new file mode 100644 index 0000000..c9dbd9b --- /dev/null +++ b/Confectionery/ConfectioneryListImplement/Implements/ShopStorage .cs @@ -0,0 +1,114 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.StoragesContracts; +using ConfectioneryContracts.ViewModels; +using ConfectioneryListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryListImplement.Implements +{ + public class ShopStorage : IShopStorage + { + private readonly DataListSingleton _source; + + public ShopStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var result = new List(); + foreach (var shop in _source.Shops) + { + result.Add(shop.GetViewModel); + } + return result; + } + + public List GetFilteredList(ShopSearchModel model) + { + var result = new List(); + if (string.IsNullOrEmpty(model.ShopName)) + { + return result; + } + foreach (var shop in _source.Shops) + { + if (shop.ShopName.Contains(model.ShopName)) + { + result.Add(shop.GetViewModel); + } + } + return result; + } + + public ShopViewModel? GetElement(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) + { + return null; + } + foreach (var shop in _source.Shops) + { + if ((!string.IsNullOrEmpty(model.ShopName) && + shop.ShopName == model.ShopName) || + (model.Id.HasValue && shop.Id == model.Id)) + { + return shop.GetViewModel; + } + } + return null; + } + + public ShopViewModel? Insert(ShopBindingModel model) + { + model.Id = 1; + foreach (var shop in _source.Shops) + { + if (model.Id <= shop.Id) + { + model.Id = shop.Id + 1; + } + } + var newShop = Shop.Create(model); + if (newShop == null) + { + return null; + } + _source.Shops.Add(newShop); + return newShop.GetViewModel; + } + + public ShopViewModel? Update(ShopBindingModel model) + { + foreach (var shop in _source.Shops) + { + if (shop.Id == model.Id) + { + shop.Update(model); + return shop.GetViewModel; + } + } + return null; + } + + public ShopViewModel? Delete(ShopBindingModel model) + { + for (int i = 0; i < _source.Shops.Count; ++i) + { + if (_source.Shops[i].Id == model.Id) + { + var element = _source.Shops[i]; + _source.Shops.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + } +} diff --git a/Confectionery/ConfectioneryListImplement/Models/Shop.cs b/Confectionery/ConfectioneryListImplement/Models/Shop.cs new file mode 100644 index 0000000..f129660 --- /dev/null +++ b/Confectionery/ConfectioneryListImplement/Models/Shop.cs @@ -0,0 +1,66 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryDataModels.Models; +using ConfectioneryDataModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryListImplement.Models +{ + public class Shop : IShopModel + { + public int Id { get; private set; } + + public string ShopName { get; private set; } = string.Empty; + + public string Address { get; private set; } = string.Empty; + + public DateTime DateOpening { get; private set; } + + public Dictionary ShopPastries + { + get; + private set; + } = new Dictionary(); + + public static Shop? Create(ShopBindingModel? model) + { + if (model == null) + { + return null; + } + return new Shop() + { + Id = model.Id, + ShopName = model.ShopName, + Address = model.Address, + DateOpening = model.DateOpening, + ShopPastries = model.ShopPastries + }; + } + + public void Update(ShopBindingModel? model) + { + if (model == null) + { + return; + } + ShopName = model.ShopName; + Address = model.Address; + DateOpening = model.DateOpening; + ShopPastries = model.ShopPastries; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + Address = Address, + DateOpening = DateOpening, + ShopPastries = ShopPastries + }; + } +} diff --git a/Confectionery/ConfectioneryView/ConfectioneryView.csproj b/Confectionery/ConfectioneryView/ConfectioneryView.csproj index 9cd5ea5..d6ab948 100644 --- a/Confectionery/ConfectioneryView/ConfectioneryView.csproj +++ b/Confectionery/ConfectioneryView/ConfectioneryView.csproj @@ -9,12 +9,14 @@ + + diff --git a/Confectionery/ConfectioneryView/FormMain.Designer.cs b/Confectionery/ConfectioneryView/FormMain.Designer.cs index e0212c1..00aaac3 100644 --- a/Confectionery/ConfectioneryView/FormMain.Designer.cs +++ b/Confectionery/ConfectioneryView/FormMain.Designer.cs @@ -28,135 +28,157 @@ /// private void InitializeComponent() { - this.menuStrip = new System.Windows.Forms.MenuStrip(); - this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.КомпонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.КондитерскиеИзделияToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.buttonCreateOrder = new System.Windows.Forms.Button(); - this.buttonTakeOrderInWork = new System.Windows.Forms.Button(); - this.buttonOrderReady = new System.Windows.Forms.Button(); - this.buttonIssuedOrder = new System.Windows.Forms.Button(); - this.buttonUpd = new System.Windows.Forms.Button(); - this.menuStrip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); + menuStrip = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + КомпонентыToolStripMenuItem = new ToolStripMenuItem(); + КондитерскиеИзделияToolStripMenuItem = new ToolStripMenuItem(); + магазиныToolStripMenuItem = new ToolStripMenuItem(); + пополнениеМагазинаToolStripMenuItem = new ToolStripMenuItem(); + dataGridView = new DataGridView(); + buttonCreateOrder = new Button(); + buttonTakeOrderInWork = new Button(); + buttonOrderReady = new Button(); + buttonIssuedOrder = new Button(); + buttonUpd = new Button(); + menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); // // menuStrip // - this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.справочникиToolStripMenuItem}); - this.menuStrip.Location = new System.Drawing.Point(0, 0); - this.menuStrip.Name = "menuStrip"; - this.menuStrip.Size = new System.Drawing.Size(1009, 24); - this.menuStrip.TabIndex = 0; - this.menuStrip.Text = "menuStrip1"; + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, пополнениеМагазинаToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Padding = new Padding(7, 3, 0, 3); + menuStrip.Size = new Size(1153, 30); + menuStrip.TabIndex = 0; + menuStrip.Text = "menuStrip1"; // // справочникиToolStripMenuItem // - this.справочникиToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.КомпонентыToolStripMenuItem, - this.КондитерскиеИзделияToolStripMenuItem}); - this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(94, 20); - this.справочникиToolStripMenuItem.Text = "Справочники"; + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыToolStripMenuItem, КондитерскиеИзделияToolStripMenuItem, магазиныToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; // // КомпонентыToolStripMenuItem // - this.КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; - this.КомпонентыToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.КомпонентыToolStripMenuItem.Text = "Компоненты"; - this.КомпонентыToolStripMenuItem.Click += new System.EventHandler(this.КомпонентыToolStripMenuItem_Click); + КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; + КомпонентыToolStripMenuItem.Size = new Size(251, 26); + КомпонентыToolStripMenuItem.Text = "Компоненты"; + КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // // КондитерскиеИзделияToolStripMenuItem // - this.КондитерскиеИзделияToolStripMenuItem.Name = "КондитерскиеИзделияToolStripMenuItem"; - this.КондитерскиеИзделияToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.КондитерскиеИзделияToolStripMenuItem.Text = "Кондитерские изделия"; - this.КондитерскиеИзделияToolStripMenuItem.Click += new System.EventHandler(this.КондитерскиеИзделияToolStripMenuItem_Click); + КондитерскиеИзделияToolStripMenuItem.Name = "КондитерскиеИзделияToolStripMenuItem"; + КондитерскиеИзделияToolStripMenuItem.Size = new Size(251, 26); + КондитерскиеИзделияToolStripMenuItem.Text = "Кондитерские изделия"; + КондитерскиеИзделияToolStripMenuItem.Click += КондитерскиеИзделияToolStripMenuItem_Click; + // + // магазиныToolStripMenuItem + // + магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem"; + магазиныToolStripMenuItem.Size = new Size(251, 26); + магазиныToolStripMenuItem.Text = "Магазины"; + магазиныToolStripMenuItem.Click += МагазиныToolStripMenuItem_Click; + // + // пополнениеМагазинаToolStripMenuItem + // + пополнениеМагазинаToolStripMenuItem.Name = "пополнениеМагазинаToolStripMenuItem"; + пополнениеМагазинаToolStripMenuItem.Size = new Size(182, 24); + пополнениеМагазинаToolStripMenuItem.Text = "Пополнение магазина"; + пополнениеМагазинаToolStripMenuItem.Click += ПополнениеМагазинаToolStripMenuItem_Click; // // dataGridView // - this.dataGridView.AllowUserToAddRows = false; - this.dataGridView.AllowUserToDeleteRows = false; - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(0, 27); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowTemplate.Height = 25; - this.dataGridView.Size = new System.Drawing.Size(757, 306); - this.dataGridView.TabIndex = 1; + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(0, 36); + dataGridView.Margin = new Padding(3, 4, 3, 4); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 25; + dataGridView.Size = new Size(865, 408); + dataGridView.TabIndex = 1; // // buttonCreateOrder // - this.buttonCreateOrder.Location = new System.Drawing.Point(806, 51); - this.buttonCreateOrder.Name = "buttonCreateOrder"; - this.buttonCreateOrder.Size = new System.Drawing.Size(182, 27); - this.buttonCreateOrder.TabIndex = 2; - this.buttonCreateOrder.Text = "Создать заказ"; - this.buttonCreateOrder.UseVisualStyleBackColor = true; - this.buttonCreateOrder.Click += new System.EventHandler(this.buttonCreateOrder_Click); + buttonCreateOrder.Location = new Point(921, 68); + buttonCreateOrder.Margin = new Padding(3, 4, 3, 4); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(208, 36); + buttonCreateOrder.TabIndex = 2; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += buttonCreateOrder_Click; // // buttonTakeOrderInWork // - this.buttonTakeOrderInWork.Location = new System.Drawing.Point(806, 112); - this.buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - this.buttonTakeOrderInWork.Size = new System.Drawing.Size(184, 26); - this.buttonTakeOrderInWork.TabIndex = 3; - this.buttonTakeOrderInWork.Text = "Отдать на выполнение"; - this.buttonTakeOrderInWork.UseVisualStyleBackColor = true; - this.buttonTakeOrderInWork.Click += new System.EventHandler(this.buttonTakeOrderInWork_Click); + buttonTakeOrderInWork.Location = new Point(921, 149); + buttonTakeOrderInWork.Margin = new Padding(3, 4, 3, 4); + buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; + buttonTakeOrderInWork.Size = new Size(210, 35); + buttonTakeOrderInWork.TabIndex = 3; + buttonTakeOrderInWork.Text = "Отдать на выполнение"; + buttonTakeOrderInWork.UseVisualStyleBackColor = true; + buttonTakeOrderInWork.Click += buttonTakeOrderInWork_Click; // // buttonOrderReady // - this.buttonOrderReady.Location = new System.Drawing.Point(806, 169); - this.buttonOrderReady.Name = "buttonOrderReady"; - this.buttonOrderReady.Size = new System.Drawing.Size(182, 28); - this.buttonOrderReady.TabIndex = 4; - this.buttonOrderReady.Text = "Заказ готов"; - this.buttonOrderReady.UseVisualStyleBackColor = true; - this.buttonOrderReady.Click += new System.EventHandler(this.buttonOrderReady_Click); + buttonOrderReady.Location = new Point(921, 225); + buttonOrderReady.Margin = new Padding(3, 4, 3, 4); + buttonOrderReady.Name = "buttonOrderReady"; + buttonOrderReady.Size = new Size(208, 37); + buttonOrderReady.TabIndex = 4; + buttonOrderReady.Text = "Заказ готов"; + buttonOrderReady.UseVisualStyleBackColor = true; + buttonOrderReady.Click += buttonOrderReady_Click; // // buttonIssuedOrder // - this.buttonIssuedOrder.Location = new System.Drawing.Point(806, 227); - this.buttonIssuedOrder.Name = "buttonIssuedOrder"; - this.buttonIssuedOrder.Size = new System.Drawing.Size(182, 27); - this.buttonIssuedOrder.TabIndex = 5; - this.buttonIssuedOrder.Text = "Заказ выдан"; - this.buttonIssuedOrder.UseVisualStyleBackColor = true; - this.buttonIssuedOrder.Click += new System.EventHandler(this.buttonIssuedOrder_Click); + buttonIssuedOrder.Location = new Point(921, 303); + buttonIssuedOrder.Margin = new Padding(3, 4, 3, 4); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(208, 36); + buttonIssuedOrder.TabIndex = 5; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += buttonIssuedOrder_Click; // // buttonUpd // - this.buttonUpd.Location = new System.Drawing.Point(806, 281); - this.buttonUpd.Name = "buttonUpd"; - this.buttonUpd.Size = new System.Drawing.Size(182, 29); - this.buttonUpd.TabIndex = 6; - this.buttonUpd.Text = "Обновить список"; - this.buttonUpd.UseVisualStyleBackColor = true; - this.buttonUpd.Click += new System.EventHandler(this.buttonUpd_Click); + buttonUpd.Location = new Point(921, 375); + buttonUpd.Margin = new Padding(3, 4, 3, 4); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(208, 39); + buttonUpd.TabIndex = 6; + buttonUpd.Text = "Обновить список"; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += buttonUpd_Click; // // FormMain // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1009, 332); - this.Controls.Add(this.buttonUpd); - this.Controls.Add(this.buttonIssuedOrder); - this.Controls.Add(this.buttonOrderReady); - this.Controls.Add(this.buttonTakeOrderInWork); - this.Controls.Add(this.buttonCreateOrder); - this.Controls.Add(this.dataGridView); - this.Controls.Add(this.menuStrip); - this.MainMenuStrip = this.menuStrip; - this.Name = "FormMain"; - this.Text = "Кондитерская"; - this.menuStrip.ResumeLayout(false); - this.menuStrip.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1153, 443); + Controls.Add(buttonUpd); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonOrderReady); + Controls.Add(buttonTakeOrderInWork); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Margin = new Padding(3, 4, 3, 4); + Name = "FormMain"; + Text = "Кондитерская"; + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); } #endregion @@ -171,5 +193,7 @@ private Button buttonOrderReady; private Button buttonIssuedOrder; private Button buttonUpd; + private ToolStripMenuItem магазиныToolStripMenuItem; + private ToolStripMenuItem пополнениеМагазинаToolStripMenuItem; } } \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormMain.cs b/Confectionery/ConfectioneryView/FormMain.cs index 433215a..aad90f4 100644 --- a/Confectionery/ConfectioneryView/FormMain.cs +++ b/Confectionery/ConfectioneryView/FormMain.cs @@ -150,5 +150,23 @@ namespace ConfectioneryView { LoadData(); } + + private void МагазиныToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShops)); + if (service is FormShops form) + { + form.ShowDialog(); + } + } + + private void ПополнениеМагазинаToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSupply)); + if (service is FormSupply form) + { + form.ShowDialog(); + } + } } } diff --git a/Confectionery/ConfectioneryView/FormMain.resx b/Confectionery/ConfectioneryView/FormMain.resx index 81a9e3d..6c82d08 100644 --- a/Confectionery/ConfectioneryView/FormMain.resx +++ b/Confectionery/ConfectioneryView/FormMain.resx @@ -1,4 +1,64 @@ - + + + diff --git a/Confectionery/ConfectioneryView/FormShop.Designer.cs b/Confectionery/ConfectioneryView/FormShop.Designer.cs new file mode 100644 index 0000000..b0a9b9a --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShop.Designer.cs @@ -0,0 +1,223 @@ +namespace ConfectioneryView +{ + partial class FormShop + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelOpeningDate = new System.Windows.Forms.Label(); + this.dateTimePicker = new System.Windows.Forms.DateTimePicker(); + this.textBoxAddress = new System.Windows.Forms.TextBox(); + this.labelAddress = new System.Windows.Forms.Label(); + this.textBoxName = new System.Windows.Forms.TextBox(); + this.labelName = new System.Windows.Forms.Label(); + this.groupBoxPastries = new System.Windows.Forms.GroupBox(); + this.dataGridView = new System.Windows.Forms.DataGridView(); + this.ColumnId = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ColumnName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ColumnCount = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSave = new System.Windows.Forms.Button(); + this.groupBoxPastries.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.SuspendLayout(); + // + // labelOpeningDate + // + this.labelOpeningDate.AutoSize = true; + this.labelOpeningDate.Location = new System.Drawing.Point(31, 102); + this.labelOpeningDate.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelOpeningDate.Name = "labelOpeningDate"; + this.labelOpeningDate.Size = new System.Drawing.Size(113, 20); + this.labelOpeningDate.TabIndex = 12; + this.labelOpeningDate.Text = "Дата открытия:"; + // + // dateTimePicker + // + this.dateTimePicker.Location = new System.Drawing.Point(159, 98); + this.dateTimePicker.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.dateTimePicker.Name = "dateTimePicker"; + this.dateTimePicker.Size = new System.Drawing.Size(249, 27); + this.dateTimePicker.TabIndex = 11; + // + // textBoxAddress + // + this.textBoxAddress.Location = new System.Drawing.Point(120, 59); + this.textBoxAddress.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBoxAddress.Name = "textBoxAddress"; + this.textBoxAddress.Size = new System.Drawing.Size(287, 27); + this.textBoxAddress.TabIndex = 10; + // + // labelAddress + // + this.labelAddress.AutoSize = true; + this.labelAddress.Location = new System.Drawing.Point(31, 63); + this.labelAddress.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelAddress.Name = "labelAddress"; + this.labelAddress.Size = new System.Drawing.Size(54, 20); + this.labelAddress.TabIndex = 9; + this.labelAddress.Text = "Адрес:"; + // + // textBoxName + // + this.textBoxName.Location = new System.Drawing.Point(120, 19); + this.textBoxName.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBoxName.Name = "textBoxName"; + this.textBoxName.Size = new System.Drawing.Size(287, 27); + this.textBoxName.TabIndex = 8; + // + // labelName + // + this.labelName.AutoSize = true; + this.labelName.Location = new System.Drawing.Point(31, 23); + this.labelName.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelName.Name = "labelName"; + this.labelName.Size = new System.Drawing.Size(80, 20); + this.labelName.TabIndex = 7; + this.labelName.Text = "Название:"; + // + // groupBoxPastries + // + this.groupBoxPastries.Controls.Add(this.dataGridView); + this.groupBoxPastries.Location = new System.Drawing.Point(31, 133); + this.groupBoxPastries.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.groupBoxPastries.Name = "groupBoxPastries"; + this.groupBoxPastries.Padding = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.groupBoxPastries.Size = new System.Drawing.Size(536, 384); + this.groupBoxPastries.TabIndex = 13; + this.groupBoxPastries.TabStop = false; + this.groupBoxPastries.Text = "Выпечка"; + // + // dataGridView + // + this.dataGridView.AllowUserToAddRows = false; + this.dataGridView.AllowUserToDeleteRows = false; + this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ActiveBorder; + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.ColumnId, + this.ColumnName, + this.ColumnCount}); + this.dataGridView.Dock = System.Windows.Forms.DockStyle.Left; + this.dataGridView.Location = new System.Drawing.Point(5, 24); + this.dataGridView.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.dataGridView.MultiSelect = false; + this.dataGridView.Name = "dataGridView"; + this.dataGridView.ReadOnly = true; + this.dataGridView.RowHeadersVisible = false; + this.dataGridView.RowHeadersWidth = 51; + this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView.Size = new System.Drawing.Size(522, 356); + this.dataGridView.TabIndex = 0; + // + // ColumnId + // + this.ColumnId.HeaderText = "Id"; + this.ColumnId.MinimumWidth = 6; + this.ColumnId.Name = "ColumnId"; + this.ColumnId.ReadOnly = true; + this.ColumnId.Visible = false; + this.ColumnId.Width = 125; + // + // ColumnName + // + this.ColumnName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.ColumnName.HeaderText = "Название выпечки"; + this.ColumnName.MinimumWidth = 6; + this.ColumnName.Name = "ColumnName"; + this.ColumnName.ReadOnly = true; + // + // ColumnCount + // + this.ColumnCount.HeaderText = "Количество"; + this.ColumnCount.MinimumWidth = 6; + this.ColumnCount.Name = "ColumnCount"; + this.ColumnCount.ReadOnly = true; + this.ColumnCount.Width = 125; + // + // buttonCancel + // + this.buttonCancel.Location = new System.Drawing.Point(449, 529); + this.buttonCancel.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(101, 36); + this.buttonCancel.TabIndex = 15; + this.buttonCancel.Text = "Отмена"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); + // + // buttonSave + // + this.buttonSave.Location = new System.Drawing.Point(330, 529); + this.buttonSave.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonSave.Name = "buttonSave"; + this.buttonSave.Size = new System.Drawing.Size(101, 36); + this.buttonSave.TabIndex = 14; + this.buttonSave.Text = "Сохранить"; + this.buttonSave.UseVisualStyleBackColor = true; + this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); + // + // FormShop + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(603, 578); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSave); + this.Controls.Add(this.groupBoxPastries); + this.Controls.Add(this.labelOpeningDate); + this.Controls.Add(this.dateTimePicker); + this.Controls.Add(this.textBoxAddress); + this.Controls.Add(this.labelAddress); + this.Controls.Add(this.textBoxName); + this.Controls.Add(this.labelName); + this.Name = "FormShop"; + this.Text = "Магазин"; + this.Load += new System.EventHandler(this.FormShop_Load); + this.groupBoxPastries.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Label labelOpeningDate; + private DateTimePicker dateTimePicker; + private TextBox textBoxAddress; + private Label labelAddress; + private TextBox textBoxName; + private Label labelName; + private GroupBox groupBoxPastries; + private DataGridView dataGridView; + private Button buttonCancel; + private Button buttonSave; + private DataGridViewTextBoxColumn ColumnId; + private DataGridViewTextBoxColumn ColumnName; + private DataGridViewTextBoxColumn ColumnCount; + } +} \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormShop.cs b/Confectionery/ConfectioneryView/FormShop.cs new file mode 100644 index 0000000..f3b1f41 --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShop.cs @@ -0,0 +1,133 @@ +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; +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.BussinessLogicsContracts; +using ConfectioneryContracts.SearchModels; +using ConfectioneryDataModels.Models; +using Microsoft.Extensions.Logging; + +namespace ConfectioneryView +{ + public partial class FormShop : Form + { + private readonly ILogger _logger; + + private readonly IShopLogic _logic; + + private int? _id; + + private Dictionary _shopPastries; + + public int Id { set { _id = value; } } + public FormShop(ILogger logger, IShopLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + _shopPastries = new Dictionary(); + } + + private void FormShop_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + _logger.LogInformation("Shop loading"); + try + { + var view = _logic.ReadElement(new ShopSearchModel { Id = _id.Value }); + if (view != null) + { + textBoxName.Text = view.ShopName; + textBoxAddress.Text = view.Address; + dateTimePicker.Value = view.DateOpening; + _shopPastries = view.ShopPastries ?? new Dictionary(); + LoadData(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Shop loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void LoadData() + { + _logger.LogInformation("Shop pastries loading"); + try + { + if (_shopPastries != null) + { + dataGridView.Rows.Clear(); + foreach (var pastry in _shopPastries) + { + dataGridView.Rows.Add(new object[] { pastry.Key, pastry.Value.Item1.PastryName, pastry.Value.Item2 }); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Shop pastries loading error"); + 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; + } + if (string.IsNullOrEmpty(textBoxAddress.Text)) + { + MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(dateTimePicker.Text)) + { + MessageBox.Show("Заполните дату", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Shop saving"); + try + { + var model = new ShopBindingModel + { + Id = _id ?? 0, + ShopName = textBoxName.Text, + Address = textBoxAddress.Text, + DateOpening = dateTimePicker.Value, + ShopPastries = _shopPastries + }; + 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, "Shop saving error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/Confectionery/ConfectioneryView/FormShop.resx b/Confectionery/ConfectioneryView/FormShop.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShop.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormShops.Designer.cs b/Confectionery/ConfectioneryView/FormShops.Designer.cs new file mode 100644 index 0000000..6e4e0bd --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShops.Designer.cs @@ -0,0 +1,127 @@ +namespace ConfectioneryView +{ + partial class FormShops + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonUpd = new System.Windows.Forms.Button(); + this.buttonDel = new System.Windows.Forms.Button(); + this.buttonEdit = new System.Windows.Forms.Button(); + this.buttonAdd = new System.Windows.Forms.Button(); + this.dataGridView = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.SuspendLayout(); + // + // buttonUpd + // + this.buttonUpd.Location = new System.Drawing.Point(511, 221); + this.buttonUpd.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonUpd.Name = "buttonUpd"; + this.buttonUpd.Size = new System.Drawing.Size(101, 36); + this.buttonUpd.TabIndex = 16; + this.buttonUpd.Text = "Обновить"; + this.buttonUpd.UseVisualStyleBackColor = true; + this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click); + // + // buttonDel + // + this.buttonDel.Location = new System.Drawing.Point(511, 158); + this.buttonDel.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonDel.Name = "buttonDel"; + this.buttonDel.Size = new System.Drawing.Size(101, 36); + this.buttonDel.TabIndex = 15; + this.buttonDel.Text = "Удалить"; + this.buttonDel.UseVisualStyleBackColor = true; + this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click); + // + // buttonEdit + // + this.buttonEdit.Location = new System.Drawing.Point(511, 95); + this.buttonEdit.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonEdit.Name = "buttonEdit"; + this.buttonEdit.Size = new System.Drawing.Size(101, 36); + this.buttonEdit.TabIndex = 14; + this.buttonEdit.Text = "Изменить"; + this.buttonEdit.UseVisualStyleBackColor = true; + this.buttonEdit.Click += new System.EventHandler(this.ButtonEdit_Click); + // + // buttonAdd + // + this.buttonAdd.Location = new System.Drawing.Point(511, 37); + this.buttonAdd.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonAdd.Name = "buttonAdd"; + this.buttonAdd.Size = new System.Drawing.Size(101, 36); + this.buttonAdd.TabIndex = 13; + this.buttonAdd.Text = "Добавить"; + this.buttonAdd.UseVisualStyleBackColor = true; + this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); + // + // dataGridView + // + this.dataGridView.AllowUserToAddRows = false; + this.dataGridView.AllowUserToDeleteRows = false; + this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ActiveBorder; + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Dock = System.Windows.Forms.DockStyle.Left; + this.dataGridView.Location = new System.Drawing.Point(0, 0); + this.dataGridView.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.dataGridView.MultiSelect = false; + this.dataGridView.Name = "dataGridView"; + this.dataGridView.ReadOnly = true; + this.dataGridView.RowHeadersVisible = false; + this.dataGridView.RowHeadersWidth = 51; + this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView.Size = new System.Drawing.Size(466, 538); + this.dataGridView.TabIndex = 17; + // + // FormShops + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(650, 538); + this.Controls.Add(this.dataGridView); + this.Controls.Add(this.buttonUpd); + this.Controls.Add(this.buttonDel); + this.Controls.Add(this.buttonEdit); + this.Controls.Add(this.buttonAdd); + this.Name = "FormShops"; + this.Text = "Магазины"; + this.Load += new System.EventHandler(this.FormShops_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Button buttonUpd; + private Button buttonDel; + private Button buttonEdit; + private Button buttonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormShops.cs b/Confectionery/ConfectioneryView/FormShops.cs new file mode 100644 index 0000000..9483bc5 --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShops.cs @@ -0,0 +1,111 @@ +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; +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.BussinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace ConfectioneryView +{ + public partial class FormShops : Form + { + private readonly ILogger _logger; + + private readonly IShopLogic _logic; + public FormShops(ILogger logger, IShopLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + private void FormShops_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["ShopName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView.Columns["ShopPastries"].Visible = false; + } + _logger.LogInformation("Shops loading"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Shops loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShop)); + if (service is FormShop form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void ButtonEdit_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShop)); + if (service is FormShop form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Deletion of shop"); + try + { + if (!_logic.Delete(new ShopBindingModel { Id = id })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Shop deletion error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/Confectionery/ConfectioneryView/FormShops.resx b/Confectionery/ConfectioneryView/FormShops.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Confectionery/ConfectioneryView/FormShops.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormSupply.Designer.cs b/Confectionery/ConfectioneryView/FormSupply.Designer.cs new file mode 100644 index 0000000..e8c598d --- /dev/null +++ b/Confectionery/ConfectioneryView/FormSupply.Designer.cs @@ -0,0 +1,153 @@ +namespace ConfectioneryView +{ + partial class FormSupply + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSave = new System.Windows.Forms.Button(); + this.textBoxCount = new System.Windows.Forms.TextBox(); + this.labelCount = new System.Windows.Forms.Label(); + this.comboBoxPastry = new System.Windows.Forms.ComboBox(); + this.labelPastry = new System.Windows.Forms.Label(); + this.comboBoxShop = new System.Windows.Forms.ComboBox(); + this.labelShop = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Location = new System.Drawing.Point(312, 170); + this.buttonCancel.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(101, 36); + this.buttonCancel.TabIndex = 19; + this.buttonCancel.Text = "Отмена"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); + // + // buttonSave + // + this.buttonSave.Location = new System.Drawing.Point(205, 170); + this.buttonSave.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.buttonSave.Name = "buttonSave"; + this.buttonSave.Size = new System.Drawing.Size(101, 36); + this.buttonSave.TabIndex = 18; + this.buttonSave.Text = "Сохранить"; + this.buttonSave.UseVisualStyleBackColor = true; + this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); + // + // textBoxCount + // + this.textBoxCount.Location = new System.Drawing.Point(139, 128); + this.textBoxCount.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBoxCount.Name = "textBoxCount"; + this.textBoxCount.Size = new System.Drawing.Size(287, 27); + this.textBoxCount.TabIndex = 17; + // + // labelCount + // + this.labelCount.AutoSize = true; + this.labelCount.Location = new System.Drawing.Point(38, 132); + this.labelCount.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelCount.Name = "labelCount"; + this.labelCount.Size = new System.Drawing.Size(93, 20); + this.labelCount.TabIndex = 16; + this.labelCount.Text = "Количество:"; + // + // comboBoxPastry + // + this.comboBoxPastry.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxPastry.FormattingEnabled = true; + this.comboBoxPastry.Location = new System.Drawing.Point(139, 80); + this.comboBoxPastry.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.comboBoxPastry.Name = "comboBoxPastry"; + this.comboBoxPastry.Size = new System.Drawing.Size(287, 28); + this.comboBoxPastry.TabIndex = 15; + // + // labelPastry + // + this.labelPastry.AutoSize = true; + this.labelPastry.Location = new System.Drawing.Point(38, 85); + this.labelPastry.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelPastry.Name = "labelPastry"; + this.labelPastry.Size = new System.Drawing.Size(72, 20); + this.labelPastry.TabIndex = 14; + this.labelPastry.Text = "Выпечка:"; + // + // comboBoxShop + // + this.comboBoxShop.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxShop.FormattingEnabled = true; + this.comboBoxShop.Location = new System.Drawing.Point(139, 34); + this.comboBoxShop.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.comboBoxShop.Name = "comboBoxShop"; + this.comboBoxShop.Size = new System.Drawing.Size(287, 28); + this.comboBoxShop.TabIndex = 13; + // + // labelShop + // + this.labelShop.AutoSize = true; + this.labelShop.Location = new System.Drawing.Point(38, 38); + this.labelShop.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.labelShop.Name = "labelShop"; + this.labelShop.Size = new System.Drawing.Size(72, 20); + this.labelShop.TabIndex = 12; + this.labelShop.Text = "Магазин:"; + // + // FormSupply + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(464, 233); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSave); + this.Controls.Add(this.textBoxCount); + this.Controls.Add(this.labelCount); + this.Controls.Add(this.comboBoxPastry); + this.Controls.Add(this.labelPastry); + this.Controls.Add(this.comboBoxShop); + this.Controls.Add(this.labelShop); + this.Name = "FormSupply"; + this.Text = "Пополнение магазина"; + this.Load += new System.EventHandler(this.FormSupply_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Button buttonCancel; + private Button buttonSave; + private TextBox textBoxCount; + private Label labelCount; + private ComboBox comboBoxPastry; + private Label labelPastry; + private ComboBox comboBoxShop; + private Label labelShop; + } +} \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/FormSupply.cs b/Confectionery/ConfectioneryView/FormSupply.cs new file mode 100644 index 0000000..78f2bcd --- /dev/null +++ b/Confectionery/ConfectioneryView/FormSupply.cs @@ -0,0 +1,124 @@ +using ConfectioneryContracts.BussinessLogicsContracts; +using ConfectioneryContracts.SearchModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ConfectioneryView +{ + public partial class FormSupply : Form + { + private readonly ILogger _logger; + + private readonly IPastryLogic _logicPastry; + + private readonly IShopLogic _logicShop; + public FormSupply(ILogger logger, IPastryLogic logicPastry, IShopLogic logicShop) + { + InitializeComponent(); + _logger = logger; + _logicPastry = logicPastry; + _logicShop = logicShop; + } + + private void FormSupply_Load(object sender, EventArgs e) + { + _logger.LogInformation("Pastries loading"); + try + { + var list = _logicPastry.ReadList(null); + if (list != null) + { + comboBoxPastry.DisplayMember = "PastryName"; + comboBoxPastry.ValueMember = "Id"; + comboBoxPastry.DataSource = list; + comboBoxPastry.SelectedItem = null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Pastries loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + _logger.LogInformation("Shops loading"); + try + { + var list = _logicShop.ReadList(null); + if (list != null) + { + comboBoxShop.DisplayMember = "ShopName"; + comboBoxShop.ValueMember = "Id"; + comboBoxShop.DataSource = list; + comboBoxShop.SelectedItem = null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Shops loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + if (comboBoxShop.SelectedValue == null) + { + MessageBox.Show("Выберите магазин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxPastry.SelectedValue == null) + { + MessageBox.Show("Выберите выпечку", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Shop replenishment"); + try + { + var pastry = _logicPastry.ReadElement(new PastrySearchModel + { Id = Convert.ToInt32(comboBoxPastry.SelectedValue) }); + if (pastry == null) + { + throw new Exception("Выпечка не найдена."); + } + var operationResult = _logicShop.Supply(new ShopSearchModel + { + Id = Convert.ToInt32(comboBoxShop.SelectedValue) + }, + pastry, + Convert.ToInt32(textBoxCount.Text)); + if (!operationResult) + { + throw new Exception("Ошибка при проведении поставки."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Shop replenishment error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + DialogResult = DialogResult.OK; + Close(); + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/Confectionery/ConfectioneryView/FormSupply.resx b/Confectionery/ConfectioneryView/FormSupply.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Confectionery/ConfectioneryView/FormSupply.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Confectionery/ConfectioneryView/Program.cs b/Confectionery/ConfectioneryView/Program.cs index a45700d..2b5e0a6 100644 --- a/Confectionery/ConfectioneryView/Program.cs +++ b/Confectionery/ConfectioneryView/Program.cs @@ -36,10 +36,12 @@ namespace ConfectioneryView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -48,6 +50,9 @@ namespace ConfectioneryView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/Confectionery/ImplementationExtensions/ConfectioneryContracts.dll b/Confectionery/ImplementationExtensions/ConfectioneryContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..5fe559fbd614ad9a24ccb80d0193778efeb477f4 GIT binary patch literal 32256 zcmeHw3wTuJwf5S3u9;kzNdhF{VnP4|fp8T;Q4*2>QMo8Vq*9Y1*}zDWi8BchEiw_r zqP1%4wW3V~wba^D@qTM^zzeO~pm^!2)}Ym@=Nx-Go?eb^|97qL+j}M?+IpVnJm-J@ z|BTMN*Lv6b?$`az-eKvNt|u1}x$*tm--sT?l|SWzpAQL`vrc+EiylmSvFK6boEM8~ zH%8)xt+D8aSh%^cA>7guZ7W=76~@|I3L`CrRm)cvHb)z+vdqlDcpdeMYNB%t7u{W1 z|6@C~ei~PpZcHcI492V2i*CfV5Z^9*iGm`VD&I_S{^ipT1kWEA)nCc3{D1PQRi^OC zK)lOY=py=*E8@gY4}8FV@C~Bc6K$WT7ZUkX?0)D=QuMMmYik?yMh4iVtUBM&yF%K;+wm2p|e~6-5^peN!?hhD2NAm`wtgdZYiuTZhS~ znU`_ST+ycns_-mLu_898GnI4H1#NO!95ZGh!I_?%QdkV^z%~qatYc(e#)7K^vr}Lq z3eR~%Kjr;Yh+HUiP`i}45#vNE&9ZeYM$paNZPgspXNU8i5DqKU3E|MCc}oyN%p8}h z>>M&x-bygX1tbw|FTtW!nqEpi)mAS02;q^N5ak9+j-ZZW9jL>RC4~r=PQH>fxJSo9 z$(Xwjp8hE6K9EUiCF60;aZ|`0oxqZ3M2@$#BjgErzm?;okS~glV z06hp9_l~?E#~bp7JYSD2_{!g~h4n{Kw!mrULY7|Tk78;0|ZLR%loq>oH^c~iD2)CSh0%(ryAQy1Q2K0 zga{zcwh0kHoMRIr*qbV6#;QAvk4JEEVl^}>`b#YC7KnslL!cP zu1$yl;yjxW0mMq15CKH3O^9GGU>sg&okOOixytqz0TG;U6C!|EZ4)AZxWFbv0I|j< zL;&$6n-Ia?vvCSK6CAe|IaV!l@RY1w2vr(d1Vp>mCPV=7Wt$MeZZdY)F|wl;*~N~$ zAda;ta4BNA$c{k-5Op>o0*HE>5CKHkCPVh&}Z^?VjvoAT~L*n8obMOV;WhL_sK=Ud2g7HtqFPtsZeKAV1! zeJo=HeLee=U;)hteS+B5h>umk`TRKaFv`^e&#`n*&Y^;Ay0PF`27H2??wOMRvdpaD zI2x0C2>fNCtl&hNJ%VGKj@SyQXZR<<5wu#EcOg%vt=Sy*{sNBqe8gWy%lv8CUL3h_ zZm;yS)tk%sT+XnONK2Sk;5n1-MII*7O~}I>x+VDAjG5#faj0M>9nZNGIsA3np@Om4 zWc8yn49|X#b6CJR-vOVo^t$f`l&AqY_K&wsCj`cCH@Lc8cbsEYZ#oEkMIX%NK1J6^d3S+6bB^+AX3L(^;aOC)&xh zQnan2O`(gZ8|l3hx@jaKlqK3&ztT2{HdSlQq6M@T7wrR|^6U`pQ>|?iZGraOA?a<) zszQmT(QeVM6KxiKL$vjxokF*WcBW`^=}ysBiFO+86>Xnr<#a%_lXCV@1zPkWN$<)vedbB1r6u%x(S9vj4gH5`W)|C) z(%(dTU2H4JYjA(rCfX_riFTuC7t&bK?icMMnjqRUqBYVi(Ml!GW?Cd#o@kfQa?wiC zyU`=t=zIez?aAoQ{ULQw*l-mEDGN*mMt<0sNQZLIGAGj08OuzAE;r8wHki0mq%Q23 z;pSpg{BK3x?X7h@E5%d!EO&9(u^vX{{|&LeV6F!9s)Tj>E`t1?hvWR%n~eE=NjE4d zzL1iKM})awVo+&~@pAkhyEzXBJnMi{+#Kg$J?nugT@}w<7yEqO)8g>TQ(2!^d60M% zGh1SgdA=h4oadqHfq7LAm#5@P)qpCgDz&mIM&pqlsx0_47!To*U68C+k z*XuRTHP26cFYo)n^Z?_8Y{sR6w+&}`rpQ-|oEH4PIft&JgXReI%16x=g*@l)$_rve zHE4~a9YG2)M|%m{6^_QXZ;1AOTCZ^o+P9R=|2zhtL3_3BecEoAbf32UJ4U`q4{F=v z!?xp>n>L}Y1@(fH%uQ**0z`P--I?xX_A7U7Hdx~pP!a%PcEOIF3`3flrN3y zwe1y@FO4GF#$^c5CECVi2+*b4_Cwz>Go7x`w!=OHM+w(xTW|1~nL*#wwpW4%ewEpy zG|5>eJz;wyXPI={3sj=P2qGQ_j7FO&mdQ01ena9mx^q#hjHa~>+v9@hN zodxMXv~3saEJ%OTwphXMFlK$@xaN2HcNF{q8a6r74%g&uH?k>D+iuAVQZ^N7+scCN zMh;EVwzUO8%AuJ`lM?092JOjpolAUV#3^uza%ro!O)`&}!zrO{bI|98({8OjhFp)J z8|-k%^$7Zw4mS+pM$%o{HX7kZ(tTRv{+UMywZ{E3kDk=pOX#2ZbXaS@K>y6A7e#wN z?O%-JW&ypbZGSO7g!T)qai17P?`w_w#3=f;4mTnHm^qsMpl#Fg4H}J&yQ;yO;2Y)` z@{6|1e{S$iXd!J|nD-ZREahw4(mc~Omd0t@oWSqQlW4NGRR{h6ZI-rul;?L9(&^gv zX%lmYdjs*w*0)wt_k$dN|V$l(x0@AQ=dr2_+-0JB=sZjE5D8rSt?s@59U^<-M6G|5>hHESEEP)hAudmbs2 z(&bv4ht`}zyR^0htvQ9R)7twZPjgMBTeSAc$R(~a>Qb7dFpZ0f&$FK1{MD|cc9CzL zYq~PQ_E3JrHPg}V&X1>PZ|7}y&2nt3^LM%U&W=CNdZq<-xlUCIv`x_DMpJAL<$v9E zx?{UL|JD@k?Yw=i`HpRM{(Y`99c^0RK3BP;ZGyJY(H_b_=&EwGyYrt)(caEG;;MFR ztMmI@I2M!-=d;g+13s;7g2s2K{Nb{{;lgp8e4h2(o&QdX_IBRKE}Xq-+v@yJTq_*y zq5QwNa7LzWcjx=uN$u^t9QR7cwmQGSy~@$11q$4&9c>dd+*r$p^D@qjQz@<8oj)Z- zdpmEgd#z(zoxi}1gCgxYEwI2{?`WH#t)n05KGBOgq>-M}+Vhx08mUifJTF=FhSqpq zvgo+hc->r2A8L))&GqywP``WD@H%l+WcS$+B;f%D&%*?=_9Q@9|}SH zz19}yEq1rje`;-M-U?{$iODuHw`vG?iY0p3@qq*GV5aTD$uS!T}CG?;D)n4i@ow*7Ip-SBka=v-eJAg6$Q|-n$%a zY2aG-R~>B{wB3%j3EI_;wg>a|HIDWQ=Id)6ZE4^}_jQgo4chgNwh7t|jLGXupB&E=T(m+FnQ7gL!wKqrHN8_Z~-E8aUwoj-yS3w%^epw_WYa7p|579TY zjc3z`=ys(^>JQU1+LQNL57UdMXdBP^kI=8QjqjEorC)0s-z_~# ze^i>J@EGCuNPJZJ9-~~*)DHeJ8l!EzB0NqLw2fDU$Ei%)xC~Fw9Btz=JV6VzjqjG8 zq{Z6CcS}#w3T@-NrKjiuZR5M8rzos6$=TDC(6)<$+l{B`t6FOc2I*9E#*j&T1(FKF#o`9b<8 zdR1!|A>1K)OKTS++#z~jX_D*1G-?Xh=PrNs$nC~qD%RSnkwH34cpO4(e9!d^&DI*< zb3H?6Xl)$sxt^tJt(79z&(bobNea)=R?$?8JxANM#%tsq-}g}_!Ihxw(-5;Pw1Go@%`ot z^rp7){pJhwp3KL`zRx*Ew`m*S=NzNEw2klMUZwA98{fyhN(YrDHSrp~q&<0rzecZVPaff~ z(c9X_dxqEPSGEmp^g8`U+xR~24f>mwQJQGG{Cpqx&y=k+N&V+E zL)&H|g`d+rtt~(bKc|IS!Y^p6wtec~ zZv280qILScNZ}W>TiY!E7~^faLEA3zzwLgTzNKxaWF9m7=`L+skZDjq-KT9kGJfek zP6xH^){Kv!J*jQyW{ff3p~KqNkny(r9ePpOkh9;q-z7tC-qbGW1IiRl?I%8<5u)wD z$5{;kcR%8dWFkbB4%FHveJCELtNX&l>w!)*2+m;Z53J1tJ-za!LtN1Um7PL=;B zdeoRe5bNxIze29VF#*Q?`03cje}wtGR#tVGim9bel~a8_zve&R^NWW4ulWzogF#<1 z_=&_bfd3P%`9C=$+3onn^T2&Cm=+A0v<>~xMKzhhpquW`2nIdWE_3Ys0uO#&^-v8? z{a4{zgQwuu;9G<9`!C~L!)NvQ)?jwN1m7AOgHwo;@Wsg>zBN>eaHY6TLAWWnPD8k9 zxK2m7>A227xEZ*nQ83rQ18@8bNg_hmX_?9F?V#?vb~e?mF)^8>~_V|Z{F z@cP^lMw&5YtahGp~@u87lFvj?;adNcW{ZZHE)Mun4Hfvb7|l@BLw*lBj3C_xX+kmKALv`cvt9v zQDMGT@UT&11_Or#j{$2keq*eWuzxZ}NNkT3{KYWoxUtAI={=yIJ}|}t|J5i4{>CT) z{<|?1_(x+V@KfVdAer-lZnMJ7qHA3|`fhM70dtd!!`|j9Mr?Pu7MT<9E5;#n5}D~Q zd&}?}O`WF zSi3cH%zJTOKOe|txm$3*l;|MjIo=-e?A6Hrhs6Jocs?U|1pX_0{o-?6BYVCpp6`m! zdx9Ur^GY8XTwX&Xd%Exo!h9g-!6TSvaIF@KPmxCUEEdmV@tGhv37&WOW!U zjqG13{*~fcEm#BpAN%UXC#;b@8^p6gd@R8TJm2>v#HUjud+rd=9pZDP;BI)P`@6-b z8|Rv+Rq?r7tovbo*?SN&>Qj7rHL~X+@q9)+kBDc#SdVLDpLfOQJ@NTae8`kK)W|+A zlk3o9avi3bX8J6Dp;(JFvQM%2Oc0+*@LA)Z1sU}wJ{20-vr;^(#j^&Um;39*8rH}@ z4dP>oPXs<){!X!Wnrz(x>l`5G=Ssod@Oj+dB|hC6*>kUW?iHWA1^2`AWp9u8^lD_! zL*jWze4Y_J0?%Xqe(^c3kv-oP&v(V=Ly3)CQezs~C(VUcODhznNF(#bF3x$ei*r6f za1uOU_LhrJg+}(Qgy(!9dsYk9h-ba{gf+5fgLp<@y~CFfzEdMxcY~jv)+J20M&|cQ zsJ#;Ne)!a;^@z1sBl{cy-;#D*nBy*H-jz`AN~jNEy*iEXiv&iTM)q;JIp=9^GyPy% zq3}f-*;*{tNwA{S!dGZyYo%CgVC_$<7e1_!tqo$0z=ez;fp=o zj^)BvXk=@pSS!U^FML=dTN}jMAl8KNof_G?L##W*y4w?{)!yA6E_;{wbZcbKz2do7 zJoky`KJn}oxmU|vqFxXC9}@pV;(u6t4vSB}#CcpJd%i24?~3Oy;qx3G7L=ON$Ubf_ z&jW?R6lr9>*vmCm3@d6z_zI0|trTmeSnGukYh-JKSR2IJfEDa%Z=x{$jo@3%y`07Xk@-#BlG1VSBbS=GFNL8rNlPQgStN2%8q4F;q#lH+(8zqf$YG7lG>T_Jm`;t%cZuAsk(nNm zdo?n1Si<%Tb6g|y6p*}WWX2tkdJv{aBl8s^R|HtD7dfnvnMMhf5T;Wj^Ial$Yh-4h zc=ia>tC9JBk&kO+=9l70>5@Z@%omDWq>-8N=~9QnRA^+rUgWSwW)dQIYGh`ogzXll zJDr&xk$W{Vb69-(g*mQ~dCHKyX=KKoA+;w=kw)grMXu1uOqF=n3lrAJe5c5r87y~; z+%0mi$h{&T7x}ozMyBK;ll_ZCE)uyy8)(bX<*qRWzOK@L^J$pp%7o=~KYFd?`zm*eRYxkvDDu7nbqhD#{Ha>07R zgkYCok06Z@Pr-7*dO^zPJyIbM>uCYYJ%Zy$aeGw>){kPIMl+TR(ioQO$8wwr!5+bW zK{`p&5-b<27fc9t3HA$8p?C_G3)TxJ1bYPg1*u3p1F|@V7*|EV80+u5Ff#E!Fs`jV3%NzV80+u z6o0{b!GvI!V2@zGAe}6pg5`qsf(gMc!5+bWK`Ie{!E(WR!GvIsV80+u5>LT$!Fs`j zV3%OOAWare!E(WR!GvIsV80-hil<cyDKft&|4F|PQno&umr zqhR6ZSw})10}I}b0Gd$7DHZvQ)7e91)6xj>1@cgKohgjQpo26O-wA*wT_|rvtp%ER8)_B!I-p7Q2w_kdXwo`_!229P6K^nG2>EKDN!Q>6 z+n}!jO}ZB0@V*Gp#M=O2$kzi+yyMgW`I|tKZX^rxO+XWGJ8gh`E6}9da6XM^{(&al zjx$Mv_5e-11Jw-q+dz}LFn=02(~d&ki<5GL_5n@08*dgGbPv#^d+{EgLEizIw4b&> z{w@%24B$lEpzi@qx}PqC{C%K__o%i({vpuBdaxbxL7<7JSUQ2dc(2jKyGU1p|97B? zH<7M_{0E?kxobD%KLJhpGit)1{{))!DQd!?zW`0Vt8^V?GOmMc7&kyRfhM_(Z$fqh zO}xQ$6J#IIB)@SBWSosd4j8vVP6wKlVcZTm6NvF;+yQwQ(8T*r--etGG%3gEhMWt; z_%ilF9s$JoGVX?)2gLX??uA?c#P~AyLmmw@@ut*$kWT_)d>QvcE&^hF89#tr3^ein z)DM9Z@k9|u77!x~PYGdU0Wq@htPe&O5F^WY4DwW>Od6mk{N#M@m*Auk4+w8VG?at#n8%Xk&?*+7geJjsBO1vK&g*UuoY0Gf2J@pH)M z0Wq?Sw;-w#V^<=dijPk=Vj0zmpKd}2mY0>40F$j!Q3ao!Q8Xr z=fRxqVx zv|?wjQ_joUo0`Jwnyh;KLRj6>-fYFRR?)!0Qs}m54B9!7cpEN@+FKgxXVUrMrgp2g z9SK3Hib#-ftOE*iL-UtL8{3<#GpRD#vfdJ-73+Y~77I7D#mlN{Xk|yd&1x>ISxy_Q zwmK)vR%{Wd_+W~?Dw`rGmFUyxLrg1Rmk6_#k4pCiT(;|*pr9+q($0CjAN31QM?Xf!2*tT(S zyw%NUhQYLI>d!E8J{QHJ&4YujY#)N;hUT%>GT8sz_Ha{VeWXDq!@*`ws5Uy7=NKy* z8)KMB1{<9Q7{aD%|MNUnVq$I|BBV@9pJiOxzV2d79)t731#kw{U~^@(y=90{wb8b4 z(`VRLL|a#2A{!jn%I3CK)oMfAE2HrtLLs^(LmHCN4Q;Q*-w+*~iG|U|j=?O~LY37N z*^G5&kX287G7ZR#Y0n8V^`=e|VjVy%w%TetTCIg0SkkPfnwB;zwm#foNl2MMRD?X0 z5PVl!vCS-Uk~J;ywlJm;QUlIW**0*JkvLAE&a>jtCKP8mz8HDdfK_cJ)?_SjRHOTh z)|`G|#T*aSU`f?pv>ZltSX)hQ1*oPf5^s&hd0Qam(G#C!)|NM`$&k)NFN-u=TvbcL zEsY4FD~<=TW+L&GSW#eF8QyG3su3$*8%4Prd5#oX$^&vm<9dfXVMNtNtG6~-O=9M% zlxbHorKC2Vh9$#11rq;B-ekK8#i8t3SpqtWSgDXnUWv~`r76IpL@4HH+fqv)N5u6pj}N#n*ubghjTE0TRqLiJ6_eu`RUt!v+~!HO-6MYl)?;AshQSWOl#)y?ay z#zw2Lq78omXk9xPE*P3HCfgc#rkEV3RlFs0G{nV8aOX;L_MSA!49ZB-R1uF`&Fh*v zq}7vjZ8(OCU4%c;Y;D0xo-|Utt@%_QicT{EBppMAd)UNkLB7H2aby}-EbUO{n0AP zv20f)n@ZZk+ZU=0Z?a?-s%haFnW}h#!mo021Hm)b!bl6}QPud5FyD;#UssLCbzNhMOUlS=E= zB_$;HGr22DbyEqaGO71yDoM4LX*nf1&8U==;@nW_q-+;EX{DzWjrXmJl!7JIlys7$ zsyXqDCs~z&q^`VF$(%wb&B~C}YZRe!(aejIbVAwxN+(p3EF5y5o3yBumCl`Qh&$@W zrY6Ef)})6Lof8c=^3qE+aZC)64J|y;3c(5ROfL$rX^z4c?5-s z)YQu4j8MV=Oe%UPCW++zwM=$N1E)J+moCW+WK>c$ExZTDL_PEbQDwFAT~kX#N7B)r z39R+{-kWOl9xZu0PIYm$ZA+n4UtQiRsV$2p4^=FbvB6S&MQj5OPFmV{QckieuQHpq zOK_=JOc_`_k#*FP+6S>>w?=JL3e9Z+k(VTuah^cz(+iQSA~94!G=?I=qE>G;H`%l3 zIgyr2$fzDZJ-aVV37AIeZ8mSh}t4Ne->d{f~Z!l7+> z@2vOXtep_l890bc?>gYbr*@me>|Vy*11OiJQS2U}>S0h732$h@%~+%%Zc}=DP{vaj zZ{c*|;?6$OA=F+>FMV;&q}>^@k7t#;tq3?i!40I<$n6pTtV2L&4-zMPQ^T8qc*@wW z#57sa5^m~oa|v89si(xFUNj z4a`C^Yh~QVXonN$9!)sy?6}xtXt0Ch>j=^g&gwRB#*Jfnkge39q*HCcwdJqZNQeyS?2VSkF(I(I*+v>mfeNzSX^5W0WXgYai`}DY;uP#(|6f_ z*O8pTp>AhX2Ay3-T=JKqZom?%_7^E6FYbd#)Wsl@>tW)~F zN#;Uz3nd|Vg><^LBr=duH4)<|S*&c2C1pMe(>2Eu+mq*DVn|VOTw}$QlRgj=4_oHI z$pb7t4-@kV6c>blIMK5s=6NfrW7A;U#W+%=^Wx^*@5{eu91Zrt? zv$f2^zr!O1Wr3aeR85#=(JlC=b}C}Aa0j*vk+$Su6EmN)NdOV-yGyEQ=@2v5y1n{} z+Wri)e5-pC@qA{kbn_GdjWvqLlyTV;5 zxX?Wl(lW?}bej82_k8yP;2G{y@LlLW8|-ZN>F(vYp6Z_Np5-ow_o?pF+;cTE6H*1f z^AV~7Ax?46gN5TLB<5zrpTp008|jnr%vB?PZ)?H>Ni}$0pcN7hlkjc9-|!6M8^MzU zEqHQbD`aNlnu!z5T8k$qzF-*oL0Y0Lx@zyTD_&l3Z<^<&2gzM%82sna3=f1*h}A3+ z=Ls%l9Fv8=yJmW`-1vj`R>tt`cGEvR)L~|?@~02aPIMZqWchtQw>jF(-iSXLZHx|@ zZZeF~9-o=rYI*|*Kh|&ujInsQ#>`F}!T$)k+sIB_>+%_9TF`{ZY+BIJ5`rR>pP=3V zgCB;ml%4q5NxsbN)-hQKew&e%m7Ta_Om^Z*KfWd>mED>~t}$6zS)s)75Q4z%Lxj^8 zSHQ^fiky{J$mDHC4l#kK&^(YixjVAFg~YL$e1=gLlW zn^`XW^Ie`o2`}zOQkcTL{GvAB%KF5qDj-zu7UjIa1ls$ip5XL~l?L!ra z^P~)9g{yHt948@VB<(-2pl*BU)xc@~`ycC=JL#?O*ZY^;e(?)`{$18@(BSwPn}3pa zn+&YG`3G`0-X0`3-ghQ9|1fW$tzF(R9ux0ndHtq0)9W1`3Zq|nLl(ZxK2bwfCh9ub zc`~@>o!+BdnqA)PCVV%V-qCI^nx5e%hW)13bbCXIK30weIION?`N^C+u17kn2bIb_ zI+LkPAKIC-;)fyv+BsxN-?mt67O~l{+(K5G_6u2A+(VMN9ma+fJySZ6o&7AaI;9Cr z#~)_o!i^;~BKnK&Z=FVVZh9g2N|v%$un`xZToT_=of4)z$0;wnmYr~6r@ZXM_Z+9u zj??Ju3)l%4c0&I=;5ZdJPKDWP*$EeRD$Gti={SvdoW^I@vlA}tG(J1g<2aQ#P9@om z?1T$Dm1HLl+tt_XR9`dtO7=z!4+Futz|x~V)A2xr>6vaQ#N!g|){59rN&9d?Pydd( zd{12tsLPY;(xWbiolH&7uxoQlcH((h5zq5!7mrvaUYq2A&&{ zxq$HC7CTUyvr+WO&wzv{v1sQee$}|v%*3rrbj#BArnU&4@Book)3Omih~t)y-Oj<^ z&HsCDNIM~kqi~!aKRu)W6hCJ~KI1VG`}XzS+IMGR-{XBx^gY`5P~THWujo5q+zh*R znu7VX@Akf@`wqhXRAI@{Yx|xkEA0DG-_u90V&6&Pr=~hQgGL#B-|jnbG=Tt59Q|5q zM6>ZQXWt!t2l^iAdjR+pC&%eN-S;HN2EtCAGp8dQiC)ro4_k)FmCpL3M>{2gCpb=I z=^>)Y8$N$ok_b(ulmXWd74AZI6(S9*@L11f*V(azLR zB?jg9*%gNDJ}vo_E`<6|sWj=UwqxG|N3U`E1$Q8BtQ6-OJc>AUe;iynXoLaPGq8Vg zB@jLK{*`|wW9bSWZTs<^|4n?`*`hvNq5OE<$@snp+j}WC_TV0$`Z;f9)yh9!HFe`3 zD~hY{toq5C^*{RN3miw~X>0MENG!g#qOm#BvUX*(J=S2Y<jQCHDq zZHimg=DM1)m1X!LH09=b?dNDPspFZo(RCNEl__y;i`9ndb6_aPudKCk9j#naG4qr; zr1Lsqtj;Uyi1B}^|2t~HkjBa*y)rqO;tc@dY5l=GyDY)?f-a&iUPAS! z%QYL)`FO^?4p>d+L8`%%@XMgr02e{#&r|MS|5Z(?oC1H;761H>eB3}Duc@CZDEy3l zm|}=0BKMs&xW8O4@B0wmOW;tou!iNX6Mv`Hxf@mS9B}h;Zy--?@QT1|!w@mOiG=wb z1^d6*cq$)tfZUG+Uy0QC4wlpC02h{fUyh$GoEtn`;G}CIoepi`G{a)UoiIMePb+GJOSl2=YPG?q5Z{X={pFhHR^jyRdSQ)E7rt0Mq~=4l z+X}=V#mPmxv_P_SUo2i^1Mjp=L%9aVcVaCk>$ntoZ@_m3-eR#tZba?RLqAyuZ63a1 znge+bf!qAdrub}}E_<|&`+ S)xQ~C&%^b9KmXs=!2bav3MQ}s literal 0 HcmV?d00001 diff --git a/Confectionery/ImplementationExtensions/ConfectioneryDataModels.dll b/Confectionery/ImplementationExtensions/ConfectioneryDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..e022749477193289f045fbde108fd008586d2334 GIT binary patch literal 6656 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 literal 0 HcmV?d00001