diff --git a/FlowerShopBusinessLogic/OrderLogic.cs b/FlowerShopBusinessLogic/OrderLogic.cs index c19d04d..f7efbde 100644 --- a/FlowerShopBusinessLogic/OrderLogic.cs +++ b/FlowerShopBusinessLogic/OrderLogic.cs @@ -4,6 +4,7 @@ using FlowerShopContracts.SearchModels; using FlowerShopContracts.StoragesContracts; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Enums; +using FlowerShopDataModels.Models; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -17,11 +18,17 @@ namespace FlowerShopBusinessLogic.BusinessLogic { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + private readonly IShopStorage _shopStorage; + private readonly IShopLogic _shopLogic; + private readonly IFlowerStorage _flowerStorage; - public OrderLogic(ILogger logger, IOrderStorage orderStorage) + public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IFlowerStorage flowerStorage, ILogger logger) { - _logger = logger; _orderStorage = orderStorage; + _shopStorage = shopStorage; + _logger = logger; + _shopLogic = shopLogic; + _flowerStorage = flowerStorage; } public List? ReadList(OrderSearchModel? model) @@ -65,6 +72,20 @@ namespace FlowerShopBusinessLogic.BusinessLogic _logger.LogWarning("Status change operation failed"); throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); } + if (element.Status == OrderStatus.Готов) + { + var flower = _flowerStorage.GetElement(new FlowerSearchModel() { Id = model.FlowerId }); + if (flower == null) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); + return false; + } + if (CheckSupply(flower, model.Count) == false) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Shop supply error."); + return false; + } + } model.Status = status; if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; _orderStorage.Update(model); @@ -106,5 +127,65 @@ namespace FlowerShopBusinessLogic.BusinessLogic } _logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id); } + + public bool CheckSupply(IFlowerModel flower, int count) + { + if (count <= 0) + { + _logger.LogWarning("Check then supply operation error. IceCream count < 0."); + return false; + } + + int sumCapacity = 0; + int sumCount = 0; + sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); + sumCount = _shopStorage.GetFullList().Select(x => x.ShopFlowers.Select(y => y.Value.Item2).Sum()).Sum(); + int freeSpace = sumCapacity - sumCount; + + if (freeSpace - count < 0) + { + _logger.LogWarning("Check then supply operation error. There's no place for new IceCream in shops."); + return false; + } + + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace = shop.MaxCapacity; + foreach (var doc in shop.ShopFlowers) + { + freeSpace -= doc.Value.Item2; + } + if (freeSpace == 0) + { + continue; + } + if (freeSpace - count >= 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, flower, count)) + count = 0; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (freeSpace - count < 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, flower, freeSpace)) + count -= freeSpace; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (count <= 0) + { + return true; + } + } + return false; + } + } } diff --git a/FlowerShopBusinessLogic/ShopLogic.cs b/FlowerShopBusinessLogic/ShopLogic.cs index 9e064d1..d92d22c 100644 --- a/FlowerShopBusinessLogic/ShopLogic.cs +++ b/FlowerShopBusinessLogic/ShopLogic.cs @@ -51,22 +51,35 @@ namespace FlowerShopBusinessLogic var curModel = _shopStorage.GetElement(model); if (curModel == null) throw new ArgumentNullException(nameof(curModel)); - if (curModel.ShopFlowers.TryGetValue(flower.Id, out var pair)) + + var countItems = curModel.ShopFlowers.Select(x => x.Value.Item2).Sum(); + if (curModel.MaxCapacity - countItems >= count) { - curModel.ShopFlowers[flower.Id] = (pair.Item1, pair.Item2 + count); + if (curModel.ShopFlowers.TryGetValue(flower.Id, out var sameDocument)) + { + curModel.ShopFlowers[flower.Id] = (flower, sameDocument.Item2 + count); + _logger.LogInformation("Same flower found by supply. Added {0} of {1} in {2} shop", count, flower.FlowerName, curModel.ShopName); + } + else + { + curModel.ShopFlowers[flower.Id] = (flower, count); + _logger.LogInformation("New flower added by supply. Added {0} of {1} in {2} shop", count, flower.FlowerName, curModel.ShopName); + } + _shopStorage.Update(new() + { + Id = curModel.Id, + ShopName = curModel.ShopName, + Address = curModel.Address, + DateOpen = curModel.DateOpen, + ShopFlowers = curModel.ShopFlowers, + MaxCapacity = curModel.MaxCapacity + }); } else { - curModel.ShopFlowers.Add(flower.Id, (flower, count)); + _logger.LogWarning("Required shop is overflowed"); + return false; } - Update(new() - { - Id = curModel.Id, - ShopName = curModel.ShopName, - DateOpen = curModel.DateOpen, - Address = curModel.Address, - ShopFlowers = curModel.ShopFlowers, - }); return true; } @@ -155,5 +168,11 @@ namespace FlowerShopBusinessLogic throw new InvalidOperationException("Магазин с таким названием уже есть"); } } + + public bool MakeSell(IFlowerModel flower, int count) + { + return _shopStorage.SellFlowers(flower, count); + } + } } diff --git a/FlowerShopContracts/BindingModels/ShopBindingModel.cs b/FlowerShopContracts/BindingModels/ShopBindingModel.cs index 9afd7ed..2298fa6 100644 --- a/FlowerShopContracts/BindingModels/ShopBindingModel.cs +++ b/FlowerShopContracts/BindingModels/ShopBindingModel.cs @@ -13,6 +13,7 @@ namespace FlowerShopContracts.BindingModels public string ShopName { get; set; } public string Address { get; set; } public DateTime DateOpen { get; set; } + public int MaxCapacity { get; set; } public Dictionary ShopFlowers { get; set; } = new(); } } diff --git a/FlowerShopContracts/BusinessLogicsContracts/IShopLogic.cs b/FlowerShopContracts/BusinessLogicsContracts/IShopLogic.cs index c9a8e57..695685f 100644 --- a/FlowerShopContracts/BusinessLogicsContracts/IShopLogic.cs +++ b/FlowerShopContracts/BusinessLogicsContracts/IShopLogic.cs @@ -18,5 +18,6 @@ namespace FlowerShopContracts.BusinessLogicsContracts bool Update(ShopBindingModel model); bool Delete(ShopBindingModel model); bool MakeSupply(ShopSearchModel model, IFlowerModel flower, int count); + bool MakeSell(IFlowerModel flower, int count); } } diff --git a/FlowerShopContracts/StoragesContracts/IShopStorage.cs b/FlowerShopContracts/StoragesContracts/IShopStorage.cs index 671f8c8..d274c09 100644 --- a/FlowerShopContracts/StoragesContracts/IShopStorage.cs +++ b/FlowerShopContracts/StoragesContracts/IShopStorage.cs @@ -18,5 +18,6 @@ namespace FlowerShopContracts.StoragesContracts ShopViewModel? Insert(ShopBindingModel model); ShopViewModel? Update(ShopBindingModel model); ShopViewModel? Delete(ShopBindingModel model); + public bool SellFlowers(IFlowerModel model, int count); } } diff --git a/FlowerShopContracts/ViewModels/ShopViewModel.cs b/FlowerShopContracts/ViewModels/ShopViewModel.cs index bb7556f..50e8691 100644 --- a/FlowerShopContracts/ViewModels/ShopViewModel.cs +++ b/FlowerShopContracts/ViewModels/ShopViewModel.cs @@ -17,6 +17,8 @@ namespace FlowerShopContracts.ViewModels public string Address { get; set; } [DisplayName("Дата открытия")] public DateTime DateOpen { get; set; } + [DisplayName("Вместимость")] + public int MaxCapacity { get; set; } public Dictionary ShopFlowers { get; set; } = new(); } } diff --git a/FlowerShopDataModels/IShopModel.cs b/FlowerShopDataModels/IShopModel.cs index 54bba9f..26c1497 100644 --- a/FlowerShopDataModels/IShopModel.cs +++ b/FlowerShopDataModels/IShopModel.cs @@ -11,6 +11,7 @@ namespace FlowerShopDataModels.Models string ShopName { get; } string Address { get; } DateTime DateOpen { get; } + int MaxCapacity { get; } Dictionary ShopFlowers { get; } } } diff --git a/FlowerShopFileImplement/DataFileSingleton.cs b/FlowerShopFileImplement/DataFileSingleton.cs index 83754aa..9a2812c 100644 --- a/FlowerShopFileImplement/DataFileSingleton.cs +++ b/FlowerShopFileImplement/DataFileSingleton.cs @@ -9,9 +9,11 @@ internal class DataFileSingleton private readonly string ComponentFileName = "Component.xml"; private readonly string OrderFileName = "Order.xml"; private readonly string FlowerFileName = "Product.xml"; + private readonly string ShopFileName = "Shops.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Flowers { get; private set; } + public List Shops { get; private set; } public static DataFileSingleton GetInstance() { if (instance == null) @@ -26,11 +28,14 @@ internal class DataFileSingleton "Flowers", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); -private DataFileSingleton() + public void SaveShops() => SaveData(Shops, ShopFileName, + "Shops", x => x.GetXElement); + private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; Flowers = LoadData(FlowerFileName, "Flower", x => Flower.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Shops = LoadData(ShopFileName, "Shop", x => Shop.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/FlowerShopFileImplement/Shop.cs b/FlowerShopFileImplement/Shop.cs new file mode 100644 index 0000000..67076e4 --- /dev/null +++ b/FlowerShopFileImplement/Shop.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; +using System.Xml.Linq; + + +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; +using FlowerShopFileImplement; +using FlowerShopFileImplement.Implements; + +namespace FlowerShopFileImplement.Models +{ + public class Shop : IShopModel + { + public int Id { get; private set; } + public string ShopName { get; private set; } + public string Address { get; private set; } + public DateTime DateOpen { get; private set; } + public Dictionary Flowers { get; private set; } = new(); + private Dictionary? _shopFlowers = null; + public Dictionary ShopFlowers + { + get + { + if (_shopFlowers == null) + { + var source = DataFileSingleton.GetInstance(); + _shopFlowers = Flowers.ToDictionary(x => x.Key, y => + ((source.Flowers.FirstOrDefault(z => z.Id == y.Key) as IFlowerModel)!, + y.Value)); + } + return _shopFlowers; + } + } + + public int MaxCapacity { get; private set; } + + public static Shop? Create(ShopBindingModel model) + { + if (model == null) + return null; + return new Shop() + { + Id = model.Id, + ShopName = model.ShopName, + Address = model.Address, + DateOpen = model.DateOpen, + MaxCapacity = model.MaxCapacity, + Flowers = model.ShopFlowers.ToDictionary(x => x.Key, x => x.Value.Item2) + }; + } + + public static Shop? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Shop() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ShopName = element.Element("ShopName")!.Value, + Address = element.Element("Address")!.Value, + MaxCapacity = Convert.ToInt32(element.Element("MaxCapacity")!.Value), + DateOpen = Convert.ToDateTime(element.Element("DateOpen")!.Value), + Flowers = + element.Element("ShopFlowers")!.Elements("ShopFlower") + .ToDictionary(x => + Convert.ToInt32(x.Element("Key")?.Value), x => + Convert.ToInt32(x.Element("Value")?.Value)) + }; + } + + + public void Update(ShopBindingModel model) + { + if (model == null) + { + return; + } + ShopName = model.ShopName; + Address = model.Address; + DateOpen = model.DateOpen; + MaxCapacity = model.MaxCapacity; + if (model.ShopFlowers.Count > 0) + { + Flowers = model.ShopFlowers.ToDictionary(x => x.Key, x => x.Value.Item2); + _shopFlowers = null; + } + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + Address = Address, + DateOpen = DateOpen, + MaxCapacity = MaxCapacity, + ShopFlowers = ShopFlowers + }; + + public XElement GetXElement => new("Shop", + new XAttribute("Id", Id), + new XElement("ShopName", ShopName), + new XElement("Address", Address), + new XElement("DateOpen", DateOpen), + new XElement("MaxCapacity", MaxCapacity), + new XElement("ShopFlowers", Flowers + .Select(x => new XElement("ShopFlower", + new XElement("Key", x.Key), + new XElement("Value", x.Value)) + ).ToArray())); + } +} diff --git a/FlowerShopFileImplement/ShopStorage.cs b/FlowerShopFileImplement/ShopStorage.cs new file mode 100644 index 0000000..c9d41d4 --- /dev/null +++ b/FlowerShopFileImplement/ShopStorage.cs @@ -0,0 +1,133 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; +using FlowerShopFileImplement.Implements; +using FlowerShopFileImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +namespace FlowerShopFileImplement.Implements +{ + public class ShopStorage : IShopStorage + { + private readonly DataFileSingleton _source; + public ShopStorage() + { + _source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return _source.Shops + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(ShopSearchModel + model) + { + if (string.IsNullOrEmpty(model.Name)) + { + return new(); + } + return _source.Shops + .Where(x => x.ShopName.Contains(model.Name)) + .Select(x => x.GetViewModel) + .ToList(); ; + } + public ShopViewModel? GetElement(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.Name) && !model.Id.HasValue) + { + return null; + } + return _source.Shops + .FirstOrDefault(x => + (!string.IsNullOrEmpty(model.Name) && x.ShopName == model.Name) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + public ShopViewModel? Insert(ShopBindingModel model) + { + model.Id = _source.Shops.Count > 0 ? _source.Shops.Max(x => x.Id) + 1 : 1; + var newShop = Shop.Create(model); + if (newShop == null) + { + return null; + } + _source.Shops.Add(newShop); + _source.SaveShops(); + return newShop.GetViewModel; + } + public ShopViewModel? Update(ShopBindingModel model) + { + var component = _source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (component == null) + { + return null; + } + component.Update(model); + _source.SaveShops(); + return component.GetViewModel; + } + public ShopViewModel? Delete(ShopBindingModel model) + { + var element = _source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + _source.Shops.Remove(element); + _source.SaveShops(); + return element.GetViewModel; + } + return null; + } + //проверка наполненности магазинов + public bool CheckAvailability(int flowerId, int count) + { + count -= _source.Shops.Select(x => x.ShopFlowers.Select(y => (y.Value.Item1.Id == flowerId ? y.Value.Item2 : 0)).Sum()).Sum(); + return count <= 0; + } + //логика продажи + public bool SellFlowers(IFlowerModel model, int count) + { + var flower = _source.Flowers.FirstOrDefault(x => x.Id == model.Id); + + if (flower == null || !CheckAvailability(flower.Id, count)) + { + return false; + } + + for (int i = 0; i < _source.Shops.Count; i++) + { + var shop = _source.Shops[i]; + var flowers = shop.ShopFlowers; + + foreach (var flowerr in flowers.Where(x => x.Value.Item1.Id == flower.Id)) + { + var min = Math.Min(flowerr.Value.Item2, count); + flowers[flowerr.Value.Item1.Id] = (flowerr.Value.Item1, flowerr.Value.Item2 - min); + count -= min; + + if (count <= 0) + { + break; + } + } + + shop.Update(new ShopBindingModel + { + Id = shop.Id, + ShopName = shop.ShopName, + Address = shop.Address, + DateOpen = shop.DateOpen, + MaxCapacity = shop.MaxCapacity, + ShopFlowers = flowers + }); + } + _source.SaveShops(); + return true; + } + } +} diff --git a/FlowerShopListImplement/Shop.cs b/FlowerShopListImplement/Shop.cs index e7bba4a..96f42a8 100644 --- a/FlowerShopListImplement/Shop.cs +++ b/FlowerShopListImplement/Shop.cs @@ -15,6 +15,7 @@ namespace FlowerShopListImplement.Models public string ShopName { get; private set; } public string Address { get; private set; } public DateTime DateOpen { get; private set; } + public int MaxCapacity { get; private set; } public Dictionary ShopFlowers { get; private set; } = new(); public static Shop? Create(ShopBindingModel model) diff --git a/FlowerShopListImplement/ShopStorage.cs b/FlowerShopListImplement/ShopStorage.cs index a97253b..b3e8a3a 100644 --- a/FlowerShopListImplement/ShopStorage.cs +++ b/FlowerShopListImplement/ShopStorage.cs @@ -106,5 +106,51 @@ namespace FlowerShopListImplement.Implements return null; } + public bool CheckAvailability(int flowerId, int count) + { + int minus = _source.Shops.Select(x => x.ShopFlowers.Select(y => (y.Value.Item1.Id == flowerId ? y.Value.Item2 : 0)).Sum()).Sum(); + count -= minus; + return count <= 0; + } + + public bool SellFlowers(IFlowerModel model, int count) + { + var flower = _source.Flowers.FirstOrDefault(x => x.Id == model.Id); + + if (flower == null || !CheckAvailability(flower.Id, count)) + { + return false; + } + + for (int i = 0; i < _source.Shops.Count; i++) + { + var shop = _source.Shops[i]; + var flowers = shop.ShopFlowers; + + foreach (var flowerr in flowers.Where(x => x.Value.Item1.Id == flower.Id)) + { + var min = Math.Min(flowerr.Value.Item2, count); + flowers[flowerr.Value.Item1.Id] = (flowerr.Value.Item1, flowerr.Value.Item2 - min); + count -= min; + + if (count <= 0) + { + break; + } + } + + shop.Update(new ShopBindingModel + { + Id = shop.Id, + ShopName = shop.ShopName, + Address = shop.Address, + DateOpen = shop.DateOpen, + MaxCapacity = shop.MaxCapacity, + ShopFlowers = flowers + }); + } + return true; + } + } } diff --git a/ProjectFlowerShop/MainForm.Designer.cs b/ProjectFlowerShop/MainForm.Designer.cs index 40db63c..78536fd 100644 --- a/ProjectFlowerShop/MainForm.Designer.cs +++ b/ProjectFlowerShop/MainForm.Designer.cs @@ -40,6 +40,7 @@ ReadyButton = new Button(); IssuedButton = new Button(); RefreshButton = new Button(); + продажиToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); SuspendLayout(); @@ -56,7 +57,7 @@ // // ToolStripMenu // - ToolStripMenu.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыStripMenuItem, ЦветыStripMenuItem, магазиныToolStripMenuItem, поставкиToolStripMenuItem }); + ToolStripMenu.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыStripMenuItem, ЦветыStripMenuItem, магазиныToolStripMenuItem, поставкиToolStripMenuItem, продажиToolStripMenuItem }); ToolStripMenu.Name = "ToolStripMenu"; ToolStripMenu.Size = new Size(117, 24); ToolStripMenu.Text = "Справочники"; @@ -148,6 +149,13 @@ RefreshButton.UseVisualStyleBackColor = true; RefreshButton.Click += RefreshButton_Click; // + // продажиToolStripMenuItem + // + продажиToolStripMenuItem.Name = "продажиToolStripMenuItem"; + продажиToolStripMenuItem.Size = new Size(224, 26); + продажиToolStripMenuItem.Text = "Продажи"; + продажиToolStripMenuItem.Click += продажиToolStripMenuItem_Click; + // // MainForm // AutoScaleDimensions = new SizeF(8F, 20F); @@ -185,5 +193,6 @@ private Button RefreshButton; private ToolStripMenuItem магазиныToolStripMenuItem; private ToolStripMenuItem поставкиToolStripMenuItem; + private ToolStripMenuItem продажиToolStripMenuItem; } } \ No newline at end of file diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs index 7b6b80d..cf1b07a 100644 --- a/ProjectFlowerShop/MainForm.cs +++ b/ProjectFlowerShop/MainForm.cs @@ -198,5 +198,14 @@ namespace ProjectFlowerShop form.ShowDialog(); } } + + private void продажиToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(SellForm)); + if (service is SellForm form) + { + form.ShowDialog(); + } + } } } diff --git a/ProjectFlowerShop/Program.cs b/ProjectFlowerShop/Program.cs index 19c9645..22ea896 100644 --- a/ProjectFlowerShop/Program.cs +++ b/ProjectFlowerShop/Program.cs @@ -53,6 +53,7 @@ namespace ProjectFlowerShop services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } } diff --git a/ProjectFlowerShop/SellForm.Designer.cs b/ProjectFlowerShop/SellForm.Designer.cs new file mode 100644 index 0000000..f458653 --- /dev/null +++ b/ProjectFlowerShop/SellForm.Designer.cs @@ -0,0 +1,118 @@ +namespace ProjectFlowerShop +{ + partial class SellForm + { + /// + /// 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() + { + labelFlower = new Label(); + labelCount = new Label(); + comboBoxFlower = new ComboBox(); + textBoxCount = new TextBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + SuspendLayout(); + // + // labelFlower + // + labelFlower.AutoSize = true; + labelFlower.Location = new Point(12, 9); + labelFlower.Name = "labelFlower"; + labelFlower.Size = new Size(53, 20); + labelFlower.TabIndex = 0; + labelFlower.Text = "Цветы"; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(12, 87); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(90, 20); + labelCount.TabIndex = 1; + labelCount.Text = "Количество"; + // + // comboBoxFlower + // + comboBoxFlower.FormattingEnabled = true; + comboBoxFlower.Location = new Point(12, 32); + comboBoxFlower.Name = "comboBoxFlower"; + comboBoxFlower.Size = new Size(151, 28); + comboBoxFlower.TabIndex = 2; + // + // textBoxCount + // + textBoxCount.Location = new Point(12, 110); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(151, 27); + textBoxCount.TabIndex = 3; + // + // buttonCancel + // + buttonCancel.Location = new Point(277, 153); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 4; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(180, 153); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 5; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // SellForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(383, 198); + Controls.Add(buttonSave); + Controls.Add(buttonCancel); + Controls.Add(textBoxCount); + Controls.Add(comboBoxFlower); + Controls.Add(labelCount); + Controls.Add(labelFlower); + Name = "SellForm"; + Text = "Продажи"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelFlower; + private Label labelCount; + private ComboBox comboBoxFlower; + private TextBox textBoxCount; + private Button buttonCancel; + private Button buttonSave; + } +} \ No newline at end of file diff --git a/ProjectFlowerShop/SellForm.cs b/ProjectFlowerShop/SellForm.cs new file mode 100644 index 0000000..36169f1 --- /dev/null +++ b/ProjectFlowerShop/SellForm.cs @@ -0,0 +1,122 @@ +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectFlowerShop +{ + public partial class SellForm : Form + { + private readonly List? _flowerList; + IShopLogic _shopLogic; + IFlowerLogic _flowerLogic; + public SellForm(IFlowerLogic flowerLogic, IShopLogic shopLogic) + { + InitializeComponent(); + _shopLogic = shopLogic; + _flowerLogic = flowerLogic; + _flowerList = flowerLogic.ReadList(null); + if (_flowerList != null) + { + comboBoxFlower.DisplayMember = "FlowerName"; + comboBoxFlower.ValueMember = "Id"; + comboBoxFlower.DataSource = _flowerList; + comboBoxFlower.SelectedItem = null; + } + } + public int FlowerId + { + get + { + return Convert.ToInt32(comboBoxFlower.SelectedValue); + } + set + { + comboBoxFlower.SelectedValue = value; + } + } + + public IFlowerModel? FlowerModel + { + get + { + if (_flowerList == null) + { + return null; + } + foreach (var elem in _flowerList) + { + if (elem.Id == FlowerId) + { + return elem; + } + } + return null; + } + } + + + public int Count + { + get { return Convert.ToInt32(textBoxCount.Text); } + set + { textBoxCount.Text = value.ToString(); } + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxFlower.SelectedValue == null) + { + MessageBox.Show("Выберите цветы", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + try + { + int count = Convert.ToInt32(textBoxCount.Text); + + bool res = _shopLogic.MakeSell( + _flowerLogic.ReadElement(new() { Id = Convert.ToInt32(comboBoxFlower.SelectedValue) }), + count + ); + + if (!res) + { + throw new Exception("Ошибка при продаже."); + } + + MessageBox.Show("Продажа прошла успешно"); + DialogResult = DialogResult.OK; + Close(); + + } + catch (Exception err) + { + MessageBox.Show("Ошибка продажи"); + return; + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/ProjectFlowerShop/SellForm.resx b/ProjectFlowerShop/SellForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectFlowerShop/SellForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/ProjectFlowerShop/ShopForm.Designer.cs b/ProjectFlowerShop/ShopForm.Designer.cs index ffdac20..64f568d 100644 --- a/ProjectFlowerShop/ShopForm.Designer.cs +++ b/ProjectFlowerShop/ShopForm.Designer.cs @@ -28,7 +28,12 @@ /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShopForm)); DataGridView = new DataGridView(); + ColumnID = new DataGridViewTextBoxColumn(); + Name = new DataGridViewTextBoxColumn(); + Price = new DataGridViewTextBoxColumn(); + Number = new DataGridViewTextBoxColumn(); buttonSave = new Button(); buttonCancel = new Button(); textBoxName = new TextBox(); @@ -37,126 +42,100 @@ labelAddress = new Label(); DateTimePicker = new DateTimePicker(); labelDate = new Label(); - ColumnID = new DataGridViewTextBoxColumn(); - Name = new DataGridViewTextBoxColumn(); - Price = new DataGridViewTextBoxColumn(); - Number = new DataGridViewTextBoxColumn(); + CapacityUpDown = new NumericUpDown(); + labelCapacity = new Label(); ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); + ((System.ComponentModel.ISupportInitialize)CapacityUpDown).BeginInit(); SuspendLayout(); // // DataGridView // DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; DataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnID, Name, Price, Number }); - DataGridView.Location = new Point(21, 12); + resources.ApplyResources(DataGridView, "DataGridView"); DataGridView.Name = "DataGridView"; - DataGridView.RowHeadersWidth = 51; DataGridView.RowTemplate.Height = 29; - DataGridView.Size = new Size(397, 305); - DataGridView.TabIndex = 0; + // + // ColumnID + // + resources.ApplyResources(ColumnID, "ColumnID"); + ColumnID.Name = "ColumnID"; + // + // Name + // + resources.ApplyResources(Name, "Name"); + Name.Name = "Name"; + // + // Price + // + resources.ApplyResources(Price, "Price"); + Price.Name = "Price"; + // + // Number + // + resources.ApplyResources(Number, "Number"); + Number.Name = "Number"; // // buttonSave // - buttonSave.Location = new Point(424, 288); + resources.ApplyResources(buttonSave, "buttonSave"); buttonSave.Name = "buttonSave"; - buttonSave.Size = new Size(123, 29); - buttonSave.TabIndex = 1; - buttonSave.Text = "Сохранить"; buttonSave.UseVisualStyleBackColor = true; buttonSave.Click += buttonSave_Click; // // buttonCancel // - buttonCancel.Location = new Point(553, 288); + resources.ApplyResources(buttonCancel, "buttonCancel"); buttonCancel.Name = "buttonCancel"; - buttonCancel.Size = new Size(116, 29); - buttonCancel.TabIndex = 2; - buttonCancel.Text = "Отмена"; buttonCancel.UseVisualStyleBackColor = true; buttonCancel.Click += buttonCancel_Click; // // textBoxName // - textBoxName.Location = new Point(424, 34); + resources.ApplyResources(textBoxName, "textBoxName"); textBoxName.Name = "textBoxName"; - textBoxName.Size = new Size(245, 27); - textBoxName.TabIndex = 3; // // textBoxAddress // - textBoxAddress.Location = new Point(424, 95); + resources.ApplyResources(textBoxAddress, "textBoxAddress"); textBoxAddress.Name = "textBoxAddress"; - textBoxAddress.Size = new Size(245, 27); - textBoxAddress.TabIndex = 4; // // labelName // - labelName.AutoSize = true; - labelName.Location = new Point(424, 12); + resources.ApplyResources(labelName, "labelName"); labelName.Name = "labelName"; - labelName.Size = new Size(77, 20); - labelName.TabIndex = 5; - labelName.Text = "Название"; // // labelAddress // - labelAddress.AutoSize = true; - labelAddress.Location = new Point(424, 72); + resources.ApplyResources(labelAddress, "labelAddress"); labelAddress.Name = "labelAddress"; - labelAddress.Size = new Size(51, 20); - labelAddress.TabIndex = 6; - labelAddress.Text = "Адрес"; // // DateTimePicker // - DateTimePicker.Location = new Point(424, 148); + resources.ApplyResources(DateTimePicker, "DateTimePicker"); DateTimePicker.Name = "DateTimePicker"; - DateTimePicker.Size = new Size(245, 27); - DateTimePicker.TabIndex = 7; // // labelDate // - labelDate.AutoSize = true; - labelDate.Location = new Point(424, 125); + resources.ApplyResources(labelDate, "labelDate"); labelDate.Name = "labelDate"; - labelDate.Size = new Size(41, 20); - labelDate.TabIndex = 8; - labelDate.Text = "Дата"; // - // ColumnID + // CapacityUpDown // - ColumnID.HeaderText = "ColumnID"; - ColumnID.MinimumWidth = 6; - ColumnID.Name = "ColumnID"; - ColumnID.Visible = false; - ColumnID.Width = 125; + resources.ApplyResources(CapacityUpDown, "CapacityUpDown"); + CapacityUpDown.Name = "CapacityUpDown"; // - // Name + // labelCapacity // - Name.HeaderText = "Название"; - Name.MinimumWidth = 6; - Name.Name = "Name"; - Name.Width = 125; - // - // Price - // - Price.HeaderText = "Цена"; - Price.MinimumWidth = 6; - Price.Name = "Price"; - Price.Width = 125; - // - // Number - // - Number.HeaderText = "Количество"; - Number.MinimumWidth = 6; - Number.Name = "Number"; - Number.Width = 125; + resources.ApplyResources(labelCapacity, "labelCapacity"); + labelCapacity.Name = "labelCapacity"; // // ShopForm // - AutoScaleDimensions = new SizeF(8F, 20F); + resources.ApplyResources(this, "$this"); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(681, 329); + Controls.Add(labelCapacity); + Controls.Add(CapacityUpDown); Controls.Add(labelDate); Controls.Add(DateTimePicker); Controls.Add(labelAddress); @@ -166,10 +145,9 @@ Controls.Add(buttonCancel); Controls.Add(buttonSave); Controls.Add(DataGridView); - //Name = "ShopForm"; - Text = "ShopForm"; Load += ShopForm_Load; ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); + ((System.ComponentModel.ISupportInitialize)CapacityUpDown).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -189,5 +167,7 @@ private DataGridViewTextBoxColumn Name; private DataGridViewTextBoxColumn Price; private DataGridViewTextBoxColumn Number; + private NumericUpDown CapacityUpDown; + private Label labelCapacity; } } \ No newline at end of file diff --git a/ProjectFlowerShop/ShopForm.agq-CM.resx b/ProjectFlowerShop/ShopForm.agq-CM.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ProjectFlowerShop/ShopForm.agq-CM.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/ProjectFlowerShop/ShopForm.cs b/ProjectFlowerShop/ShopForm.cs index 90f1a02..a982d9a 100644 --- a/ProjectFlowerShop/ShopForm.cs +++ b/ProjectFlowerShop/ShopForm.cs @@ -71,7 +71,7 @@ namespace ProjectFlowerShop ShopName = textBoxName.Text, Address = textBoxAddress.Text, DateOpen = DateTimePicker.Value.Date, - ShopFlowers = _flowers + MaxCapacity = Convert.ToInt32(CapacityUpDown.Value), }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) @@ -108,7 +108,8 @@ namespace ProjectFlowerShop textBoxName.Text = shop.ShopName; textBoxAddress.Text = shop.Address; DateTimePicker.Text = shop.DateOpen.ToString(); - _flowers = shop.ShopFlowers; + CapacityUpDown.Value = shop.MaxCapacity; + _flowers = shop.ShopFlowers ?? new Dictionary(); } LoadData(); } diff --git a/ProjectFlowerShop/ShopForm.resx b/ProjectFlowerShop/ShopForm.resx index e4ea5ef..9158edf 100644 --- a/ProjectFlowerShop/ShopForm.resx +++ b/ProjectFlowerShop/ShopForm.resx @@ -120,13 +120,360 @@ True + + ColumnID + + + + 6 + + + False + + + 125 + True + + Название + + + 6 + + + 125 + True + + Цена + + + 6 + + + 125 + True + + Количество + + + 6 + + + 125 + + + + 21, 12 + + + 51 + + + 397, 305 + + + 0 + + + DataGridView + + + System.Windows.Forms.DataGridView, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + 424, 288 + + + 123, 29 + + + 1 + + + Сохранить + + + buttonSave + + + System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + 553, 288 + + + 116, 29 + + + 2 + + + Отмена + + + buttonCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + 424, 34 + + + 245, 27 + + + 3 + + + textBoxName + + + System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + 424, 95 + + + 245, 27 + + + 4 + + + textBoxAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + True + + + 424, 12 + + + 77, 20 + + + 5 + + + Название + + + labelName + + + System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 424, 72 + + + 51, 20 + + + 6 + + + Адрес + + + labelAddress + + + System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 424, 148 + + + 245, 27 + + + 7 + + + DateTimePicker + + + System.Windows.Forms.DateTimePicker, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 424, 125 + + + 41, 20 + + + 8 + + + Дата + + + labelDate + + + System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 424, 207 + + + 245, 27 + + + 9 + + + CapacityUpDown + + + System.Windows.Forms.NumericUpDown, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 424, 184 + + + 100, 20 + + + 10 + + + Вместимость + + + labelCapacity + + + System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 8, 20 + + + 681, 329 + + + Магазин + + + ColumnID + + + System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Name + + + System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Price + + + System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Number + + + System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShopForm + + + System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file