diff --git a/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ShopLogic.cs b/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ShopLogic.cs new file mode 100644 index 0000000..3425ea6 --- /dev/null +++ b/CarRepairShop/CarRepairShopBusinessLogic/BusinessLogics/ShopLogic.cs @@ -0,0 +1,143 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.BusinessLogicsContracts; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.StoragesContracts; +using CarRepairShopContracts.ViewModels; +using CarRepairShopDataModels.Models; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopBusinessLogic.BusinessLogics +{ + public class ShopLogic : IShopLogic + { + private readonly ILogger _logger; + private readonly IShopStorage _shopStorage; + + public ShopLogic(ILogger logger, IShopStorage shopStorage) + { + _logger = logger; + _shopStorage = shopStorage; + } + + public List? ReadList(ShopSearchModel model) + { + _logger.LogInformation("ReadList. Id:{Id}", model?.Id); + var list = model == null ? _shopStorage.GetFullList() : _shopStorage.GetFilteredList(model); + if(list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public ShopViewModel? ReadElement(ShopSearchModel model) + { + if(model == null) throw new ArgumentNullException(nameof(model)); + _logger.LogInformation("ReadElement. Id:{Id}", model.Id); + var element = _shopStorage.GetElement(model); + if(element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + + public bool Create(ShopBindingModel model) + { + CheckModel(model); + if(_shopStorage.Insert(model) == null) + { + _logger.LogWarning("Create operation failed"); + return false; + } + return true; + } + public bool Update(ShopBindingModel model) + { + CheckModel(model); + if(_shopStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + public bool Delete(ShopBindingModel model) + { + CheckModel(model, false); + if(_shopStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + public bool AddRepair(ShopSearchModel model, IRepairModel repair, int count) + { + if(model == null) throw new ArgumentNullException(nameof(model)); + if(count <= 0) throw new ArgumentNullException("Количество добавляемых изделий должно быть больше 0", nameof(count)); + + _logger.LogInformation("AddRepair. ShopName:{ShopName}. Id: {Id}", model?.ShopName, model?.Id); + var shop = _shopStorage.GetElement(model); + + if (shop == null) return false; + + if (!shop.ShopRepairs.ContainsKey(repair.Id)) + { + shop.ShopRepairs[repair.Id] = (repair, count); + } + else + { + shop.ShopRepairs[repair.Id] = (repair, shop.ShopRepairs[repair.Id].Item2 + count); + } + + _shopStorage.Update(new ShopBindingModel() + { + ShopName = shop.ShopName, + ShopAddress = shop.ShopAddress, + DateOpen = shop.DateOpen, + ShopRepairs = shop.ShopRepairs + }); + return true; + } + + private void CheckModel(ShopBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ShopName)) + { + throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName)); + } + if (string.IsNullOrEmpty(model.ShopAddress)) + { + throw new ArgumentNullException("Нету адреса магазина", nameof(model.ShopAddress)); + } + _logger.LogInformation("Repair. ShopName:{ShopName}. ShopAddress:{ShopAddress}. Id:{Id}", model.ShopName, model.ShopAddress, model.Id); + var element = _shopStorage.GetElement(new ShopSearchModel + { + ShopName = model.ShopName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Магазин с таким названием уже есть"); + } + } + } +} diff --git a/CarRepairShop/CarRepairShopContracts/BindingModels/ShopBindingModel.cs b/CarRepairShop/CarRepairShopContracts/BindingModels/ShopBindingModel.cs new file mode 100644 index 0000000..703cdb7 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/BindingModels/ShopBindingModel.cs @@ -0,0 +1,18 @@ +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.BindingModels +{ + public class ShopBindingModel : IShopModel + { + public int Id { get; set; } + public string ShopName { get; set; } = string.Empty; + public string ShopAddress { get; set; } = string.Empty; + public DateTime DateOpen { get; set; } = DateTime.Now; + public Dictionary ShopRepairs { get; set; } = new(); + } +} diff --git a/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IShopLogic.cs b/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IShopLogic.cs new file mode 100644 index 0000000..b44d23a --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/BusinessLogicsContracts/IShopLogic.cs @@ -0,0 +1,23 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.ViewModels; +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.BusinessLogicsContracts +{ + public interface IShopLogic + { + List? ReadList(ShopSearchModel? model); + ShopViewModel? ReadElement(ShopSearchModel model); + + bool Create(ShopBindingModel model); + bool Update(ShopBindingModel model); + bool Delete(ShopBindingModel model); + bool AddRepair(ShopSearchModel model, IRepairModel repair, int count); + } +} diff --git a/CarRepairShop/CarRepairShopContracts/SearchModels/ShopSearchModel.cs b/CarRepairShop/CarRepairShopContracts/SearchModels/ShopSearchModel.cs new file mode 100644 index 0000000..2adbb70 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/SearchModels/ShopSearchModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.SearchModels +{ + public class ShopSearchModel + { + public int? Id { get; set; } + public string ShopName { get; set; } = string.Empty; + } +} diff --git a/CarRepairShop/CarRepairShopContracts/StoragesContracts/IShopStorage.cs b/CarRepairShop/CarRepairShopContracts/StoragesContracts/IShopStorage.cs new file mode 100644 index 0000000..4205c2c --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/StoragesContracts/IShopStorage.cs @@ -0,0 +1,22 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.StoragesContracts +{ + public interface IShopStorage + { + List GetFullList(); + List GetFilteredList(ShopSearchModel model); + + ShopViewModel? GetElement(ShopSearchModel model); + ShopViewModel? Insert(ShopBindingModel model); + ShopViewModel? Update(ShopBindingModel model); + ShopViewModel? Delete(ShopBindingModel model); + } +} diff --git a/CarRepairShop/CarRepairShopContracts/ViewModels/ShopViewModel.cs b/CarRepairShop/CarRepairShopContracts/ViewModels/ShopViewModel.cs new file mode 100644 index 0000000..c6458a6 --- /dev/null +++ b/CarRepairShop/CarRepairShopContracts/ViewModels/ShopViewModel.cs @@ -0,0 +1,26 @@ +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopContracts.ViewModels +{ + public class ShopViewModel : IShopModel + { + public int Id { get; set; } + + [DisplayName("Название магазина")] + public string ShopName { get; set; } = string.Empty; + + [DisplayName("Адрес магазина")] + public string ShopAddress { get; set; } = string.Empty; + + [DisplayName("Дата открытия")] + public DateTime DateOpen { get; set; } = DateTime.Now; + + public Dictionary ShopRepairs { get; set; } = new(); + } +} diff --git a/CarRepairShop/CarRepairShopDataModels/Models/IShopModel.cs b/CarRepairShop/CarRepairShopDataModels/Models/IShopModel.cs new file mode 100644 index 0000000..e62110a --- /dev/null +++ b/CarRepairShop/CarRepairShopDataModels/Models/IShopModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopDataModels.Models +{ + public interface IShopModel : IId + { + string ShopName { get; } + string ShopAddress { get; } + DateTime DateOpen { get; } + Dictionary ShopRepairs { get; } + } +} diff --git a/CarRepairShop/CarRepairShopListImplement/DataListSingleton.cs b/CarRepairShop/CarRepairShopListImplement/DataListSingleton.cs index 5e8c8c1..ad7d503 100644 --- a/CarRepairShop/CarRepairShopListImplement/DataListSingleton.cs +++ b/CarRepairShop/CarRepairShopListImplement/DataListSingleton.cs @@ -8,12 +8,14 @@ namespace CarRepairShopListImplement public List Components { get; set; } public List Repairs { get; set; } public List Orders { get; set; } + public List Shops { get; set; } private DataListSingleton() { Components = new List(); Repairs = new List(); Orders = new List(); + Shops = new List(); } public static DataListSingleton GetInstance() diff --git a/CarRepairShop/CarRepairShopListImplement/Implements/ShopStorage.cs b/CarRepairShop/CarRepairShopListImplement/Implements/ShopStorage.cs new file mode 100644 index 0000000..45c7f54 --- /dev/null +++ b/CarRepairShop/CarRepairShopListImplement/Implements/ShopStorage.cs @@ -0,0 +1,106 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.SearchModels; +using CarRepairShopContracts.StoragesContracts; +using CarRepairShopContracts.ViewModels; +using CarRepairShopListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopListImplement.Implements +{ + public class ShopStorage : IShopStorage + { + private readonly DataListSingleton _source; + + public ShopStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var result = new List(); + foreach(var shop in _source.Shops) + { + result.Add(shop.GetViewModel); + } + return result; + } + + public List GetFilteredList(ShopSearchModel model) + { + var result = new List(); + if (string.IsNullOrEmpty(model.ShopName)) return result; + + foreach(var shop in _source.Shops) + { + if (shop.ShopName.Contains(model.ShopName)) + { + result.Add(shop.GetViewModel); + } + } + return result; + } + + public ShopViewModel? GetElement(ShopSearchModel model) + { + if(string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) return null; + + foreach(var shop in _source.Shops) + { + if((model.ShopName == shop.ShopName) || (model.Id == shop.Id)) + { + return shop.GetViewModel; + } + } + return null; + } + + public ShopViewModel? Insert(ShopBindingModel model) + { + model.Id = 1; + foreach(var shop in _source.Shops) + { + if(model.Id <= shop.Id) + { + model.Id = shop.Id + 1; + } + } + var newShop = Shop.Create(model); + if (newShop == null) return null; + + _source.Shops.Add(newShop); + return newShop.GetViewModel; + } + + public ShopViewModel? Update(ShopBindingModel model) + { + foreach(var shop in _source.Shops) + { + if(shop.Id == model.Id) + { + shop.Update(model); + return shop.GetViewModel; + } + } + return null; + } + + public ShopViewModel? Delete(ShopBindingModel model) + { + for (int i = 0; i < _source.Shops.Count; i++) + { + if (_source.Shops[i].Id == model.Id) + { + var element = _source.Shops[i]; + _source.Shops.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + } +} diff --git a/CarRepairShop/CarRepairShopListImplement/Models/Shop.cs b/CarRepairShop/CarRepairShopListImplement/Models/Shop.cs new file mode 100644 index 0000000..18db0e8 --- /dev/null +++ b/CarRepairShop/CarRepairShopListImplement/Models/Shop.cs @@ -0,0 +1,50 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.ViewModels; +using CarRepairShopDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarRepairShopListImplement.Models +{ + public class Shop : IShopModel + { + public int Id { get; private set; } + public string ShopName { get; private set; } = string.Empty; + public string ShopAddress { get; private set; } = string.Empty; + public DateTime DateOpen { get; private set; } = DateTime.Now; + public Dictionary ShopRepairs { get; private set; } = new Dictionary(); + + public static Shop? Create(ShopBindingModel? model) + { + if (model == null) return null; + return new Shop() + { + Id = model.Id, + ShopName = model.ShopName, + ShopAddress = model.ShopAddress, + DateOpen = model.DateOpen, + ShopRepairs = model.ShopRepairs + }; + } + + public void Update(ShopBindingModel? model) + { + if(model == null) return; + ShopName = model.ShopName; + ShopAddress = model.ShopAddress; + DateOpen = model.DateOpen; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + ShopAddress = ShopAddress, + DateOpen = DateOpen, + ShopRepairs = ShopRepairs + }; + } +} diff --git a/CarRepairShop/CarRepairShopView/FormMain.Designer.cs b/CarRepairShop/CarRepairShopView/FormMain.Designer.cs index ec5b8c0..ce990da 100644 --- a/CarRepairShop/CarRepairShopView/FormMain.Designer.cs +++ b/CarRepairShop/CarRepairShopView/FormMain.Designer.cs @@ -32,6 +32,8 @@ справочникиToolStripMenuItem = new ToolStripMenuItem(); компонентыToolStripMenuItem = new ToolStripMenuItem(); изделияToolStripMenuItem = new ToolStripMenuItem(); + ShopsToolStripMenuItem = new ToolStripMenuItem(); + FillShopToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); buttonCreateOrder = new Button(); buttonTakeOrderInWork = new Button(); @@ -53,7 +55,7 @@ // // справочникиToolStripMenuItem // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, изделияToolStripMenuItem }); + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, изделияToolStripMenuItem, ShopsToolStripMenuItem, FillShopToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; справочникиToolStripMenuItem.Size = new Size(94, 20); справочникиToolStripMenuItem.Text = "Справочники"; @@ -61,17 +63,31 @@ // компонентыToolStripMenuItem // компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(145, 22); + компонентыToolStripMenuItem.Size = new Size(198, 22); компонентыToolStripMenuItem.Text = "Компоненты"; компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; // // изделияToolStripMenuItem // изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; - изделияToolStripMenuItem.Size = new Size(145, 22); + изделияToolStripMenuItem.Size = new Size(198, 22); изделияToolStripMenuItem.Text = "Ремонт"; изделияToolStripMenuItem.Click += ремонтToolStripMenuItem_Click; // + // ShopsToolStripMenuItem + // + ShopsToolStripMenuItem.Name = "ShopsToolStripMenuItem"; + ShopsToolStripMenuItem.Size = new Size(198, 22); + ShopsToolStripMenuItem.Text = "Магазины"; + ShopsToolStripMenuItem.Click += ShopsToolStripMenuItem_Click; + // + // FillShopToolStripMenuItem + // + FillShopToolStripMenuItem.Name = "FillShopToolStripMenuItem"; + FillShopToolStripMenuItem.Size = new Size(198, 22); + FillShopToolStripMenuItem.Text = "Пополнение магазина"; + FillShopToolStripMenuItem.Click += FillShopToolStripMenuItem_Click; + // // dataGridView // dataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; @@ -177,5 +193,7 @@ private Button buttonOrderReady; private Button buttonIssuedOrder; private Button buttonRef; + private ToolStripMenuItem ShopsToolStripMenuItem; + private ToolStripMenuItem FillShopToolStripMenuItem; } } \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopView/FormMain.cs b/CarRepairShop/CarRepairShopView/FormMain.cs index 793a7b5..94954f9 100644 --- a/CarRepairShop/CarRepairShopView/FormMain.cs +++ b/CarRepairShop/CarRepairShopView/FormMain.cs @@ -169,5 +169,23 @@ namespace CarRepairShopView { LoadData(); } + + private void ShopsToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShops)); + if (service is FormShops form) + { + form.ShowDialog(); + } + } + + private void FillShopToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormRepairShop)); + if (service is FormRepairShop form) + { + form.ShowDialog(); + } + } } } diff --git a/CarRepairShop/CarRepairShopView/FormMain.resx b/CarRepairShop/CarRepairShopView/FormMain.resx index 5203d24..a0623c8 100644 --- a/CarRepairShop/CarRepairShopView/FormMain.resx +++ b/CarRepairShop/CarRepairShopView/FormMain.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object] diff --git a/CarRepairShop/CarRepairShopView/FormRepairShop.Designer.cs b/CarRepairShop/CarRepairShopView/FormRepairShop.Designer.cs new file mode 100644 index 0000000..c1cda4f --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormRepairShop.Designer.cs @@ -0,0 +1,143 @@ +namespace CarRepairShopView +{ + partial class FormRepairShop + { + /// + /// 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() + { + comboBoxShop = new ComboBox(); + label1 = new Label(); + label2 = new Label(); + comboBoxRepair = new ComboBox(); + label3 = new Label(); + textBoxCount = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // comboBoxShop + // + comboBoxShop.FormattingEnabled = true; + comboBoxShop.Location = new Point(89, 9); + comboBoxShop.Name = "comboBoxShop"; + comboBoxShop.Size = new Size(178, 23); + comboBoxShop.TabIndex = 0; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 12); + label1.Name = "label1"; + label1.Size = new Size(57, 15); + label1.TabIndex = 1; + label1.Text = "Магазин:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(12, 50); + label2.Name = "label2"; + label2.Size = new Size(51, 15); + label2.TabIndex = 2; + label2.Text = "Ремонт:"; + // + // comboBoxRepair + // + comboBoxRepair.FormattingEnabled = true; + comboBoxRepair.Location = new Point(89, 47); + comboBoxRepair.Name = "comboBoxRepair"; + comboBoxRepair.Size = new Size(178, 23); + comboBoxRepair.TabIndex = 3; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(12, 89); + label3.Name = "label3"; + label3.Size = new Size(49, 15); + label3.TabIndex = 5; + label3.Text = "Кол-во:"; + // + // textBoxCount + // + textBoxCount.Location = new Point(89, 86); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(178, 23); + textBoxCount.TabIndex = 6; + // + // buttonSave + // + buttonSave.Location = new Point(195, 122); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(90, 32); + buttonSave.TabIndex = 7; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(60, 122); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(90, 32); + buttonCancel.TabIndex = 8; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // FormRepairShop + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(297, 166); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxCount); + Controls.Add(label3); + Controls.Add(comboBoxRepair); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(comboBoxShop); + FormBorderStyle = FormBorderStyle.FixedSingle; + Name = "FormRepairShop"; + Text = "Назначит ремонт магазину"; + Load += FormRepairShop_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private ComboBox comboBoxShop; + private Label label1; + private Label label2; + private ComboBox comboBoxRepair; + private Label label3; + private TextBox textBoxCount; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopView/FormRepairShop.cs b/CarRepairShop/CarRepairShopView/FormRepairShop.cs new file mode 100644 index 0000000..fb83216 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormRepairShop.cs @@ -0,0 +1,125 @@ +using CarRepairShopContracts.BusinessLogicsContracts; +using CarRepairShopContracts.SearchModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CarRepairShopView +{ + public partial class FormRepairShop : Form + { + private readonly ILogger _logger; + private readonly IRepairLogic _logicR; + private readonly IShopLogic _logicS; + public FormRepairShop(ILogger logger, IRepairLogic logicR, IShopLogic logicS) + { + InitializeComponent(); + _logger = logger; + _logicR = logicR; + _logicS = logicS; + } + + private void FormRepairShop_Load(object sender, EventArgs e) + { + _logger.LogInformation("Загрузка магазинов"); + try + { + var list = _logicS.ReadList(null); + if (list != null) + { + comboBoxShop.DisplayMember = "ShopName"; + comboBoxShop.ValueMember = "Id"; + comboBoxShop.DataSource = list; + comboBoxShop.SelectedItem = null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка магазинов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + _logger.LogInformation("Загрузка ремонтов"); + try + { + var list = _logicR.ReadList(null); + if (list != null) + { + comboBoxRepair.DisplayMember = "RepairName"; + comboBoxRepair.ValueMember = "Id"; + comboBoxRepair.DataSource = list; + comboBoxRepair.SelectedItem = null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка ремонтов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(comboBoxShop.Text)) + { + MessageBox.Show("Выберите магазин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(comboBoxRepair.Text)) + { + MessageBox.Show("Выберите ремонт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + _logger.LogInformation("Пополнение магазина"); + + try + { + var operationResult = _logicS.AddRepair(new ShopSearchModel + { + Id = Convert.ToInt32(comboBoxShop.SelectedValue) + }, + + _logicR.ReadElement(new RepairSearchModel() + { + Id = Convert.ToInt32(comboBoxRepair.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, "Ошибка пополнения магазина"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + } +} diff --git a/CarRepairShop/CarRepairShopView/FormRepairShop.resx b/CarRepairShop/CarRepairShopView/FormRepairShop.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormRepairShop.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/CarRepairShop/CarRepairShopView/FormShop.Designer.cs b/CarRepairShop/CarRepairShopView/FormShop.Designer.cs new file mode 100644 index 0000000..c3a3f7c --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShop.Designer.cs @@ -0,0 +1,201 @@ +namespace CarRepairShopView +{ + partial class FormShop + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + textBoxName = new TextBox(); + label1 = new Label(); + label2 = new Label(); + textBoxAddress = new TextBox(); + label3 = new Label(); + dateTimePickerDateOpen = new DateTimePicker(); + groupBox = new GroupBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + dataGridView = new DataGridView(); + ColumnId = new DataGridViewTextBoxColumn(); + ColumnName = new DataGridViewTextBoxColumn(); + ColumnCount = new DataGridViewTextBoxColumn(); + groupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // textBoxName + // + textBoxName.Location = new Point(82, 13); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(100, 23); + textBoxName.TabIndex = 0; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(17, 17); + label1.Name = "label1"; + label1.Size = new Size(62, 15); + label1.TabIndex = 1; + label1.Text = "Название:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(200, 17); + label2.Name = "label2"; + label2.Size = new Size(43, 15); + label2.TabIndex = 3; + label2.Text = "Адрес:"; + // + // textBoxAddress + // + textBoxAddress.Location = new Point(249, 13); + textBoxAddress.Name = "textBoxAddress"; + textBoxAddress.Size = new Size(100, 23); + textBoxAddress.TabIndex = 2; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(368, 18); + label3.Name = "label3"; + label3.Size = new Size(90, 15); + label3.TabIndex = 5; + label3.Text = "Дата открытия:"; + // + // dateTimePickerDateOpen + // + dateTimePickerDateOpen.Location = new Point(464, 13); + dateTimePickerDateOpen.Name = "dateTimePickerDateOpen"; + dateTimePickerDateOpen.Size = new Size(142, 23); + dateTimePickerDateOpen.TabIndex = 6; + // + // groupBox + // + groupBox.Controls.Add(dataGridView); + groupBox.Location = new Point(12, 47); + groupBox.Name = "groupBox"; + groupBox.Size = new Size(611, 274); + groupBox.TabIndex = 8; + groupBox.TabStop = false; + groupBox.Text = "Ремонты"; + // + // buttonSave + // + buttonSave.Location = new Point(530, 327); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(93, 32); + buttonSave.TabIndex = 9; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(431, 327); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(93, 32); + buttonCancel.TabIndex = 10; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnId, ColumnName, ColumnCount }); + dataGridView.Location = new Point(5, 22); + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowTemplate.Height = 25; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(600, 246); + dataGridView.TabIndex = 1; + // + // ColumnId + // + ColumnId.HeaderText = "Id"; + ColumnId.Name = "ColumnId"; + ColumnId.ReadOnly = true; + ColumnId.Visible = false; + // + // ColumnName + // + ColumnName.HeaderText = "Компонент"; + ColumnName.Name = "ColumnName"; + ColumnName.ReadOnly = true; + // + // ColumnCount + // + ColumnCount.FillWeight = 50F; + ColumnCount.HeaderText = "Количество"; + ColumnCount.Name = "ColumnCount"; + ColumnCount.ReadOnly = true; + // + // FormShop + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(635, 368); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(groupBox); + Controls.Add(dateTimePickerDateOpen); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(textBoxAddress); + Controls.Add(label1); + Controls.Add(textBoxName); + Name = "FormShop"; + Text = "Создание магазина"; + Load += FormShop_Load; + groupBox.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxName; + private Label label1; + private Label label2; + private TextBox textBoxAddress; + private Label label3; + private DateTimePicker dateTimePickerDateOpen; + private GroupBox groupBox; + private Button buttonSave; + private Button buttonCancel; + private DataGridView dataGridView; + private DataGridViewTextBoxColumn ColumnId; + private DataGridViewTextBoxColumn ColumnName; + private DataGridViewTextBoxColumn ColumnCount; + } +} \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopView/FormShop.cs b/CarRepairShop/CarRepairShopView/FormShop.cs new file mode 100644 index 0000000..d139762 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShop.cs @@ -0,0 +1,127 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.BusinessLogicsContracts; +using CarRepairShopContracts.SearchModels; +using CarRepairShopDataModels.Models; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CarRepairShopView +{ + public partial class FormShop : Form + { + + private readonly ILogger _logger; + private readonly IShopLogic _logic; + private int? _id; + private Dictionary _shopRepairs; + public int Id { set { _id = value; } } + + public FormShop(ILogger logger, IShopLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + _shopRepairs = new Dictionary(); + } + + private void FormShop_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + _logger.LogInformation("Загрузка магазина"); + try + { + var view = _logic.ReadElement(new ShopSearchModel { Id = _id.Value }); + if (view != null) + { + textBoxName.Text = view.ShopName; + textBoxAddress.Text = view.ShopAddress; + dateTimePickerDateOpen.Value = view.DateOpen; + _shopRepairs = view.ShopRepairs ?? new Dictionary(); + LoadData(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки магазина"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void LoadData() + { + _logger.LogInformation("Загрузка ремонтов магазина"); + try + { + if (_shopRepairs != null) + { + dataGridView.Rows.Clear(); + foreach (var sr in _shopRepairs) + { + dataGridView.Rows.Add(new object[] { sr.Key, sr.Value.Item1.RepairName, sr.Value.Item2 }); + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки ремонтов магазина"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxName.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxAddress.Text)) + { + MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение магазина"); + try + { + var model = new ShopBindingModel + { + Id = _id ?? 0, + ShopName = textBoxName.Text, + ShopAddress = textBoxAddress.Text, + DateOpen = dateTimePickerDateOpen.Value.Date, + ShopRepairs = _shopRepairs + }; + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Доп информация в логах"); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch(Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения магазина"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/CarRepairShop/CarRepairShopView/FormShop.resx b/CarRepairShop/CarRepairShopView/FormShop.resx new file mode 100644 index 0000000..fcacbcb --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShop.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopView/FormShops.Designer.cs b/CarRepairShop/CarRepairShopView/FormShops.Designer.cs new file mode 100644 index 0000000..de83585 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShops.Designer.cs @@ -0,0 +1,124 @@ +namespace CarRepairShopView +{ + partial class FormShops + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + buttonAddShop = new Button(); + buttonUpdShop = new Button(); + buttonDelShop = new Button(); + buttonRefShop = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Left; + dataGridView.Location = new Point(0, 0); + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowTemplate.Height = 25; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.ShowCellErrors = false; + dataGridView.ShowCellToolTips = false; + dataGridView.ShowEditingIcon = false; + dataGridView.ShowRowErrors = false; + dataGridView.Size = new Size(611, 450); + dataGridView.TabIndex = 0; + // + // buttonAddShop + // + buttonAddShop.Location = new Point(638, 12); + buttonAddShop.Name = "buttonAddShop"; + buttonAddShop.Size = new Size(133, 45); + buttonAddShop.TabIndex = 1; + buttonAddShop.Text = "Добавить"; + buttonAddShop.UseVisualStyleBackColor = true; + buttonAddShop.Click += buttonAddShop_Click; + // + // buttonUpdShop + // + buttonUpdShop.Location = new Point(638, 73); + buttonUpdShop.Name = "buttonUpdShop"; + buttonUpdShop.Size = new Size(133, 45); + buttonUpdShop.TabIndex = 2; + buttonUpdShop.Text = "Редактировать"; + buttonUpdShop.UseVisualStyleBackColor = true; + buttonUpdShop.Click += buttonUpdShop_Click; + // + // buttonDelShop + // + buttonDelShop.Location = new Point(638, 137); + buttonDelShop.Name = "buttonDelShop"; + buttonDelShop.Size = new Size(133, 45); + buttonDelShop.TabIndex = 3; + buttonDelShop.Text = "Удалить"; + buttonDelShop.UseVisualStyleBackColor = true; + buttonDelShop.Click += buttonDelShop_Click; + // + // buttonRefShop + // + buttonRefShop.Location = new Point(638, 204); + buttonRefShop.Name = "buttonRefShop"; + buttonRefShop.Size = new Size(133, 45); + buttonRefShop.TabIndex = 4; + buttonRefShop.Text = "Обновить"; + buttonRefShop.UseVisualStyleBackColor = true; + buttonRefShop.Click += buttonRefShop_Click; + // + // FormShops + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(buttonRefShop); + Controls.Add(buttonDelShop); + Controls.Add(buttonUpdShop); + Controls.Add(buttonAddShop); + Controls.Add(dataGridView); + Name = "FormShops"; + Text = "Магазины"; + Load += FormShops_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonAddShop; + private Button buttonUpdShop; + private Button buttonDelShop; + private Button buttonRefShop; + } +} \ No newline at end of file diff --git a/CarRepairShop/CarRepairShopView/FormShops.cs b/CarRepairShop/CarRepairShopView/FormShops.cs new file mode 100644 index 0000000..5db0459 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShops.cs @@ -0,0 +1,114 @@ +using CarRepairShopContracts.BindingModels; +using CarRepairShopContracts.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 CarRepairShopView +{ + public partial class FormShops : Form + { + + private readonly ILogger _logger; + private readonly IShopLogic _logic; + + public FormShops(ILogger logger, IShopLogic logic) + { + InitializeComponent(); + _logic = logic; + _logger = logger; + } + + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["ShopRepairs"].Visible = false; + dataGridView.Columns["ShopName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка магазинов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки магазинов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAddShop_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShop)); + if (service is FormShop form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void FormShops_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void buttonUpdShop_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShop)); + if (service is FormShop form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void buttonDelShop_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление магазина"); + try + { + if (!_logic.Delete(new ShopBindingModel { Id = id })) + { + throw new Exception("Ошибка при удалении. Доп информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления ремонта"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + } + + private void buttonRefShop_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/CarRepairShop/CarRepairShopView/FormShops.resx b/CarRepairShop/CarRepairShopView/FormShops.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/CarRepairShop/CarRepairShopView/FormShops.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/CarRepairShop/CarRepairShopView/Program.cs b/CarRepairShop/CarRepairShopView/Program.cs index 6d07e27..32b786b 100644 --- a/CarRepairShop/CarRepairShopView/Program.cs +++ b/CarRepairShop/CarRepairShopView/Program.cs @@ -40,9 +40,11 @@ namespace CarRepairShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -50,6 +52,9 @@ namespace CarRepairShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file