diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Component.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Component.cs new file mode 100644 index 0000000..90870d9 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Component.cs @@ -0,0 +1,20 @@ +namespace ProjectConfectFactory.Entities; + +public class Component +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public string Unit { get; private set; } = string.Empty; + public decimal Count { get; private set; } + + public static Component CreateEntity(int id, string name, string unit, decimal count) + { + return new Component + { + Id = id, + Name = name ?? string.Empty, + Unit = unit ?? string.Empty, + Count = count + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/DeliveryType.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/DeliveryType.cs new file mode 100644 index 0000000..df2f0ff --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/DeliveryType.cs @@ -0,0 +1,12 @@ +namespace ProjectConfectFactory.Entities.Enums; + +public enum DeliveryType +{ + None = 0, + + Express = 1, // 1-2 дня + + Middle = 2, // 3-5 дней + + Long = 3 // 6-10 дней +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/ProductType.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/ProductType.cs new file mode 100644 index 0000000..fbe8074 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Enums/ProductType.cs @@ -0,0 +1,19 @@ +namespace ProjectConfectFactory.Entities.Enums; + +[Flags] +public enum ProductType +{ + None = 0, + + Dark = 1, // горький шоколад + + White = 2, // белый шоколад + + Nut = 4, // ореховый + + Fondant = 8, // с помадкой + + Alcohol = 16 // с алкоголем +} + + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Order.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Order.cs new file mode 100644 index 0000000..e7abc0d --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Order.cs @@ -0,0 +1,23 @@ +namespace ProjectConfectFactory.Entities; + +// заказ +public class Order +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public string Phone { get; private set; } = string.Empty; + public IEnumerable OrderProducts { get; private set;} = []; + public DateTime DateTime { get; private set; } + + public static Order CreateOpeartion(int id, string name, string phone, IEnumerable orderProducts) + { + return new Order + { + Id = id, + Name = name ?? string.Empty, + Phone = phone ?? string.Empty, + OrderProducts = orderProducts, + DateTime = DateTime.Now + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/OrderProducts.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/OrderProducts.cs new file mode 100644 index 0000000..61e8701 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/OrderProducts.cs @@ -0,0 +1,21 @@ +namespace ProjectConfectFactory.Entities; + +// класс продукт в заказе +public class OrderProducts +{ + public int Id { get; private set; } + public int ProductId { get; private set; } + public int Count { get; private set; } + public decimal Price { get; private set; } + + public static OrderProducts CreateElement(int id, int productId, int count, decimal price) + { + return new OrderProducts + { + Id = id, + ProductId = productId, + Count = count, + Price = price + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Product.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Product.cs new file mode 100644 index 0000000..b1838b0 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Product.cs @@ -0,0 +1,24 @@ +using ProjectConfectFactory.Entities.Enums; + +namespace ProjectConfectFactory.Entities; + +public class Product +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public ProductType ProductType { get; private set; } + public IEnumerable Recipe { get; private set; } = []; + public decimal Price { get; private set; } + + public static Product CreateEntity(int id, string name, ProductType productType, IEnumerable recipe, decimal price) + { + return new Product + { + Id = id, + Name = name ?? string.Empty, + ProductType = productType, + Recipe = recipe, + Price = price + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Purchase.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Purchase.cs new file mode 100644 index 0000000..a1ab9d0 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Purchase.cs @@ -0,0 +1,21 @@ +namespace ProjectConfectFactory.Entities; + +//Закупка +public class Purchase +{ + public int Id { get; private set; } + public DateTime DateTime { get; private set; } + public int SellerId { get; private set; } + public int ComponentId { get; private set; } + + public static Purchase CreateOpeartion(int id, int sellerId, int componentId) + { + return new Purchase + { + Id = id, + DateTime = DateTime.Now, + SellerId = sellerId, + ComponentId = componentId + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Recipe.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Recipe.cs new file mode 100644 index 0000000..b5898c0 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Recipe.cs @@ -0,0 +1,19 @@ +namespace ProjectConfectFactory.Entities; + +// класс компонент в продукте (рецепт) +public class Recipe +{ + public int Id { get; private set; } + public int ComponentId { get; private set; } + public double CountComponent { get; private set; } + + public static Recipe CreateElement(int id, int componentId, double countComponent) + { + return new Recipe + { + Id = id, + ComponentId = componentId, + CountComponent = countComponent + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Entities/Seller.cs b/ProjectConfectFactory/ProjectConfectFactory/Entities/Seller.cs new file mode 100644 index 0000000..af8cb39 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Entities/Seller.cs @@ -0,0 +1,22 @@ +using ProjectConfectFactory.Entities.Enums; + +namespace ProjectConfectFactory.Entities; + +public class Seller +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public string Phone { get; private set; } = string.Empty; + public DeliveryType DeliveryTime { get; private set; } + + public static Seller CreateEntity(int id, string name, string phone, DeliveryType deliveryTime) + { + return new Seller + { + Id = id, + Name = name ?? string.Empty, + Phone = phone ?? string.Empty, + DeliveryTime = deliveryTime + }; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Form1.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Form1.Designer.cs deleted file mode 100644 index 3547285..0000000 --- a/ProjectConfectFactory/ProjectConfectFactory/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectConfectFactory -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Form1.cs b/ProjectConfectFactory/ProjectConfectFactory/Form1.cs deleted file mode 100644 index 8408963..0000000 --- a/ProjectConfectFactory/ProjectConfectFactory/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectConfectFactory -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.Designer.cs new file mode 100644 index 0000000..6977aa5 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.Designer.cs @@ -0,0 +1,139 @@ +namespace ProjectConfectFactory +{ + partial class FormConFactory + { + /// + /// 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() + { + menuStripTool = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + ProductToolStripMenuItem = new ToolStripMenuItem(); + SellerToolStripMenuItem = new ToolStripMenuItem(); + ComponentToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + OrderToolStripMenuItem = new ToolStripMenuItem(); + PurchaseToolStripMenuItem = new ToolStripMenuItem(); + ReportToolStripMenuItem = new ToolStripMenuItem(); + menuStripTool.SuspendLayout(); + SuspendLayout(); + // + // menuStripTool + // + menuStripTool.BackColor = Color.Bisque; + menuStripTool.ImageScalingSize = new Size(20, 20); + menuStripTool.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, ReportToolStripMenuItem }); + menuStripTool.Location = new Point(0, 0); + menuStripTool.Name = "menuStripTool"; + menuStripTool.Size = new Size(862, 28); + menuStripTool.TabIndex = 0; + menuStripTool.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ProductToolStripMenuItem, SellerToolStripMenuItem, ComponentToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // ProductToolStripMenuItem + // + ProductToolStripMenuItem.Name = "ProductToolStripMenuItem"; + ProductToolStripMenuItem.Size = new Size(182, 26); + ProductToolStripMenuItem.Text = "Продукты"; + ProductToolStripMenuItem.Click += ProductToolStripMenuItem_Click; + // + // SellerToolStripMenuItem + // + SellerToolStripMenuItem.Name = "SellerToolStripMenuItem"; + SellerToolStripMenuItem.Size = new Size(182, 26); + SellerToolStripMenuItem.Text = "Поставщики"; + SellerToolStripMenuItem.Click += SellerToolStripMenuItem_Click; + // + // ComponentToolStripMenuItem + // + ComponentToolStripMenuItem.Name = "ComponentToolStripMenuItem"; + ComponentToolStripMenuItem.Size = new Size(182, 26); + ComponentToolStripMenuItem.Text = "Компоненты"; + ComponentToolStripMenuItem.Click += ComponentToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { OrderToolStripMenuItem, PurchaseToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(95, 24); + операцииToolStripMenuItem.Text = "Операции"; + // + // OrderToolStripMenuItem + // + OrderToolStripMenuItem.Name = "OrderToolStripMenuItem"; + OrderToolStripMenuItem.Size = new Size(156, 26); + OrderToolStripMenuItem.Text = "Заказ"; + OrderToolStripMenuItem.Click += OrderToolStripMenuItem_Click; + // + // PurchaseToolStripMenuItem + // + PurchaseToolStripMenuItem.Name = "PurchaseToolStripMenuItem"; + PurchaseToolStripMenuItem.Size = new Size(156, 26); + PurchaseToolStripMenuItem.Text = "Поставка"; + PurchaseToolStripMenuItem.Click += PurchaseToolStripMenuItem_Click; + // + // ReportToolStripMenuItem + // + ReportToolStripMenuItem.Name = "ReportToolStripMenuItem"; + ReportToolStripMenuItem.Size = new Size(73, 24); + ReportToolStripMenuItem.Text = "Отчёты"; + // + // FormConFactory + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.Фон; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(862, 453); + Controls.Add(menuStripTool); + MainMenuStrip = menuStripTool; + Name = "FormConFactory"; + StartPosition = FormStartPosition.CenterParent; + Text = "\"Кондитерская фабрика\""; + menuStripTool.ResumeLayout(false); + menuStripTool.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStripTool; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem ProductToolStripMenuItem; + private ToolStripMenuItem SellerToolStripMenuItem; + private ToolStripMenuItem ComponentToolStripMenuItem; + private ToolStripMenuItem операцииToolStripMenuItem; + private ToolStripMenuItem OrderToolStripMenuItem; + private ToolStripMenuItem PurchaseToolStripMenuItem; + private ToolStripMenuItem ReportToolStripMenuItem; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.cs b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.cs new file mode 100644 index 0000000..93058dd --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.cs @@ -0,0 +1,85 @@ +namespace ProjectConfectFactory; + +using ProjectConfectFactory.Forms; +using Unity; + +public partial class FormConFactory : Form +{ + + private readonly IUnityContainer _container; + public FormConFactory(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void ProductToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void SellerToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ComponentToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void OrderToolStripMenuItem_Click(object sender, EventArgs e) + { + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void PurchaseToolStripMenuItem_Click(object sender, EventArgs e) + { + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.resx b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.resx new file mode 100644 index 0000000..f5a8e35 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/FormConFactory.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.Designer.cs new file mode 100644 index 0000000..63c844a --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.Designer.cs @@ -0,0 +1,161 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormComponent + { + /// + /// 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() + { + buttonBack = new Button(); + ButtonSave = new Button(); + label4 = new Label(); + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + textBoxComponentUnit = new TextBox(); + textBoxComponentName = new TextBox(); + numericUpDownComponentCount = new NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).BeginInit(); + SuspendLayout(); + // + // buttonBack + // + buttonBack.Location = new Point(291, 245); + buttonBack.Name = "buttonBack"; + buttonBack.Size = new Size(94, 29); + buttonBack.TabIndex = 17; + buttonBack.Text = "Отмена"; + buttonBack.UseVisualStyleBackColor = true; + buttonBack.Click += buttonBack_Click; + // + // ButtonSave + // + ButtonSave.Location = new Point(67, 245); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(94, 29); + ButtonSave.TabIndex = 16; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // label4 + // + label4.AutoSize = true; + label4.BackColor = Color.Bisque; + label4.Location = new Point(22, 191); + label4.Name = "label4"; + label4.Size = new Size(112, 20); + label4.TabIndex = 15; + label4.Text = "Кол-во сейчас:"; + // + // label3 + // + label3.AutoSize = true; + label3.BackColor = Color.Bisque; + label3.Location = new Point(22, 131); + label3.Name = "label3"; + label3.Size = new Size(113, 20); + label3.TabIndex = 14; + label3.Text = "Ед. измерения:"; + // + // label2 + // + label2.AutoSize = true; + label2.BackColor = Color.Bisque; + label2.Location = new Point(22, 67); + label2.Name = "label2"; + label2.Size = new Size(119, 20); + label2.TabIndex = 13; + label2.Text = "Наименование:"; + // + // label1 + // + label1.AutoSize = true; + label1.BackColor = Color.Bisque; + label1.Font = new Font("Segoe UI", 10F); + label1.Location = new Point(169, 9); + label1.Name = "label1"; + label1.Size = new Size(102, 23); + label1.TabIndex = 12; + label1.Text = "Компонент:"; + // + // textBoxComponentUnit + // + textBoxComponentUnit.Location = new Point(206, 124); + textBoxComponentUnit.Name = "textBoxComponentUnit"; + textBoxComponentUnit.Size = new Size(218, 27); + textBoxComponentUnit.TabIndex = 10; + // + // textBoxComponentName + // + textBoxComponentName.Location = new Point(206, 60); + textBoxComponentName.Name = "textBoxComponentName"; + textBoxComponentName.Size = new Size(218, 27); + textBoxComponentName.TabIndex = 9; + // + // numericUpDownComponentCount + // + numericUpDownComponentCount.Location = new Point(206, 184); + numericUpDownComponentCount.Maximum = new decimal(new int[] { 10000, 0, 0, 0 }); + numericUpDownComponentCount.Name = "numericUpDownComponentCount"; + numericUpDownComponentCount.Size = new Size(218, 27); + numericUpDownComponentCount.TabIndex = 18; + // + // FormComponent + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.AntiqueWhite; + ClientSize = new Size(482, 303); + Controls.Add(numericUpDownComponentCount); + Controls.Add(buttonBack); + Controls.Add(ButtonSave); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(textBoxComponentUnit); + Controls.Add(textBoxComponentName); + Name = "FormComponent"; + StartPosition = FormStartPosition.CenterParent; + Text = "Компонент"; + ((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonBack; + private Button ButtonSave; + private Label label4; + private Label label3; + private Label label2; + private Label label1; + private TextBox textBoxComponentUnit; + private TextBox textBoxComponentName; + private NumericUpDown numericUpDownComponentCount; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.cs new file mode 100644 index 0000000..a3e3190 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.cs @@ -0,0 +1,74 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Repositories; + +namespace ProjectConfectFactory.Forms; + +public partial class FormComponent : Form +{ + private readonly IComponentRepository _componentRepository; + private int? _componentId; + + public int Id + { + set + { + try + { + var component = _componentRepository.ReadComponentById(value); + if (component == null) + { + throw new InvalidDataException(nameof(component)); + } + textBoxComponentName.Text = component.Name; + textBoxComponentUnit.Text = component.Unit; + numericUpDownComponentCount.Value = (decimal)component.Count; + + + _componentId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormComponent(IComponentRepository componentRepository, IPurchaseRepository purchaseRepository) + { + InitializeComponent(); + _componentRepository = componentRepository ?? throw new ArgumentNullException(nameof(componentRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxComponentName.Text) || string.IsNullOrWhiteSpace(textBoxComponentUnit.Text) || numericUpDownComponentCount.Value == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_componentId.HasValue) + { + + _componentRepository.UpdateComponent(CreateComponent(_componentId.Value)); + } + else + { + _componentRepository.CreateComponent(CreateComponent(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonBack_Click(object sender, EventArgs e) => Close(); + + private Component CreateComponent(int id) => Component.CreateEntity(id, textBoxComponentName.Text, textBoxComponentUnit.Text, + Convert.ToDecimal(numericUpDownComponentCount.Value)); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Form1.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.resx similarity index 92% rename from ProjectConfectFactory/ProjectConfectFactory/Form1.resx rename to ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.resx index 1af7de1..8b2ff64 100644 --- a/ProjectConfectFactory/ProjectConfectFactory/Form1.resx +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponent.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.Designer.cs new file mode 100644 index 0000000..7a27854 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.Designer.cs @@ -0,0 +1,130 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormComponents + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormComponents)); + panel1 = new Panel(); + buttonUpd = new Button(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridViewComponents = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewComponents).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.BackColor = Color.Linen; + panel1.Controls.Add(buttonUpd); + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(657, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(143, 450); + panel1.TabIndex = 1; + // + // buttonUpd + // + buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage"); + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(27, 339); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(95, 90); + buttonUpd.TabIndex = 4; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += buttonUpd_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage"); + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(27, 134); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(95, 90); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(27, 24); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 90); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridViewComponents + // + dataGridViewComponents.AllowUserToAddRows = false; + dataGridViewComponents.AllowUserToDeleteRows = false; + dataGridViewComponents.AllowUserToResizeColumns = false; + dataGridViewComponents.AllowUserToResizeRows = false; + dataGridViewComponents.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewComponents.BackgroundColor = Color.Bisque; + dataGridViewComponents.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewComponents.Dock = DockStyle.Fill; + dataGridViewComponents.GridColor = Color.Bisque; + dataGridViewComponents.Location = new Point(0, 0); + dataGridViewComponents.MultiSelect = false; + dataGridViewComponents.Name = "dataGridViewComponents"; + dataGridViewComponents.ReadOnly = true; + dataGridViewComponents.RowHeadersVisible = false; + dataGridViewComponents.RowHeadersWidth = 51; + dataGridViewComponents.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewComponents.Size = new Size(657, 450); + dataGridViewComponents.TabIndex = 2; + // + // FormComponents + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewComponents); + Controls.Add(panel1); + Name = "FormComponents"; + Text = "Компоненты"; + Load += FormComponents_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewComponents).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonUpd; + private Button buttonDel; + private Button buttonAdd; + private DataGridView dataGridViewComponents; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.cs new file mode 100644 index 0000000..d440a98 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.cs @@ -0,0 +1,110 @@ + +using ProjectConfectFactory.Repositories; +using Unity; + +namespace ProjectConfectFactory.Forms; + +public partial class FormComponents : Form +{ + private readonly IUnityContainer _container; + + private readonly IComponentRepository _componentRepository; + + public FormComponents(IUnityContainer container, IComponentRepository componentRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _componentRepository = componentRepository ?? + throw new ArgumentNullException(nameof(componentRepository)); + } + private void FormComponents_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _componentRepository.DeleteComponent(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewComponents.DataSource = _componentRepository.ReadComponents(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewComponents.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewComponents.SelectedRows[0].Cells["Id"].Value); + return true; + } +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.resx new file mode 100644 index 0000000..ce544af --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormComponents.resx @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAED/SURBVHhe7d0H + mBRF/sbxH3EBQdIRFAUFxZxFwRMzoqfomQMmBBWz3p05Y8CsiJjPiIoIiqinglkMcIBgOPXU81RUUEwY + Ti/V/6m9Hf+zVb1Lh+rprp7v+zyf5/FZ2dnqmZqud3p6ekQIyWeWFZEhInKxiEwRkb+IyGIR+YeI/FtE + vhKRD0TkKRG5XkQOFZGVzRshtekmIvuKyFUi8riIvFN3//0sIv+s+2/9M/3/9L/R/1b/DrGj55iea3rO + 6bmn56C+//Sc1HNTz1E9V/Wc1XNXz+H25o0QaSIia4vIsSJyi4jMEJGP6+5LJSLfi8giEZkvIhNF5FwR + 2UZEWps3RAgpRtqIyIEiMq1uh6p3BFG9LSJnikgv88arLJ1F5BgRmRlwH4U1q24HrW+rmtOzbk7puWXe + R2HouazntJ7beo5Xc/Sif7mIfBJwP4WhS9b9dcWquXnjhBD/ol8hnSEinwc84eP6l4jcJSJrmn+s4OlR + 9ypev4Iy75O4fqi7TX3b1RQ9d/Qc0nPJvE/i+qJurusjXNWUgSLyWMD9kcT7InK4iLQ0/xghxI/sJSIL + A57crvxHRG6sgsOwLUTkeBFZEnAfuKKLgD4UW2P+8YJlmbrD9y4XfpN+q0AvXvpQeJGzvIjcGbD9Lr0r + IoPNP0wIyW+6pPCKoDH6/UX9KqSIWU1E5gVsc1r039J/s4jRc0TPFXOb06KfA/q5UMTsl3IhNd3EOQKE + 5D+biMiCgCdw2vQruj+Yg/E8e1R4J1vyXd3fLlL03EjzVX9D9HNBPyeKEv3evD5J0tzOStAnDa5kDogQ + ko/oM3mzWLDKXSMiTc2BeZhhGS1YJf8VkRPNQXkYfRj+0oDtqyR9zsaO5sA8jH57aFLA9lXSpyKyvjkw + Qki2GVT30TPzCZuFcebgPMtRAduUlaPNwXmWsQHblAX93NjeHJxH0SfjPRGwXVnQ51isYQ6QEJJNNq47 + bGw+UbN0ljlIT6JPnNQnN5rbkxU9Fj0mH6M/3mduT5b0c0Q/V3yLPopyT8D2ZOmjKvzkCiG5S8e6C6aY + T9Cs6UPYu5iDzXn65uAtlCD6ELZvH7nUh9zzVKRK9MLl27UXfh+wHXnwSt0nZAghGeXBgCdmXujPZS9n + Djin0e+vvh6wDXmhx+bLRwT1Y64fe3Mb8kI/Z3xJv7orSprbkBcXmQMmhFQm+kxx8wmZN/rQpQ85O2Ds + eePL2yr3Bow9b3Y3B53DNBORuQFjzxN9oux65sAJIelGfyZXH840n5B5tLU5+JxFf7Tpx4Bx540eY94/ + hqUfa3PceaSfO3n/XLu+3LQ57jx6zhw4ISTd6OvIm0/EvHrRHHzOktXnquPQY81zng8Yc17p51Beo9/u + yeJ6HnFta24AISSd6IuBfBjwJMyzzc2NyEm6130JijnevPqp7hKweYx+jM3x5pk+CpDXk9j0pYzN8eaZ + /vZGQkgFsnPAEzCW3qutpQ4+9hR1xR1T1O2PvaLuefpVNe7+aerEUVeqzbbZQTVr1sz6nZjuMDciJzk5 + YKyxrNtvMzXylFFqzD2PqvFPzqml/1v/bL1Nfm39+wROMTciJ9GPsTnWyJo2bVY79/Qc1HPx7qfm1s5N + PUf1XO2z+trW7ySgn0t5zJ8DxhpZTatWartd9lKnXXq9uuGBp9W9z8xXtzw8Q118y0S1z/BjVPcVelq/ + E5P+1E8fcyMIIe6jv8PbfAJGsmyHTup351+lJr7wprp/xl8adPX4R9Sa629s/X4M+jPY+otg8pbEZ/4v + 33Nldd61d1r3nWnUuLtUj169rd+P4U1zI3IQ/dgmvhaFnmtXjX/Yuu/K6Tn7+/Ovrp3D5u/HoJ9LeYv+ + yKc5zsg2324nddOUZ637r9yEZ19Th55whmrRssb6/Rj0l1kRQlKMPvyf6LPqesG67v7p1s6gIXonsc1O + u1u3E4P+nvE8ZeWAMUay9oabqtsfn2ndZw254/GZap2N+lu3E0PeXm0lPiq19U671c418z5riJ7DDgqV + fi7l7W0AfYTHHGckQ0eeaN1fjRl980TVrn1H63YimmNuCCHEbQYEPPFCa9e+vRo74XFrB7A0E59/Q220 + 2VbW7UV0hbkxGWd4wBhDW6HXypEW/5I7p/1Z9ey9qnV7EY0wNybjXBkwxtA26L+5mvDc69Z9tTS6BDg4 + EqCfU3lKokv+Dtn3IOt+CuP868ar5i1aWLcXgb7wk28XWSLEq/wu4IkX2knnX6Imv2g/+cO4ZeoLqlXr + NtZtRqCvHJan3BIwxlCaNGmixo6fbN1HYY2+6b7a2zBvN4JbzY3JOC8HjDGU1m3aqHuffMm6j8I6+vQL + rduMSF9pLy/Rl/39NmCMofTo2Us9NNO+j8Ladehw6zYjKsKXLhGS2+jv5TafdKHoV6zT5/9VPTTzHeuJ + H9buBx1u3W4EX5sbk3FmBIwxlAFbbaueev199cDLb1n3UVj9Bm5j3W4EL5kbk3G+ChhjKPsNH6mefO19 + NSlmMb3v+ddr39YybzeCm82NyTD6Ex7m+EI7bfQVatq896z7KCx9smVNq9bW7UZQhG+wJCS3eSbgSRfK + AUccXbtoPfLnv1pP/LD0mdjm7UbU1dygDLMoYHyhnH7JVbX35UOz3rbuo7BOOPdy63Yj0JfazUu6BIwv + tJsmPZK4TO15yJHW7UbwrLlBGWbLgPGF0rKmRj0y8/Xa+zJumdL6b7W9ddsRXGduECHEXeYFPOlCuezm + O2t3Do/Nedd60kfRrn0H67YjWN3coAwT+xrrE596KXGZunnq89btRvDvusPFeYj+EiVzfKG0W7Z97f2o + TZkZv0ydM+Y267YjeM3coAyzW8D4Qll7w41/uS8feCl+mRp+4hnWbUcwwdwgQoi7/C3gSRfKbVOn1e4c + Hn81WQFYaZXVrNuOQH+5SR7SKmBsoehrI+i3UmoLwOz4BUB/nC3hSVd5+VjlRgFjC2XlVfr+smhNTVAA + 9PUWzNuOQH+bZl5yUMD4Qtlqh51+uS8ffDn+fXnSRddYtx3Bo+YGEULcJfblQe+re9WatAAkvC7AQHOD + Mkr7gLGFskzbdr/saB+dE78AaAmPpuTljOvNAsYWylrrb/j/BWBW/HNTEh5N+czcoAxzWMD4Qtlpz32d + FICER1O4IiAhKYYC4CYUAHehALgLBYAQ0mAoAG5CAXAXCoC7UAAIIQ2GAuAmFAB3oQC4CwWAENJgKABu + QgFwFwqAu1AACCENhgLgJhQAd6EAuAsFgBDSYCgAbkIBcBcKgLtQAAghDYYC4CYUAHehALgLBYAQ0mAo + AG5CAXAXCoC7UAAIKWCaiciqdd+brr997EYReVBEpovIbBF5S0TeD+FfAU+6UHJSAD4J2KYs6Ku/mWML + JUcF4O8B25UF/ZiaYwslJwVAX1bZ3KasfB4wvlByUgB+DNimIG+IyMy6/d9kEblWRI4RkUEi0itHl7km + JFb0BF5PRE4QkalJvuLTlZwUAO/lqAB4LycFoBByUgBcWSgi94rI4SKyirlzJSSv6Skip4jIewGTOlMU + ADcoAO5QANwpWAEwvVm3X+1u7nAJyTpN677FS3+//H8DJm8uUADcoAC4QwFwp+AFoES/Bfpwjs4lIlUc + vfAPEZE5ARM1dygAblAA3KEAuFMlBaCcfsGl97+cL0Aqnq3qDkuZkzK3KABuUADcoQC4U4UFoOQZEVnT + 3EETkka6icideT7U3xAKgBsUAHcoAO5UcQHQ/ikiY0SknbnDJsRVdhWRLwMmnxcoAG5QANyhALhT5QWg + RH/EcGNzx01IkjQXkXNF5D8BE84bFAA3KADuUADcoQD8Qp8oqD8xwLkBJHH0If9XAiaZdygAblAA3KEA + uEMBsNwvIq3NHTohYbOSiLwTMLG8RAFwgwLgDgXAHQpAoJdzdMls4lHWSnLd/TyiALhBAXCHAuAOBaBB + +tNaK5g7eEIail78vT3ZryEUADcoAO5QANyhADTqryLS1dzRE2JGN8UPAyaQ9ygAblAA3KEAuEMBWKr5 + ItLB3OETUsqv6r6Vz5w4hUABcIMC4A4FwB0KQCj62wdbmjt+QvRlffXkMCeMUzUtm6ktN1pe/e6A9dSN + Z26pHh+3s5p9957qrQf2U+8/PHSpunVubd1mWHkoAPeOHmRtUxbmTdjbGltYeSkAc+7Z09quLNx/6fbW + 2MLKQwH4VYdW1jZlZfSx/a3xhZWHAjBg3W7WNv1i6v7q/Ql7q/fH76ne+ONuaua4ndWjFw1S1xzTXx21 + 6+qq32q/Us2aNrFuMwVjzZ0/IWcFTBQn2rVpoQ7ZZXX1xLid1Y8vH6bU3CNj69F1Gev2w8pDAXjull2t + bcrCN88Pt8YWVl4KwOJnhlnblYUXb9vNGltYeSgAulSb25SVm8/ayhpfWHkoANv062FtUz1zjlTqhRFK + PTUs0NcPDVWTztla7bZ5L9WyeVPr9h3aw1wASPVGX9f/3wGTJJGe3duqa08dqH54KdmiX44C4AYFwB0K + gDuFLwDaUkpAyeIH91fnHryB6tSuxvo7DnwtIr3NhYBUX5ZxfdJf+7Yt1TUnb67+OesIe/InRAFwgwLg + DgXAnaooACXPL70EaEsePkCdtv+6aRwReI6rBZKLAyZGbHts21t9Nv1ge7I7QgFwgwLgDgXAnaoqAHNH + KvXccGvBb8hbt+2uBqzZ1fqbCR1oLgiketJXRH4KmBSR6ZP7rv7DrwMmuVsUADcoAO5QANyprgKg3w4Y + qdTTh1qLfUP+Ne1gdc5B66umTZydLLiQjwZWb54ImBCRdWhXo57/42/tyZ0CCoAbFAB3KADuVF0B0GYe + rtTT9mLfmLtO20K1cPeWwJXmwkCKn00DJkJkXTu1VvPv29ue1CmhALhBAXCHAuBOVRYAbUa48wHK/Wn0 + INWqZTNrDDH8UPelb6SKMjVgIkSiP96nP8NvTeYUUQDcoAC4QwFwp2oLgH4r4JnwbwWUTL1gO9W8mZMj + AaPNBYIUN+uKyH8DJkFo+oIV068fYk/klPVarp01lrDu+tMzTgrAKmusbd12WHqxMLcpC9+/OMIaW1gt + WrZUT7723v8KwOxkBaCmVfwLO+kSY25XFmbeuYc1trBWXWMtJwXguvunW7cdli7V5jZl5bZzt7bGF9ag + IbuVFYC3rPsorNMuu8G67bC2H7CitU2hvXK4tcCHMe64AdY4YlgiIh3NhYIUMzcGTIBIzj9qE3sCV8Ba + fTpZYwlrzB331e4cHpubbNHq1KWbddthvT5xH2ubsvDfOUeqpgmuOjZlxpza+/KRBAXg9sdnWrcbVpMm + ov49e6S1XVl4c9K+1vjC6tyl6y+L1kMz4xeA868fb912WGus3NHapqwkuarihv1//ct9+cBL8QvAESef + Z912WHtu18fapkieDf+pgHIHbNfHGksMx5sLBSleWtVdBMJ88EPTl/L9T0Y7383W626NJ6yjTznrf69a + Exy2vmnKs6pJ0/iH3D567EBrm7KiT940xxfWpTfdkfhV69lX32rdblj67Sdze7Ky4PGDrPGF1aRJk1/e + mkpy2HrY8adbtx3Wpmt3s7YpK9OuG2KNL6z2HTuq6fP/WntfTgq4j8IatGv8y2Qfuuvq1jZFEvMogL5W + wErd21rjiWiOuViQ4mXvgAc+tJYtmqq/TN7XnrgVMvQ3q1pjCmvdjTZJvGiN+P1Z1u2GpT8qmZdXrdoG + q//KGmNYQ/beP/Gh1sG77Wfdbljr9e1sbU9WdBluXdPcGmNYx55+zv8WrRfj35drrt/Put2w9tthVWub + svLe1KHW+KK44o93q+mvvWfdP2FNeO511bFzF+t2w7rg6IRHRvVVAp+Nfi6A9tD521rjiUF/FTwpcBKd + /PeHg9a3J20FjTpyE2tMUVx9xwQ1Oeaidc8z81TX5VawbjOstVfpZG1PlvYdvIo1xrBqalqpe6fPUPe/ + aN9PYdz44DOqplUr63bD2ntQwkOtjq27amdrjGF1W76HenSWfR+Fdf518Q//a+ce0c/anqzogqyLsjnG + sDbcdLNEb/EdcfK51m1God/CMLcpspfjHQXQduq/ojWmiPSF4UhBo78G8vuABz2UNq2aq8+fOsSesBX0 + 6DU7WeOKovdqa6jxT86xnvhh7H7wEdbtRXHwkNWs7cnS5SduZo0xigFbbacmvvCmdT8tjf6dTbbYzrq9 + KC49foC1PVkatsvq1hij2GvYEdb9FMb4J+eqlVZZzbq9KB4Z8xtre7Kk35IwxxjFieddat1PYehS2r5T + /CKnffDIAdb2RKaPEgYs7mHMSvAWSp155qJBipOBAQ94aMfvv649WStsyQsjEl8AQy8+9z4z39oBNObY + sy6ufb/WvK0o7hi1jbU9WdJfp2uOMapdhw6PXAJ+e8Bh1u1EVemPny7NnQkPv+q5dfTpF1r3VWP0HO6/ + VfyT5jT9EbJvX8jHpylKTh22gTXOKFrWtFKjxt1l3V+Nuf2xV1Sf1eN/ukdbucey1rbEpj/hErDAhzG4 + Xw9rbBHoT4f9ylw4SDFydsADHpo+29maqBnQJyGaY4tqjfU2Ujc88LS1IzDpneweB49MvPjrj01+Oi29 + 70iIQ7933b1zG2usUW0+aGd1x+MzrfvOpP/NwO13tn4/Kv259TydS6Hpxzbpd7nrOaaPMoUpp3ru6jls + 3kZUW2y4vLUtWXv25l2tcUbVokXL2rP5w5TTy+94UC234krWbUR15F5rWdsSW4K3ASafu401toj2MhcO + Uow8HfBgh7Lxml3sSZqRJBcLKadfKeyy3zB12W0PWDuFWx6eoQ4/6VzVbfnE76nVGtR/BWs78uDEoetZ + Y41DX9Bn6MgT1bUTn7DuS/0z/f/ate9o/V4cJ+TgSFSQwQPczBU95/Tcu2XqC9Z9edntD6pd9j+0du6a + vxfHTWduaW1H1nQx1V8lbo41Dv2q/oRzL1d3PjGr3v143/Ov1547sfVOu6mmTeOfc1Buxq0Or/Hx5/hv + A/z0+EFJv0J4nLlwkGJkUcCDHcrFx/W3J2lG9AVg2rZpYY0xiWU7dFK9+66pVl9nw9oT/ZJ81C/I3Rdu + Z21HHujLOOvP1JvjTUJfJ6HvWuvVSnLNhIbMm1C5S09Hce/oQdZYk9BzsMtyPWrnpJ6beo6a/yaJZVq3 + UF8/d6i1HXlw1mHJj26Ua9a8ee2rfH0Vz559+tZezdL8N0mstlKH2mtrmNuRSIwrA5YcvH38E3xF5Flz + 4SD+R3/jk/lAhzbrrj3sCZqh3x/o5pVrJfTusaz615+PsLYhL3b8dU9rzHmlx2qOPy/02xKr9mxvjTmv + 9HPI3Ia8+OLpYc5Lfpr+eM7W1jYk9kL07wcoueOUgdYYI/jMXDyI/+kf8ECHoi+6ksf3XPWnEsyx5lEe + D7OWe+n23Z0fBUiDHmNeLqXcEFdvT6VNP3c+eeIga/x58rsD/Cj5Ky3fTv1zVgoF/6XDrIU9rA/vjX8x + ozrtzQWE+J0DAh7kUDZZu6s9OXPgwqM3tcaaNxuu3iV35SlIkgssVcr+O+bngjUN0Y/1RmvEv5BMpSS+ + YE0F6Lcn9Amf5tjz5sErdrDG7kTMqwKWLJvsCMrG5gJC/M5xAQ9yKAfu1NeenDnw88wj1Jq93ZxYlgb9 + ESv9RTHmuPPos+kHq07tE504lKqOy9bk7lMUDdFvlzn6hrZU6Gv//6QXl4Cx5834C5JdLyJtQ7ZYyRqz + M/qoQsDCHla/1eJf6VNEBpkLCPE7ZwQ8yKGcMXwje3LmxGsT9050GdY06SMU5njzbMqVO+TyrQA9ptRe + ZaXkomPyeXRKP1f0iZ/mePPsgN/0tbYjD/S3KKZ6YTR93lDAwh7W7gN7WWOOYA9zASF+R3/fs/kgh5Kn + TwAEuf28bXK3cO08sFdmX5iUxMkHJ7sISxpOOjjby0/HoR97/erQ3Jas6a/bNcead9/NGKHWWSXZFfpc + 05crfuHW31pjdSrBFQG1QwYnelvvEHMBIX7n2oAHOZRrTx1oT86c0e9pmuPOSv91uqnvXxxhjdEH+qNM + eXrFpd/397FIaT+8dJgasK77j0HGpb9HwxyjL/QJi/pkO3ObsqC/RnviJQ6u+b80c5IVgGN3W8MaewTH + mgsI8TvXBzzIoVx/+hb25MyhM0e4/exwHPo65l/qz+8GjM8X+ozmfZJ9jtiJvQb1qT3PwxyfT7569tBc + lIDTh29ojc037z60f+3lds1tqyR9boc+4miOLRX6ugIBC3tYJ+65ljX+CE40FxDidwpfALSxpwzM7ASs + nQb28vaVv0m/6tbf/WBuY6Uct9863r7yN+kjAfotIXMbK0Ffnviakze3xuQrfSJokq+xTkJfl6CiX5xE + ASAOUxUFQHvull1rT9AxtyMteid7zhEbF2bBKjfpssGqfduW1janRe9k9Znf5jh8p99aufoPv078RVZR + dO3UWk27bog1Ft/945XDawuiub1p0p+ceH3iPtZYUkUBIA5TNQVA01cS01/RmvbJgeuv9iv18h27W3+/ + SN6bOlTtsFn6VwvU19LXh3nNv18kr9y5e+qvYPWc13NfPwfMv18k+lMrvZZL97wAfbKf/hTUjy8fZv39 + 1FEAiMNUVQEo0VeO23aTFaxtSkrveG44Y0svLvLjiv4oni485n2R1Hp9O3v3Mb8k9JzRcyeNk9r0XM/7 + 1RJd0m+56ZMbO7d38+VIJfpEv30Hr6LefmA/629WDAWAOExVFoAS/cpLvypadpn4h7P1TmHrfj1qv/s9 + lUt/ekAfyn70mp3UbluvrFq2iH84W/+uvg39nqrzL1HxhJ5Dd12wrdqmX4/auWXeR2HpS3UfssvqhT8S + 1Rj9UcExJ21ee+VN8/6JQl95UH/b5DsPZrjwl1AAiMNUdQEo0SdkPTzmN7Vfg9tvra61O09ze0v0+7V9 + e3WovUyu/rKPjx870Lq9aqY/7TDh4kHq8N3XVOuu2lm1atnw16rq/6f/jf63+lvzfP+khGt6buk5pj+C + qedcY+cK6Dmr565eqKZevWPtnDZvr5rpV+36xMffbr1y7acGGitX+sjBwA2Wq/0E0dM37pKvL+2iABCH + oQA0QJ9ZrK+Opr/P+5mbdlWz795T/e3hoVX7Kj8ufRLkR48dqObes5d6/o+/rT0ZU/+3/lkRT5BMk557 + HzxyQO1c1HNSz009R325HHKe6JMG9St6fV8+ecOQ2iMlb9y/T/7PkaAAEIehAACALygAxGEoAADgCwoA + cRgKAAD4ggJAHIYCAAC+oAAQh6EAAIAvKADEYSgAAOALCgBxGAoAAPiCAkAchgIAAL6gABCHoQAAgC8o + AMRhKAAA4AsKAHEYCgAA+IICQByGAgAAvqAAEIehAACALygAxGEoAADgCwoAcRgKAAD4ggJAHIYCAAC+ + oAAQh6EAAIAvKADEYSgAAOALCgBxGAoAAPiCAkAchgIAAL6gABCHoQAAgC8oAMRhKAAA4AsKAHEYCgAA + +IICQByGAgAAvqAAEIehAACALygAxGEoAADgCwoAcRgKAAD4ggJAHIYCAAC+oAAQh6EAAIAvKADEYSgA + AOALCgBxGAoAAPiCAkAchgIAAL6gABCHoQAAgC8oAMRhKAAA4AsKAHGY2AUAAFBVKAAFCwUAABAGBaBg + oQAAAMKgABQsFAAAQBgUgIKFAgAACIMCULBQAAAAYVAAChYKAAAgDApAwUIBAACEQQEoWCgAAIAwKAAF + CwUAABAGBaBgoQAAAMKgABQsFAAAQBgUgIKFAgAACIMCULBQAAAAYVAAChYKAAAgDApAwRK7AIwdc7X6 + +YfvAAAVs0T9/PnfYztu5HBrXx4BBaBgoQAAgDcoAMRdKAAA4A0KAHEXCgAAeIMCQNyFAgAA3qAAEHeh + AACANygAxF0oAADgDQoAcRcKAAB4gwJA3IUCAADeoAAQd6EAAIA3KADEXSgAAOANCgBxFwoAAHiDAkDc + hQIAAN6gABB3oQAAgDcoAMRdKAAA4A0KAHEXCgAAeIMCQNyFAgAA3qAAEHehAACANygAxF0oAADgDQoA + cRcKAAB4gwJA3IUCAADeoAAQd6EAAIA3KADEXSgAAOANCgBxFwoAAHiDAkDchQIAAN6gABB3oQAAgDco + AMRdKAAA4A0KAHEXCgAAeIMCQNyFAgAA3qAAEHehAACANygAxF0oAADgDQoAcRcKAAB4gwJA3IUCAADe + oAAQd6EAAIA3KADEXaq2APzju2/V7JkvqymTJ6l77roTABr08JQH1Jvz51n7kcqjABB3qboC8OWihers + M89Q3bp1s7YJABrTp0/v2n3fD99+be1bKoMCQNylqgrAW6+/plZfbTVrWwAgii232EJ9tuAjax+TPgoA + cZeqKQCffvxhbXs3twMA4thsQH+15KvF1r4mXRQA4i5VUwAOHDrU2gYASGL0hRdY+5p0UQCIu1RFAfjg + 3XdUs2bNrG0AgCR+1blzhc8HoAAQd6mKAjBu7DXW+AHAhSefeNza56SHAkDcpSoKwAnHHWeNHwBcuOG6 + cdY+Jz0UAOIuVVEAjjpypDV+AHBhzJVXWPuc9FAAiLtURQG48PxR1vgBwIVJ902w9jnpoQAQd6mKAvDS + C89Z4weApFq0aKEWfvKxtc9JDwWAuEtVFICfvl+iNt5oI2sbACCJofvtZ+1v0kUBIO5SFQVAe+7pp1TL + li2t7QCAOPRHAN9/5y1rX5MuCgBxl6opANrtt95Se8jO3BYAiKJD+/bqqWlPWPuY9FEAiLtUVQHQnnly + ulp3nXWs7QGAMLbZemv1xrxXrX1LZVAAiLtUXQHQ9FcB6/Z++qmnqAP231/tsftuANCgQw46UI069xw1 + 6+UXrf1JZVEAiLtUZQEAAD9RAIi7UAAAwBvJCsApJxxt7csjONxcQIjfoQAAgDeSFYCxl11o7csj2MFc + QIjfoQAAgDeSFYC3ZsW+KNo/RKSduYAQv0MBAABvJCsA2vbbbGntz0O4zlw8iP+hAACAN5IXgPkznlTt + 2i5j7dMbsUBEupqLB/E/FAAA8EbyAqA9POEO1XaZUCVgoYhsaC4cpBihAACAN9wUAO3VF6apLTcfYO3b + 6/xXRCaJyIrmokGKEwoAAHjDXQEomfv8E+qSc89QRx82TO/brxKRY0Skt7lYkOKFAgAA3nBfAH7xxYf6 + VT+polAAAMAbFADiLhQAAPAGBYC4CwUAALxBASDuQgEAAG9QAIi7UAAAwBsUAOIuFAAA8AYFgLgLBQAA + vEEBIO5CAQAAb1AAiLtQAADAGxQA4i4UAADwBgWAuAsFAAC8QQEg7kIBAABvUACIu1AAAMAbFADiLhQA + APCG+wLww6fvqef+9IAaf/M4XQD2EJGNRKSpuViQ4oUCAADecFcAFv/tTXXqiceoTh07WPt3EflERH4v + IjXmokGKEwoAAHjDTQF4a9ZzarVV+1j79QAvikgXc+EgxQgFAAC8kbwAfPrOq6r3Sr2sfXojXuZIQDFD + AQAAbyQvACMO2t/an4dwqrl4EP9DAQAAbyQrAJ+8PVc1b97c2p+H8IWINDcXEOJ3KAAA4I1kBeC2666y + 9uURbG4uIMTvUAAAwBvJCsCZJ51g7csjGGYuIMTvUAAAwBvJCsBxI4db+/IITjAXEOJ3KAAA4I1MC8CJ + 5gJC/A4FAAC8QQEg7lKVBeCn75eoGc89q84752w18vDD1IhDhwFAg44ceYS6ZPSFav7c2db+pLIoAMRd + qq4AvPDsM2rjjTaytgcAwthxh8Hq7Tdet/YtlUEBIO5SVQXgnrvuVDU1Nda2AEAUnTt1Us8/87S1j0kf + BYC4S9UUgBeff5bFH4AzXbt2VX9/76/WviZdFADiLlVRAPR7/ptu0s/aBgBI4uADD7D2N+miABB3qYoC + 8PKM563xA0BSLVq0UIs+XWDtc9JDASDuUhUF4KILzrfGDwAuPHD/RGufkx4KAHGXqigARx050ho/ALgw + 5qorrX1OeigAxF2qogCcePzx1vgBwIUbrhtn7XPSQwEg7lIVBUCP1Rw/ALgw/fHHrH1OeigAxF2qogC8 + /85bqmnTptY2AEAS+noA33/zlbXPSQ8FgLhLVRQAbeh++1nbAABJXDDqPGtfky4KAHGXqikAC/7+N7Xi + iita2wEAcfTfdBO15KvF1r4mXRQA4i5VUwC01+fNVaus0sfaFgCI4tebDVALPvzA2sekjwJA3KWqCoD2 + xcJP1Skn/aH2vTtzmwCgMSussIK68rJLK/y+fzkKAHGXqisAJT8u+ab2K4En3D1ejRt7DQAEuu7asWry + xPvUnFmv1F5W3NyXVBYFwNc0EZGOdZqa/zOjVG0BAAD/UAB8yDoicrSI3C0is0Xk24A78zsRmSsiE0Tk + eBHZoK4kVDIUAADwBgUgr+klIqNE5N2AOy6sv4vIxSLS17zxlEIBAABvUADyljXqXun/K+AOi+s/IjJZ + RNY3/5jjUAAAwBsUgLyknYhcLiL/DLijXPl33SLdyfzjjkIBAABvUADykI0SHuqPaqGIbG8OwkEoAADg + DQpA1jlURH4OuHPSpo8G/N4cTMJQAADAGxSALHOaiPw34I6ppCscflqAAgAA3qAAZBV9hr95h2TlFkfX + EqAAAIA3KABZJE+Lf4mLEkABAABvUAAqnTwu/iVJSwAFAAC8QQGoZPK8+JckKQEUAADwBgWgUvFh8S+J + WwIoAADgDQpAJeLT4l8SpwRQAADAGxSAtOPj4l8StQRQAADAGxSANHN+wEY707p5S7VMi1bWzx27McJ1 + AigAAOANCkBacb74N23SRO299kA1YZ/T1Ken3K1+OGdKrYWn3qMe2P8sdeD626oWTZtZv+dA2BJAAQAA + b1AA0ojzxX+97r3V7KOu+WXRb8hrx16vft1zTev3HQhTAigAAOANCoDrOF/8h6y1mVp85v3WYt+Qr8+c + pA5YfxvrdhxYWgmgAACANygALuP8hL/frru5+uGyx9TPl09TP5431VrsG/L92Q+qw/vtaN2eA42dGEgB + AABvUABcJbXF/59XTq/lQQmgAACANygALpL64u9JCaAAAIA3KABJU7HF34MSQAEAAG9QAJKk4ot/zksA + BQAAvEEBiJvMFv8clwAKAAB4gwIQJ5kv/jktAfpjgubPQ6EAAEClUQCixvnn/OMu/nFLwHdnP6iGbbi9 + NQ4Hvgv4WSgUAACoNApAlOTmlb8paglI8UhALBQAAKg0CkDY5HbxL/G5BFAAAKDSKABhkvvFv8TXEkAB + AIBKowAsLd4s/iU+lgAKAABUGgWgsZwTMOhE0l78S6KWAH1i4CEbDrLGWykUAACoNApAQxkZMOBEKrX4 + l0QtAVkeCaAAAEClUQCCMlhE/hMw4NgqvfiXRC0BWR0JoAAAQKVRAMx0E5HPAgYbW1aLf0nUEpDFkQCf + C8C7b72pTjvlZLXpJv3Ucsstpzp26AAADVphhRXUFgMHqosuOF99tuAja59SORQAMw8FDDS2rBf/kqgl + oNJHAnwsAD99v0Sde/ZZqqamxtoeAAijQ/v26tZbbrL2L5VBASjPjgGDjC0vi/8vrpimfohYAnbsu7G1 + XWnwsQAMH3aItR0AEMdlF4+29jHpowCU0kRE3ggYZCy5W/zrRDkS8MiB56nWzVta25YG3wrAjddfZ20D + AMTVrFkz9fT0ada+Jl0UgFKGBAwwlrwu/iVhSsATh1yolmnRytq2tPhUAJZ8tVh1797d2gYASGKzAf2t + /U26KAClTA8YYGR5X/xLGisBlXzlX+JTAZgyeZI1fgBw4e03Xrf2OemhAOgsJyL/DhhgJL4s/iVBJaDS + r/xLfCoAZ5x2qjV+AHDhrttvs/Y56aEA6BwXMLhIfFv8S8pLQBav/Ev222ef2rPq7QmaPyMPP8waPwC4 + cOVll1r7nPRQAHSmBAwutM1WXkt9d+mfrMXVF7oETDt0dCav/MsNO/gg9Y/vvg2YpPly6sknWWMHABdu + v/UWa5+THgqAPvt/ccDgQunUpp1aMOp+a1H1yWMjL1GtW+Tjs+wjDh2W+yMB946/yxo3ALjw6uxZ1j4n + PRSAHgEDC+2inUdYC6pPnjr6SrVMy2xf+ZvyfiTgy0ULay/eYY4bAJJYa801rf1NuigAWwUMLJRmTZuq + z86fbC2qvsjj4l+S9xKgL+FpjhkAknjg/onWviZdFID9AwYWSv+V1rQWVV/k6bB/Q/L8dsCPS75RO+4w + 2BozAMRx3LHHWPuZ9FEADg8YWChDN97OWlh9kMbi37n7ymrjrfa3fp5UnkuAviCQPlLRpEkTa9wAEEaL + Fi1qv1Mkm/0cBSD2RwCP2nxXa3HNu7QW/3P/+L66+qGf1YDtE02IQHkuAdpzTz+l9t93X9WtWzdr7ABg + 0i8aevXqqY44bIR6Y96r1j6lcigAIwIGFsreG2xtLbB5lsZ7/p269lRn3/xXNWbqP2vpErD5b0Za/y6p + vJ8TUKKPCiz85GMAaND333xl7TuyQQHYJ2BgoazVfSVrkc2rNF/5lxb/8hJQjUcCAMAvFID+AQML7d0z + x1uLbd5UcvGnBACALygAnQMGFtoxA3ezFtw8qcRh/4ZU+9sBAJBvFACdDwMGF0pN8xZq7kk3WQtvHqTx + yr/L8r3VqDsafuVv4kgAAOQVBUDnroDBhbZSp+7q0/MnWQtwllJZ/Hv0VldM+VDd9pJSY//0L2uxbwgl + AADyiAKgc1DA4CJZr0ef3FwVMM3F//ZXVC1KAAD4jgKg005EfgwYYCTrLt878yMBabzn37l7L3X5gx/8 + svgnKQGcEwAAeUEBKOXegAFGluWRgLRe+V/50EfW4p+kBHAkAADygAJQysYBA4wliyMBlXzlb4pTAjgS + AABZowCUZ3rAIGOp5JGALF75m+KUAI4EAECWKADlWUdE/hUw0FgqUQLSWPy1tTYZpG5+/h/WQt8YSgAA + +IQCYObqgIHGlmYJSGvxL1mn/w6UAAAoLAqAmVYiMi9gsLGlcU5AGu/5B1l70+0rUgI4JwAAKo0CEJQ1 + ReTbgAHH5vJIQNqv/E0cCQCAIqIANJStROSngEHH5uJIQKVe+Zs4EgAARUMBaCx7ujwpUEtyJKDSr/xN + HAkAgCKhACwtzktAnCMBWb3yN3EkAACKggIQJpmWgLws/iWUAAAoAgpA2GRSAvK2+JdQAgDAdxSAKKlo + Ccjr4l9CCQAAn1EAomZv1yUg6MTANE74a9u+s/WzpDgxEAB8RQGIk1SPBKTxyl9/sc9lD/xN7Xvc5db/ + S4ojAQDgIwpA3KRyJOCeg850/spff7HPFVM+/GXx3euo0da/SYojAQDgGwpAkjg/EuBa6ZW/ufhyJKA+ + jgQAqD4UgKTJbQloaPEvoQTURwkAUF0oAC6SuxKwtMW/hBJQHyUAQPWgALhKbkpA2MW/hBJQHyUAQHWg + ALhM5iUg6uJfQgmojxIAoPgoAK6TWQnQi//lD35gLaphUQLqowQAKDYKQBqpeAlIuviXUALqowQAKC4K + QFqpWAlwtfiXUALqowQAKCYKQJpJvQS4XvxLKAH1UQIAFA8FIO2kVgLSWvxLKAH1UQIAFAsFoBJxftng + Jk2aqFF3vmotlq5x2eD6Grts8IIPP1AzX5qhHntkKgAEevzRh9WcWa+oRZ8usPYhlUcBqFScl4CefddX + 1z6x2FosXaME1FdeAvQRgRuuG6c2WH99698BQEOaNWumNv/1ZmrSfRMCFuZKoQBUMpSAMr6XgE8++rva + bEB/6/8BQBR77rG7+vqLRQELdNooAJUOJaCMzyVg2XbtrJ8BQBw7/WbHDM4xogBkEUpAGZ9LAAC4MnbM + 1QGLdJooAFmFElCGEgCg2vXo0aPCRwEoAFmGElCGEgCg2r3w7DMBC3VaKABZx/l1AlZcdT019vEvrMXS + Na4TAABu3XTD9QELdVooAHkIRwLKcCQAQLW6+orLAxbqtFAA8hJKQBlKAIBqNOHu8QELdVooAHkKbweU + 4e0AANWkadOm6uMP3g9YqNNCAchbOBJQhiMBAKrFLkN2Dlik00QByGMoAWUoAQCKrm3bZdTr8+YGLNJp + ogDkNZSAMpQAAEXVqlUrNXnifQELdNooAHkOJaAMJQBA0ayz9toV/ux/OQpA3kMJKONzCdDf/rX1Vlup + bbbeGkAV23GHwerIkUeoqQ9OrvCV/0wUAB/CpwPK+PzpgGEHH5TxEx4ASigAvoQSUIYSAABJUQB8CiWg + DCUAAJKgAPgWSkAZSgAAxEUB8DGUgDKUAACIgwLgaygBZSgBABAVBcDnUALKUAIAIAoKgO+hBJShBABA + WBSAIoQSUIYSAABhUACKEkpAGUoAACwNBaBIoQSUoQQAQGMoAEULJaAMJQAAGkIBKGIoAWUoAQAQhAJQ + 1FACylACAMBEAShyKAFlKAEAUI4CUPRQAspQAgCghAJQDaEElKEEAIBGAaiWUALKUAIAgAJQTaEElKEE + AKhuFIBqCyWgDCUAQPWiAFRjKAFlKAEAqhMFoFpDCShDCQBQfSgA1RxKQBlKAIDqQgGo9lACylACAFQP + CgChBNRDCQBQHSgA5H+hBJShBAAoPgoA+f9QAspQAgAUGwWA1A8loAwlAEBxUQCIHUpAGUoAgGKiAJDg + UALKUAIAFA8FgDQcSkAZSgCAYqEAkMZDCShDCQBQHBQAsvRQAspQAgAUAwWAhAsloAwlAID/KAAkfCgB + ZSgB2Vjw4Qfqjtv+qM49+yz1h9+dCHjnvHPOVnfdfpv69OMPrfldWRQAEi2UgDKUgMr58P131YFDh6pm + zZpZ2wL4qHnz5mr4sENqS6053yuDAkCihxJQhhKQvj+/8pJabrnlrPEDRdCzZ081f+5sa96njwJA4oUS + UIYSkJ6P/vaeWn755a1xA0Wy0kq91GcLPrLmf7ooACR+KAFlKAHpOOSgA63xAkV09FFHWvM/XRQAkiyU + gDKUALcWfvKxatGihTVWoIhat26tvvp8kfU8SA8FgCQPJaAMJcCdCXePt8YIFNnUBydbz4P0UACIm1AC + ylAC3Lhk9IXW+IAiGzvmaut5kB4KAHGXWwMe5ER69l1fXfvEYmuxdG2vo0ZbfzupdfrvUJESMGD7RE/C + QCMOHaZ++n5JwA6jsi6/5GJrbECRjRt7jfU8SA8FgLjL9QEPcmIcCWhckY8E3D/hXmtcQJH96eGHrOdB + eigAxF1SKQAaJaBxRS0Bixd9pmpqaqxxAUXUrm1b9e2XX1jPg/RQAIi7pFYANEpA44paAo460v02AXl0 + 8h9+b83/dFEAiLukWgA0SkDjilgC9MVRevde2RoTUCRrrL567REvc/6niwJA3CX1AqBRAhpXxBLw5vx5 + qk+f3taYgCLQi/9f//KmNe/TRwEg7lKRAqBRAhpXxBKw6NMF6rhjj6m9WIo5LsBHbdsuU/vtgJV/5V9C + ASDuUrECoFECGlfEEqB9/cWi2ouljLnyCnXh+aMA74y56kr1yEMPqm8Wf27N78qiABB3qWgB0CgBjStq + CQDgAgWAuEvFC4BGCWgcJQBAMAoAcZdMCoBGCWgcJQCAjQJA3CWzAqBRAhpHCQBQHwWAuEumBUCjBDSO + EgDg/1EAiLtkXgA0SkDjKAEA/ocCQNwlFwVAowQ0jhIAgAJAXCZ2Adh+0CDVvHlz6+dJ8FXCjSv6VwkD + WBoKAHGX2AVg7Jir1b3j73JeAjgS0DiOBADVjAJA3CVRAdATkhJQHyUAQHooAMRdEhcA7e4773BeAng7 + oHG8HQBUIwoAcRcnBUCjBNTncwnQX3Zi73gAZI8CQNzFWQHQKAH1+VoCmjRpop6ePs16fAFkjQJA3MVp + AdAoAfXFKwH/VWMfzbYEDN5+e+uxBZA1CgBxF+cFQKME1BevBGR7JEA/fl8uWmg9tgCyRAEg7pJKAdAo + AfXFKwHZHgl4ecbz1uMKIEsUAOIuqRUAjRJQXyVKwMljZqtmzVpYfzuO6Y8/Zj2mALJEASDukmoB0LhO + QH1pXifglGvmqGWW/ZX1N+Oa/vifrMcTQJYoAMRdUi8AGiWgvjRKgOvFX6MAAHlDASDuUpECoFEC6otX + AoLfDkhj8dcoAEDeUACIu1SsAGiUgPrilYD6RwLSWvw1CgCQNxQA4i4VLQAaJaC+JCUgzcVfowAAeUMB + IO5S8QKgUQLqi1MCRt05X7VNcfHXKABA3lAAiLtkUgA0SkB9UUrA+ePnq3Yd0l38NQoAkDcUAOIumRUA + jRJQX5gSUKnFX6MAAHlDASDukmkB0CgB9TVWAiq5+GsUACBvKADEXTIvABoloL6gElDpxV+jAAB5QwEg + 7pKLAqBRAuorLwFZLP4aBQDIGwoAcZfcFACNElCfLgHn3TlXte/c3fp/lUABAPKGAkDcJVcFQOMLhOpr + 0qSJ9bNKoQAAeUMBIO6SuwKgcSQgHygAQN5QAIi75LIAaJSA7FEAgLyhABB3yW0B0CgB2aIAAHlDASDu + kusCoFECskMBAPKGAkDcJfcFQOPEwHg6d+yoVuq5ovXzsCgAQN5QAIi7eFEANI4ERNOxQ3v10rSpasvN + B1j/LywKAJA3FADiLt4UAI0SEE5p8ddPeAoAUCQUAOIuXhUAjRLQuPLFX6MAAEVCASDu4l0B0CgBwczF + X6MAAEVCASDu4mUB0Hw+MXDQ3sdZfzspfcLfrKf/ZD3hKQBAkVAAiLt4WwA0H48EpPHFPkGv/EsoAECR + UACIu3hdADSfSkClF3+NAgAUCQWAuIv3BUDzoQRksfhrFACgSCgAxF0KUQC0PJeArBZ/jQIAFAkFgLhL + YQqAlscSkOXir1EAgCKhABB3KVQB0PJUArJe/DUKAFAkFADiLoUrAFoeSkAeFn+NAgAUCQWAuEshC4CW + ZQnIy+KvUQCAIqEAEHcpbAHQsigBeVr8NQoAUCQUAOIuhS4AWiVLQN4Wf40CABQJBYC4S+ELgFaJEpDH + xV+jAABFQgEg7lIVBUBLswRcNOEvqn3n7tb/T8LF4q9RAIAioQAQd6maAqCl8QVCK/RZR7Xr0MX6eRIN + fbFPHBQAoEgoAMRdqqoAaGkcCXDJ1Sv/EgoAUCQUAOIuVVcAtLyWANeLv0YBAIqEAkDcpSoLgJbG2wFJ + HXHIAWrc5Rc51XeV3tbfCYsCAOQNBYC4S9UWAC2vRwLyggIA5A0FgLhLVRcAjRLQMAoAkDcUAOIuVV8A + NEpAMAoAkDcUAOIuFIA6lAAbBQDIGwoAcRcKQBlKQH3bbbut+vbLL6z7CUBWKADEXSgABkpAfZQAIE8o + AMRdKAABKAH1UQKAvKAAEHehADSAElAfJQDIAwoAcRcKQCMoAfVRAoCsUQCIu1AAloISUB8lAMgSBYC4 + CwUgBEpAfZQAICsUAOIuFICQKAH1UQKALFAAiLtQACLQJaCmpsa6L6rV9oMGUQKAiqIAEHehAET08ozn + 1Sb9Nrbuj2q1w+DB6odvv7buJwBpoAAQd6EAxPTi88+qC0adpw4fMVyNOHSYN/bYfTfrsUzq+OOOte4f + AGmgABB3oQBUoUtGX2g9nkk0a9ZMvTp7lvV3ALhGASDuQgGoUq5LwLHHHG39DQCuUQCIu1AAqtiF54+y + Hte41l5rLev2AbhGASDuQgGocq5KQKeOHa3bBuAaBYC4CwUATt4OWH755a3bBeAaBYC4CwUAtZIeCdhy + iy2s2wTgGgWAuAsFAL9IUgIuu3i0dXsAXKMAEHehAKCeOCWgS5cu6stFC63bAuAaBYC4CwUAlijnBDRt + 2lRNmTzJug0AaaAAEHehACDQuLHXqJYtW1qPe7k2bdqou26/zfpdAGmhABB3oQCgQXNmvaJ2GbKzVQRa + t26t9tl7L/Xm/HnW7wBIEwWAuAsFAEu1eNFn6pknp6sHJ92vnnv6KfX1F4usfwOgEigAxF0oAADgDQoA + cRcKAAB4gwJA3IUCAADeoAAQd6EAAIA3KADEXSgAAOANCgBxFwoAAHiDAkDchQIAAN6gABB3oQAAgDco + AMRdxgU8yKGMuerKgMkJAEhPsgJw9GHDrH15BMeZCwjxO5cEPMihjL7wgoDJCQBIzfffWIt6FAfvt5e1 + L49gmLmAEL9zVsCDHMrpp55iT04AQHq+S1YAdh/yG2tfHsGe5gJC/M4JAQ9yKMMOPsienACA9Cz52lrU + o+i/8YbWvjyCweYCQvzOIQEPciibDehvT04AQHq+XWwt6lF07tjR2pdHsKm5gBC/s3nAgxxKp44d1U/f + L7EnKAAgHV8vshb1sD5+c7a1H4+os7mAEL/TNeBBDk1/X7w1QQEA6fjqM2thD+vum6+19uERfGkuHqQY + 0Q+s+WCHcsWll9gTFACQjsUfWQt7WIcdvL+1D4/gRXPhIMXIjIAHO5QtBm5uT1AAgHsJPgL442fvq+W6 + d7P24RHcbC4cpBgZHfBgh9KkSRP1zptv2BMVAODWt19YC3tYj9x3p7X/juhAc+EgxciggAc7NK4HAAAV + 8NWn1sIe1h677GTtuyPqYS4cpBhpIyI/BTzgobRfdln1+Wef2JMVAODIEvXzFx9aC3sYb77yjGrWrJm1 + 747gLXPRIMXKkwEPemijzj0nYMICAJxI8Pn//fb8rbXPjmiMuWCQYkVf49l80ENr06aNevetN+1JCwBI + bvECa2EP45lHJtWeq2XusyPaxFwwSLHSTkR+CHjgQ9t1lyH2pAUAJLPkS2thD+O7Be+qtddY3dpXR/S2 + uViQYmZ8wIMfyXXXjrUnLwAgvi8/sRb3MI494lBrHx3DGeZCQYqZ2JcFLmndurWa9fKL9gQGAEQX89X/ + fbfd4OLQvz45fHlzoSDFzXMBkyCSLl26qDfnz7MnMgAgPP1dK4s/thb3pXnh8SlqmTZtrH1zDNeZCwQp + drYPmASRrbJKH/W3v75tT2gAQDjffG4t7ksz86lHVaeOHax9cgz/FJGVzAWCFD8zAyZDZCuuuKKaP3e2 + PakBAI377mv18+fRPvf/xOR71LLt2lr74phuNRcGUh3pLyL/CZgQkemvDH7g/on25AYANEAf+o/2pT9j + Lh6lalq2tPbBMX0rIsuZCwOpntwUMCli0SeiHHfsMerrLxYFTHQAQD0Rzvpf8NZctfuQ31j73YSONxcE + Ul3pLCJfBEyM2Hr16qkmT7zPnuwAgP/5eqG1yAf5x8K/qWsvu8jV+/3l5olIc3NBINWXPQImR2L9N91E + TZk8Sf2kz3A1Jz8AVKuvF1kLvemHT99Tt4y9QvVdpbe1b3XgHyKygbkQkOrN2IBJ4kSfPr3VWWecrt6Y + 96r9RACAatLI4v/Tog/Uy9MfVseNHK66de1i7UsdOtJcAEh1p0ZE5gRMFKd69uypDjpgqLrq8svUo1On + 1JaCTz/+UC35arH9RAGAwliifv7qs9qF/puP3lYL/jJHzZ/xpHrgrlvUxeeervbcdWfVpXMna5+ZgvvM + nT8hOvqzoJ8GTBgASE2rVq1qjxQeNvxQ9cqLLwQsnm58tuAjdd45Z6t+G2+kOnZw/p66D+bWfR8MIYFZ + V0S+CZg4AJA6/Wmiw0cMV999/aW1gCdxz113qg7t21t/r4q8JyLdzR0+IWa2rDtJxJxAAFAROwwerH5c + 8o21kMdx0w3Xu7hevs8Wisgq5o6ekIYySES+C5hIAFAR+nC9uZhH9ersWaqluwvn+OhjEVnL3METsrT0 + E5HPAyYUAKSuXdu2auEnH1uLehS7/XZX63aryFsi0tPcsRMSNn3r3jsyJxYApO6PN99oLephLV70maqp + qbFus0q8WHehN0ISZVkRmRAwwQAgVUcdOdJa2MN69qknrdurAv8VkTEi0tLckROSJMeKyE8BEw4AUrHp + ppu8+fOP318cx2WXXHy/eXsF96WI7GLuuAlxFX0yyXMBEw8A0nCNuROKkM0Cbq+o7hWR5c07gJA0slfd + R0vMSQgALh1o7nwipG0VfKT5XREZbG44IWlHnxtwOp8UAJCSJSLS0dzxRExR3wZ4X0QO471+knWWEZET + ReTDgEkKAHHpFxhJs2bBzl16ve6oCF/lS3KVpiKyjYjczkWEACT0iIg0M3cyMXNI3dnx5t/wxaK6M/s3 + MjeMkDxGHxUYIiJXi8hrnj/5AFTOf0RkXAqHtvcQka8C/l4e/UtEXhKRC+peVLUwN4YQn9K17vLCR4vI + WBGZJiKv1r2Ptbhgh+gARPOjiLwjIteLyPrmzsNh9PkEp4nIK3UfmTPHUSl6e/W5U3r/N1tEHhaRy+ve + 09ffxeL9N/b9H2wth0y86GNFAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA65SURBVHhe7d1t + jKVnXcfxLRZfCYjGhxRQ2E7n+l9z5pxuu6S0EGFeNgRfaaKJSRMD0aAkoCigiVL1nSGakhaRGMMLnyAG + oQ+JkQS33W23BWJ8SCmiQrttt43dpcVdt7Lt7prbTEL8ezfu0/zvMzOfT/J9f537evHbOTvnzJ49AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAGxX+/fvf/l8Pn/16urqXkmSLrZhS4ZNyTvDhDY2Nq6MiDdHxHsi4vaI+JuI + eDQivh0R5yRJuowN2zJszLA1t/fefzEibhq2KO8TW6C19oaIeH9r7Z6IODFyQZIkVfYfEXF3RPxyRLw+ + 7xaXYO/eva/qvd8SEZ+PiLMjD1+SpGXpy62190bE9+c94zxdffXVPxgRt0bEcyMPWJKkZe5kRNy2urr6 + mrxvvIThYfXe/yAi/mvkgUqStJ16vrV2R2vtqrx3bBp+kWLzbZNvjTxASZK2c8M7ArfOZrPvzvu3q/Xe + b4yIfxh5YJIk7aT+fnV19Ya8g7vRFZs/9fvoniRpt/TC8G7Anj17XpZHcVcYfkNy86MT+cFIkrQbumvX + fVpg8/P8Xxt5GJIk7ab+bTabreSd3JF67+sR8cTIQ5AkaTf21Gw225f3ckdprb3F5/olSfrftdaeHb7e + Pu/mjrD5k/8384uWJEn/03Orq6vX5v3c1tbX11/XWjsy8mIlSdJ3enLH/E2B4bv8I+KfR16kJEn6vz2y + srLyyryn205E/NnIi5MkSS9R7/1TeU+3lYh4T35RkiTpvPr5vKvbQmtt4Q/6SJJ00T2/trY2y/u67K6I + iPtHXowkSTrPeu8Hh03NI7u0eu/vzC9CkiRdeL33W/LOLqXZbPZ9EfFMfgGSJOmienrfvn3fm/d26fTe + f2fk8JIk6eL7cN7bpTJ8btG3/UmSdNk73lp7Rd7dpRERvzZyaEmSdIn13j+Qd3cp7N+//+XD/1PkA0uS + pMvS0Y2NjSvz/k4uIn585LCSJOky1Xt/e97fyfXeP50PKkmSLmt/nvd3UsPHE4ZvLBo5qCRJunydGv7I + Xt7hyfTef3rkkJIk6TLXWvvJvMOTiYg/zAecuvVZf/FtN/Wnb97oRyRJutCGDRm2JO/L1PXeP5Z3eDIR + 8S/5gFP01hv7M/fcNj/wnwcWXzl3ePHiucOLc5IkXUIvDpsybMtbb+zH8u5M1FfzDk9ifX39dSOHK21t + Lc7c+fvr9549vDg5cnmSJF1yw8Z89iPr966txdm8Q9Wtrq6+Ju9xuYh4Rz5YZdfvi1NH75l/KV+UJElb + 0ZN3z7903bVxKu9RZUvxccCI+JV8sKp6j7Pf+Kv5A/lyJEnayo58bv7gsEF5l6rqvf9S3uNyEfGJfLCq + Pvlbs/vypUiSVNEff3h2MO9SYR/Pe1wuIg6MHGzLu+H6fuLM/fPj+UIkSarozAPzY/v3xYm8T0V9Ie9x + uYh4eORgW97Hfn3tYL4MSZIqu/2Dk70L8E95j8tFxGMjB9vyjt4z/2K+CEmSKnvirsVDeZ+KejTvcbnW + 2rMjB9vyXjy0OJIvQpKkyk4fWkzyQ3BEHM97XC4iTo8cbMs7d3hxKl+EJEnFTfVxwNN5j8uNHKqkkUuQ + JKm8vE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV + +QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hc + PlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV + 97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXlC5AkaYry + PlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXlC5Ak + aYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5QFXl + C5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe43L5 + QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe + 43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7 + VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKk + Kcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUv + QJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UD + VZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcRJzOh6ro3OHFqXwJkiQVdyrvU1Gn8x6Xa609O3Kw + Le/0wcWRkYuQJKms04eufTTvU1HH8x6Xi4jHRg625R29e/FQvghJkip74u7Fg3mfino073G5iHh45GBb + 3h0fmh3MFyFJUmUf/cDsUN6nov4x73G5iDgwcrAt743X9RNnHpgfy5chSVJFZ+5fPLN/X5zM+1TUF/Ie + l4uIT4wcrKRP3updAEnSNP3Rb84O5l0q7ON5j8tFxPtHDlZS73H265+ZH86XIknSVnbkc/MHhw3Ku1RV + 7/19eY/LRcQ78sEqu+7aOPX4nfMv5suRJGkrevyuxUPXLeL5vEeV9d7fnve43MrKymvzwapbW4uzn/nI + /N6zDyxO5IuSJOlyNGzMX/7u7L5hc/IOVddauyrv8SQi4mv5cFP0Y2/qx+78vfUDJ/928ZVzhxcv5MuT + JOkCe+HkgfnDw7a85YZ+PO/ORD2Sd3gywy8jjBxw0tbW4szbbupP37zRj0iSdKENGzJsSd6XqWut3ZF3 + eDK995/KB5QkSVvST+QdnszKysorI2Kq70OWJGm3dGrv3r2vyjs8qd77p0YOKkmSLl9/mvd3clN/HFCS + pJ1ea+3mvL+T29jYuDIinsqHlSRJl6Unh63N+7sUIuJDIweWJEmXWGvtV/PuLo3NXwb8Zj60JEm6pI63 + 1l6Rd3eptNZ+e+TgkiTpIuu9/0be26Uzn89fHRH/ng8vSZIuqqeW7qN/L6W19rMjL0CSJF1grbWfyTu7 + zK6IiAP5RUiSpPOvtXbfsKl5ZJda7309Yto/lyhJ0jbu1DXXXNPzvm4LrbV3j7wgSZL0/9R7f1fe1W0l + Iv4kvyhJkvTStdb+Iu/ptrP53QCP5BcnSZJGe3g2m31P3tNtaWVl5bUR8djIi5QkSd/pid77j+Yd3dbW + 1tZmwzcZjbxYSZIU8VxrbZH3c0eIiDe31p4dedGSJO3aNrfxprybO8rmOwGP5xcvSdIu7ehsNtuX93JH + iojXR8RXRx6CJEm7pt77v66srFydd3JHG77XuPf+6fwwJEnaDfXePzv8/Zy8j7vFFa2190bEt/ODkSRp + h/ZC7/2D2+4rfrdCa+2NEfF3Iw9JkqSd1Jd779fnHdztXtZ7vyUijo08MEmStm3Db/kP73jv2bPnu/L4 + sWk2m/1wRHx0+CMI+QFKkrTNGrbstvX19R/Ke8dLWFlZ+YGIuHX4YoSRBypJ0jJ3Yhj+1tpVed84T8Pf + Etj8r4HPR8SZkYcsSdIyNGzUoYj4uWG78p5xCYbvR+69vy8i7oqIb408fEmSKhvepb5z+P/92Wz2I3m3 + 2AIbGxtX9t5v7L3/wvA2S0T8dUR8IyKeH7kgSZIupWFbvr65NcNb++9eW1t7k1/qWzLDPw6GL1dorb1h + dXV1ryRJF9qwIcOWDJuSdwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAbeO/ARmncr3NqsTVAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.Designer.cs new file mode 100644 index 0000000..b843176 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.Designer.cs @@ -0,0 +1,218 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormOrder + { + /// + /// 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() + { + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + textBoxOrderPhone = new TextBox(); + textBoxOrderName = new TextBox(); + dateTimePickerOrder = new DateTimePicker(); + label4 = new Label(); + groupBoxListProducts = new GroupBox(); + dataGridViewProducts = new DataGridView(); + ColumnProduct = new DataGridViewComboBoxColumn(); + ColumnCount = new DataGridViewTextBoxColumn(); + ColumnPrice = new DataGridViewTextBoxColumn(); + buttonBack = new Button(); + ButtonSave = new Button(); + groupBoxListProducts.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit(); + SuspendLayout(); + // + // label3 + // + label3.AutoSize = true; + label3.BackColor = Color.Bisque; + label3.Location = new Point(92, 112); + label3.Name = "label3"; + label3.Size = new Size(72, 20); + label3.TabIndex = 10; + label3.Text = "Телефон:"; + // + // label2 + // + label2.AutoSize = true; + label2.BackColor = Color.Bisque; + label2.Location = new Point(92, 62); + label2.Name = "label2"; + label2.Size = new Size(115, 20); + label2.TabIndex = 9; + label2.Text = "Имя заказчика:"; + // + // label1 + // + label1.AutoSize = true; + label1.BackColor = Color.Bisque; + label1.Font = new Font("Segoe UI", 10F); + label1.Location = new Point(245, 11); + label1.Name = "label1"; + label1.Size = new Size(57, 23); + label1.TabIndex = 8; + label1.Text = "Заказ:"; + // + // textBoxOrderPhone + // + textBoxOrderPhone.Location = new Point(284, 105); + textBoxOrderPhone.Name = "textBoxOrderPhone"; + textBoxOrderPhone.Size = new Size(250, 27); + textBoxOrderPhone.TabIndex = 7; + // + // textBoxOrderName + // + textBoxOrderName.Location = new Point(284, 55); + textBoxOrderName.Name = "textBoxOrderName"; + textBoxOrderName.Size = new Size(250, 27); + textBoxOrderName.TabIndex = 6; + // + // dateTimePickerOrder + // + dateTimePickerOrder.Enabled = false; + dateTimePickerOrder.Location = new Point(284, 156); + dateTimePickerOrder.Name = "dateTimePickerOrder"; + dateTimePickerOrder.Size = new Size(250, 27); + dateTimePickerOrder.TabIndex = 11; + // + // label4 + // + label4.AutoSize = true; + label4.BackColor = Color.Bisque; + label4.Location = new Point(92, 163); + label4.Name = "label4"; + label4.Size = new Size(44, 20); + label4.TabIndex = 12; + label4.Text = "Дата:"; + // + // groupBoxListProducts + // + groupBoxListProducts.Controls.Add(dataGridViewProducts); + groupBoxListProducts.Location = new Point(27, 209); + groupBoxListProducts.Name = "groupBoxListProducts"; + groupBoxListProducts.Size = new Size(570, 292); + groupBoxListProducts.TabIndex = 26; + groupBoxListProducts.TabStop = false; + groupBoxListProducts.Text = "Список продуктов:"; + // + // dataGridViewProducts + // + dataGridViewProducts.BackgroundColor = Color.Bisque; + dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewProducts.Columns.AddRange(new DataGridViewColumn[] { ColumnProduct, ColumnCount, ColumnPrice }); + dataGridViewProducts.Dock = DockStyle.Fill; + dataGridViewProducts.Location = new Point(3, 23); + dataGridViewProducts.Name = "dataGridViewProducts"; + dataGridViewProducts.RowHeadersVisible = false; + dataGridViewProducts.RowHeadersWidth = 51; + dataGridViewProducts.Size = new Size(564, 266); + dataGridViewProducts.TabIndex = 27; + // + // ColumnProduct + // + ColumnProduct.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnProduct.HeaderText = "Продукт"; + ColumnProduct.MinimumWidth = 6; + ColumnProduct.Name = "ColumnProduct"; + // + // ColumnCount + // + ColumnCount.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnCount.HeaderText = "Кол-во"; + ColumnCount.MinimumWidth = 6; + ColumnCount.Name = "ColumnCount"; + // + // ColumnPrice + // + ColumnPrice.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnPrice.HeaderText = "Общая цена"; + ColumnPrice.MinimumWidth = 6; + ColumnPrice.Name = "ColumnPrice"; + // + // buttonBack + // + buttonBack.Location = new Point(406, 521); + buttonBack.Name = "buttonBack"; + buttonBack.Size = new Size(100, 30); + buttonBack.TabIndex = 25; + buttonBack.Text = "Отмена"; + buttonBack.UseVisualStyleBackColor = true; + buttonBack.Click += buttonBack_Click; + // + // ButtonSave + // + ButtonSave.Location = new Point(92, 521); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(100, 30); + ButtonSave.TabIndex = 24; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // FormOrder + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.Linen; + ClientSize = new Size(631, 563); + Controls.Add(groupBoxListProducts); + Controls.Add(buttonBack); + Controls.Add(ButtonSave); + Controls.Add(label4); + Controls.Add(dateTimePickerOrder); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(textBoxOrderPhone); + Controls.Add(textBoxOrderName); + Name = "FormOrder"; + StartPosition = FormStartPosition.CenterParent; + Text = "Заказ"; + groupBoxListProducts.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label3; + private Label label2; + private Label label1; + private TextBox textBoxOrderPhone; + private TextBox textBoxOrderName; + private DateTimePicker dateTimePickerOrder; + private Label label4; + private GroupBox groupBoxListProducts; + private DataGridView dataGridViewProducts; + private Button buttonBack; + private Button ButtonSave; + private DataGridViewComboBoxColumn ColumnProduct; + private DataGridViewTextBoxColumn ColumnCount; + private DataGridViewTextBoxColumn ColumnPrice; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.cs new file mode 100644 index 0000000..73274fe --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.cs @@ -0,0 +1,61 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Repositories; + +namespace ProjectConfectFactory.Forms; + +public partial class FormOrder : Form +{ + private readonly IOrderRepository _orderRepository; + public FormOrder(IOrderRepository orderRepository, IProductRepository productRepository) + { + InitializeComponent(); + _orderRepository = orderRepository ?? + throw new ArgumentNullException(nameof(orderRepository)); + + ColumnProduct.DataSource = productRepository.ReadProducts(); + ColumnProduct.DisplayMember = "Name"; + ColumnProduct.ValueMember = "Id"; + } + + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewProducts.RowCount < 2 || string.IsNullOrWhiteSpace(textBoxOrderName.Text) || string.IsNullOrWhiteSpace(textBoxOrderPhone.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + + + _orderRepository.CreateOrder(Order.CreateOpeartion(0, textBoxOrderName.Text, textBoxOrderPhone.Text, CreateListOrderProductsFromDataGrid())); + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void buttonBack_Click(object sender, EventArgs e) => Close(); + + private List CreateListOrderProductsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewProducts.Rows) + { + if (row.Cells["ColumnProduct"].Value == null || + row.Cells["ColumnCount"].Value == null || + row.Cells["ColumnPrice"].Value == null) + { + continue; + } + + list.Add(OrderProducts.CreateElement(0, Convert.ToInt32(row.Cells["ColumnProduct"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value), Convert.ToDecimal(row.Cells["ColumnPrice"].Value))); + } + + return list; + } +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.resx new file mode 100644 index 0000000..756f7a5 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrder.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/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.Designer.cs new file mode 100644 index 0000000..9d1b2b4 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.Designer.cs @@ -0,0 +1,117 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormOrders + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormOrders)); + panel1 = new Panel(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridViewOrders = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.BackColor = Color.Linen; + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(657, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(143, 450); + panel1.TabIndex = 1; + // + // buttonDel + // + buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage"); + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(27, 134); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(95, 90); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(27, 24); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 90); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridViewOrders + // + dataGridViewOrders.AllowUserToAddRows = false; + dataGridViewOrders.AllowUserToDeleteRows = false; + dataGridViewOrders.AllowUserToResizeColumns = false; + dataGridViewOrders.AllowUserToResizeRows = false; + dataGridViewOrders.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewOrders.BackgroundColor = Color.Bisque; + dataGridViewOrders.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewOrders.Dock = DockStyle.Fill; + dataGridViewOrders.GridColor = Color.Bisque; + dataGridViewOrders.Location = new Point(0, 0); + dataGridViewOrders.MultiSelect = false; + dataGridViewOrders.Name = "dataGridViewOrders"; + dataGridViewOrders.ReadOnly = true; + dataGridViewOrders.RowHeadersVisible = false; + dataGridViewOrders.RowHeadersWidth = 51; + dataGridViewOrders.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewOrders.Size = new Size(657, 450); + dataGridViewOrders.TabIndex = 2; + // + // FormOrders + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewOrders); + Controls.Add(panel1); + Name = "FormOrders"; + StartPosition = FormStartPosition.CenterParent; + Text = "Заказы"; + Load += FormOrders_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewOrders).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonDel; + private Button buttonAdd; + private DataGridView dataGridViewOrders; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.cs new file mode 100644 index 0000000..e027df4 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.cs @@ -0,0 +1,89 @@ +using ProjectConfectFactory.Repositories; +using Unity; + +namespace ProjectConfectFactory.Forms; + +public partial class FormOrders : Form +{ + private readonly IUnityContainer _container; + + private readonly IOrderRepository _orderRepository; + + public FormOrders(IUnityContainer container, IOrderRepository orderRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _orderRepository = orderRepository ?? + throw new ArgumentNullException(nameof(orderRepository)); + } + + private void FormOrders_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + try + { + + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + + _orderRepository.DeleteOrder(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewOrders.DataSource = _orderRepository.ReadOrder(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewOrders.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewOrders.SelectedRows[0].Cells["Id"].Value); + return true; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.resx new file mode 100644 index 0000000..1dd991c --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormOrders.resx @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.Designer.cs new file mode 100644 index 0000000..84c6b75 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.Designer.cs @@ -0,0 +1,213 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormProduct + { + /// + /// 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() + { + label2 = new Label(); + textBoxProductName = new TextBox(); + label1 = new Label(); + numericUpDownProductPrice = new NumericUpDown(); + label4 = new Label(); + buttonBack = new Button(); + ButtonSave = new Button(); + groupBoxRecipe = new GroupBox(); + dataGridViewRecipe = new DataGridView(); + ColumnComponent = new DataGridViewComboBoxColumn(); + ColumnCount = new DataGridViewTextBoxColumn(); + label3 = new Label(); + checkedListBoxProductType = new CheckedListBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).BeginInit(); + groupBoxRecipe.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).BeginInit(); + SuspendLayout(); + // + // label2 + // + label2.AutoSize = true; + label2.BackColor = Color.Bisque; + label2.Location = new Point(43, 73); + label2.Name = "label2"; + label2.Size = new Size(119, 20); + label2.TabIndex = 15; + label2.Text = "Наименование:"; + // + // textBoxProductName + // + textBoxProductName.Location = new Point(195, 66); + textBoxProductName.Name = "textBoxProductName"; + textBoxProductName.Size = new Size(182, 27); + textBoxProductName.TabIndex = 14; + // + // label1 + // + label1.AutoSize = true; + label1.BackColor = Color.Bisque; + label1.Font = new Font("Segoe UI", 10F); + label1.Location = new Point(299, 20); + label1.Name = "label1"; + label1.Size = new Size(78, 23); + label1.TabIndex = 16; + label1.Text = "Продукт:"; + // + // numericUpDownProductPrice + // + numericUpDownProductPrice.Location = new Point(484, 66); + numericUpDownProductPrice.Maximum = new decimal(new int[] { 10000, 0, 0, 0 }); + numericUpDownProductPrice.Name = "numericUpDownProductPrice"; + numericUpDownProductPrice.Size = new Size(152, 27); + numericUpDownProductPrice.TabIndex = 20; + // + // label4 + // + label4.AutoSize = true; + label4.BackColor = Color.Bisque; + label4.Location = new Point(407, 73); + label4.Name = "label4"; + label4.Size = new Size(48, 20); + label4.TabIndex = 19; + label4.Text = "Цена:"; + // + // buttonBack + // + buttonBack.Location = new Point(435, 498); + buttonBack.Name = "buttonBack"; + buttonBack.Size = new Size(100, 30); + buttonBack.TabIndex = 22; + buttonBack.Text = "Отмена"; + buttonBack.UseVisualStyleBackColor = true; + buttonBack.Click += buttonBack_Click; + // + // ButtonSave + // + ButtonSave.Location = new Point(129, 498); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(100, 30); + ButtonSave.TabIndex = 21; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // groupBoxRecipe + // + groupBoxRecipe.Controls.Add(dataGridViewRecipe); + groupBoxRecipe.Location = new Point(43, 242); + groupBoxRecipe.Name = "groupBoxRecipe"; + groupBoxRecipe.Size = new Size(596, 230); + groupBoxRecipe.TabIndex = 23; + groupBoxRecipe.TabStop = false; + groupBoxRecipe.Text = "Рецепт:"; + // + // dataGridViewRecipe + // + dataGridViewRecipe.BackgroundColor = Color.Bisque; + dataGridViewRecipe.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewRecipe.Columns.AddRange(new DataGridViewColumn[] { ColumnComponent, ColumnCount }); + dataGridViewRecipe.Dock = DockStyle.Fill; + dataGridViewRecipe.Location = new Point(3, 23); + dataGridViewRecipe.Name = "dataGridViewRecipe"; + dataGridViewRecipe.RowHeadersVisible = false; + dataGridViewRecipe.RowHeadersWidth = 51; + dataGridViewRecipe.Size = new Size(590, 204); + dataGridViewRecipe.TabIndex = 27; + // + // ColumnComponent + // + ColumnComponent.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnComponent.HeaderText = "Компонент"; + ColumnComponent.MinimumWidth = 6; + ColumnComponent.Name = "ColumnComponent"; + // + // ColumnCount + // + ColumnCount.HeaderText = "Кол-во"; + ColumnCount.MinimumWidth = 6; + ColumnCount.Name = "ColumnCount"; + ColumnCount.Width = 250; + // + // label3 + // + label3.AutoSize = true; + label3.BackColor = Color.Bisque; + label3.Location = new Point(43, 111); + label3.Name = "label3"; + label3.Size = new Size(105, 20); + label3.TabIndex = 25; + label3.Text = "Тип продукта:"; + // + // checkedListBoxProductType + // + checkedListBoxProductType.FormattingEnabled = true; + checkedListBoxProductType.Location = new Point(43, 151); + checkedListBoxProductType.MultiColumn = true; + checkedListBoxProductType.Name = "checkedListBoxProductType"; + checkedListBoxProductType.Size = new Size(596, 70); + checkedListBoxProductType.TabIndex = 28; + // + // FormProduct + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.AntiqueWhite; + ClientSize = new Size(691, 553); + Controls.Add(checkedListBoxProductType); + Controls.Add(label3); + Controls.Add(groupBoxRecipe); + Controls.Add(buttonBack); + Controls.Add(ButtonSave); + Controls.Add(numericUpDownProductPrice); + Controls.Add(label4); + Controls.Add(label1); + Controls.Add(label2); + Controls.Add(textBoxProductName); + Name = "FormProduct"; + StartPosition = FormStartPosition.CenterParent; + Text = "Продукт"; + ((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).EndInit(); + groupBoxRecipe.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label2; + private TextBox textBoxProductName; + private Label label1; + private NumericUpDown numericUpDownProductPrice; + private Label label4; + private Button buttonBack; + private Button ButtonSave; + private GroupBox groupBoxRecipe; + private Label label3; + private DataGridView dataGridViewRecipe; + private CheckedListBox checkedListBoxProductType; + private DataGridViewComboBoxColumn ColumnComponent; + private DataGridViewTextBoxColumn ColumnCount; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.cs new file mode 100644 index 0000000..c1a0941 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.cs @@ -0,0 +1,123 @@ +using ProjectConfectFactory.Entities.Enums; +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Repositories; + +namespace ProjectConfectFactory.Forms; + +public partial class FormProduct : Form +{ + private readonly IProductRepository _productRepository; + + private int? _productId; + public FormProduct(IProductRepository productRepository, IComponentRepository componentRepository) + { + InitializeComponent(); + _productRepository = productRepository ?? + throw new ArgumentNullException(nameof(productRepository)); + + foreach (var elem in Enum.GetValues(typeof(ProductType))) + { + checkedListBoxProductType.Items.Add(elem); + } + + ColumnComponent.DataSource = componentRepository.ReadComponents(); + ColumnComponent.DisplayMember = "Name"; + ColumnComponent.ValueMember = "Id"; + } + + public int Id + { + set + { + try + { + var product = _productRepository.ReadProductById(value); + if (product == null) + { + throw new InvalidDataException(nameof(product)); + } + + foreach (ProductType elem in Enum.GetValues(typeof(ProductType))) + { + if ((elem & product.ProductType) != 0) + { + + checkedListBoxProductType.SetItemChecked(checkedListBoxProductType.Items.IndexOf(elem), true); + } + } + + textBoxProductName.Text = product.Name; + numericUpDownProductPrice.Value = (decimal)product.Price; + _productId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewRecipe.RowCount < 1 || string.IsNullOrWhiteSpace(textBoxProductName.Text) || + checkedListBoxProductType.CheckedItems.Count == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_productId.HasValue) + { + + _productRepository.UpdateProduct(CreateProduct(_productId.Value)); + } + + else + { + _productRepository.CreateProduct(CreateProduct(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonBack_Click(object sender, EventArgs e) => Close(); + + private List CreateListRecipeFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewRecipe.Rows) + { + if (row.Cells["ColumnComponent"].Value == null || + row.Cells["ColumnCount"].Value == null) + { + continue; + } + + list.Add(Recipe.CreateElement(0, Convert.ToInt32(row.Cells["ColumnComponent"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value))); + } + + return list; + } + + + + private Product CreateProduct(int id) + { + ProductType productType = ProductType.None; + foreach (var elem in checkedListBoxProductType.CheckedItems) + { + productType |= (ProductType)elem; + } + + return Product.CreateEntity(id, textBoxProductName.Text, productType, CreateListRecipeFromDataGrid(), Convert.ToInt32(numericUpDownProductPrice.Value)); + } + +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.resx new file mode 100644 index 0000000..301d143 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProduct.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.Designer.cs new file mode 100644 index 0000000..056c4fb --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.Designer.cs @@ -0,0 +1,131 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormProducts + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormProducts)); + panel1 = new Panel(); + buttonUpd = new Button(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridViewProducts = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.BackColor = Color.Linen; + panel1.Controls.Add(buttonUpd); + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(780, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(143, 450); + panel1.TabIndex = 2; + // + // buttonUpd + // + buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage"); + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(27, 339); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(95, 90); + buttonUpd.TabIndex = 4; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += buttonUpd_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage"); + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(27, 134); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(95, 90); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(27, 24); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 90); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridViewProducts + // + dataGridViewProducts.AllowUserToAddRows = false; + dataGridViewProducts.AllowUserToDeleteRows = false; + dataGridViewProducts.AllowUserToResizeColumns = false; + dataGridViewProducts.AllowUserToResizeRows = false; + dataGridViewProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewProducts.BackgroundColor = Color.Bisque; + dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewProducts.Dock = DockStyle.Fill; + dataGridViewProducts.GridColor = Color.Bisque; + dataGridViewProducts.Location = new Point(0, 0); + dataGridViewProducts.MultiSelect = false; + dataGridViewProducts.Name = "dataGridViewProducts"; + dataGridViewProducts.ReadOnly = true; + dataGridViewProducts.RowHeadersVisible = false; + dataGridViewProducts.RowHeadersWidth = 51; + dataGridViewProducts.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewProducts.Size = new Size(780, 450); + dataGridViewProducts.TabIndex = 3; + // + // FormProducts + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(923, 450); + Controls.Add(dataGridViewProducts); + Controls.Add(panel1); + Name = "FormProducts"; + StartPosition = FormStartPosition.CenterParent; + Text = "Продукты"; + Load += FormProducts_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonUpd; + private Button buttonDel; + private Button buttonAdd; + private DataGridView dataGridViewProducts; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.cs new file mode 100644 index 0000000..b15991b --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.cs @@ -0,0 +1,110 @@ +using ProjectConfectFactory.Repositories; +using Unity; + +namespace ProjectConfectFactory.Forms; + +public partial class FormProducts : Form +{ + private readonly IUnityContainer _container; + + private readonly IProductRepository _productRepository; + + public FormProducts(IUnityContainer container, IProductRepository productRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _productRepository = productRepository ?? + throw new ArgumentNullException(nameof(productRepository)); + } + + private void FormProducts_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _productRepository.DeleteProduct(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewProducts.DataSource = _productRepository.ReadProducts(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewProducts.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewProducts.SelectedRows[0].Cells["Id"].Value); + return true; + } + +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.resx new file mode 100644 index 0000000..ce544af --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormProducts.resx @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe + 43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7 + VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKk + Kcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUv + QJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UD + VZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcRJzOh6ro3OHFqXwJkiQVdyrvU1Gn8x6Xa609O3Kw + Le/0wcWRkYuQJKms04eufTTvU1HH8x6Xi4jHRg625R29e/FQvghJkip74u7Fg3mfino073G5iHh45GBb + 3h0fmh3MFyFJUmUf/cDsUN6nov4x73G5iDgwcrAt743X9RNnHpgfy5chSVJFZ+5fPLN/X5zM+1TUF/Ie + l4uIT4wcrKRP3updAEnSNP3Rb84O5l0q7ON5j8tFxPtHDlZS73H265+ZH86XIknSVnbkc/MHhw3Ku1RV + 7/19eY/LRcQ78sEqu+7aOPX4nfMv5suRJGkrevyuxUPXLeL5vEeV9d7fnve43MrKymvzwapbW4uzn/nI + /N6zDyxO5IuSJOlyNGzMX/7u7L5hc/IOVddauyrv8SQi4mv5cFP0Y2/qx+78vfUDJ/928ZVzhxcv5MuT + JOkCe+HkgfnDw7a85YZ+PO/ORD2Sd3gywy8jjBxw0tbW4szbbupP37zRj0iSdKENGzJsSd6XqWut3ZF3 + eDK995/KB5QkSVvST+QdnszKysorI2Kq70OWJGm3dGrv3r2vyjs8qd77p0YOKkmSLl9/mvd3clN/HFCS + pJ1ea+3mvL+T29jYuDIinsqHlSRJl6Unh63N+7sUIuJDIweWJEmXWGvtV/PuLo3NXwb8Zj60JEm6pI63 + 1l6Rd3eptNZ+e+TgkiTpIuu9/0be26Uzn89fHRH/ng8vSZIuqqeW7qN/L6W19rMjL0CSJF1grbWfyTu7 + zK6IiAP5RUiSpPOvtXbfsKl5ZJda7309Yto/lyhJ0jbu1DXXXNPzvm4LrbV3j7wgSZL0/9R7f1fe1W0l + Iv4kvyhJkvTStdb+Iu/ptrP53QCP5BcnSZJGe3g2m31P3tNtaWVl5bUR8djIi5QkSd/pid77j+Yd3dbW + 1tZmwzcZjbxYSZIU8VxrbZH3c0eIiDe31p4dedGSJO3aNrfxprybO8rmOwGP5xcvSdIu7ehsNtuX93JH + iojXR8RXRx6CJEm7pt77v66srFydd3JHG77XuPf+6fwwJEnaDfXePzv8/Zy8j7vFFa2190bEt/ODkSRp + h/ZC7/2D2+4rfrdCa+2NEfF3Iw9JkqSd1Jd779fnHdztXtZ7vyUijo08MEmStm3Db/kP73jv2bPnu/L4 + sWk2m/1wRHx0+CMI+QFKkrTNGrbstvX19R/Ke8dLWFlZ+YGIuHX4YoSRBypJ0jJ3Yhj+1tpVed84T8Pf + Etj8r4HPR8SZkYcsSdIyNGzUoYj4uWG78p5xCYbvR+69vy8i7oqIb408fEmSKhvepb5z+P/92Wz2I3m3 + 2AIbGxtX9t5v7L3/wvA2S0T8dUR8IyKeH7kgSZIupWFbvr65NcNb++9eW1t7k1/qWzLDPw6GL1dorb1h + dXV1ryRJF9qwIcOWDJuSdwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAbeO/ARmncr3NqsTVAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.Designer.cs new file mode 100644 index 0000000..22641e7 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.Designer.cs @@ -0,0 +1,161 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormPurchase + { + /// + /// 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() + { + label4 = new Label(); + dateTimePickerPruchase = new DateTimePicker(); + label1 = new Label(); + label2 = new Label(); + comboBoxComponent = new ComboBox(); + comboBoxSellerName = new ComboBox(); + label3 = new Label(); + buttonBack = new Button(); + ButtonSave = new Button(); + SuspendLayout(); + // + // label4 + // + label4.AutoSize = true; + label4.BackColor = Color.Bisque; + label4.Location = new Point(37, 143); + label4.Name = "label4"; + label4.Size = new Size(44, 20); + label4.TabIndex = 14; + label4.Text = "Дата:"; + // + // dateTimePickerPruchase + // + dateTimePickerPruchase.Enabled = false; + dateTimePickerPruchase.Location = new Point(171, 136); + dateTimePickerPruchase.Name = "dateTimePickerPruchase"; + dateTimePickerPruchase.Size = new Size(250, 27); + dateTimePickerPruchase.TabIndex = 13; + // + // label1 + // + label1.AutoSize = true; + label1.BackColor = Color.Bisque; + label1.Location = new Point(37, 88); + label1.Name = "label1"; + label1.Size = new Size(89, 20); + label1.TabIndex = 15; + label1.Text = "Поставщик:"; + // + // label2 + // + label2.AutoSize = true; + label2.BackColor = Color.Bisque; + label2.Font = new Font("Segoe UI", 10F); + label2.Location = new Point(151, 27); + label2.Name = "label2"; + label2.Size = new Size(86, 23); + label2.TabIndex = 16; + label2.Text = "Поставка:"; + // + // comboBoxComponent + // + comboBoxComponent.FormattingEnabled = true; + comboBoxComponent.Location = new Point(171, 187); + comboBoxComponent.Name = "comboBoxComponent"; + comboBoxComponent.Size = new Size(250, 28); + comboBoxComponent.TabIndex = 17; + // + // comboBoxSellerName + // + comboBoxSellerName.FormattingEnabled = true; + comboBoxSellerName.Location = new Point(171, 80); + comboBoxSellerName.Name = "comboBoxSellerName"; + comboBoxSellerName.Size = new Size(250, 28); + comboBoxSellerName.TabIndex = 18; + // + // label3 + // + label3.AutoSize = true; + label3.BackColor = Color.Bisque; + label3.Location = new Point(37, 195); + label3.Name = "label3"; + label3.Size = new Size(91, 20); + label3.TabIndex = 19; + label3.Text = "Компонент:"; + // + // buttonBack + // + buttonBack.Location = new Point(272, 252); + buttonBack.Name = "buttonBack"; + buttonBack.Size = new Size(100, 30); + buttonBack.TabIndex = 27; + buttonBack.Text = "Отмена"; + buttonBack.UseVisualStyleBackColor = true; + buttonBack.Click += buttonBack_Click; + // + // ButtonSave + // + ButtonSave.Location = new Point(68, 252); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(100, 30); + ButtonSave.TabIndex = 26; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // FormPurchase + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.AntiqueWhite; + ClientSize = new Size(449, 308); + Controls.Add(buttonBack); + Controls.Add(ButtonSave); + Controls.Add(label3); + Controls.Add(comboBoxSellerName); + Controls.Add(comboBoxComponent); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(label4); + Controls.Add(dateTimePickerPruchase); + Name = "FormPurchase"; + StartPosition = FormStartPosition.CenterParent; + Text = "Поставка"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label4; + private DateTimePicker dateTimePickerPruchase; + private Label label1; + private Label label2; + private ComboBox comboBoxComponent; + private ComboBox comboBoxSellerName; + private Label label3; + private Button buttonBack; + private Button ButtonSave; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.cs new file mode 100644 index 0000000..646fd3b --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.cs @@ -0,0 +1,48 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Repositories; + +namespace ProjectConfectFactory.Forms; + +public partial class FormPurchase : Form +{ + private readonly IPurchaseRepository _purchaseRepository; + + public FormPurchase(IPurchaseRepository purchaseRepository, + ISellerRepository sellerRepository, IComponentRepository componentRepository) + { + InitializeComponent(); + _purchaseRepository = purchaseRepository ?? throw new ArgumentNullException(nameof(purchaseRepository)); + + comboBoxSellerName.DataSource = sellerRepository.ReadSellers(); + comboBoxSellerName.DisplayMember = "Name"; + comboBoxSellerName.ValueMember = "Id"; + comboBoxComponent.ValueMember = "ComponentId"; + + comboBoxComponent.DataSource = componentRepository.ReadComponents(); + comboBoxComponent.DisplayMember = "Name"; + comboBoxComponent.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxSellerName.SelectedIndex < 0 || comboBoxComponent.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + + _purchaseRepository.CreatePurchase(Purchase.CreateOpeartion(0, (int)comboBoxSellerName.SelectedValue!, (int)comboBoxComponent.SelectedValue!)); + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonBack_Click(object sender, EventArgs e) => Close(); +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchase.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/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.Designer.cs new file mode 100644 index 0000000..6b24703 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.Designer.cs @@ -0,0 +1,102 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormPurchases + { + /// + /// 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() + { + panel1 = new Panel(); + buttonAdd = new Button(); + dataGridViewPurchases = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.BackColor = Color.Linen; + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(657, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(143, 450); + panel1.TabIndex = 2; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(27, 24); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 90); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridViewPurchases + // + dataGridViewPurchases.AllowUserToAddRows = false; + dataGridViewPurchases.AllowUserToDeleteRows = false; + dataGridViewPurchases.AllowUserToResizeColumns = false; + dataGridViewPurchases.AllowUserToResizeRows = false; + dataGridViewPurchases.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewPurchases.BackgroundColor = Color.Bisque; + dataGridViewPurchases.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewPurchases.Dock = DockStyle.Fill; + dataGridViewPurchases.GridColor = Color.Bisque; + dataGridViewPurchases.Location = new Point(0, 0); + dataGridViewPurchases.MultiSelect = false; + dataGridViewPurchases.Name = "dataGridViewPurchases"; + dataGridViewPurchases.ReadOnly = true; + dataGridViewPurchases.RowHeadersVisible = false; + dataGridViewPurchases.RowHeadersWidth = 51; + dataGridViewPurchases.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewPurchases.Size = new Size(657, 450); + dataGridViewPurchases.TabIndex = 3; + // + // FormPurchases + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewPurchases); + Controls.Add(panel1); + Name = "FormPurchases"; + StartPosition = FormStartPosition.CenterParent; + Text = "Поставки"; + Load += FormPurchases_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonAdd; + private DataGridView dataGridViewPurchases; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.cs new file mode 100644 index 0000000..61770b4 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.cs @@ -0,0 +1,49 @@ +using ProjectConfectFactory.Repositories; +using Unity; + +namespace ProjectConfectFactory.Forms; + +public partial class FormPurchases : Form +{ + private readonly IUnityContainer _container; + + private readonly IPurchaseRepository _purchaseRepository; + + public FormPurchases(IUnityContainer container, IPurchaseRepository purchaseRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _purchaseRepository = purchaseRepository ?? + throw new ArgumentNullException(nameof(purchaseRepository)); + } + + private void FormPurchases_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewPurchases.DataSource = _purchaseRepository.ReadPurchases(); +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormPurchases.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/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.Designer.cs new file mode 100644 index 0000000..3a97e8a --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.Designer.cs @@ -0,0 +1,160 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormSeller + { + /// + /// 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() + { + textBoxSellerName = new TextBox(); + textBoxSellerPhone = new TextBox(); + comboBoxSellerDelivTime = new ComboBox(); + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); + label4 = new Label(); + ButtonSellerSave = new Button(); + ButtonSellerBack = new Button(); + SuspendLayout(); + // + // textBoxSellerName + // + textBoxSellerName.Location = new Point(230, 66); + textBoxSellerName.Name = "textBoxSellerName"; + textBoxSellerName.Size = new Size(218, 27); + textBoxSellerName.TabIndex = 0; + // + // textBoxSellerPhone + // + textBoxSellerPhone.Location = new Point(230, 130); + textBoxSellerPhone.Name = "textBoxSellerPhone"; + textBoxSellerPhone.Size = new Size(218, 27); + textBoxSellerPhone.TabIndex = 1; + // + // comboBoxSellerDelivTime + // + comboBoxSellerDelivTime.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSellerDelivTime.FormattingEnabled = true; + comboBoxSellerDelivTime.Location = new Point(230, 189); + comboBoxSellerDelivTime.Name = "comboBoxSellerDelivTime"; + comboBoxSellerDelivTime.Size = new Size(218, 28); + comboBoxSellerDelivTime.TabIndex = 2; + // + // label1 + // + label1.AutoSize = true; + label1.BackColor = Color.Bisque; + label1.Font = new Font("Segoe UI", 10F); + label1.Location = new Point(172, 19); + label1.Name = "label1"; + label1.Size = new Size(101, 23); + label1.TabIndex = 3; + label1.Text = "Поставщик:"; + // + // label2 + // + label2.AutoSize = true; + label2.BackColor = Color.Bisque; + label2.Location = new Point(46, 73); + label2.Name = "label2"; + label2.Size = new Size(119, 20); + label2.TabIndex = 4; + label2.Text = "Наименование:"; + // + // label3 + // + label3.AutoSize = true; + label3.BackColor = Color.Bisque; + label3.Location = new Point(46, 137); + label3.Name = "label3"; + label3.Size = new Size(72, 20); + label3.TabIndex = 5; + label3.Text = "Телефон:"; + // + // label4 + // + label4.AutoSize = true; + label4.BackColor = Color.Bisque; + label4.Location = new Point(46, 197); + label4.Name = "label4"; + label4.Size = new Size(104, 20); + label4.TabIndex = 6; + label4.Text = "Тип доставки:"; + // + // ButtonSellerSave + // + ButtonSellerSave.Location = new Point(71, 251); + ButtonSellerSave.Name = "ButtonSellerSave"; + ButtonSellerSave.Size = new Size(94, 29); + ButtonSellerSave.TabIndex = 7; + ButtonSellerSave.Text = "Сохранить"; + ButtonSellerSave.UseVisualStyleBackColor = true; + ButtonSellerSave.Click += ButtonSellerSave_Click; + // + // ButtonSellerBack + // + ButtonSellerBack.Location = new Point(315, 251); + ButtonSellerBack.Name = "ButtonSellerBack"; + ButtonSellerBack.Size = new Size(94, 29); + ButtonSellerBack.TabIndex = 8; + ButtonSellerBack.Text = "Отмена"; + ButtonSellerBack.UseVisualStyleBackColor = true; + ButtonSellerBack.Click += ButtonSellerBack_Click; + // + // FormSeller + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.AntiqueWhite; + ClientSize = new Size(482, 303); + Controls.Add(ButtonSellerBack); + Controls.Add(ButtonSellerSave); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(comboBoxSellerDelivTime); + Controls.Add(textBoxSellerPhone); + Controls.Add(textBoxSellerName); + Name = "FormSeller"; + StartPosition = FormStartPosition.CenterParent; + Text = "Поставщик"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxSellerName; + private TextBox textBoxSellerPhone; + private ComboBox comboBoxSellerDelivTime; + private Label label1; + private Label label2; + private Label label3; + private Label label4; + private Button ButtonSellerSave; + private Button ButtonSellerBack; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.cs new file mode 100644 index 0000000..b0a5f30 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.cs @@ -0,0 +1,77 @@ +using ProjectConfectFactory.Repositories; +using ProjectConfectFactory.Entities.Enums; +using ProjectConfectFactory.Entities; + +namespace ProjectConfectFactory.Forms; + +public partial class FormSeller : Form +{ + private readonly ISellerRepository _sellerRepository; + private int? _sellerId; + + public int Id + { + set + { + try + { + var seller = _sellerRepository.ReadSellerById(value); + if (seller == null) + { + throw new InvalidDataException(nameof(seller)); + } + textBoxSellerName.Text = seller.Name; + textBoxSellerPhone.Text = seller.Phone; + comboBoxSellerDelivTime.SelectedItem = seller.DeliveryTime; + + _sellerId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormSeller(ISellerRepository sellerRepository) + { + InitializeComponent(); + _sellerRepository = sellerRepository ?? + throw new ArgumentNullException(nameof(sellerRepository)); + + comboBoxSellerDelivTime.DataSource = Enum.GetValues(typeof(DeliveryType)); + } + + private void ButtonSellerSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxSellerName.Text) || string.IsNullOrWhiteSpace(textBoxSellerPhone.Text) || comboBoxSellerDelivTime.SelectedIndex < 1) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_sellerId.HasValue) + { + + _sellerRepository.UpdateSeller(CreateSeller(_sellerId.Value)); + } + else + { + _sellerRepository.CreateSeller(CreateSeller(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonSellerBack_Click(object sender, EventArgs e) => Close(); + private Seller CreateSeller(int id) => Seller.CreateEntity(id, textBoxSellerName.Text, textBoxSellerPhone.Text, + (DeliveryType)comboBoxSellerDelivTime.SelectedItem!); + +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSeller.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/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.Designer.cs new file mode 100644 index 0000000..ce84a42 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.Designer.cs @@ -0,0 +1,131 @@ +namespace ProjectConfectFactory.Forms +{ + partial class FormSellers + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSellers)); + panel1 = new Panel(); + buttonUpd = new Button(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridViewSellers = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewSellers).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.BackColor = Color.Linen; + panel1.Controls.Add(buttonUpd); + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(789, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(143, 453); + panel1.TabIndex = 0; + // + // buttonUpd + // + buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage"); + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(27, 339); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(95, 90); + buttonUpd.TabIndex = 4; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage"); + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(27, 134); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(95, 90); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(27, 24); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 90); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewSellers + // + dataGridViewSellers.AllowUserToAddRows = false; + dataGridViewSellers.AllowUserToDeleteRows = false; + dataGridViewSellers.AllowUserToResizeColumns = false; + dataGridViewSellers.AllowUserToResizeRows = false; + dataGridViewSellers.Anchor = AnchorStyles.Left | AnchorStyles.Right; + dataGridViewSellers.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewSellers.BackgroundColor = Color.Bisque; + dataGridViewSellers.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewSellers.GridColor = Color.Bisque; + dataGridViewSellers.Location = new Point(0, 0); + dataGridViewSellers.MultiSelect = false; + dataGridViewSellers.Name = "dataGridViewSellers"; + dataGridViewSellers.ReadOnly = true; + dataGridViewSellers.RowHeadersVisible = false; + dataGridViewSellers.RowHeadersWidth = 51; + dataGridViewSellers.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewSellers.Size = new Size(789, 453); + dataGridViewSellers.TabIndex = 1; + // + // FormSellers + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(932, 453); + Controls.Add(dataGridViewSellers); + Controls.Add(panel1); + Name = "FormSellers"; + StartPosition = FormStartPosition.CenterParent; + Text = "Поставщики"; + Load += FormSellers_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewSellers).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private DataGridView dataGridViewSellers; + private Button buttonUpd; + private Button buttonDel; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.cs b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.cs new file mode 100644 index 0000000..08e73d6 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.cs @@ -0,0 +1,109 @@ +using ProjectConfectFactory.Repositories; +using Unity; + +namespace ProjectConfectFactory.Forms; + +public partial class FormSellers : Form +{ + private readonly IUnityContainer _container; + + private readonly ISellerRepository _sellerRepository; + + public FormSellers(IUnityContainer container, ISellerRepository sellerRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _sellerRepository = sellerRepository ?? + throw new ArgumentNullException(nameof(sellerRepository)); + } + private void FormSellers_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _sellerRepository.DeleteSeller(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewSellers.DataSource = _sellerRepository.ReadSellers(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewSellers.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewSellers.SelectedRows[0].Cells["Id"].Value); + return true; + } +} + diff --git a/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.resx b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.resx new file mode 100644 index 0000000..d722f74 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Forms/FormSellers.resx @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7VFXe + 43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKkKcr7 + VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUvQJKk + Kcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UDVZUv + QJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcPlBV+QIkSZqivE9V5T0ulw9UVb4ASZKmKO9TVXmPy+UD + VZUvQJKkKcr7VFXe43L5QFXlC5AkaYryPlWV97hcRJzOh6ro3OHFqXwJkiQVdyrvU1Gn8x6Xa609O3Kw + Le/0wcWRkYuQJKms04eufTTvU1HH8x6Xi4jHRg625R29e/FQvghJkip74u7Fg3mfino073G5iHh45GBb + 3h0fmh3MFyFJUmUf/cDsUN6nov4x73G5iDgwcrAt743X9RNnHpgfy5chSVJFZ+5fPLN/X5zM+1TUF/Ie + l4uIT4wcrKRP3updAEnSNP3Rb84O5l0q7ON5j8tFxPtHDlZS73H265+ZH86XIknSVnbkc/MHhw3Ku1RV + 7/19eY/LRcQ78sEqu+7aOPX4nfMv5suRJGkrevyuxUPXLeL5vEeV9d7fnve43MrKymvzwapbW4uzn/nI + /N6zDyxO5IuSJOlyNGzMX/7u7L5hc/IOVddauyrv8SQi4mv5cFP0Y2/qx+78vfUDJ/928ZVzhxcv5MuT + JOkCe+HkgfnDw7a85YZ+PO/ORD2Sd3gywy8jjBxw0tbW4szbbupP37zRj0iSdKENGzJsSd6XqWut3ZF3 + eDK995/KB5QkSVvST+QdnszKysorI2Kq70OWJGm3dGrv3r2vyjs8qd77p0YOKkmSLl9/mvd3clN/HFCS + pJ1ea+3mvL+T29jYuDIinsqHlSRJl6Unh63N+7sUIuJDIweWJEmXWGvtV/PuLo3NXwb8Zj60JEm6pI63 + 1l6Rd3eptNZ+e+TgkiTpIuu9/0be26Uzn89fHRH/ng8vSZIuqqeW7qN/L6W19rMjL0CSJF1grbWfyTu7 + zK6IiAP5RUiSpPOvtXbfsKl5ZJda7309Yto/lyhJ0jbu1DXXXNPzvm4LrbV3j7wgSZL0/9R7f1fe1W0l + Iv4kvyhJkvTStdb+Iu/ptrP53QCP5BcnSZJGe3g2m31P3tNtaWVl5bUR8djIi5QkSd/pid77j+Yd3dbW + 1tZmwzcZjbxYSZIU8VxrbZH3c0eIiDe31p4dedGSJO3aNrfxprybO8rmOwGP5xcvSdIu7ehsNtuX93JH + iojXR8RXRx6CJEm7pt77v66srFydd3JHG77XuPf+6fwwJEnaDfXePzv8/Zy8j7vFFa2190bEt/ODkSRp + h/ZC7/2D2+4rfrdCa+2NEfF3Iw9JkqSd1Jd779fnHdztXtZ7vyUijo08MEmStm3Db/kP73jv2bPnu/L4 + sWk2m/1wRHx0+CMI+QFKkrTNGrbstvX19R/Ke8dLWFlZ+YGIuHX4YoSRBypJ0jJ3Yhj+1tpVed84T8Pf + Etj8r4HPR8SZkYcsSdIyNGzUoYj4uWG78p5xCYbvR+69vy8i7oqIb408fEmSKhvepb5z+P/92Wz2I3m3 + 2AIbGxtX9t5v7L3/wvA2S0T8dUR8IyKeH7kgSZIupWFbvr65NcNb++9eW1t7k1/qWzLDPw6GL1dorb1h + dXV1ryRJF9qwIcOWDJuSdwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAbeO/ARmncr3NqsTVAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Program.cs b/ProjectConfectFactory/ProjectConfectFactory/Program.cs index 9facb79..f69322a 100644 --- a/ProjectConfectFactory/ProjectConfectFactory/Program.cs +++ b/ProjectConfectFactory/ProjectConfectFactory/Program.cs @@ -1,3 +1,8 @@ +using ProjectConfectFactory.Repositories.Implementations; +using ProjectConfectFactory.Repositories; +using Unity; +using Unity.Lifetime; + namespace ProjectConfectFactory { internal static class Program @@ -11,7 +16,20 @@ namespace ProjectConfectFactory // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(CreateContainer().Resolve()); + } + + private static IUnityContainer CreateContainer() + { + var container = new UnityContainer(); + + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + + return container; } } } \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/ProjectConfectFactory.csproj b/ProjectConfectFactory/ProjectConfectFactory/ProjectConfectFactory.csproj index 663fdb8..accbdf0 100644 --- a/ProjectConfectFactory/ProjectConfectFactory/ProjectConfectFactory.csproj +++ b/ProjectConfectFactory/ProjectConfectFactory/ProjectConfectFactory.csproj @@ -8,4 +8,23 @@ enable + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.Designer.cs b/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2517e8d --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectConfectFactory.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectConfectFactory.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap add { + get { + object obj = ResourceManager.GetObject("add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Фон { + get { + object obj = ResourceManager.GetObject("Фон", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.resx b/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.resx new file mode 100644 index 0000000..34e51ff --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\Фон.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/IComponentRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IComponentRepository.cs new file mode 100644 index 0000000..b5afeb5 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IComponentRepository.cs @@ -0,0 +1,16 @@ +using ProjectConfectFactory.Entities; + +namespace ProjectConfectFactory.Repositories; + +public interface IComponentRepository +{ + IEnumerable ReadComponents(); + + Component ReadComponentById(int id); + + void CreateComponent(Component component); + + void UpdateComponent(Component component); + + void DeleteComponent(int id); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/IOrderRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IOrderRepository.cs new file mode 100644 index 0000000..c8dd1d3 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IOrderRepository.cs @@ -0,0 +1,11 @@ +using ProjectConfectFactory.Entities; +namespace ProjectConfectFactory.Repositories; + +public interface IOrderRepository +{ + IEnumerable ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null); + + void CreateOrder(Order order); + + void DeleteOrder(int id); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/IProductRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IProductRepository.cs new file mode 100644 index 0000000..bb71689 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IProductRepository.cs @@ -0,0 +1,23 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Entities.Enums; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectConfectFactory.Repositories; + +public interface IProductRepository +{ + void CreateProduct(Product product); + + void UpdateProduct(Product product); + + Product ReadProductById(int id); + + IEnumerable ReadProducts(); + + void DeleteProduct(int id); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/IPurchaseRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IPurchaseRepository.cs new file mode 100644 index 0000000..c83dabd --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/IPurchaseRepository.cs @@ -0,0 +1,16 @@ +using ProjectConfectFactory.Entities; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectConfectFactory.Repositories; + +public interface IPurchaseRepository +{ + IEnumerable ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null); + + void CreatePurchase(Purchase purchase); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/ISellerRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/ISellerRepository.cs new file mode 100644 index 0000000..c00963a --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/ISellerRepository.cs @@ -0,0 +1,16 @@ +using ProjectConfectFactory.Entities; + +namespace ProjectConfectFactory.Repositories; + +public interface ISellerRepository +{ + void CreateSeller(Seller seller); + + void DeleteSeller(int id); + + Seller ReadSellerById(int id); + + IEnumerable ReadSellers(); + + void UpdateSeller(Seller seller); +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/ComponentRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/ComponentRepository.cs new file mode 100644 index 0000000..e7589dd --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/ComponentRepository.cs @@ -0,0 +1,28 @@ +using ProjectConfectFactory.Entities; + +namespace ProjectConfectFactory.Repositories.Implementations; + +public class ComponentRepository : IComponentRepository +{ + public void CreateComponent(Component component) + { + } + + public void DeleteComponent(int id) + { + } + + public Component ReadComponentById(int id) + { + return Component.CreateEntity(0, string.Empty, string.Empty, 0); + } + + public IEnumerable ReadComponents() + { + return []; + } + + public void UpdateComponent(Component component) + { + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/MyProductRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/MyProductRepository.cs new file mode 100644 index 0000000..6186d65 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/MyProductRepository.cs @@ -0,0 +1,29 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Entities.Enums; + +namespace ProjectConfectFactory.Repositories.Implementations; + +public class MyProductRepository : IProductRepository +{ + public void CreateProduct(Product product) + { + } + + public void DeleteProduct(int id) + { + } + + public Product ReadProductById(int id) + { + return Product.CreateEntity(0, string.Empty, ProductType.None, [] ,0); ; + } + + public IEnumerable ReadProducts() + { + return []; + } + + public void UpdateProduct(Product product) + { + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/OrderRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/OrderRepository.cs new file mode 100644 index 0000000..22b6503 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/OrderRepository.cs @@ -0,0 +1,24 @@ +using ProjectConfectFactory.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectConfectFactory.Repositories.Implementations; + +public class OrderRepository : IOrderRepository +{ + public void CreateOrder(Order order) + { + } + + public void DeleteOrder(int id) + { + } + + public IEnumerable ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null) + { + return []; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/PurchaseRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/PurchaseRepository.cs new file mode 100644 index 0000000..56a29f2 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/PurchaseRepository.cs @@ -0,0 +1,20 @@ +using ProjectConfectFactory.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectConfectFactory.Repositories.Implementations; + +public class PurchaseRepository : IPurchaseRepository +{ + public void CreatePurchase(Purchase purchase) + { + } + + public IEnumerable ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null) + { + return []; + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/SellerRepository.cs b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/SellerRepository.cs new file mode 100644 index 0000000..93d0c49 --- /dev/null +++ b/ProjectConfectFactory/ProjectConfectFactory/Repositories/Implementations/SellerRepository.cs @@ -0,0 +1,35 @@ +using ProjectConfectFactory.Entities; +using ProjectConfectFactory.Entities.Enums; +using Microsoft.VisualBasic.FileIO; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectConfectFactory.Repositories.Implementations; + +public class SellerRepository : ISellerRepository +{ + public void CreateSeller(Seller seller) + { + } + + public void DeleteSeller(int id) + { + } + + public Seller ReadSellerById(int id) + { + return Seller.CreateEntity(0, string.Empty, string.Empty, DeliveryType.None); ; + } + + public IEnumerable ReadSellers() + { + return []; + } + + public void UpdateSeller(Seller seller) + { + } +} diff --git a/ProjectConfectFactory/ProjectConfectFactory/Resources/add.png b/ProjectConfectFactory/ProjectConfectFactory/Resources/add.png new file mode 100644 index 0000000..9dc1ccd Binary files /dev/null and b/ProjectConfectFactory/ProjectConfectFactory/Resources/add.png differ diff --git a/ProjectConfectFactory/ProjectConfectFactory/Resources/del.png b/ProjectConfectFactory/ProjectConfectFactory/Resources/del.png new file mode 100644 index 0000000..4388d5f Binary files /dev/null and b/ProjectConfectFactory/ProjectConfectFactory/Resources/del.png differ diff --git a/ProjectConfectFactory/ProjectConfectFactory/Resources/ee27ce243807293c9b5e0820d82494fe.jpg b/ProjectConfectFactory/ProjectConfectFactory/Resources/ee27ce243807293c9b5e0820d82494fe.jpg new file mode 100644 index 0000000..fc0140c Binary files /dev/null and b/ProjectConfectFactory/ProjectConfectFactory/Resources/ee27ce243807293c9b5e0820d82494fe.jpg differ diff --git a/ProjectConfectFactory/ProjectConfectFactory/Resources/pencil.png b/ProjectConfectFactory/ProjectConfectFactory/Resources/pencil.png new file mode 100644 index 0000000..db84fca Binary files /dev/null and b/ProjectConfectFactory/ProjectConfectFactory/Resources/pencil.png differ diff --git a/ProjectConfectFactory/ProjectConfectFactory/Resources/Фон.jpg b/ProjectConfectFactory/ProjectConfectFactory/Resources/Фон.jpg new file mode 100644 index 0000000..30e1147 Binary files /dev/null and b/ProjectConfectFactory/ProjectConfectFactory/Resources/Фон.jpg differ