diff --git a/.gitignore b/.gitignore index ca1c7a3..710a2d5 100644 --- a/.gitignore +++ b/.gitignore @@ -398,3 +398,4 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml +/CarpentryWorkshop/ImplementationExtensions diff --git a/CarpentryWorkshop/CarpentryWorkshop.sln b/CarpentryWorkshop/CarpentryWorkshop.sln index 8003ba3..26adb34 100644 --- a/CarpentryWorkshop/CarpentryWorkshop.sln +++ b/CarpentryWorkshop/CarpentryWorkshop.sln @@ -5,13 +5,15 @@ VisualStudioVersion = 17.7.34024.191 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopView", "CarpentryWorkshop\CarpentryWorkshopView.csproj", "{98E796E8-D77E-4A5D-BB64-1C4029C51360}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopDataModels", "CarpentryWorkshopDataModels\CarpentryWorkshopDataModels.csproj", "{E4AD7D91-C944-486B-891A-32D402EE6AD8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopDataModels", "CarpentryWorkshopDataModels\CarpentryWorkshopDataModels.csproj", "{E4AD7D91-C944-486B-891A-32D402EE6AD8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopContracts", "CarpentryWorkshopContracts\CarpentryWorkshopContracts.csproj", "{E1F5F636-7BA7-49CA-AF95-D36D1C55FD0E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopContracts", "CarpentryWorkshopContracts\CarpentryWorkshopContracts.csproj", "{E1F5F636-7BA7-49CA-AF95-D36D1C55FD0E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopListImplement", "CarpentryWorkshopListImplement\CarpentryWorkshopListImplement.csproj", "{8778E6ED-03D0-4073-B61E-8ED7FF2DC420}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopListImplement", "CarpentryWorkshopListImplement\CarpentryWorkshopListImplement.csproj", "{8778E6ED-03D0-4073-B61E-8ED7FF2DC420}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopBusinessLogic", "CarpentryWorkshopBusinessLogic\CarpentryWorkshopBusinessLogic.csproj", "{4D7EFA75-B5DC-4287-A50D-73405118D4A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CarpentryWorkshopBusinessLogic", "CarpentryWorkshopBusinessLogic\CarpentryWorkshopBusinessLogic.csproj", "{4D7EFA75-B5DC-4287-A50D-73405118D4A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CarpentryWorkshopFileImplement", "CarpentryWorkshopFileImplement\CarpentryWorkshopFileImplement.csproj", "{6EFF6C01-263D-4D25-806A-1DC593820AB1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +41,10 @@ Global {4D7EFA75-B5DC-4287-A50D-73405118D4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {4D7EFA75-B5DC-4287-A50D-73405118D4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D7EFA75-B5DC-4287-A50D-73405118D4A0}.Release|Any CPU.Build.0 = Release|Any CPU + {6EFF6C01-263D-4D25-806A-1DC593820AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EFF6C01-263D-4D25-806A-1DC593820AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EFF6C01-263D-4D25-806A-1DC593820AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EFF6C01-263D-4D25-806A-1DC593820AB1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshopView.csproj b/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshopView.csproj index 1bf66cf..0fa3d84 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshopView.csproj +++ b/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshopView.csproj @@ -27,6 +27,7 @@ + diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormMain.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormMain.Designer.cs index 453a582..e50250d 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormMain.Designer.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormMain.Designer.cs @@ -32,6 +32,7 @@ справочникиToolStripMenuItem = new ToolStripMenuItem(); КомпонентыToolStripMenuItem = new ToolStripMenuItem(); ИзделияToolStripMenuItem = new ToolStripMenuItem(); + продажиToolStripMenuItem = new ToolStripMenuItem(); магазиныToolStripMenuItem = new ToolStripMenuItem(); поставкиToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); @@ -56,7 +57,7 @@ // // справочникиToolStripMenuItem // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыToolStripMenuItem, ИзделияToolStripMenuItem, магазиныToolStripMenuItem, поставкиToolStripMenuItem }); + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыToolStripMenuItem, ИзделияToolStripMenuItem, магазиныToolStripMenuItem, поставкиToolStripMenuItem, продажиToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; справочникиToolStripMenuItem.Size = new Size(94, 20); справочникиToolStripMenuItem.Text = "Справочники"; @@ -89,6 +90,13 @@ поставкиToolStripMenuItem.Text = "Поставки"; поставкиToolStripMenuItem.Click += поставкиToolStripMenuItem_Click; // + // продажиToolStripMenuItem + // + продажиToolStripMenuItem.Name = "продажиToolStripMenuItem"; + продажиToolStripMenuItem.Size = new Size(180, 22); + продажиToolStripMenuItem.Text = "Продажи"; + продажиToolStripMenuItem.Click += продажиToolStripMenuItem_Click; + // // dataGridView // dataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; @@ -193,5 +201,6 @@ private ToolStripMenuItem ИзделияToolStripMenuItem; private ToolStripMenuItem магазиныToolStripMenuItem; private ToolStripMenuItem поставкиToolStripMenuItem; + private ToolStripMenuItem продажиToolStripMenuItem; } } \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormMain.cs b/CarpentryWorkshop/CarpentryWorkshop/FormMain.cs index 3a3039d..e7ad7c8 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormMain.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormMain.cs @@ -169,5 +169,13 @@ namespace CarpentryWorkshopView form.ShowDialog(); } } + private void продажиToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormWoodSale)); + if (service is FormWoodSale form) + { + form.ShowDialog(); + } + } } } diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormSell.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormSell.Designer.cs new file mode 100644 index 0000000..945e17b --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormSell.Designer.cs @@ -0,0 +1,117 @@ +namespace CarpentryWorkshopView +{ + partial class FormSell + { + /// + /// 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() + { + WoodComboBox = new ComboBox(); + WoodLabel = new Label(); + CountLabel = new Label(); + CountTextBox = new TextBox(); + SaveButton = new Button(); + CancelButton = new Button(); + SuspendLayout(); + // + // WoodComboBox + // + WoodComboBox.FormattingEnabled = true; + WoodComboBox.Location = new Point(99, 12); + WoodComboBox.Name = "WoodComboBox"; + WoodComboBox.Size = new Size(121, 23); + WoodComboBox.TabIndex = 0; + // + // WoodLabel + // + WoodLabel.AutoSize = true; + WoodLabel.Location = new Point(12, 20); + WoodLabel.Name = "WoodLabel"; + WoodLabel.Size = new Size(81, 15); + WoodLabel.TabIndex = 1; + WoodLabel.Text = "Изделие"; + // + // CountLabel + // + CountLabel.AutoSize = true; + CountLabel.Location = new Point(21, 49); + CountLabel.Name = "CountLabel"; + CountLabel.Size = new Size(72, 15); + CountLabel.TabIndex = 2; + CountLabel.Text = "Количество"; + // + // CountTextBox + // + CountTextBox.Location = new Point(99, 41); + CountTextBox.Name = "CountTextBox"; + CountTextBox.Size = new Size(121, 23); + CountTextBox.TabIndex = 3; + // + // SaveButton + // + SaveButton.Location = new Point(64, 73); + SaveButton.Name = "SaveButton"; + SaveButton.Size = new Size(75, 23); + SaveButton.TabIndex = 4; + SaveButton.Text = "Сохранить"; + SaveButton.UseVisualStyleBackColor = true; + SaveButton.Click += SaveButton_Click; + // + // CancelButton + // + CancelButton.Location = new Point(145, 73); + CancelButton.Name = "CancelButton"; + CancelButton.Size = new Size(75, 23); + CancelButton.TabIndex = 5; + CancelButton.Text = "Отмена"; + CancelButton.UseVisualStyleBackColor = true; + // + // FormSell + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(224, 108); + Controls.Add(CancelButton); + Controls.Add(SaveButton); + Controls.Add(CountTextBox); + Controls.Add(CountLabel); + Controls.Add(WoodLabel); + Controls.Add(WoodComboBox); + Name = "FormSell"; + Text = "Форма продажи"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private ComboBox WoodComboBox; + private Label WoodLabel; + private Label CountLabel; + private TextBox CountTextBox; + private Button SaveButton; + private Button CancelButton; + } +} \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormSell.cs b/CarpentryWorkshop/CarpentryWorkshop/FormSell.cs new file mode 100644 index 0000000..89c3d3d --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormSell.cs @@ -0,0 +1,115 @@ +using CarpentryWorkshopContracts.BusinessLogicsContracts; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopDataModels.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 CarpentryWorkshopView +{ + public partial class FormSell : Form + { + private readonly List? _woodList; + IShopLogic _shopLogic; + IWoodLogic _woodLogic; + public FormSell(IWoodLogic woodLogic, IShopLogic shopLogic) + { + InitializeComponent(); + _shopLogic = shopLogic; + _woodLogic = woodLogic; + _woodList = woodLogic.ReadList(null); + if (_woodList != null) + { + WoodComboBox.DisplayMember = "WoodName"; + WoodComboBox.ValueMember = "Id"; + WoodComboBox.DataSource = _woodList; + WoodComboBox.SelectedItem = null; + } + } + public int WoodId + { + get + { + return Convert.ToInt32(WoodComboBox.SelectedValue); + } + set + { + WoodComboBox.SelectedValue = value; + } + } + + public IWoodModel? WoodModel + { + get + { + if (_woodList == null) + { + return null; + } + foreach (var elem in _woodList) + { + if (elem.Id == WoodId) + { + return elem; + } + } + return null; + } + } + + + public int Count + { + get { return Convert.ToInt32(CountTextBox.Text); } + set + { CountTextBox.Text = value.ToString(); } + } + + private void SaveButton_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(CountTextBox.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (WoodComboBox.SelectedValue == null) + { + MessageBox.Show("Выберите изделие", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + try + { + int count = Convert.ToInt32(CountTextBox.Text); + + bool res = _shopLogic.MakeSell( + _woodLogic.ReadElement(new() { Id = Convert.ToInt32(WoodComboBox.SelectedValue) }), + count + ); + + if (!res) + { + throw new Exception("Ошибка при продаже."); + } + + MessageBox.Show("Продажа прошла успешно"); + DialogResult = DialogResult.OK; + Close(); + + } + catch (Exception err) + { + MessageBox.Show("Ошибка продажи"); + return; + } + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormSell.resx b/CarpentryWorkshop/CarpentryWorkshop/FormSell.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormSell.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/CarpentryWorkshop/CarpentryWorkshop/FormShop.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormShop.Designer.cs index a11fedc..5a8b4ca 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormShop.Designer.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormShop.Designer.cs @@ -41,7 +41,10 @@ Название = new DataGridViewTextBoxColumn(); Цена = new DataGridViewTextBoxColumn(); Количество = new DataGridViewTextBoxColumn(); + CapacityUpDown = new NumericUpDown(); + CapacityLabel = new Label(); ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); + ((System.ComponentModel.ISupportInitialize)CapacityUpDown).BeginInit(); SuspendLayout(); // // DateTimePicker @@ -94,42 +97,46 @@ // // SaveButton // - SaveButton.Location = new Point(247, 255); + SaveButton.Location = new Point(247, 284); SaveButton.Name = "SaveButton"; SaveButton.Size = new Size(75, 23); SaveButton.TabIndex = 6; SaveButton.Text = "Сохранить"; SaveButton.UseVisualStyleBackColor = true; - SaveButton.Click += SaveButton_Click; + SaveButton.Click += ButtonSave_Click; // // CancelButton // - CancelButton.Location = new Point(328, 255); + CancelButton.Location = new Point(328, 284); CancelButton.Name = "CancelButton"; CancelButton.Size = new Size(75, 23); CancelButton.TabIndex = 7; CancelButton.Text = "Отмена"; CancelButton.UseVisualStyleBackColor = true; - CancelButton.Click += CancelButton_Click; + CancelButton.Click += ButtonCancel_Click; // // DataGridView // DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; DataGridView.Columns.AddRange(new DataGridViewColumn[] { Column1, Название, Цена, Количество }); - DataGridView.Location = new Point(12, 99); + DataGridView.Location = new Point(12, 128); DataGridView.Name = "DataGridView"; + DataGridView.RowHeadersWidth = 51; DataGridView.Size = new Size(391, 150); DataGridView.TabIndex = 8; // // Column1 // Column1.HeaderText = "Column1"; + Column1.MinimumWidth = 6; Column1.Name = "Column1"; Column1.Visible = false; + Column1.Width = 125; // // Название // Название.HeaderText = "Название"; + Название.MinimumWidth = 6; Название.Name = "Название"; Название.ReadOnly = true; Название.Width = 150; @@ -137,20 +144,43 @@ // Цена // Цена.HeaderText = "Цена"; + Цена.MinimumWidth = 6; Цена.Name = "Цена"; Цена.ReadOnly = true; + Цена.Width = 125; // // Количество // Количество.HeaderText = "Количество"; + Количество.MinimumWidth = 6; Количество.Name = "Количество"; Количество.ReadOnly = true; + Количество.Width = 125; // - // ShopForm + // CapacityUpDown + // + CapacityUpDown.Location = new Point(98, 99); + CapacityUpDown.Maximum = new decimal(new int[] { 10000, 0, 0, 0 }); + CapacityUpDown.Name = "CapacityUpDown"; + CapacityUpDown.Size = new Size(120, 23); + CapacityUpDown.TabIndex = 9; + // + // CapacityLabel + // + CapacityLabel.AutoSize = true; + CapacityLabel.Location = new Point(12, 107); + CapacityLabel.Name = "CapacityLabel"; + CapacityLabel.Size = new Size(80, 15); + CapacityLabel.TabIndex = 10; + CapacityLabel.Text = "Вместимость"; + // + // FormShop // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(411, 285); + ClientSize = new Size(411, 315); + Controls.Add(CapacityLabel); + Controls.Add(CapacityUpDown); Controls.Add(DataGridView); Controls.Add(CancelButton); Controls.Add(SaveButton); @@ -160,14 +190,16 @@ Controls.Add(AddressTextBox); Controls.Add(NameTextBox); Controls.Add(DateTimePicker); - Name = "ShopForm"; - Text = "ShopForm"; - Load += ShopForm_Load; + Name = "FormShop"; + Text = "Форма магазина"; + Load += FormShop_Load; ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); + ((System.ComponentModel.ISupportInitialize)CapacityUpDown).EndInit(); ResumeLayout(false); PerformLayout(); } + #endregion private DateTimePicker DateTimePicker; @@ -183,5 +215,7 @@ private DataGridViewTextBoxColumn Название; private DataGridViewTextBoxColumn Цена; private DataGridViewTextBoxColumn Количество; + private NumericUpDown CapacityUpDown; + private Label CapacityLabel; } } \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormShop.cs b/CarpentryWorkshop/CarpentryWorkshop/FormShop.cs index 0076e41..745c9c9 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormShop.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormShop.cs @@ -3,76 +3,78 @@ using CarpentryWorkshopContracts.BusinessLogicsContracts; using CarpentryWorkshopContracts.SearchModels; using CarpentryWorkshopDataModels.Models; using Microsoft.Extensions.Logging; +using System.Windows.Forms; namespace CarpentryWorkshopView { public partial class FormShop : Form { private readonly ILogger _logger; + private readonly IShopLogic _logic; - public int? _id; - private Dictionary _woods; + + private int? _id; + + private Dictionary _shopWoods; + + public int Id { set { _id = value; } } + public FormShop(ILogger logger, IShopLogic logic) { InitializeComponent(); _logger = logger; _logic = logic; + _shopWoods = new Dictionary(); } - private void ShopForm_Load(object sender, EventArgs e) + private void FormShop_Load(object sender, EventArgs e) { if (_id.HasValue) { - _logger.LogInformation("Загрузка магазина"); + _logger.LogInformation("Shop loading"); try { - var shop = _logic.ReadElement(new ShopSearchModel { Id = _id }); - if (shop != null) + var view = _logic.ReadElement(new ShopSearchModel { Id = _id.Value }); + if (view != null) { - NameTextBox.Text = shop.ShopName; - AddressTextBox.Text = shop.Address; - DateTimePicker.Text = shop.DateOpen.ToString(); - _woods = shop.ShopWoods; + NameTextBox.Text = view.ShopName; + AddressTextBox.Text = view.Address; + DateTimePicker.Value = view.DateOpen; + CapacityUpDown.Text = view.WoodMaxCount.ToString(); + _shopWoods = view.ShopWoods ?? new Dictionary(); + LoadData(); } - LoadData(); } catch (Exception ex) { - _logger.LogError(ex, "Ошибка загрузки магазина"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + _logger.LogError(ex, "Shop loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void LoadData() { - _logger.LogInformation("Загрузка товаров магазина"); + _logger.LogInformation("Shop ice creams loading"); try { - if (_woods != null) + if (_shopWoods != null) { - foreach (var wood in _woods) + DataGridView.Rows.Clear(); + foreach (var wood in _shopWoods) { - DataGridView.Rows.Add(new object[] { wood.Key, wood.Value.Item1.WoodName, wood.Value.Item1.Price, wood.Value.Item2 }); + DataGridView.Rows.Add(new object[] { wood.Key, wood.Value.Item1.WoodName, wood.Value.Item1.Price,wood.Value.Item2 }); } } } catch (Exception ex) { - _logger.LogError(ex, "Ошибка загрузки изделий магазина"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + _logger.LogError(ex, "Shop ice creams loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void CancelButton_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - - private void SaveButton_Click(object sender, EventArgs e) + private void ButtonSave_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(NameTextBox.Text)) { @@ -84,7 +86,17 @@ namespace CarpentryWorkshopView MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - _logger.LogInformation("Сохранение магазина"); + if (string.IsNullOrEmpty(DateTimePicker.Text)) + { + MessageBox.Show("Заполните дату", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(CapacityUpDown.Text)) + { + MessageBox.Show("Заполните максимальное количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Shop saving"); try { var model = new ShopBindingModel @@ -92,8 +104,9 @@ namespace CarpentryWorkshopView Id = _id ?? 0, ShopName = NameTextBox.Text, Address = AddressTextBox.Text, - DateOpen = DateTimePicker.Value.Date, - ShopWoods = _woods + DateOpen = DateTimePicker.Value, + WoodMaxCount = Convert.ToInt32(CapacityUpDown.Text), + ShopWoods = _shopWoods }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) @@ -106,9 +119,15 @@ namespace CarpentryWorkshopView } catch (Exception ex) { - _logger.LogError(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/CarpentryWorkshop/CarpentryWorkshop/FormShops.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormShops.Designer.cs index ec39f29..b1ec242 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormShops.Designer.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormShops.Designer.cs @@ -52,7 +52,7 @@ AddButton.TabIndex = 1; AddButton.Text = "Добавить"; AddButton.UseVisualStyleBackColor = true; - AddButton.Click += AddButton_Click; + AddButton.Click += ButtonAdd_Click; // // UpdateButton // @@ -62,7 +62,7 @@ UpdateButton.TabIndex = 2; UpdateButton.Text = "Изменить"; UpdateButton.UseVisualStyleBackColor = true; - UpdateButton.Click += UpdateButton_Click; + UpdateButton.Click += ButtonEdit_Click; // // RefreshButton // @@ -72,7 +72,7 @@ RefreshButton.TabIndex = 3; RefreshButton.Text = "Обновить"; RefreshButton.UseVisualStyleBackColor = true; - RefreshButton.Click += RefreshButton_Click; + RefreshButton.Click += ButtonUpd_Click; // // DeleteButton // @@ -82,7 +82,7 @@ DeleteButton.TabIndex = 4; DeleteButton.Text = "Удалить"; DeleteButton.UseVisualStyleBackColor = true; - DeleteButton.Click += DeleteButton_Click; + DeleteButton.Click += ButtonDel_Click; // // ShopsForm // @@ -94,9 +94,9 @@ Controls.Add(UpdateButton); Controls.Add(AddButton); Controls.Add(DataGridView); - Name = "ShopsForm"; - Text = "ShopsForm"; - Load += ShopsForm_Load; + Name = "FormShops"; + Text = "FormShops"; + Load += FormShops_Load; ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); ResumeLayout(false); } diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormShops.cs b/CarpentryWorkshop/CarpentryWorkshop/FormShops.cs index cbe1cd6..76ae5c2 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormShops.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormShops.cs @@ -2,19 +2,28 @@ using CarpentryWorkshopContracts.BindingModels; using CarpentryWorkshopContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; +using System.Windows.Forms; namespace CarpentryWorkshopView { 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 @@ -25,25 +34,18 @@ namespace CarpentryWorkshopView DataGridView.DataSource = list; DataGridView.Columns["Id"].Visible = false; DataGridView.Columns["ShopName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Address"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["DateOpen"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; DataGridView.Columns["ShopWoods"].Visible = false; } - _logger.LogInformation("Загрузка магазинов"); + _logger.LogInformation("Shops loading"); } catch (Exception ex) { - _logger.LogError(ex, "Ошибка загрузки магазинов"); + _logger.LogError(ex, "Shops loading error"); MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void ShopsForm_Load(object sender, EventArgs e) - { - LoadData(); - } - - private void AddButton_Click(object sender, EventArgs e) + private void ButtonAdd_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormShop)); if (service is FormShop form) @@ -55,15 +57,14 @@ namespace CarpentryWorkshopView } } - private void UpdateButton_Click(object sender, EventArgs e) + 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) { - var tmp = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); - form._id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); if (form.ShowDialog() == DialogResult.OK) { LoadData(); @@ -72,25 +73,17 @@ namespace CarpentryWorkshopView } } - private void RefreshButton_Click(object sender, EventArgs e) - { - LoadData(); - } - - private void DeleteButton_Click(object sender, EventArgs e) + 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("Удаление магазина"); + _logger.LogInformation("Deletion of shop"); try { - if (!_logic.Delete(new ShopBindingModel - { - Id = id - })) + if (!_logic.Delete(new ShopBindingModel { Id = id })) { throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); } @@ -98,11 +91,16 @@ namespace CarpentryWorkshopView } catch (Exception ex) { - _logger.LogError(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/CarpentryWorkshop/CarpentryWorkshop/FormSupply.cs b/CarpentryWorkshop/CarpentryWorkshop/FormSupply.cs index ba71e4b..8297b97 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/FormSupply.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/FormSupply.cs @@ -25,8 +25,7 @@ namespace CarpentryWorkshopView { get { - return - Convert.ToInt32(ShopComboBox.SelectedValue); + return Convert.ToInt32(ShopComboBox.SelectedValue); } set { @@ -37,8 +36,7 @@ namespace CarpentryWorkshopView { get { - return - Convert.ToInt32(WoodComboBox.SelectedValue); + return Convert.ToInt32(WoodComboBox.SelectedValue); } set { @@ -120,12 +118,11 @@ namespace CarpentryWorkshopView { int count = Convert.ToInt32(CountTextBox.Text); - bool res = _shopLogic.MakeSupply(new SupplyBindingModel - { - ShopId = Convert.ToInt32(ShopComboBox.SelectedValue), - WoodId = Convert.ToInt32(WoodComboBox.SelectedValue), - Count = Convert.ToInt32(CountTextBox.Text) - }); + bool res = _shopLogic.MakeSupply( + new ShopSearchModel() { Id = Convert.ToInt32(ShopComboBox.SelectedValue) }, + _woodLogic.ReadElement(new() { Id = Convert.ToInt32(WoodComboBox.SelectedValue) }), + count + ); if (!res) { diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.Designer.cs new file mode 100644 index 0000000..df9ee7a --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.Designer.cs @@ -0,0 +1,127 @@ +namespace CarpentryWorkshopView +{ + partial class FormWoodSale + { + /// + /// 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() + { + buttonCancel = new Button(); + buttonSale = new Button(); + textBoxCount = new TextBox(); + labelCount = new Label(); + comboBoxWood = new ComboBox(); + labelWood = new Label(); + SuspendLayout(); + // + // buttonCancel + // + buttonCancel.Location = new Point(253, 83); + buttonCancel.Margin = new Padding(4, 3, 4, 3); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(88, 27); + buttonCancel.TabIndex = 17; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSale + // + buttonSale.Location = new Point(159, 83); + buttonSale.Margin = new Padding(4, 3, 4, 3); + buttonSale.Name = "buttonSale"; + buttonSale.Size = new Size(88, 27); + buttonSale.TabIndex = 16; + buttonSale.Text = "Продать"; + buttonSale.UseVisualStyleBackColor = true; + buttonSale.Click += ButtonSale_Click; + // + // textBoxCount + // + textBoxCount.Location = new Point(101, 51); + textBoxCount.Margin = new Padding(4, 3, 4, 3); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(252, 23); + textBoxCount.TabIndex = 15; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(13, 54); + labelCount.Margin = new Padding(4, 0, 4, 0); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(78, 15); + labelCount.TabIndex = 14; + labelCount.Text = "Количество :"; + // + // comboBoxWood + // + comboBoxWood.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxWood.FormattingEnabled = true; + comboBoxWood.Location = new Point(101, 15); + comboBoxWood.Margin = new Padding(4, 3, 4, 3); + comboBoxWood.Name = "comboBoxWood"; + comboBoxWood.Size = new Size(252, 23); + comboBoxWood.TabIndex = 13; + // + // labelWood + // + labelWood.AutoSize = true; + labelWood.Location = new Point(13, 19); + labelWood.Margin = new Padding(4, 0, 4, 0); + labelWood.Name = "labelWood"; + labelWood.Size = new Size(80, 15); + labelWood.TabIndex = 12; + labelWood.Text = "Изделие :"; + // + // FormWoodSale + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(373, 123); + Controls.Add(buttonCancel); + Controls.Add(buttonSale); + Controls.Add(textBoxCount); + Controls.Add(labelCount); + Controls.Add(comboBoxWood); + Controls.Add(labelWood); + Name = "FormWoodSale"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Продажа изделий"; + Load += FormWoodSale_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonCancel; + private Button buttonSale; + private TextBox textBoxCount; + private Label labelCount; + private ComboBox comboBoxWood; + private Label labelWood; + } +} \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.cs b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.cs new file mode 100644 index 0000000..3d7352c --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.cs @@ -0,0 +1,96 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CarpentryWorkshopView +{ + public partial class FormWoodSale : Form + { + private readonly ILogger _logger; + + private readonly IWoodLogic _logicWood; + + private readonly IShopLogic _logicShop; + + public FormWoodSale(ILogger logger, IWoodLogic logicWood, IShopLogic logicShop) + { + InitializeComponent(); + _logger = logger; + _logicWood = logicWood; + _logicShop = logicShop; + } + + private void FormWoodSale_Load(object sender, EventArgs e) + { + _logger.LogInformation("Ice creams loading"); + try + { + var list = _logicWood.ReadList(null); + if (list != null) + { + comboBoxWood.DisplayMember = "WoodName"; + comboBoxWood.ValueMember = "Id"; + comboBoxWood.DataSource = list; + comboBoxWood.SelectedItem = null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ice creams loading error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonSale_Click(object sender, EventArgs e) + { + if (comboBoxWood.SelectedValue == null) + { + MessageBox.Show("Выберите мороженое", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Ice cream sale"); + try + { + var operationResult = _logicShop.MakeSell( + new WoodBindingModel + { + Id = Convert.ToInt32(comboBoxWood.SelectedValue) + }, + 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, "Wood sale error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.resx b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshop/FormWoodSale.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/CarpentryWorkshop/CarpentryWorkshop/Program.cs b/CarpentryWorkshop/CarpentryWorkshop/Program.cs index 56b3301..7989730 100644 --- a/CarpentryWorkshop/CarpentryWorkshop/Program.cs +++ b/CarpentryWorkshop/CarpentryWorkshop/Program.cs @@ -1,7 +1,7 @@ using CarpentryWorkshopBusinessLogic.BusinessLogics; using CarpentryWorkshopContracts.BusinessLogicsContracts; using CarpentryWorkshopContracts.StoragesContracts; -using CarpentryWorkshopListImplement.Implements; +using CarpentryWorkshopFileImplement.Implements; using CarpentryWorkshopView; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -56,6 +56,7 @@ namespace CarpentryWorkshop services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs b/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs index 66a3eee..f9da371 100644 --- a/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/OrderLogic.cs @@ -4,6 +4,7 @@ using CarpentryWorkshopContracts.SearchModels; using CarpentryWorkshopContracts.StoragesContracts; using CarpentryWorkshopContracts.ViewModels; using CarpentryWorkshopDataModels.Enums; +using CarpentryWorkshopDataModels.Models; using Microsoft.Extensions.Logging; namespace CarpentryWorkshopBusinessLogic.BusinessLogics @@ -12,11 +13,18 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + private readonly IShopStorage _shopStorage; + private readonly IShopLogic _shopLogic; + private readonly IWoodStorage _woodStorage; - public OrderLogic(ILogger logger, IOrderStorage orderStorage) + public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, + IShopLogic shopLogic, IWoodStorage woodStorage, ILogger logger) { _logger = logger; _orderStorage = orderStorage; + _shopStorage = shopStorage; + _shopLogic = shopLogic; + _woodStorage = woodStorage; } public List? ReadList(OrderSearchModel? model) @@ -60,6 +68,20 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics _logger.LogWarning("Status change operation failed"); throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); } + if (element.Status == OrderStatus.Готов) + { + var wood = _woodStorage.GetElement(new WoodSearchModel() { Id = model.WoodId }); + if (wood == null) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); + return false; + } + if (CheckSupply(wood, 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); @@ -81,8 +103,66 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics return ChangeStatus(model, OrderStatus.Выдан); } - private void CheckModel(OrderBindingModel model, bool withParams = -true) + public bool CheckSupply(IWoodModel wood, int count) + { + if (count <= 0) + { + _logger.LogWarning("Check then supply operation error. Wood count < 0."); + return false; + } + + int sumCapacity = 0; + int sumCount = 0; + sumCapacity = _shopStorage.GetFullList().Select(x => x.WoodMaxCount).Sum(); + sumCount = _shopStorage.GetFullList().Select(x => x.ShopWoods.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 Wood in shops."); + return false; + } + + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace = shop.WoodMaxCount; + foreach (var doc in shop.ShopWoods) + { + freeSpace -= doc.Value.Item2; + } + if (freeSpace == 0) + { + continue; + } + if (freeSpace - count >= 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, wood, count)) + count = 0; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (freeSpace - count < 0) + { + if (_shopLogic.MakeSupply(new() { Id = shop.Id }, wood, freeSpace)) + count -= freeSpace; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (count <= 0) + { + return true; + } + } + return false; + } + + private void CheckModel(OrderBindingModel model, bool withParams = true) { if (model == null) { diff --git a/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/ShopLogic.cs b/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/ShopLogic.cs index dbd73e0..1499e2c 100644 --- a/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/ShopLogic.cs +++ b/CarpentryWorkshop/CarpentryWorkshopBusinessLogic/BusinessLogics/ShopLogic.cs @@ -12,18 +12,16 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IShopStorage _shopStorage; - private readonly IWoodStorage _woodStorage; - public ShopLogic(ILogger logger, IShopStorage shopStorage, IWoodStorage woodStorage) + public ShopLogic(ILogger logger, IShopStorage shopStorage) { _logger = logger; _shopStorage = shopStorage; - _woodStorage = woodStorage; } public List ReadList(ShopSearchModel model) { - _logger.LogInformation("ReadList. ShopName:{ShopName}.Id:{ Id}", model?.ShopName, model?.Id); + _logger.LogInformation("ReadList. ShopName:{Name}. Id:{ Id}", model?.ShopName, model?.Id); var list = model == null ? _shopStorage.GetFullList() : _shopStorage.GetFilteredList(model); if (list == null) { @@ -32,47 +30,58 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics } _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; + } - public bool MakeSupply(SupplyBindingModel model) + public bool MakeSupply(ShopSearchModel model, IWoodModel wood, int count) { + if (model == null) - { throw new ArgumentNullException(nameof(model)); - } - if (model.Count <= 0) + if (wood == null) + throw new ArgumentNullException(nameof(wood)); + if (count <= 0) + throw new ArgumentNullException("Количество должно быть положительным числом"); + + ShopViewModel curModel = _shopStorage.GetElement(model); + if (curModel == null) + throw new ArgumentNullException(nameof(curModel)); + var countItems = curModel.ShopWoods.Select(x => x.Value.Item2).Sum(); + if (curModel.WoodMaxCount - countItems >= count) { - throw new ArgumentException("Количество изделий должно быть больше 0"); - } - var shop = _shopStorage.GetElement(new ShopSearchModel - { - Id = model.ShopId - }); - if (shop == null) - { - throw new ArgumentException("Магазина не существует"); - } - if (shop.ShopWoods.ContainsKey(model.WoodId)) - { - var oldValue = shop.ShopWoods[model.WoodId]; - oldValue.Item2 += model.Count; - shop.ShopWoods[model.WoodId] = oldValue; + if (curModel.ShopWoods.TryGetValue(wood.Id, out var sameDocument)) + { + curModel.ShopWoods[wood.Id] = (wood, sameDocument.Item2 + count); + _logger.LogInformation("Same wood found by supply. Added {0} of {1} in {2} shop", count, wood.WoodName, curModel.ShopName); + } + else + { + curModel.ShopWoods[wood.Id] = (wood, count); + _logger.LogInformation("New wood added by supply. Added {0} of {1} in {2} shop", count, wood.WoodName, curModel.ShopName); + } + _shopStorage.Update(new() + { + Id = curModel.Id, + ShopName = curModel.ShopName, + Address = curModel.Address, + DateOpen = curModel.DateOpen, + ShopWoods = curModel.ShopWoods, + WoodMaxCount = curModel.WoodMaxCount + }); } else { - var wood = _woodStorage.GetElement(new WoodSearchModel - { - Id = model.WoodId - }); - if (wood == null) - { - throw new ArgumentException($"Поставка: Товар с id:{model.WoodId} не найденн"); - } - shop.ShopWoods.Add(model.WoodId, (wood, model.Count)); + _logger.LogWarning("Required shop is overflowed"); + return false; } return true; } + public bool MakeSell(IWoodModel wood, int count) + { + return _shopStorage.SellWoods(wood, count); + } + public ShopViewModel ReadElement(ShopSearchModel model) { if (model == null) @@ -133,15 +142,20 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics { return; } - if (string.IsNullOrEmpty(model.Address)) - { - throw new ArgumentException("Адрес магазина длжен быть заполнен", nameof(model.Address)); - } if (string.IsNullOrEmpty(model.ShopName)) { - throw new ArgumentException("Название магазина должно быть заполнено", nameof(model.ShopName)); + throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName)); } - _logger.LogInformation("Shop. ShopName:{ShopName}.Adres:{Adres}.OpeningDate:{OpeningDate}.Id:{ Id}", model.ShopName, model.Address, model.DateOpen, model.Id); + if (string.IsNullOrEmpty(model.Address)) + { + throw new ArgumentNullException("Нет адресса магазина", nameof(model.ShopName)); + } + if (model.DateOpen == null) + { + throw new ArgumentNullException("Нет даты открытия магазина", nameof(model.ShopName)); + } + _logger.LogInformation("Shop. ShopName:{ShopName}.Address:{Address}. DateOpen:{DateOpen}. Id: { Id}", + model.ShopName, model.Address, model.DateOpen, model.Id); var element = _shopStorage.GetElement(new ShopSearchModel { ShopName = model.ShopName @@ -151,5 +165,6 @@ namespace CarpentryWorkshopBusinessLogic.BusinessLogics throw new InvalidOperationException("Магазин с таким названием уже есть"); } } + } } diff --git a/CarpentryWorkshop/CarpentryWorkshopContracts/BindingModels/ShopBindingModel.cs b/CarpentryWorkshop/CarpentryWorkshopContracts/BindingModels/ShopBindingModel.cs index feed4c9..1ca3279 100644 --- a/CarpentryWorkshop/CarpentryWorkshopContracts/BindingModels/ShopBindingModel.cs +++ b/CarpentryWorkshop/CarpentryWorkshopContracts/BindingModels/ShopBindingModel.cs @@ -9,5 +9,6 @@ namespace CarpentryWorkshopContracts.BindingModels public string Address { get; set; } public DateTime DateOpen { get; set; } public Dictionary ShopWoods { get; set; } = new(); + public int WoodMaxCount { get; set; } } } diff --git a/CarpentryWorkshop/CarpentryWorkshopContracts/BusinessLogicsContracts/IShopLogic.cs b/CarpentryWorkshop/CarpentryWorkshopContracts/BusinessLogicsContracts/IShopLogic.cs index 5840f0f..f223e12 100644 --- a/CarpentryWorkshop/CarpentryWorkshopContracts/BusinessLogicsContracts/IShopLogic.cs +++ b/CarpentryWorkshop/CarpentryWorkshopContracts/BusinessLogicsContracts/IShopLogic.cs @@ -12,6 +12,7 @@ namespace CarpentryWorkshopContracts.BusinessLogicsContracts bool Create(ShopBindingModel model); bool Update(ShopBindingModel model); bool Delete(ShopBindingModel model); - bool MakeSupply(SupplyBindingModel model); + bool MakeSupply(ShopSearchModel model, IWoodModel wood, int count); + bool MakeSell(IWoodModel wood, int count); } } diff --git a/CarpentryWorkshop/CarpentryWorkshopContracts/SearchModels/SupplySearchModel.cs b/CarpentryWorkshop/CarpentryWorkshopContracts/SearchModels/SupplySearchModel.cs new file mode 100644 index 0000000..27b4eeb --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopContracts/SearchModels/SupplySearchModel.cs @@ -0,0 +1,8 @@ +namespace CarpentryWorkshopContracts.SearchModels +{ + public class SupplySearchModel + { + public int? WoodId { get; set; } + public int? Count { get; set; } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopContracts/StoragesContracts/IShopStorage.cs b/CarpentryWorkshop/CarpentryWorkshopContracts/StoragesContracts/IShopStorage.cs index 465cef8..2ff6ee3 100644 --- a/CarpentryWorkshop/CarpentryWorkshopContracts/StoragesContracts/IShopStorage.cs +++ b/CarpentryWorkshop/CarpentryWorkshopContracts/StoragesContracts/IShopStorage.cs @@ -18,5 +18,6 @@ namespace CarpentryWorkshopContracts.StoragesContracts ShopViewModel? Insert(ShopBindingModel model); ShopViewModel? Update(ShopBindingModel model); ShopViewModel? Delete(ShopBindingModel model); + public bool SellWoods(IWoodModel model, int count); } } diff --git a/CarpentryWorkshop/CarpentryWorkshopContracts/ViewModels/ShopViewModel.cs b/CarpentryWorkshop/CarpentryWorkshopContracts/ViewModels/ShopViewModel.cs index d469d57..ec8eed1 100644 --- a/CarpentryWorkshop/CarpentryWorkshopContracts/ViewModels/ShopViewModel.cs +++ b/CarpentryWorkshop/CarpentryWorkshopContracts/ViewModels/ShopViewModel.cs @@ -13,5 +13,7 @@ namespace CarpentryWorkshopContracts.ViewModels [DisplayName("Дата открытия")] public DateTime DateOpen { get; set; } public Dictionary ShopWoods { get; set; } = new(); + [DisplayName("Вместимость")] + public int WoodMaxCount { get; set; } } } diff --git a/CarpentryWorkshop/CarpentryWorkshopDataModels/Models/IShopModel.cs b/CarpentryWorkshop/CarpentryWorkshopDataModels/Models/IShopModel.cs index 19e6d4c..b6a8824 100644 --- a/CarpentryWorkshop/CarpentryWorkshopDataModels/Models/IShopModel.cs +++ b/CarpentryWorkshop/CarpentryWorkshopDataModels/Models/IShopModel.cs @@ -6,5 +6,6 @@ string Address { get; } DateTime DateOpen { get; } Dictionary ShopWoods { get; } + public int WoodMaxCount { get; } } } diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj b/CarpentryWorkshop/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj new file mode 100644 index 0000000..319d159 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/CarpentryWorkshopFileImplement.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + enable + enable + + + + + + + + diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/DataFileSingleton.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/DataFileSingleton.cs new file mode 100644 index 0000000..87c458e --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/DataFileSingleton.cs @@ -0,0 +1,64 @@ +using CarpentryWorkshopFileImplement.Models; +using System.Xml.Linq; + +namespace CarpentryWorkshopFileImplement +{ + internal class DataFileSingleton + { + private static DataFileSingleton? instance; + private readonly string ComponentFileName = "Component.xml"; + private readonly string OrderFileName = "Order.xml"; + private readonly string WoodFileName = "Wood.xml"; + private readonly string ShopFileName = "Shop.xml"; + public List Components { get; private set; } + public List Orders { get; private set; } + public List Woods { get; private set; } + public List Shops { get; private set; } + public static DataFileSingleton GetInstance() + { + if (instance == null) + { + instance = new DataFileSingleton(); + } + return instance; + } + public void SaveComponents() => SaveData(Components, ComponentFileName, + "Components", x => x.GetXElement); + public void SaveWoods() => SaveData(Woods, WoodFileName, + "Woods", x => x.GetXElement); + public void SaveOrders() => SaveData(Orders, OrderFileName, + "Orders", x => x.GetXElement); + public void SaveShops() => SaveData(Shops, ShopFileName, + "Shops", x => x.GetXElement); + private DataFileSingleton() + { + Components = LoadData(ComponentFileName, "Component", x => + Component.Create(x)!)!; + Woods = LoadData(WoodFileName, "Wood", x => + Wood.Create(x)!)!; + Orders = LoadData(OrderFileName, "Order", x => + Order.Create(x)!)!; + Shops = LoadData(ShopFileName, "Shop", x => + Shop.Create(x)!)!; + } + private static List? LoadData(string filename, string xmlNodeName, + Func selectFunction) + { + if (File.Exists(filename)) + { + return + XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList(); + } + return new List(); + } + private static void SaveData(List data, string filename, string + xmlNodeName, Func selectFunction) + { + if (data != null) + { + new XDocument(new XElement(xmlNodeName, + data.Select(selectFunction).ToArray())).Save(filename); + } + } + } +} \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs new file mode 100644 index 0000000..f214989 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ComponentStorage.cs @@ -0,0 +1,85 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.SearchModels; +using CarpentryWorkshopContracts.StoragesContracts; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopFileImplement.Models; + +namespace CarpentryWorkshopFileImplement.Implements +{ + public class ComponentStorage : IComponentStorage + { + private readonly DataFileSingleton source; + public ComponentStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Components + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(ComponentSearchModel + model) + { + if (string.IsNullOrEmpty(model.ComponentName)) + { + return new(); + } + return source.Components + .Where(x => x.ComponentName.Contains(model.ComponentName)) + .Select(x => x.GetViewModel) + .ToList(); + } + public ComponentViewModel? GetElement(ComponentSearchModel model) + { + if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue) + { + return null; + } + return source.Components + .FirstOrDefault(x => + (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == + model.ComponentName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + public ComponentViewModel? Insert(ComponentBindingModel model) + { + model.Id = source.Components.Count > 0 ? source.Components.Max(x => + x.Id) + 1 : 1; + var newComponent = Component.Create(model); + if (newComponent == null) + { + return null; + } + source.Components.Add(newComponent); + source.SaveComponents(); + return newComponent.GetViewModel; + } + public ComponentViewModel? Update(ComponentBindingModel model) + { + var component = source.Components.FirstOrDefault(x => x.Id == + model.Id); + if (component == null) + { + return null; + } + component.Update(model); + source.SaveComponents(); + return component.GetViewModel; + } + public ComponentViewModel? Delete(ComponentBindingModel model) + { + var element = source.Components.FirstOrDefault(x => x.Id == + model.Id); + if (element != null) + { + source.Components.Remove(element); + source.SaveComponents(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..533e58b --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/OrderStorage.cs @@ -0,0 +1,88 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.SearchModels; +using CarpentryWorkshopContracts.StoragesContracts; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopFileImplement.Models; + +namespace CarpentryWorkshopFileImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + private readonly DataFileSingleton source; + public OrderStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Orders + .Select(x => AccessWoodStorage(x.GetViewModel)) + .ToList(); + } + public List GetFilteredList(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return new(); + } + return source.Orders + .Where(x => x.Id == model.Id) + .Select(x => AccessWoodStorage(x.GetViewModel)) + .ToList(); + } + public OrderViewModel? GetElement(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + return AccessWoodStorage(source.Orders + .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel); + } + public OrderViewModel? Insert(OrderBindingModel model) + { + model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1; + var newOrder = Order.Create(model); + if (newOrder == null) + { + return null; + } + source.Orders.Add(newOrder); + source.SaveOrders(); + return AccessWoodStorage(newOrder.GetViewModel); + } + public OrderViewModel? Update(OrderBindingModel model) + { + var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + source.SaveOrders(); + return AccessWoodStorage(order.GetViewModel); + } + public OrderViewModel? Delete(OrderBindingModel model) + { + var element = source.Orders.FirstOrDefault(x => x.Id == + model.Id); + if (element != null) + { + source.Orders.Remove(element); + source.SaveOrders(); + return AccessWoodStorage(element.GetViewModel); + } + return null; + } + public OrderViewModel AccessWoodStorage(OrderViewModel model) + { + if (model == null) + return null; + var wood = source.Woods.FirstOrDefault(x => (x.Id == model.WoodId)); + if (wood == null) + return model; + model.WoodName = wood.WoodName; + return model; + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ShopStorage.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ShopStorage.cs new file mode 100644 index 0000000..67b3161 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/ShopStorage.cs @@ -0,0 +1,131 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.SearchModels; +using CarpentryWorkshopContracts.StoragesContracts; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopDataModels.Models; +using CarpentryWorkshopFileImplement.Models; + +namespace CarpentryWorkshopFileImplement.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.ShopName)) + { + return new(); + } + return source.Shops.Where(x => x.ShopName.Contains(model.ShopName)).Select(x => x.GetViewModel).ToList(); + } + public ShopViewModel? GetElement(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) + { + return null; + } + return source.Shops.FirstOrDefault(x => + (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) || + (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 shop = source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (shop == null) + { + return null; + } + shop.Update(model); + source.SaveShops(); + return shop.GetViewModel; + } + + public ShopViewModel? Delete(ShopBindingModel model) + { + var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id); + if (shop != null) + { + source.Shops.Remove(shop); + source.SaveShops(); + return shop.GetViewModel; + } + return null; + } + + public bool CheckAvailability(int woodId, int count) + { + int minus = source.Shops + .SelectMany(shop => shop.ShopWoods + .Where(wood => wood.Value.Item1.Id == woodId) + .Select(wood => wood.Value.Item2)) + .Sum(); + count -= minus; + return count <= 0; + } + + public bool SellWoods(IWoodModel model, int count) + { + var wood = source.Woods.FirstOrDefault(x => x.Id == model.Id); + + if (wood == null || !CheckAvailability(wood.Id, count)) + { + return false; + } + + for (int i = 0; i < source.Shops.Count; i++) + { + var shop = source.Shops[i]; + var woods = shop.ShopWoods; + + foreach (var wod in woods.Where(x => x.Value.Item1.Id == wood.Id)) + { + var min = Math.Min(wod.Value.Item2, count); + woods[wod.Value.Item1.Id] = (wod.Value.Item1, wod.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, + WoodMaxCount = shop.WoodMaxCount, + ShopWoods = woods + }); + } + source.SaveShops(); + return true; + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs new file mode 100644 index 0000000..6949f53 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Implements/WoodStorage.cs @@ -0,0 +1,84 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.SearchModels; +using CarpentryWorkshopContracts.StoragesContracts; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopFileImplement.Models; + +namespace CarpentryWorkshopFileImplement.Implements +{ + public class WoodStorage : IWoodStorage + { + private readonly DataFileSingleton source; + public WoodStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Woods + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(WoodSearchModel model) + { + if (string.IsNullOrEmpty(model.WoodName)) + { + return new(); + } + return source.Woods + .Where(x => x.WoodName.Contains(model.WoodName)) + .Select(x => x.GetViewModel) + .ToList(); + } + public WoodViewModel? GetElement(WoodSearchModel model) + { + if (string.IsNullOrEmpty(model.WoodName) && !model.Id.HasValue) + { + return null; + } + return source.Woods + .FirstOrDefault(x => + (!string.IsNullOrEmpty(model.WoodName) && x.WoodName == + model.WoodName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + public WoodViewModel? Insert(WoodBindingModel model) + { + model.Id = source.Woods.Count > 0 ? source.Woods.Max(x => + x.Id) + 1 : 1; + var newWood = Wood.Create(model); + if (newWood == null) + { + return null; + } + source.Woods.Add(newWood); + source.SaveWoods(); + return newWood.GetViewModel; + } + public WoodViewModel? Update(WoodBindingModel model) + { + var wood = source.Woods.FirstOrDefault(x => x.Id == + model.Id); + if (wood == null) + { + return null; + } + wood.Update(model); + source.SaveWoods(); + return wood.GetViewModel; + } + public WoodViewModel? Delete(WoodBindingModel model) + { + var wood = source.Woods.FirstOrDefault(x => x.Id == + model.Id); + if (wood != null) + { + source.Woods.Remove(wood); + source.SaveWoods(); + return wood.GetViewModel; + } + return null; + } + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Component.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Component.cs new file mode 100644 index 0000000..50c8488 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Component.cs @@ -0,0 +1,59 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopDataModels.Models; +using System.Xml.Linq; + +namespace CarpentryWorkshopFileImplement.Models +{ + public class Component : IComponentModel + { + public int Id { get; private set; } + public string ComponentName { get; private set; } = string.Empty; + public double Cost { get; set; } + public static Component? Create(ComponentBindingModel model) + { + if (model == null) + { + return null; + } + return new Component() + { + Id = model.Id, + ComponentName = model.ComponentName, + Cost = model.Cost + }; + } + public static Component? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Component() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ComponentName = element.Element("ComponentName")!.Value, + Cost = Convert.ToDouble(element.Element("Cost")!.Value) + }; + } + public void Update(ComponentBindingModel model) + { + if (model == null) + { + return; + } + ComponentName = model.ComponentName; + Cost = model.Cost; + } + public ComponentViewModel GetViewModel => new() + { + Id = Id, + ComponentName = ComponentName, + Cost = Cost + }; + public XElement GetXElement => new("Component", + new XAttribute("Id", Id), + new XElement("ComponentName", ComponentName), + new XElement("Cost", Cost.ToString())); + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Order.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Order.cs new file mode 100644 index 0000000..c1250f4 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Order.cs @@ -0,0 +1,85 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopDataModels.Enums; +using CarpentryWorkshopDataModels.Models; +using System.Xml.Linq; + +namespace CarpentryWorkshopFileImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; private set; } + public int WoodId { get; private set; } + public int Count { get; private set; } + public double Sum { get; private set; } + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + public DateTime DateCreate { get; private set; } = DateTime.Now; + public DateTime? DateImplement { get; private set; } + public static Order? Create(OrderBindingModel model) + { + if (model == null) + { + return null; + } + return new Order() + { + Id = model.Id, + WoodId = model.WoodId, + Count = model.Count, + Sum = model.Sum, + Status = model.Status, + DateCreate = model.DateCreate, + DateImplement = model.DateImplement + }; + } + public static Order? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Order() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + WoodId = Convert.ToInt32(element.Element("WoodId")!.Value), + Count = Convert.ToInt32(element.Element("Count")!.Value), + Sum = Convert.ToDouble(element.Element("Sum")!.Value), + Status = (OrderStatus)Convert.ToInt32(element.Element("Status").Value), + DateCreate = Convert.ToDateTime(element.Element("DateCreate").Value), + DateImplement = String.IsNullOrEmpty(element.Element("DateImplement").Value) ? DateTime.MinValue : Convert.ToDateTime(element.Element("DateImplement").Value) + }; + } + public void Update(OrderBindingModel? model) + { + if (model == null) + { + return; + } + Id = model.Id; + WoodId = model.WoodId; + Count = model.Count; + Sum = model.Sum; + Status = model.Status; + DateCreate = model.DateCreate; + DateImplement = model.DateImplement; + } + public OrderViewModel GetViewModel => new() + { + Id = Id, + WoodId = WoodId, + Count = Count, + Sum = Sum, + Status = Status, + DateCreate = DateCreate, + DateImplement = DateImplement, + }; + public XElement GetXElement => new("Order", + new XAttribute("Id", Id), + new XElement("WoodId", WoodId), + new XElement("Count", Count), + new XElement("Sum", Sum.ToString()), + new XElement("Status", (int)Status), + new XElement("DateCreate", DateCreate), + new XElement("DateImplement", DateImplement)); + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Shop.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Shop.cs new file mode 100644 index 0000000..6a19218 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Shop.cs @@ -0,0 +1,103 @@ +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.ViewModels; +using CarpentryWorkshopDataModels.Models; +using System.Xml.Linq; + +namespace CarpentryWorkshopFileImplement.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 DateOpen { get; private set; } + public Dictionary Woods { get; private set; } = new(); + private Dictionary? _shopWoods = null; + + public Dictionary ShopWoods + { + get + { + if (_shopWoods == null) + { + var source = DataFileSingleton.GetInstance(); + _shopWoods = Woods.ToDictionary(x => x.Key, + y => ((source.Woods.FirstOrDefault(z => z.Id == y.Key) as IWoodModel)!, y.Value)); + } + return _shopWoods; + } + } + + public int WoodMaxCount { 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, + Woods = model.ShopWoods.ToDictionary(x => x.Key, x => x.Value.Item2), + WoodMaxCount = model.WoodMaxCount + }; + } + + 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, + DateOpen = Convert.ToDateTime(element.Element("DateOpen")!.Value), + WoodMaxCount = Convert.ToInt32(element.Element("WoodMaxCount")!.Value), + Woods = element.Element("ShopWoods")!.Elements("ShopWood") + .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; + WoodMaxCount = model.WoodMaxCount; + Woods = model.ShopWoods.ToDictionary(x => x.Key, x => x.Value.Item2); + _shopWoods = null; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + Address = Address, + DateOpen = DateOpen, + ShopWoods = ShopWoods, + WoodMaxCount = WoodMaxCount + }; + + public XElement GetXElement => new("Shop", + new XAttribute("Id", Id), + new XElement("ShopName", ShopName), + new XElement("Address", Address), + new XElement("DateOpen", DateOpen.ToString()), + new XElement("WoodMaxCount", WoodMaxCount.ToString()), + new XElement("ShopWoods", + Woods.Select(x => new XElement("ShopWood", + new XElement("Key", x.Key), + new XElement("Value", x.Value))).ToArray())); + } +} diff --git a/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Wood.cs b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Wood.cs new file mode 100644 index 0000000..c703955 --- /dev/null +++ b/CarpentryWorkshop/CarpentryWorkshopFileImplement/Models/Wood.cs @@ -0,0 +1,98 @@ +using CarpentryWorkshopDataModels.Models; +using CarpentryWorkshopFileImplement; +using CarpentryWorkshopContracts.BindingModels; +using CarpentryWorkshopContracts.ViewModels; +using System.Xml.Linq; + +namespace CarpentryWorkshopFileImplement.Models +{ + public class Wood : IWoodModel + { + public int Id { get; private set; } + public string WoodName { get; private set; } = string.Empty; + public double Price { get; private set; } + public Dictionary Components { get; private set; } = new(); + private Dictionary? _woodComponents = null; + + public Dictionary WoodComponents + { + get + { + if (_woodComponents == null) + { + var source = DataFileSingleton.GetInstance(); + _woodComponents = Components.ToDictionary(x => x.Key, y => + ((source.Components.FirstOrDefault(z => z.Id == y.Key) as IComponentModel)!, + y.Value)); + } + return _woodComponents; + } + } + + public static Wood? Create(WoodBindingModel model) + { + if (model == null) + { + return null; + } + return new Wood() + { + Id = model.Id, + WoodName = model.WoodName, + Price = model.Price, + Components = model.WoodComponents.ToDictionary(x => x.Key, x + => x.Value.Item2) + }; + } + + public static Wood? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Wood() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + WoodName = element.Element("WoodName")!.Value, + Price = Convert.ToDouble(element.Element("Price")!.Value), + Components = + element.Element("WoodComponents")!.Elements("WoodComponents") + .ToDictionary(x => + Convert.ToInt32(x.Element("Key")?.Value), x => + Convert.ToInt32(x.Element("Value")?.Value)) + }; + } + + public void Update(WoodBindingModel model) + { + if (model == null) + { + return; + } + WoodName = model.WoodName; + Price = model.Price; + Components = model.WoodComponents.ToDictionary(x => x.Key, x => + x.Value.Item2); + _woodComponents = null; + } + + public WoodViewModel GetViewModel => new() + { + Id = Id, + WoodName = WoodName, + Price = Price, + WoodComponents = WoodComponents + }; + + public XElement GetXElement => new("Wood", + new XAttribute("Id", Id), + new XElement("WoodName", WoodName), + new XElement("Price", Price.ToString()), + new XElement("WoodComponents", Components.Select(x => + new XElement("WoodComponent", + new XElement("Key", x.Key), + new XElement("Value", x.Value))) + .ToArray())); + } +} \ No newline at end of file diff --git a/CarpentryWorkshop/CarpentryWorkshopListImplement/Implements/ShopStorage.cs b/CarpentryWorkshop/CarpentryWorkshopListImplement/Implements/ShopStorage.cs index fc8c47b..586314c 100644 --- a/CarpentryWorkshop/CarpentryWorkshopListImplement/Implements/ShopStorage.cs +++ b/CarpentryWorkshop/CarpentryWorkshopListImplement/Implements/ShopStorage.cs @@ -100,5 +100,50 @@ namespace CarpentryWorkshopListImplement.Implements } return null; } + public bool CheckAvailability(int woodId, int count) + { + int minus = _source.Shops.Select(x => x.ShopWoods.Select(y => (y.Value.Item1.Id == woodId ? y.Value.Item2 : 0)).Sum()).Sum(); + count -= minus; + return count <= 0; + } + + public bool SellWoods(IWoodModel model, int count) + { + var wood = _source.Woods.FirstOrDefault(x => x.Id == model.Id); + + if (wood == null || !CheckAvailability(wood.Id, count)) + { + return false; + } + + for (int i = 0; i < _source.Shops.Count; i++) + { + var shop = _source.Shops[i]; + var woods = shop.ShopWoods; + + foreach (var wod in woods.Where(x => x.Value.Item1.Id == wood.Id)) + { + var min = Math.Min(wod.Value.Item2, count); + woods[wod.Value.Item1.Id] = (wod.Value.Item1, wod.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, + WoodMaxCount = shop.WoodMaxCount, + ShopWoods = woods + }); + } + return true; + } } } diff --git a/CarpentryWorkshop/CarpentryWorkshopListImplement/Models/Shop.cs b/CarpentryWorkshop/CarpentryWorkshopListImplement/Models/Shop.cs index 1b9426b..c14e7b6 100644 --- a/CarpentryWorkshop/CarpentryWorkshopListImplement/Models/Shop.cs +++ b/CarpentryWorkshop/CarpentryWorkshopListImplement/Models/Shop.cs @@ -15,6 +15,7 @@ namespace CarpentryWorkshopListImplement.Models public string ShopName { get; private set; } public string Address { get; private set; } public DateTime DateOpen { get; private set; } + public int WoodMaxCount { get; private set; } public Dictionary ShopWoods { get; private set; } = new(); public static Shop? Create(ShopBindingModel model) @@ -26,7 +27,8 @@ namespace CarpentryWorkshopListImplement.Models Id = model.Id, ShopName = model.ShopName, Address = model.Address, - DateOpen = model.DateOpen + DateOpen = model.DateOpen, + ShopWoods = new() }; } @@ -39,6 +41,7 @@ namespace CarpentryWorkshopListImplement.Models ShopName = model.ShopName; Address = model.Address; DateOpen = model.DateOpen; + ShopWoods = model.ShopWoods; } public ShopViewModel GetViewModel => new()