From ed88ae026b8304667ed28700eadc0c2d302446cb Mon Sep 17 00:00:00 2001 From: Timur_Sharafutdinov Date: Sat, 14 Dec 2024 20:32:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectPublishing/Entities/Client.cs | 27 +++ .../ProjectPublishing/Entities/Contact.cs | 28 +++ .../Entities/Enums/ClientType.cs | 14 ++ .../Entities/Enums/OrderType.cs | 16 ++ .../Entities/Enums/ProductType.cs | 16 ++ .../ProjectPublishing/Entities/Order.cs | 28 +++ .../Entities/OrderProduct.cs | 24 +++ .../Entities/PrintingHouse.cs | 28 +++ .../ProjectPublishing/Entities/Product.cs | 24 +++ .../ProjectPublishing/Form1.Designer.cs | 39 ---- ProjectPublishing/ProjectPublishing/Form1.cs | 10 - .../FormPublishing.Designer.cs | 136 ++++++++++++++ .../ProjectPublishing/FormPublishing.cs | 78 ++++++++ .../ProjectPublishing/FormPublishing.resx | 123 +++++++++++++ .../Forms/FormClient.Designer.cs | 142 +++++++++++++++ .../ProjectPublishing/Forms/FormClient.cs | 78 ++++++++ .../{Form1.resx => Forms/FormClient.resx} | 50 ++--- .../Forms/FormClients.Designer.cs | 127 +++++++++++++ .../ProjectPublishing/Forms/FormClients.cs | 112 ++++++++++++ .../ProjectPublishing/Forms/FormClients.resx | 120 ++++++++++++ .../Forms/FormContact.Designer.cs | 162 +++++++++++++++++ .../ProjectPublishing/Forms/FormContact.cs | 81 +++++++++ .../ProjectPublishing/Forms/FormContact.resx | 120 ++++++++++++ .../Forms/FormContacts.Designer.cs | 126 +++++++++++++ .../ProjectPublishing/Forms/FormContacts.cs | 107 +++++++++++ .../ProjectPublishing/Forms/FormContacts.resx | 120 ++++++++++++ .../Forms/FormOrder.Designer.cs | 171 ++++++++++++++++++ .../ProjectPublishing/Forms/FormOrder.cs | 71 ++++++++ .../ProjectPublishing/Forms/FormOrder.resx | 126 +++++++++++++ .../Forms/FormOrders.Designer.cs | 111 ++++++++++++ .../ProjectPublishing/Forms/FormOrders.cs | 91 ++++++++++ .../ProjectPublishing/Forms/FormOrders.resx | 120 ++++++++++++ .../Forms/FormPrintingHouse.Designer.cs | 162 +++++++++++++++++ .../Forms/FormPrintingHouse.cs | 50 +++++ .../Forms/FormPrintingHouse.resx | 120 ++++++++++++ .../Forms/FormPrintingHouses.Designer.cs | 97 ++++++++++ .../Forms/FormPrintingHouses.cs | 56 ++++++ .../Forms/FormPrintingHouses.resx | 120 ++++++++++++ .../Forms/FormProduct.Designer.cs | 118 ++++++++++++ .../ProjectPublishing/Forms/FormProduct.cs | 95 ++++++++++ .../ProjectPublishing/Forms/FormProduct.resx | 120 ++++++++++++ .../Forms/FormProducts.Designer.cs | 97 ++++++++++ .../ProjectPublishing/Forms/FormProducts.cs | 109 +++++++++++ .../ProjectPublishing/Forms/FormProducts.resx | 120 ++++++++++++ .../ProjectPublishing/Program.cs | 16 +- .../ProjectPublishing.csproj | 19 ++ .../Properties/Resources.Designer.cs | 103 +++++++++++ .../Properties/Resources.resx | 133 ++++++++++++++ .../Repositories/IClientRepository.cs | 17 ++ .../Repositories/IContactRepository.cs | 17 ++ .../Repositories/IOrderRepository.cs | 18 ++ .../Repositories/IPrintingHouseRepository.cs | 17 ++ .../Repositories/IProductRepository.cs | 17 ++ .../Implementations/ClientRepository.cs | 34 ++++ .../Implementations/ContactRepository.cs | 34 ++++ .../Implementations/OrderRepository.cs | 35 ++++ .../PrintingHouseRepository.cs | 33 ++++ .../Implementations/ProductRepository.cs | 34 ++++ .../ProjectPublishing/Resources/Add.png | Bin 0 -> 931 bytes .../ProjectPublishing/Resources/Del.png | Bin 0 -> 452 bytes .../ProjectPublishing/Resources/Edit.png | Bin 0 -> 12138 bytes .../Resources/PrintingHouse.jpg | Bin 0 -> 21455 bytes 62 files changed, 4342 insertions(+), 75 deletions(-) create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Client.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Contact.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Enums/ClientType.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Enums/OrderType.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Enums/ProductType.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Order.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/OrderProduct.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/PrintingHouse.cs create mode 100644 ProjectPublishing/ProjectPublishing/Entities/Product.cs delete mode 100644 ProjectPublishing/ProjectPublishing/Form1.Designer.cs delete mode 100644 ProjectPublishing/ProjectPublishing/Form1.cs create mode 100644 ProjectPublishing/ProjectPublishing/FormPublishing.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/FormPublishing.cs create mode 100644 ProjectPublishing/ProjectPublishing/FormPublishing.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormClient.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormClient.cs rename ProjectPublishing/ProjectPublishing/{Form1.resx => Forms/FormClient.resx} (93%) create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormClients.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormClients.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormClients.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContact.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContact.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContact.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContacts.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContacts.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormContacts.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrder.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrder.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrder.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrders.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormOrders.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProduct.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProduct.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProduct.resx create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProducts.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProducts.cs create mode 100644 ProjectPublishing/ProjectPublishing/Forms/FormProducts.resx create mode 100644 ProjectPublishing/ProjectPublishing/Properties/Resources.Designer.cs create mode 100644 ProjectPublishing/ProjectPublishing/Properties/Resources.resx create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IClientRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IContactRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IOrderRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IPrintingHouseRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IProductRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/ClientRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/ContactRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/PrintingHouseRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/ProductRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Resources/Add.png create mode 100644 ProjectPublishing/ProjectPublishing/Resources/Del.png create mode 100644 ProjectPublishing/ProjectPublishing/Resources/Edit.png create mode 100644 ProjectPublishing/ProjectPublishing/Resources/PrintingHouse.jpg diff --git a/ProjectPublishing/ProjectPublishing/Entities/Client.cs b/ProjectPublishing/ProjectPublishing/Entities/Client.cs new file mode 100644 index 0000000..160c8b9 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Client.cs @@ -0,0 +1,27 @@ +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class Client +{ + public int ID { get; private set; } + public string Name { get; private set; } = string.Empty; + public string INN { get; private set; } = string.Empty; + public ClientType ClientType { get; private set; } + public static Client CreateEntity(int id, string name, string inn, ClientType clientType) + { + return new Client + { + ID = id, + Name = name, + INN = inn, + ClientType = clientType + }; + } +} + diff --git a/ProjectPublishing/ProjectPublishing/Entities/Contact.cs b/ProjectPublishing/ProjectPublishing/Entities/Contact.cs new file mode 100644 index 0000000..3afc19b --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Contact.cs @@ -0,0 +1,28 @@ +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class Contact +{ + public int ID { get; private set; } + public string Name { get; private set; } = string.Empty; + public string Phone { get; private set; } = string.Empty; + public string Email { get; private set; } = string.Empty; + public int ClientID { get; private set; } + public static Contact CreateEntity(int id, string name, string phone, string email, int clientID) + { + return new Contact + { + ID = id, + Name = name, + Phone = phone, + Email = email, + ClientID = clientID + }; + } +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/Enums/ClientType.cs b/ProjectPublishing/ProjectPublishing/Entities/Enums/ClientType.cs new file mode 100644 index 0000000..0428965 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Enums/ClientType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities.Enums; + +public enum ClientType +{ + None = 0, + Individual = 1, + Organization = 2 +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/Enums/OrderType.cs b/ProjectPublishing/ProjectPublishing/Entities/Enums/OrderType.cs new file mode 100644 index 0000000..ba9ceeb --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Enums/OrderType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities.Enums; +[Flags] +public enum OrderType +{ + None = 0, + Book = 1, + Brochure = 2, + Booklet = 4, + Newsletter = 8 +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/Enums/ProductType.cs b/ProjectPublishing/ProjectPublishing/Entities/Enums/ProductType.cs new file mode 100644 index 0000000..2240860 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Enums/ProductType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities.Enums; +[Flags] +public enum ProductType +{ + None = 0, + Book = 1, + Brochure = 2, + Booklet = 4, + Newsletter = 8 +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/Order.cs b/ProjectPublishing/ProjectPublishing/Entities/Order.cs new file mode 100644 index 0000000..e33d67a --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Order.cs @@ -0,0 +1,28 @@ +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class Order +{ + public int ID { get; private set; } + public int ClientID { get; private set; } + public DateTime OrderDate { get; private set; } + public IEnumerable OrderProduct { get; private set; } = []; + public string Description { get; private set; } = string.Empty; + public static Order CreateOperation(int id, int clientID, IEnumerable orderProducts, string description) + { + return new Order + { + ID = id, + ClientID = clientID, + OrderDate = DateTime.Now, + OrderProduct = orderProducts, + Description = description + }; + } +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/OrderProduct.cs b/ProjectPublishing/ProjectPublishing/Entities/OrderProduct.cs new file mode 100644 index 0000000..6506757 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/OrderProduct.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class OrderProduct +{ + public int ID { get; private set; } + public int OrderID { get; private set; } + public int ProductID { get; private set; } + public int Count { get; private set; } + public static OrderProduct CreateElement(int id, int productId, int count) + { + return new OrderProduct + { + ID = id, + ProductID = productId, + Count = count + }; + } +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/PrintingHouse.cs b/ProjectPublishing/ProjectPublishing/Entities/PrintingHouse.cs new file mode 100644 index 0000000..2849dd7 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/PrintingHouse.cs @@ -0,0 +1,28 @@ +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class PrintingHouse +{ + public int ID { get; private set; } + public string Name { get; private set; } = string.Empty; + public string Description { get; private set; } = string.Empty; + public string Phone { get; private set; } = string.Empty; + public int OrderID { get; private set; } + public static PrintingHouse CreateOperation(int id, string name, string description, string phone, int orderID) + { + return new PrintingHouse + { + ID = id, + Name = name, + Description = description, + Phone = phone, + OrderID = orderID + }; + } +} diff --git a/ProjectPublishing/ProjectPublishing/Entities/Product.cs b/ProjectPublishing/ProjectPublishing/Entities/Product.cs new file mode 100644 index 0000000..cd02f94 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Entities/Product.cs @@ -0,0 +1,24 @@ +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Entities; + +public class Product +{ + public int ID { get; private set; } + public string Description; + public ProductType ProductType { get; private set; } + public static Product CreateEntity(int id, ProductType productType, string description) + { + return new Product + { + ID = id, + Description = description, + ProductType = productType, + }; + } +} diff --git a/ProjectPublishing/ProjectPublishing/Form1.Designer.cs b/ProjectPublishing/ProjectPublishing/Form1.Designer.cs deleted file mode 100644 index 3752acd..0000000 --- a/ProjectPublishing/ProjectPublishing/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectPublishing -{ - 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/ProjectPublishing/ProjectPublishing/Form1.cs b/ProjectPublishing/ProjectPublishing/Form1.cs deleted file mode 100644 index a88ef72..0000000 --- a/ProjectPublishing/ProjectPublishing/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectPublishing -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectPublishing/ProjectPublishing/FormPublishing.Designer.cs b/ProjectPublishing/ProjectPublishing/FormPublishing.Designer.cs new file mode 100644 index 0000000..55ed7b9 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/FormPublishing.Designer.cs @@ -0,0 +1,136 @@ +namespace ProjectPublishing +{ + partial class FormPublishing + { + /// + /// 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() + { + menuStrip1 = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + заказчикиToolStripMenuItem = new ToolStripMenuItem(); + контактыToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + заказыToolStripMenuItem = new ToolStripMenuItem(); + отчётыToolStripMenuItem = new ToolStripMenuItem(); + типографииToolStripMenuItem = new ToolStripMenuItem(); + продуктыToolStripMenuItem1 = new ToolStripMenuItem(); + menuStrip1.SuspendLayout(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчётыToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(678, 24); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { заказчикиToolStripMenuItem, контактыToolStripMenuItem, продуктыToolStripMenuItem1 }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(94, 20); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // заказчикиToolStripMenuItem + // + заказчикиToolStripMenuItem.Name = "заказчикиToolStripMenuItem"; + заказчикиToolStripMenuItem.Size = new Size(180, 22); + заказчикиToolStripMenuItem.Text = "Заказчики"; + заказчикиToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; + // + // контактыToolStripMenuItem + // + контактыToolStripMenuItem.Name = "контактыToolStripMenuItem"; + контактыToolStripMenuItem.Size = new Size(180, 22); + контактыToolStripMenuItem.Text = "Контакты"; + контактыToolStripMenuItem.Click += ContactsToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { заказыToolStripMenuItem, типографииToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(75, 20); + операцииToolStripMenuItem.Text = "Операции"; + // + // заказыToolStripMenuItem + // + заказыToolStripMenuItem.Name = "заказыToolStripMenuItem"; + заказыToolStripMenuItem.Size = new Size(180, 22); + заказыToolStripMenuItem.Text = "Заказы"; + заказыToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; + // + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(60, 20); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // типографииToolStripMenuItem + // + типографииToolStripMenuItem.Name = "типографииToolStripMenuItem"; + типографииToolStripMenuItem.Size = new Size(180, 22); + типографииToolStripMenuItem.Text = "Типографии"; + типографииToolStripMenuItem.Click += PrintingHousesToolStripMenuItem_Click; + // + // продуктыToolStripMenuItem1 + // + продуктыToolStripMenuItem1.Name = "продуктыToolStripMenuItem1"; + продуктыToolStripMenuItem1.Size = new Size(180, 22); + продуктыToolStripMenuItem1.Text = "Продукты"; + продуктыToolStripMenuItem1.Click += ProductsToolStripMenuItem_Click; + // + // FormPublishing + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.PrintingHouse; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(678, 374); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "FormPublishing"; + Text = "Form1"; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStrip1; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem заказчикиToolStripMenuItem; + private ToolStripMenuItem контактыToolStripMenuItem; + private ToolStripMenuItem операцииToolStripMenuItem; + private ToolStripMenuItem отчётыToolStripMenuItem; + private ToolStripMenuItem заказыToolStripMenuItem; + private ToolStripMenuItem продуктыToolStripMenuItem1; + private ToolStripMenuItem типографииToolStripMenuItem; + } +} diff --git a/ProjectPublishing/ProjectPublishing/FormPublishing.cs b/ProjectPublishing/ProjectPublishing/FormPublishing.cs new file mode 100644 index 0000000..68d83a9 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/FormPublishing.cs @@ -0,0 +1,78 @@ +using ProjectPublishing.Forms; +using Unity; + +namespace ProjectPublishing +{ + public partial class FormPublishing : Form + { + private readonly IUnityContainer _container; + public FormPublishing(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + private void ClientsToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ContactsToolStripMenuItem_Click(object sender, EventArgs + e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ProductsToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void PrintingHousesToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void OrdersToolStripMenuItem_Click(object sender,EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/ProjectPublishing/ProjectPublishing/FormPublishing.resx b/ProjectPublishing/ProjectPublishing/FormPublishing.resx new file mode 100644 index 0000000..a0623c8 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/FormPublishing.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/ProjectPublishing/ProjectPublishing/Forms/FormClient.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormClient.Designer.cs new file mode 100644 index 0000000..6086596 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClient.Designer.cs @@ -0,0 +1,142 @@ +namespace ProjectPublishing.Forms +{ + partial class FormClient + { + /// + /// 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() + { + labelOrderName = new Label(); + labelClientINN = new Label(); + labelClientType = new Label(); + textBoxClientName = new TextBox(); + textBoxClientINN = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + comboBoxClientType = new ComboBox(); + SuspendLayout(); + // + // labelOrderName + // + labelOrderName.AutoSize = true; + labelOrderName.Location = new Point(44, 45); + labelOrderName.Name = "labelOrderName"; + labelOrderName.Size = new Size(88, 15); + labelOrderName.TabIndex = 0; + labelOrderName.Text = "Имя заказчика"; + // + // labelClientINN + // + labelClientINN.AutoSize = true; + labelClientINN.Location = new Point(44, 94); + labelClientINN.Name = "labelClientINN"; + labelClientINN.Size = new Size(34, 15); + labelClientINN.TabIndex = 1; + labelClientINN.Text = "ИНН"; + // + // labelClientType + // + labelClientType.AutoSize = true; + labelClientType.Location = new Point(44, 142); + labelClientType.Name = "labelClientType"; + labelClientType.Size = new Size(84, 15); + labelClientType.TabIndex = 2; + labelClientType.Text = "Тип заказчика"; + // + // textBoxClientName + // + textBoxClientName.Location = new Point(138, 42); + textBoxClientName.Name = "textBoxClientName"; + textBoxClientName.Size = new Size(217, 23); + textBoxClientName.TabIndex = 3; + // + // textBoxClientINN + // + textBoxClientINN.Location = new Point(138, 91); + textBoxClientINN.Name = "textBoxClientINN"; + textBoxClientINN.Size = new Size(217, 23); + textBoxClientINN.TabIndex = 4; + // + // buttonSave + // + buttonSave.Location = new Point(57, 219); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(250, 219); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // comboBoxClientType + // + comboBoxClientType.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxClientType.FormattingEnabled = true; + comboBoxClientType.Location = new Point(138, 139); + comboBoxClientType.Name = "comboBoxClientType"; + comboBoxClientType.Size = new Size(217, 23); + comboBoxClientType.TabIndex = 8; + // + // FormClient + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(439, 289); + Controls.Add(comboBoxClientType); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxClientINN); + Controls.Add(textBoxClientName); + Controls.Add(labelClientType); + Controls.Add(labelClientINN); + Controls.Add(labelOrderName); + Name = "FormClient"; + StartPosition = FormStartPosition.CenterParent; + Text = "Заказчик"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelOrderName; + private Label labelClientINN; + private Label labelClientType; + private TextBox textBoxClientName; + private TextBox textBoxClientINN; + private Button buttonSave; + private Button buttonCancel; + private ComboBox comboBoxClientType; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormClient.cs b/ProjectPublishing/ProjectPublishing/Forms/FormClient.cs new file mode 100644 index 0000000..e18bb37 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClient.cs @@ -0,0 +1,78 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectPublishing.Forms +{ + public partial class FormClient : Form + { + private readonly IClientRepository _clientRepository; + private int? _clientId; + public int Id + { + set + { + try + { + var client = _clientRepository.ReadClientById(value); + if (client == null) + { + throw new InvalidDataException(nameof(client)); + } + textBoxClientName.Text = client.Name; + textBoxClientINN.Text = client.INN; + + _clientId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormClient(IClientRepository clientRepository) + { + InitializeComponent(); + comboBoxClientType.DataSource = Enum.GetValues(typeof(ClientType)); + _clientRepository = clientRepository ?? + throw new ArgumentNullException(nameof(clientRepository)); + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxClientName.Text) || string.IsNullOrWhiteSpace(textBoxClientINN.Text) || + string.IsNullOrWhiteSpace(comboBoxClientType.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_clientId.HasValue) + { + _clientRepository.UpdateClient(CreateClient(_clientId.Value)); + } + else + { + _clientRepository.CreateClient(CreateClient(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + private Client CreateClient(int id) => Client.CreateEntity(id, textBoxClientName.Text, textBoxClientINN.Text, (ClientType)comboBoxClientType.SelectedItem!); + } +} diff --git a/ProjectPublishing/ProjectPublishing/Form1.resx b/ProjectPublishing/ProjectPublishing/Forms/FormClient.resx similarity index 93% rename from ProjectPublishing/ProjectPublishing/Form1.resx rename to ProjectPublishing/ProjectPublishing/Forms/FormClient.resx index 1af7de1..af32865 100644 --- a/ProjectPublishing/ProjectPublishing/Form1.resx +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClient.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormClients.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormClients.Designer.cs new file mode 100644 index 0000000..9db9cc2 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClients.Designer.cs @@ -0,0 +1,127 @@ +namespace ProjectPublishing.Forms +{ + partial class FormClients + { + /// + /// 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(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonUpd); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(583, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(133, 378); + panel1.TabIndex = 0; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(36, 154); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(65, 65); + buttonDel.TabIndex = 2; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackColor = SystemColors.Window; + buttonUpd.BackgroundImage = Properties.Resources.Edit; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(36, 83); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(65, 65); + buttonUpd.TabIndex = 1; + buttonUpd.UseVisualStyleBackColor = false; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(36, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(583, 378); + dataGridView.TabIndex = 1; + // + // FormClients + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(716, 378); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormClients"; + StartPosition = FormStartPosition.CenterParent; + Text = "Заказчики"; + Load += FormClients_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormClients.cs b/ProjectPublishing/ProjectPublishing/Forms/FormClients.cs new file mode 100644 index 0000000..f69d2bf --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClients.cs @@ -0,0 +1,112 @@ +using ProjectPublishing.Repositories; +using ProjectPublishing.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectPublishing.Forms +{ + public partial class FormClients : Form + { + private readonly IUnityContainer _container; + private readonly IClientRepository _clientRepository; + public FormClients(IUnityContainer container, IClientRepository clientRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _clientRepository = clientRepository ?? + throw new + ArgumentNullException(nameof(clientRepository)); + } + private void FormClients_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 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 ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _clientRepository.DeleteClient(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridView.DataSource = _clientRepository.ReadClients(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormClients.resx b/ProjectPublishing/ProjectPublishing/Forms/FormClients.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormClients.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/ProjectPublishing/ProjectPublishing/Forms/FormContact.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormContact.Designer.cs new file mode 100644 index 0000000..3d122f5 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContact.Designer.cs @@ -0,0 +1,162 @@ +namespace ProjectPublishing.Forms +{ + partial class FormContact + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + textBoxName = new TextBox(); + labelName = new Label(); + labelPhone = new Label(); + label3 = new Label(); + label4 = new Label(); + textBoxPhone = new TextBox(); + textBoxEmail = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + comboBoxClient = new ComboBox(); + SuspendLayout(); + // + // textBoxName + // + textBoxName.Location = new Point(157, 40); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(140, 23); + textBoxName.TabIndex = 0; + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(41, 48); + labelName.Name = "labelName"; + labelName.Size = new Size(31, 15); + labelName.TabIndex = 1; + labelName.Text = "Имя"; + // + // labelPhone + // + labelPhone.AutoSize = true; + labelPhone.Location = new Point(41, 88); + labelPhone.Name = "labelPhone"; + labelPhone.Size = new Size(55, 15); + labelPhone.TabIndex = 2; + labelPhone.Text = "Телефон"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(41, 131); + label3.Name = "label3"; + label3.Size = new Size(41, 15); + label3.TabIndex = 3; + label3.Text = "Почта"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(41, 176); + label4.Name = "label4"; + label4.Size = new Size(57, 15); + label4.TabIndex = 4; + label4.Text = "Заказчик"; + // + // textBoxPhone + // + textBoxPhone.Location = new Point(157, 85); + textBoxPhone.Name = "textBoxPhone"; + textBoxPhone.Size = new Size(140, 23); + textBoxPhone.TabIndex = 5; + // + // textBoxEmail + // + textBoxEmail.Location = new Point(157, 128); + textBoxEmail.Name = "textBoxEmail"; + textBoxEmail.Size = new Size(140, 23); + textBoxEmail.TabIndex = 7; + // + // buttonSave + // + buttonSave.Location = new Point(41, 239); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 8; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(222, 239); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 9; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // comboBoxClient + // + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(157, 173); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(140, 23); + comboBoxClient.TabIndex = 10; + // + // FormContact + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(431, 294); + Controls.Add(comboBoxClient); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxEmail); + Controls.Add(textBoxPhone); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(labelPhone); + Controls.Add(labelName); + Controls.Add(textBoxName); + Name = "FormContact"; + Text = "FormContact"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxName; + private Label labelName; + private Label labelPhone; + private Label label3; + private Label label4; + private TextBox textBoxPhone; + private TextBox textBoxEmail; + private Button buttonSave; + private Button buttonCancel; + private ComboBox comboBoxClient; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormContact.cs b/ProjectPublishing/ProjectPublishing/Forms/FormContact.cs new file mode 100644 index 0000000..37f48b3 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContact.cs @@ -0,0 +1,81 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectPublishing.Forms +{ + public partial class FormContact : Form + { + private readonly IContactRepository _contactRepository; + private int? _contactId; + public int Id + { + set + { + try + { + var contact = _contactRepository.ReadContactById(value); + if (contact == null) + { + throw new + InvalidDataException(nameof(contact)); + } + textBoxName.Text = contact.Name; + textBoxPhone.Text = contact.Phone; + textBoxEmail.Text = contact.Email; + comboBoxClient.Text = contact.ClientID.ToString(); + _contactId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormContact(IContactRepository contactRepository) + { + InitializeComponent(); + _contactRepository = contactRepository ?? + throw new ArgumentNullException(nameof(contactRepository)); + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) + || + string.IsNullOrWhiteSpace(textBoxPhone.Text) || string.IsNullOrWhiteSpace(textBoxEmail.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_contactId.HasValue) + { + _contactRepository.UpdateContact(CreateContact(_contactId.Value)); + } + else + { + _contactRepository.CreateContact(CreateContact(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => + Close(); + private Contact CreateContact(int id) => Contact.CreateEntity(id, textBoxName.Text, + textBoxPhone.Text, textBoxEmail.Text, Convert.ToInt32(comboBoxClient)); + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormContact.resx b/ProjectPublishing/ProjectPublishing/Forms/FormContact.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContact.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/ProjectPublishing/ProjectPublishing/Forms/FormContacts.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.Designer.cs new file mode 100644 index 0000000..ef7a4ca --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectPublishing.Forms +{ + partial class FormContacts + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + panel1 = new Panel(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(557, 343); + dataGridView.TabIndex = 3; + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonUpd); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(557, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(133, 343); + panel1.TabIndex = 2; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(35, 154); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(65, 65); + buttonDel.TabIndex = 5; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackColor = SystemColors.Window; + buttonUpd.BackgroundImage = Properties.Resources.Edit; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(35, 83); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(65, 65); + buttonUpd.TabIndex = 4; + buttonUpd.UseVisualStyleBackColor = false; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(35, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 3; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // FormContacts + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(690, 343); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormContacts"; + Text = "FormContacts"; + Load += FormContacts_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Panel panel1; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormContacts.cs b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.cs new file mode 100644 index 0000000..e679cab --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.cs @@ -0,0 +1,107 @@ +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectPublishing.Forms +{ + public partial class FormContacts : Form + { + private readonly IUnityContainer _container; + private readonly IContactRepository _contactRepository; + public FormContacts(IUnityContainer container, IContactRepository + contactRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _contactRepository = contactRepository ?? throw new ArgumentNullException(nameof(contactRepository)); + } + private void FormContacts_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 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 ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _contactRepository.DeleteContact(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridView.DataSource = _contactRepository.ReadContacts(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormContacts.resx b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContacts.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/ProjectPublishing/ProjectPublishing/Forms/FormOrder.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.Designer.cs new file mode 100644 index 0000000..43a688a --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.Designer.cs @@ -0,0 +1,171 @@ +namespace ProjectPublishing.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() + { + groupBoxProduct = new GroupBox(); + dataGridViewProducts = new DataGridView(); + ColumnProduct = new DataGridViewComboBoxColumn(); + Column2 = new DataGridViewTextBoxColumn(); + labelClient = new Label(); + comboBoxClient = new ComboBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + textBoxDescription = new TextBox(); + labelDescription = new Label(); + groupBoxProduct.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit(); + SuspendLayout(); + // + // groupBoxProduct + // + groupBoxProduct.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBoxProduct.Controls.Add(dataGridViewProducts); + groupBoxProduct.Location = new Point(42, 123); + groupBoxProduct.Name = "groupBoxProduct"; + groupBoxProduct.Size = new Size(277, 253); + groupBoxProduct.TabIndex = 0; + groupBoxProduct.TabStop = false; + groupBoxProduct.Text = "Продукты"; + // + // dataGridViewProducts + // + dataGridViewProducts.AllowUserToResizeColumns = false; + dataGridViewProducts.AllowUserToResizeRows = false; + dataGridViewProducts.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + dataGridViewProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewProducts.Columns.AddRange(new DataGridViewColumn[] { ColumnProduct, Column2 }); + dataGridViewProducts.Location = new Point(6, 22); + dataGridViewProducts.MultiSelect = false; + dataGridViewProducts.Name = "dataGridViewProducts"; + dataGridViewProducts.RowHeadersVisible = false; + dataGridViewProducts.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewProducts.Size = new Size(265, 225); + dataGridViewProducts.TabIndex = 0; + // + // ColumnProduct + // + ColumnProduct.HeaderText = "Продукт"; + ColumnProduct.Name = "ColumnProduct"; + // + // Column2 + // + Column2.HeaderText = "Количество"; + Column2.Name = "Column2"; + // + // labelClient + // + labelClient.AutoSize = true; + labelClient.Location = new Point(48, 30); + labelClient.Name = "labelClient"; + labelClient.Size = new Size(57, 15); + labelClient.TabIndex = 1; + labelClient.Text = "Заказчик"; + // + // comboBoxClient + // + comboBoxClient.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(144, 27); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(121, 23); + comboBoxClient.TabIndex = 2; + // + // buttonSave + // + buttonSave.Location = new Point(42, 391); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 3; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.Location = new Point(244, 391); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 4; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // textBoxDescription + // + textBoxDescription.Location = new Point(144, 82); + textBoxDescription.Name = "textBoxDescription"; + textBoxDescription.Size = new Size(121, 23); + textBoxDescription.TabIndex = 5; + // + // labelDescription + // + labelDescription.AutoSize = true; + labelDescription.Location = new Point(48, 85); + labelDescription.Name = "labelDescription"; + labelDescription.Size = new Size(62, 15); + labelDescription.TabIndex = 6; + labelDescription.Text = "Описание"; + // + // FormOrder + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(359, 426); + Controls.Add(labelDescription); + Controls.Add(textBoxDescription); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(comboBoxClient); + Controls.Add(labelClient); + Controls.Add(groupBoxProduct); + Name = "FormOrder"; + Text = "FormOrder"; + groupBoxProduct.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private Label label2; + private Button buttonSave; + private CheckedListBox checkedListBoxOrderType; + private GroupBox groupBoxProduct; + private Label labelClient; + private ComboBox comboBoxClient; + private DataGridView dataGridViewProducts; + private Button buttonCancel; + private DataGridViewComboBoxColumn ColumnProduct; + private DataGridViewTextBoxColumn Column2; + private TextBox textBoxDescription; + private Label labelDescription; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormOrder.cs b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.cs new file mode 100644 index 0000000..e92eb96 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.cs @@ -0,0 +1,71 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectPublishing.Forms +{ + public partial class FormOrder : Form + { + private readonly IOrderRepository _orderRepository; + public FormOrder(IOrderRepository orderRepository, IClientRepository clientRepository, IProductRepository productRepository) + { + InitializeComponent(); + + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + + comboBoxClient.DataSource = clientRepository.ReadClients(); + comboBoxClient.DisplayMember = "Client"; + comboBoxClient.ValueMember = "Id"; + + ColumnProduct.DataSource = productRepository.ReadProducts(); + ColumnProduct.DisplayMember = "ProductType"; + ColumnProduct.ValueMember = "Id"; + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewProducts.RowCount < 1 || comboBoxClient.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _orderRepository.CreateOrder(Order.CreateOperation(0,(int)comboBoxClient.SelectedValue!, + CreateListFeedFeedReplenishmentsFromDataGrid(), textBoxDescription.Text)); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + private List + CreateListFeedFeedReplenishmentsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewProducts.Rows) + { + if (row.Cells["ColumnFeed"].Value == null || + row.Cells["ColumnCount"].Value == null) + { + continue; + } + list.Add(OrderProduct.CreateElement(0, Convert.ToInt32(row.Cells["ColumnProduct"].Value), + Convert.ToInt32(row.Cells["ColumnCount"].Value))); + } + return list; + } + + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormOrder.resx b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.resx new file mode 100644 index 0000000..1fe7d22 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrder.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/ProjectPublishing/ProjectPublishing/Forms/FormOrders.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.Designer.cs new file mode 100644 index 0000000..7bd9c16 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.Designer.cs @@ -0,0 +1,111 @@ +namespace ProjectPublishing.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() + { + dataGridView = new DataGridView(); + panel1 = new Panel(); + buttonDel = new Button(); + buttonAdd = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(499, 338); + dataGridView.TabIndex = 5; + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(499, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(133, 338); + panel1.TabIndex = 4; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(35, 83); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(65, 65); + buttonDel.TabIndex = 5; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(35, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 3; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // FormOrders + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(632, 338); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormOrders"; + Text = "FormOrders"; + Load += FormOrders_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Panel panel1; + private Button buttonDel; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs new file mode 100644 index 0000000..6049dbd --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs @@ -0,0 +1,91 @@ +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectPublishing.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() => dataGridView.DataSource = _orderRepository.ReadOrders(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + } + } diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormOrders.resx b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.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/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.Designer.cs new file mode 100644 index 0000000..24f7830 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.Designer.cs @@ -0,0 +1,162 @@ +namespace ProjectPublishing.Forms +{ + partial class FormPrintingHouse + { + /// + /// 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() + { + textBoxDescription = new TextBox(); + label5 = new Label(); + textBoxName = new TextBox(); + label4 = new Label(); + buttonCancel = new Button(); + labelOrder = new Label(); + buttonSave = new Button(); + textBoxPhone = new TextBox(); + labelPhone = new Label(); + comboBoxOrder = new ComboBox(); + SuspendLayout(); + // + // textBoxDescription + // + textBoxDescription.Location = new Point(197, 146); + textBoxDescription.Name = "textBoxDescription"; + textBoxDescription.Size = new Size(151, 23); + textBoxDescription.TabIndex = 22; + // + // label5 + // + label5.AutoSize = true; + label5.Location = new Point(39, 149); + label5.Name = "label5"; + label5.Size = new Size(62, 15); + label5.TabIndex = 21; + label5.Text = "Описание"; + // + // textBoxName + // + textBoxName.Location = new Point(197, 92); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(151, 23); + textBoxName.TabIndex = 20; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(39, 95); + label4.Name = "label4"; + label4.Size = new Size(59, 15); + label4.TabIndex = 19; + label4.Text = "Название"; + // + // buttonCancel + // + buttonCancel.Location = new Point(273, 277); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 16; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // labelOrder + // + labelOrder.AutoSize = true; + labelOrder.Location = new Point(39, 39); + labelOrder.Name = "labelOrder"; + labelOrder.Size = new Size(37, 15); + labelOrder.TabIndex = 15; + labelOrder.Text = "Заказ"; + // + // buttonSave + // + buttonSave.Location = new Point(39, 277); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 23; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // textBoxPhone + // + textBoxPhone.Location = new Point(197, 197); + textBoxPhone.Name = "textBoxPhone"; + textBoxPhone.Size = new Size(151, 23); + textBoxPhone.TabIndex = 24; + // + // labelPhone + // + labelPhone.AutoSize = true; + labelPhone.Location = new Point(39, 200); + labelPhone.Name = "labelPhone"; + labelPhone.Size = new Size(55, 15); + labelPhone.TabIndex = 25; + labelPhone.Text = "Телефон"; + // + // comboBoxOrder + // + comboBoxOrder.FormattingEnabled = true; + comboBoxOrder.Location = new Point(197, 36); + comboBoxOrder.Name = "comboBoxOrder"; + comboBoxOrder.Size = new Size(151, 23); + comboBoxOrder.TabIndex = 26; + // + // FormPrintingHouse + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(415, 345); + Controls.Add(comboBoxOrder); + Controls.Add(labelPhone); + Controls.Add(textBoxPhone); + Controls.Add(buttonSave); + Controls.Add(textBoxDescription); + Controls.Add(label5); + Controls.Add(textBoxName); + Controls.Add(label4); + Controls.Add(buttonCancel); + Controls.Add(labelOrder); + Name = "FormPrintingHouse"; + Text = "FormPrintingHouse"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxDescription; + private Label label5; + private TextBox textBoxName; + private Label label4; + private Button buttonCancel; + private Label labelOrder; + private Button buttonSave; + private TextBox textBoxPhone; + private Label labelPhone; + private ComboBox comboBoxOrder; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.cs b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.cs new file mode 100644 index 0000000..11d1081 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.cs @@ -0,0 +1,50 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectPublishing.Forms +{ + public partial class FormPrintingHouse : Form + { + private readonly IPrintingHouseRepository _printingHouseRepository; + public FormPrintingHouse(IPrintingHouseRepository printingHouseRepository, + IOrderRepository orderRepository) + { + InitializeComponent(); + _printingHouseRepository = printingHouseRepository ?? + throw new ArgumentNullException(nameof(printingHouseRepository)); + comboBoxOrder.DataSource = orderRepository.ReadOrders(); + comboBoxOrder.DisplayMember = "Description"; + comboBoxOrder.ValueMember = "Id"; + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxOrder.SelectedIndex < 0 || + string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxPhone.Text.ToString()) + || string.IsNullOrWhiteSpace(textBoxDescription.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + _printingHouseRepository.CreatePrintingHouse(PrintingHouse.CreateOperation(0, textBoxName.Text!, textBoxDescription.Text!, + textBoxPhone.Text!, (int)comboBoxOrder.SelectedValue!)); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.resx b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouse.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/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.Designer.cs new file mode 100644 index 0000000..a1ccd92 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.Designer.cs @@ -0,0 +1,97 @@ +namespace ProjectPublishing.Forms +{ + partial class FormPrintingHouses + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + panel1 = new Panel(); + buttonAdd = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(587, 356); + dataGridView.TabIndex = 7; + // + // panel1 + // + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(587, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(133, 356); + panel1.TabIndex = 6; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(35, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 3; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // FormPrintingHouses + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(720, 356); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormPrintingHouses"; + Text = "FormPrintingHouses"; + Load += FormPrintingHouses_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Panel panel1; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs new file mode 100644 index 0000000..a38dde9 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs @@ -0,0 +1,56 @@ +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectPublishing.Forms +{ + public partial class FormPrintingHouses : Form + { + private readonly IUnityContainer _container; + private readonly IPrintingHouseRepository _printingHouseRepository; + public FormPrintingHouses(IUnityContainer container, + IPrintingHouseRepository printingHouseRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _printingHouseRepository = printingHouseRepository ?? + throw new ArgumentNullException(nameof(printingHouseRepository)); + } + private void FormPrintingHouses_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() => dataGridView.DataSource = + _printingHouseRepository.ReadPrintingHouses(); + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.resx b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.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/ProjectPublishing/ProjectPublishing/Forms/FormProduct.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.Designer.cs new file mode 100644 index 0000000..936d64e --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.Designer.cs @@ -0,0 +1,118 @@ +namespace ProjectPublishing.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() + { + labelProductType = new Label(); + labelDescription = new Label(); + checkedListBoxProductType = new CheckedListBox(); + textBoxDescription = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelProductType + // + labelProductType.AutoSize = true; + labelProductType.Location = new Point(44, 39); + labelProductType.Name = "labelProductType"; + labelProductType.Size = new Size(80, 15); + labelProductType.TabIndex = 0; + labelProductType.Text = "Тип продукта"; + // + // labelDescription + // + labelDescription.AutoSize = true; + labelDescription.Location = new Point(44, 155); + labelDescription.Name = "labelDescription"; + labelDescription.Size = new Size(62, 15); + labelDescription.TabIndex = 1; + labelDescription.Text = "Описание"; + // + // checkedListBoxProductType + // + checkedListBoxProductType.FormattingEnabled = true; + checkedListBoxProductType.Location = new Point(186, 39); + checkedListBoxProductType.Name = "checkedListBoxProductType"; + checkedListBoxProductType.Size = new Size(120, 94); + checkedListBoxProductType.TabIndex = 2; + // + // textBoxDescription + // + textBoxDescription.Location = new Point(186, 152); + textBoxDescription.Name = "textBoxDescription"; + textBoxDescription.Size = new Size(120, 23); + textBoxDescription.TabIndex = 3; + // + // buttonSave + // + buttonSave.Location = new Point(44, 226); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(231, 226); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // FormProduct + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(353, 277); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxDescription); + Controls.Add(checkedListBoxProductType); + Controls.Add(labelDescription); + Controls.Add(labelProductType); + Name = "FormProduct"; + Text = "Продукт"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelProductType; + private Label labelDescription; + private CheckedListBox checkedListBoxProductType; + private TextBox textBoxDescription; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormProduct.cs b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.cs new file mode 100644 index 0000000..2135c3c --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.cs @@ -0,0 +1,95 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectPublishing.Forms +{ + public partial class FormProduct : Form + { + private readonly IProductRepository _productRepository; + private int? _productId; + 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); + } + } + textBoxDescription.Text = product.Description; + _productId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormProduct(IProductRepository productRepository) + { + InitializeComponent(); + _productRepository = productRepository ?? + throw new ArgumentNullException(nameof(productRepository)); + foreach (var elem in Enum.GetValues(typeof(ProductType))) + { + checkedListBoxProductType.Items.Add(elem); + } + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxDescription.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 ButtonCancel_Click(object sender, EventArgs e) => Close(); + private Product CreateProduct(int id) + { + ProductType productType = ProductType.None; + foreach (var elem in checkedListBoxProductType.CheckedItems) + { + productType |= (ProductType)elem; + } + return Product.CreateEntity(id, productType, textBoxDescription.Text); + } + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormProduct.resx b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProduct.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/ProjectPublishing/ProjectPublishing/Forms/FormProducts.Designer.cs b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.Designer.cs new file mode 100644 index 0000000..1b9aaaf --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.Designer.cs @@ -0,0 +1,97 @@ +namespace ProjectPublishing.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() + { + dataGridView = new DataGridView(); + panel1 = new Panel(); + buttonAdd = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(525, 343); + dataGridView.TabIndex = 7; + // + // panel1 + // + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(525, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(133, 343); + panel1.TabIndex = 6; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(35, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 3; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // FormProducts + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(658, 343); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormProducts"; + Text = "FormProducts"; + Load += FormProducts_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Panel panel1; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormProducts.cs b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.cs new file mode 100644 index 0000000..30c46c0 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.cs @@ -0,0 +1,109 @@ +using ProjectPublishing.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectPublishing.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 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 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 LoadList() => dataGridView.DataSource = _productRepository.ReadProducts(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + } +} diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormProducts.resx b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Forms/FormProducts.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/ProjectPublishing/ProjectPublishing/Program.cs b/ProjectPublishing/ProjectPublishing/Program.cs index 10acd16..247a339 100644 --- a/ProjectPublishing/ProjectPublishing/Program.cs +++ b/ProjectPublishing/ProjectPublishing/Program.cs @@ -1,3 +1,7 @@ +using ProjectPublishing.Repositories; +using ProjectPublishing.Repositories.Implementations; +using Unity; + namespace ProjectPublishing { internal static class Program @@ -11,7 +15,17 @@ namespace ProjectPublishing // 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(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + return container; } } } \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/ProjectPublishing.csproj b/ProjectPublishing/ProjectPublishing/ProjectPublishing.csproj index 663fdb8..accbdf0 100644 --- a/ProjectPublishing/ProjectPublishing/ProjectPublishing.csproj +++ b/ProjectPublishing/ProjectPublishing/ProjectPublishing.csproj @@ -8,4 +8,23 @@ enable + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Properties/Resources.Designer.cs b/ProjectPublishing/ProjectPublishing/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b8405ef --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectPublishing.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("ProjectPublishing.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 Del { + get { + object obj = ResourceManager.GetObject("Del", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Edit { + get { + object obj = ResourceManager.GetObject("Edit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap PrintingHouse { + get { + object obj = ResourceManager.GetObject("PrintingHouse", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectPublishing/ProjectPublishing/Properties/Resources.resx b/ProjectPublishing/ProjectPublishing/Properties/Resources.resx new file mode 100644 index 0000000..f53fc3e --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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\PrintingHouse.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 + + + ..\Resources\Del.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IClientRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IClientRepository.cs new file mode 100644 index 0000000..58a0108 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IClientRepository.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectPublishing.Entities; + +namespace ProjectPublishing.Repositories; + +public interface IClientRepository +{ + IEnumerable ReadClients(); + Client ReadClientById(int id); + void CreateClient(Client client); + void UpdateClient(Client client); + void DeleteClient(int id); +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IContactRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IContactRepository.cs new file mode 100644 index 0000000..978cbf5 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IContactRepository.cs @@ -0,0 +1,17 @@ +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories; + +public interface IContactRepository +{ + IEnumerable ReadContacts(); + Contact ReadContactById(int id); + void CreateContact(Contact contact); + void UpdateContact(Contact contact); + void DeleteContact(int id); +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IOrderRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IOrderRepository.cs new file mode 100644 index 0000000..a608a1a --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IOrderRepository.cs @@ -0,0 +1,18 @@ +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories; + +public interface IOrderRepository +{ + IEnumerable ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, + int? clientID = null, int? printingHouseID = null); + Order ReadOrderById(int id); + void CreateOrder(Order order); + void UpdateOrder(Order order); + void DeleteOrder(int id); +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IPrintingHouseRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IPrintingHouseRepository.cs new file mode 100644 index 0000000..1d04006 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IPrintingHouseRepository.cs @@ -0,0 +1,17 @@ +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories; + +public interface IPrintingHouseRepository +{ + IEnumerable ReadPrintingHouses(); + PrintingHouse ReadPrintingHouseById(int id); + void CreatePrintingHouse(PrintingHouse printingHouse); + void UpdatePrintingHouse(PrintingHouse printingHouse); + void DeletePrintingHouse(int id); +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IProductRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IProductRepository.cs new file mode 100644 index 0000000..6f59363 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IProductRepository.cs @@ -0,0 +1,17 @@ +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories; + +public interface IProductRepository +{ + IEnumerable ReadProducts(); + Product ReadProductById(int id); + void CreateProduct(Product product); + void UpdateProduct(Product product); + void DeleteProduct(int id); +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ClientRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ClientRepository.cs new file mode 100644 index 0000000..1c91089 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ClientRepository.cs @@ -0,0 +1,34 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations; +public class ClientRepository : IClientRepository +{ + public void CreateClient(Client client) + { + } + + public void DeleteClient(int id) + { + } + + public Client ReadClientById(int id) + { + return Client.CreateEntity(0, string.Empty, string.Empty, ClientType.None); + } + + public IEnumerable ReadClients() + { + return []; + } + + public void UpdateClient(Client client) + { + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ContactRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ContactRepository.cs new file mode 100644 index 0000000..a3d4e4b --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ContactRepository.cs @@ -0,0 +1,34 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations; + +public class ContactRepository : IContactRepository +{ + public void CreateContact(Contact contact) + { + } + + public void DeleteContact(int id) + { + } + + public Contact ReadContactById(int id) + { + return Contact.CreateEntity(0, string.Empty, string.Empty, string.Empty, 0); + } + + public IEnumerable ReadContacts() + { + return []; + } + + public void UpdateContact(Contact contact) + { + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs new file mode 100644 index 0000000..af3ec41 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs @@ -0,0 +1,35 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations; + +public class OrderRepository : IOrderRepository +{ + public void CreateOrder(Order order) + { + } + + public void DeleteOrder(int id) + { + } + + public Order ReadOrderById(int id) + { + return Order.CreateOperation(0, 0, [], string.Empty); + } + + public IEnumerable ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, + int? clientID = null, int? printingHouseID = null) + { + return []; + } + + public void UpdateOrder(Order order) + { + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/PrintingHouseRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/PrintingHouseRepository.cs new file mode 100644 index 0000000..04a8d52 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/PrintingHouseRepository.cs @@ -0,0 +1,33 @@ +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations; + +public class PrintingHouseRepository : IPrintingHouseRepository +{ + public void CreatePrintingHouse(PrintingHouse printingHouse) + { + } + + public void DeletePrintingHouse(int id) + { + } + + public PrintingHouse ReadPrintingHouseById(int id) + { + return PrintingHouse.CreateOperation(0,string.Empty, string.Empty, string.Empty, 0); + } + + public IEnumerable ReadPrintingHouses() + { + return []; + } + + public void UpdatePrintingHouse(PrintingHouse printingHouse) + { + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ProductRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ProductRepository.cs new file mode 100644 index 0000000..7670172 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/ProductRepository.cs @@ -0,0 +1,34 @@ +using ProjectPublishing.Entities; +using ProjectPublishing.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations; + +public class ProductRepository : IProductRepository +{ + public void CreateProduct(Product product) + { + } + + public void DeleteProduct(int id) + { + } + + public Product ReadProductById(int id) + { + return Product.CreateEntity(0,ProductType.None, string.Empty); + } + + public IEnumerable ReadProducts() + { + return []; + } + + public void UpdateProduct(Product product) + { + } +} diff --git a/ProjectPublishing/ProjectPublishing/Resources/Add.png b/ProjectPublishing/ProjectPublishing/Resources/Add.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8fca31577ce5baeee0926c82d6127d758f9e04 GIT binary patch literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^4?&oN8Ax*GDtQ1Y?*N|=*Z=?j`>YT6`R8ZMws^O- zURJB@UDtX#u6DIq<>Ku!j5I#^=svY@AK_h_2>1}&99oM z|F!bJWksD{-LkkR+Gp+DmY<4!mAWs$et&Db@0(!#&p)%|8DrM(y}S95z@nCe?<5!Z zR!)%nw!wGrh2`1L{6vqhQv2#OKlidL*KXfeOYLqx(+&F37GT=K@zuE_z@EC4XUlBW z>VC0(`c-#!@2bj}{Vw<9qMG1txvkl^9zJf%e^Xm_?vDR zUKe+^QMxv6-^$f9dz?G!9d54FIxoEK*zv>CZ^P!4eN@hSHsk22$0|Ek9IP<2?)%(5 zD>q|nQPmtbzR=Axv-#eq6xGhO47;*%Gw)ilwi`Fw!iwK&6@8k2byeQhx&O5<=Z3Eg z|8U~Eh=>N+5^w0jcejhsbz1qBW(NF5% zzGRQFKl4Ru!~S2c+uy8zEPv~(-H+DyogH!K4;}w{@NcocTi*A}cm9iRaDDGPX}5aT zN0s;4(I(UlQFtufcJb3$W3~FwjlhD?$yE#e#Vsda+`dx$SIIn{@2w)a`9yGgr>M?~?v~YDw1n=YA4X|67Hhjo7@|`LM-*|1HvT z{d0BR%+oyA%l}Mt*QGyvepmOulZd@3Z6_SJHM{GQ*Z)AE=>A{U<-bMve+IMv zF7f}ZBmRH+_Mg}G|Jf`5*{uIFSp5I-^Z$f-{{`&-$Cdq`w&Z_h&;Q(}|7&*qfA{f! z&z%29&;Ad||F7!xf7^k`6_&9K42*`JE{-7;bKc&HE^2ZRaJa~5sMYmD?EC(U4no@N z<2AEp6^C8ep7tZrN)_k~G?0)ods*y0-A~`Q<;*_&f6vv#__e1su7y@c{N<|=DHZgJ zoZdgb@p!J~R}cO0u;cF!nB8EkTX{SEfo595{EA;ZHsQhkMzh{la_lMjxbNWdO}oFe zUSCmO5)dDJOSG_mgZ+`D>3N0w4>^{4pRIeP=(aWglIMom?n9_a4*Y?nf zT_#^y76;F;Z~cj#*f04wmjlKWtxKYTW$&@Q?fhAMbxm-_R{sIe(ee`4sgm zw(4Bt8@_*T==WazQNF+AhM->Zdyex7=cUp73*=U;EkCo_V#%kHRDY19r>mdKI;Vst E0QBV0Qvd(} literal 0 HcmV?d00001 diff --git a/ProjectPublishing/ProjectPublishing/Resources/Edit.png b/ProjectPublishing/ProjectPublishing/Resources/Edit.png new file mode 100644 index 0000000000000000000000000000000000000000..14175b5e6a80d3c271ae8f8a2597f5ce951db2a2 GIT binary patch literal 12138 zcmYjX2{=^W-#=r7BugQLnGi{3iIOlQdy2BO5Tg`HA(Y*WRF>>Qt1Xerk|j$rQxqj6 zp@^|2NsN6MGw-<*zyI6w^tk7IzWa91y>}vym>aL>mEZ*ctT#0=umpeuUUC2)F8F80 z@9QG`!|8p%)S3tW3*tE&0oQ9iO-_0Pz+Z>_Mt+YGqcnb7 z-@5YjrO(m)U2pC_eb;f!-~vi1)%LDyZdt6i>#&VW{5wB1BscPM{(B&9+Su={sn@QhDeabtd2Q;vTYf?N2CwGAs-*c5?Lb^0 zHwVC5`plmz{Q6wCAYeHE-md(k`9BJc1P>;DJZcskBfehUH&1Ix#AYV<%`1=PghAOy z+@WJ=0DeUMeLd5u-aB6}vH8TaWB1955!uPR_m@`F2w}d#wCOx)!8}I*NJm?BCW7;0 zcaZJ4xjSZOZkXTi%^EiDm8u?Vo>1^sJG;dv7y$fSmNId2u*-ijNvEEW$j|@0t+_2d z`fufoZy-**_^k*4D)LohVd<^0{ca*#ACRz#9p=4ar@R`=K7^dk4n+ZQ)4-S6MZGZc z*(S=8A&=YhLa|~fMId`YDjvY(i6xjaoT9;mDgYGHp+Srjr(X^a0*sNAS9A7D!ka^ z2+4yp(5L2MHH2h09{>$6PSxYy^LSo^!uQ!kEYypk?m9sdev$2v1fK(?#P7Zl4W-13 zLq$U-nTRcC+2p5X5R%^r2|8y0Zf8e9DQUaKSz@wS4Jdr_&L|=@gj{mc zCV*^)3vvl)6CAP`3h>f1dSRX<^jQNMr)j|0Na6X#3%!-x!d!cX( zjwbmdms{(ove6_f7=G-UIw~aCc)dUX0K<(vvu`#>ki%aJ5F~o8&@UCl^{*>{Qm$pa z()A0wx?@R5 zYT=niYP60N<&iMZQulzhLJHcg&f#~R1J5lQgJjXe$Oy!lgY#B)NI6V3QF!_i)`CmF zwjsH!$^S-+>6;4NZI1_Nfz=AE} z+*G`}|KvB8^phf4lCdnd~q!nNJj#dI0K|=7B1B+)bna`_z81ROf4gk z%FKN?fKmF!(LSW0zP?fK$v121~83uD2AJ&o{NwaCmS%F_DQ3(yTBcG%aAV0iL*|a8-qA?An(t1 z%HFjOmr@Hg@saj9yoXI-VtkJlH++$Ek_YV=)rp8nOor{YPXeV~1@0u=LcIFWpvHXh z0O~#o4mH>y@$IdMAnxFXo{Ny)Hl9Ov{#Ha2KTQi!WO?zK!$>pYU4kNrp9Z0-wfNH_ z?5+t6iXwh$gEVXLTiC5e83=-0h&ep?eqp3PDU6_4;-?Zw!-LNhM&wW;rvzDdjG-<8 z(pwcF=y~5A?RU7JA9z%l4X7i+un9|aIi|!|cerIKzaDYn6YfBnzj+$G8BVdrq!-3~ zq%2h_)}1n;Bi9$|C1ZhXoG36fV2l*0aYPBT?mQAYGHJ|9%93GDZ(HQqc81}^Z-m#w zYz0x#3(8qfWHTCQap$x-c;|RfM||qY>kT)fL}B1PIfaK>Q522=YG_t8FoQJe9A3-@ z;JAi1aiG_j^lqVEO$@a!*cudFUzo=h%2K=-PKt4)2Rbs~gg#?qe7O*wK}a0nY54F6 zMKY|z>G_MJ>R8r_F`xyr7Ce_>DozG-3bJlIR^iYN76wJp3%L!QkS8@|l4tUd5TIxc zq@$=tfaXECCQC_T&7nvOE+11N#s1XKJaE=ea?pG!vpiU4kC`JUY+g-chLo2EM+9*q zKoaRhb0MO@Ssl3c3Sf6;vmi0w%;`!~4u^_RM0irQj^HEa!a$F-697zmIt-ZQL$p@i=U1H6fk( zSS8_Kw`7>~_&T0D5=rv>a=!AVxlKY8D*!BgcQD^jqcB=ix!t+w2y&pAwiE@9+U)}b z@Guq(OvD))0U{QaEg$eVi=e<<^Z7#?Dk(gIY$0RXeZ_p{d$~^Vlrk-R1Acq#J3{(K zVvDf;ep%A-r6sq(g?qo&dAxS{iyIJ-C)EkDuGwDX6eN-j6J~;DH)XK``?t~{q(Cxw zy>NjzK(L;U0q(Pn;m%fFdnSEptPhwYAhLfSQT8XCLDMa%kD9!E8tqtdbr?&qw!fIH z`b^>R6)J8Ih{q&k_q0>vE7l9*IV##)GDb%p-yM1E;-IiRc}PlWo!1tgY>Y>BnC}qB z=cG-_OVdf@t(O^FUE6gP#ZvhBUg>PqYAf6eho(elQRdK1UWa#C_(09LI)E8G zh&MNY%;SUYOs*>%Sl^xoM+54bQz-CRe%I3GuZI~<+ERVxmJI+DsUsU^?2W<;@DA*F znK9&XWCJbk@>YsP<6A8>pj@kHp=QVpVg`db7~am)@HR>Ezx^vFBvi>Qsm$Xrk7*-rbmV3RZIBK(0=hC`w zgNc^g;_gI0AuK7?6AIh`b&LXEBeRk>WdinCTDT%}1gyeS&d-sp1C#aLn(?Com&mwV^U zJjeA%n&%t&00leX5#Pd|nI#5{txyg>ZSOV#WFw%{h`qrJH`sTKs!nJ21{d6jLnyR5 z_1GI6aDy$QtMfFnam25VnjupMNAn5WO|(=ofX@^nhQUcCChK^*{_ixk%au)b0wF^t zxTcLH%T3z0v&q8+o|Oz3>$k&66HQ8;5hKFf2}6?_4j>x_1Ins^bYKgU>m(e*Q#>Zy zm>bYw8z1xm4yzrpB+fxL0TvR#8T^IEL=z!s&>8R$q!A-;2*n>j6vw;OQLzKWr!sM* z+iZzHWSCq+tQ#ViIkVXshc?jmMl2}jo5*5^7tHto);EHzS4R#u6hn#EArY-Sz*sNC zeAqb6)4(>NVLhT@!a>>?f0OO-E?5%)({^ zM$*VMkEbwueG6H)4G!{nvMun7WUoiscswQ9csQ~y8LZ`*#3C+D!mLCrxU>xOOv zFewoWuLjR>`u&p^iqQ8odU5)RBK&Z2LjBAJh_mHu8nV}>-kg3CY+RqcJ_wJoY<-$~ z?6n!>mqzfjv535B*+`-IFm^<&kPxQhUPqH2up@F8CPj$F`0dOI8)y5!tji-&!?Co) zQI{EoA)fYK^#|c0&qN$Cb(8UaS!_5vR!`Z%^%LEU+82Yw%93r%I}IvN0~{(aUA#ze zm1`W3H3n8X^ScI}up9U)v(yzINXbxbfbxv3X3F$A1e@vedrVOPOCU$|vt}w+R zOj`e##3GPImk|=TIk8CgVg-pp7Adf-5rnNslpX##v1kMlT|wB+|6D=XRb$T1!kide zk2#(#K#*w42l_OTkd%inVCn%dU>t^m1z8(afTJ|qW_^am8$fbpn=C*}--HIv|17Q} z>hXa)|MUs63{~0f4kM$_NUZ}T#T5pRb&%m-9P7xJAj67gR;&uUw_)@IXcJ;+aO0o1 zf~*1vz;6BrNI+m!MH&P&R{?Pd{0oU7%K!pmD}V(b1XgtzsDk*wRRBH#Rj%r=Rsr#L ztH62)tm?3a9Q#)RDG03UI0QL1uK+DjN9C%HL#m*UJriIAU1Cw7a3wm_wOpY3UjhV) zE@EJkJqKWP9-aY|RTaJn!%B3h>ljYm^HSaqz*&0gfLbV&HZ+_jS$GD|g47 z`oy@v16lTF1ld;%ct#=3G`@xD0L6;0WHRs;3MjA(TY6vuJ{GC5J9bWx2p=)y6<3Hx zIM9IIX~e(?qC0eN?J58pD{n;w@h=3nuL7`=^N`+Tb3jq-W`cf?z%)hv#{q$DD;%4k zj>uJx(@+%8Dgbrpta9|LfX^FO0jR@%6*#R5K8vgZP>0ki&<_Ej72rMv;Ja6x_25E- zODp=wihN)Pd-TER{8Rx&t47_ggE#C|22nJaMkY3NiR{V;9$Z@q=TBAO$+4nApAUTc z*FA#7YIxr?t)t2zWm_-F2Ly??V9VEG6i%~mr%3YhnbU8$RT88HAg zAv2;5W9A6N*ux1jl!l@l|BV%WMyos*>EBclpc!*RhL!TbNSy(~k}FbM*KpxOS0&j) zKzJ1hOB_RE{adFu5%TbL)D4K4#&H!KM^un4MZ>+33*CB1xtIWS27V<7ao1G<@2cY_ zg6ItJAD{}n*wY%}K%ueqtH5m);I&$LCPHW|JafV^Dm@T)8*EHFAC=RNrbL)NbSh7OT;c zJ`MaxD|Srsp(&~>xvYhfR*e;~P(|Jnu#=C|eh)nVV~|8+omP@&%&!8}R>lKyh!c&K zT?JwxusTPF_|VvMs{p?$u>6lh7>&F!U{5n+Xu0Ko98kyURRE;|Hmq_8LmgXIflvsn zatQOGGmKXOlqv}L4-iIYn5_b#s-WsWKoXsyzXF7#_(=S#(J@j1U90-U-h%V!mGU{w zhjv`M%Am(bGW?H06^O1%6?+fvaIZ2*qWk1l7+|q_ujVMe4rs0x4&^c*5F#eAt6npd zj#`z|C!E6#R^){G-<1NZazxL1!M^&}CMRxJ{>R{Gn#1)U!^=D3|1oqqpZSmBmr4Ks zq{fN_{0}&I`hP%y$p2LQGVSNW(*`inc{aU|e)gSi+V$+2s!UVtT;7X|CNcd&8cV5W zkE3jdGdB|LzFMnzpBT=&oSZ8!Y<}n&t1o)HQ|R`MVZ6@GmY;3MezEe-BIEiQS?~dQ zNxvWtHFPqQ3vWJ1u(IyTbEa<52+vi2rDi!^s@qf`+5YF3gvPT*tEJ}0qx!$8C5B<$ zapxUJir(gRnn>7A&C{iED zJsAQ@PyZYne7C8)-C~`_s|zM&t!?d+Cm(Iwwslfxs!+X*phTvX-Yl;%KU%6bJz>EZ z?{8<~w|ngeT5&}6%wy+LvqDvycBLN;Hq2ObML#XnJY4d~O*nbcO2@O6bJjFJV8%`& z;BS!P$Dh1B@F0`U2>m+b1$GFsPAY!Occ!8=QVu^=?fUxZqprrWnDfpd;2 zICAbxYV$&U{?lmIp#j2uc80zVdjRc{r=iK*wgAbQ=2RzKrHC;M2 z$6cI!KNn;*-Cz3ZJCiXr=P(=3QC9l9-&lR75SRPdNCAdugn?3+@?MjnMe~Ml9)uOY zGSi9A_?ds45_3cu^H3LKNI)|w9VKX>%}Vz*CM>sgEv>W5cBCqjjbM8A5h-~LK47TL zB5=03EN>q7BiQr4d_B_=LEeXOrrzp=?owYI%YVOTc&PfkzN=SZ2eapBllBrkGVqlz zq8u9PMM%!mXM|X1T=^g7jZkZBXM5In8tWb7$P1Wjs>4j`>vG{K!>qS=#Zvh%m~$Sn1uNLg#`INT^4klI znswud{z$+&r!D^+BDWQ*5!IY>}F!~*AObL1PU1cp<1 z$8imM!CHskM^&o(1SV5hXwp1O`6hfz+3nw7l$EaipeZzd*RCaW&Gce@{;z(!<9Rk+ z&$RhOc07N$Q2*A%mX&LDVH|U4{)mYPj*jk~-v9h4U4|ZFw4)$t!OT)A-l4)BuZQ#H z8WN##d%c;iFxph9iwaQj&n{W0ztD)5VkX;8aUZCv_#-eBS&qg=W#MYz5GC@Xmpmhv};!N^9^(5CFP+?B_mR59JQpSW;>^=GkXKn2z>Aqhu=lt4=R?GiHXs~i!B!XPfLHEFD3}X(;D90e;>#q zGN;rGTh|n{gz{$#vA(?|Y#y@b&@o_yo|^UoPjr{}nA&vK>#UPs{@P zMt={8kp5Qcz}xH{%)cYEdoO+TU5c5J@a;<8K2DD*v~Y|s8h?7yywjMnAs{#@-Mwj! zJIbNS25j<6!en?dHUn+eMEMTor52ZwSE=-cqMh)K4f@7VJ2kttcJI7dz_T%LM-tO(nZhjm~Co>T%>#Yn+^^*IR+2?E@lP2r@p<!t23>pP7_$+xog=cArYP zMe4G}OV+h5oyObbpf%2ZyTR9c!*jUwg{x3xc&E+6lfLVhzhhM1rK2)PjjWo%$!RDk*O5U!l}xR0%^2>~vV3IMq9#Y?_}aTyV!LI2yi{Ai0L{k>GL3+97Q^-D2=T z)tKy%Knoo`>4@}d)xj?omAc_4{R5hbx>kixs&o(hoqT`;{whE?S$S$eQgoOG^}O$x zf2Dh%0LG7U>qmI`yKa_N!bl_2`*7TK-lhBSlLrnutC`S-5;Q!D9hKVE;%M2cyp+B} zte{f&+B|fuPtLs%X#XqOQSs-BZ_lxk%8Z=tF>l=9=u#0VM`s96&5=)TKf~CXSGnCQ znA1au2-bNrBuITS-^`MrF-OZZ;tOw^U@dn00Das8_%b>E!cauTYd% ztj8_zm5!^kI2vojK$S+Kj#wLpG_%gm>djBM^h?4}{fbT+F@F^9PE5}Fb!ro}n^Or# z#~8Exn=$xY$>pXGP{jLFjIA0mI5ccNVDGsb$n0X}zWs8Jwefl)M`ySvsgVh)Qt2RK zkH_DnnUv>bkA9KmW8`<7hfTSt>mnc;5Wg%!`d!yzD)EuABzpH93~sW^czZem-ChPf zeoWlajzMM9VOKjeX#s6Q3WKw@nnkqyq&q@P{CGP7Me$~W#H3N!R5ecd!VJF@YDv)! z+z7Flsk%9xs{x`LZjXzQI(Fce6=1b1{Ki=`P>8*28)srj%=!70;Gk0FFPmGQkBP{Z z$b0A2}+B$i+Q`p0@}niUVCL{ zk~E6cVU-c+CVB+4ph>U`F&5hYCH_0u)^f;UU(X+08vTXslcn<6G3KRZ+wYxUTAmk- z?sU7L0@ zx3_A$-}2-c`P663A1y;hs%NPmMyUzZ zHl6!B%-zO4g^1N|8)*bvx2h9JBpdMZ=~>0DgRjTZza6JPG!LeRe_D9 z9Eo@Ir4abGPp5YOE$?+$8h3o=AudYjs7k^TOQ7?>^0If>;&@@f=bbJ5qn`O0>1Yc^ z_uiu1zl%JPSSCbudRC5QMPI zhe}eP=BM@QFeKSL>Ke}qhbo!ziPoUYJla*|PuF#Roi!WrDSBrCKc99ZzXdq#ntiWi zZ@4V8XKj6BWv~Dk5TIm!<));KPTl{)lz!o?^!fPJnbFoBo7czol-&i890RjeKI=8aBsVVOGTO`ovR1f@-TqnbPEw1&|`gTcf0QA}- zTMO`aTq7Ks9xHe2ZY^g1q77Hk!)x!k2Ta{l9iYC-)S(Bk?UsdN$CHMS=g?>O3mJYv z?A{22Q$Md2GIC-dJ(}4=_h%FC&Rb8i^QfAC7@ng)QSb^=ux9bu#Ll){@~cDPr>YYK zX%^;J3R?>Q`k7v7+7yWc)a+xFM^=j_wuJp_sX9m6709Yj3;%wc)HxeLEdJ<}rk!3A z@%x@K7w*NFS7$vSB|Y8)=FD$y%9$-oQtRRIX=~G8e3qNysy5!T3CsL&D|TU7kpweT zZz&GSseY`6myuJWu0iAK+BJnwS#!Uhr0sj~Ww&S@ZmSiOAIXS!9v|th(Q;K)Z8xjx zvZwsl^q|1XzddRh+djCYL=v?=mRMTPPrpu&#E~RThLu0-@9tmvvQXvfX7pveW&Q7) z&^ezC7Hi>WExz$fCek%r@vt)@t+^=8d6Q+XK|RldTnIMAnFTMYJAeCYH$)PvxO_WL zVfuyZF!)$GU9jg;^+Zfy?m>DGacX$dq{axV$rZ`TNGk+5BLs>W=6Imq*pq^f49`$iGz=%vq%NrpB_C=7 zH7dnP;mI4#-Zc9KFoz@q2Pv>blJm5yZc;;dYZJ|Ev zm>F>~|7P0$fjPs`9L~Y-%i)I^C}C?Ev?DStSSGKBMiff6o}HR>I4s?@d!kT7Vtp`U zEHk!Qbc)}EWgs5Rr$XaC;uvYLGZDbbYJXd%*oe- zCa&s{wF}NK8ky_pT`6mW{a=*x8F_H|HsvhN!tRm{kOqUuG}zX+OdLNoM`(DT>s)r_ zZCuM!#Rs9UN7o}A5TC|PIkD5vVgonLR2ez+KFYMvwmllwiIyuY-usYc4Fx$tLEQ?C zV@aA3$^r0`;>9zzEQCN=(v0c85emsjW2!9=ybs)^t1cz_lWQS+0JF51Vj6s7@7jaM zT(!U30Vw5BfCSjM`%Sy4R9#v2pt4k8E`>Gw&}3uDjgVW{FP7ybZ3eJ)PwOPRQmy?? zTXJ8{OR`(m(y)3qN+!CfBo|&X&yz3v{o%PHR9I2KQtJt-{W;t%|1np=Uu;uVWqYBO z#YEcYut2}<87_?*tB_j3&!ZiQCp+8k(L=_%;W1Zvs4zXk+HH6Vr#!+n_cf3yQHKF? zvnt@d^GuDLKw{YrcvNUByT|;Km-(rNuw{1KeP(6}+Ai5S3%>0;8DO8t{lT(>78iV} z`*w(@=KYozirK$I|5D-GJv3!)l?1rIr+5DSYpcgK*#b#xj?+?OgMB73#N45wz)c4< zJ9@g6U}0(+9!K~6Iy6?EsB0p6>OJo2WJ9TYKuRu0)rP}9A@DT@non#|q*7JL26fCA9L#4#UJo4Jl zv-a=~2!LC^{lM22iHZwP#fN@|?7{3>Y8hF2r7#=pAo#5&lb_vIlte9Q;MCTC&Q(%w zea(A9qOjrOjMWXg*o~R>e=bbu0C>kJeLRRNa(l|Ssm`CMUO33gdKfN0Yw^l2obu9o ze#f#Z1xB;0qZNEBrS;Cfl0Vo>zODm5Xa>(MSt>oWs8CM%lKC$EDm4CcLM*$7eOcx^ zzBgFGW8|3&M(M2M6MK^bAIq*I!#7Xdq}VI!fZsfP;?Nk@baM0<+589n;=`7;Cl0!K zG54k+Qj%YCQ*N$5S`nP(<9;uE^oB?I;*~6i^!6Cs(00nTYdOMA4;J6Ag+^6%%z+cc z#hwXFVfcq2(ZIJ;SHBZ==gCLf4mIQKRW%x6b0wt(Au^L*hK2a;Va%!ve94!oBP2Sz zxRlZE>UGvnw)Oqp=z)@hG$l}P+TD-$+q6ygM!~P)%gSFXc~#PxI?C*ZCmED#fWH;A zg!cWhw~g9#4=F^65=Xz;kXpP%`mB?K>)mfdDe-q+a#32p)8aI=t5}5*w74Gf;{vVY zD05-y?eGk5a?B3h=a|n(D;4-sP~H2xvmhY&SbA{EGf!=O2?tgi|Ksb67Hd6SLv=@HZtTzv8Xy|CCF$Zu%ojqdQaA<8noKn0ro1V-V&Bxd z({-a$;Gyb157lmdbJs?LlVdkGo3R>ow;j*1-cB?-Jt}YS)s(L%IH^|;`tsg!<8^`v z$GGn{etfo^y1_6(cm5EWIY~9I(EZ3b`1t0>WQ^jrLAYtCk-Vsylir0Wh=m z0e>Fsc)jacSlx5N9PYdC+*fN4uBRzMehTvLt!Pr#2~Tjb%a6KwqTBKwYxg&+0}PAy zI}h8(?YOVd{bL<=*Y6AfM@-higWB$VYLpryGigEjPtDGRT{z`O9`7OO`1Tswk#%U{ z<#T>L#wK4l9MUA8{bq>FK4uNOd)|@;cXm&JivF8T!4?zB4iORj^3yj^z+ZI&oH%*OVPE@`oDdeKaL$8D{_}8j{2l2>7B{%#)QeKt zBju1XxA$i;(M6)^=HD*eCj|S>pY8t88?fU{FRCc;>C8=avLbDw8Rx!!=GmC&q78zT zPTWSZZ`KomncBBI_R2APy07>hd<9S1I-j-Y1S$*#;Lq@^xG2^;7f;ywvS`=Hz1L4a zG3MusA+wTWURmceY$glhg1Tq#0zmhH&z~wAnXlAqgp?P?nm^;o9kIt0I%2L9blm8D z;k%Z58u?HCUOWOwKlb-0Gm&%tn_tZDv;Z-A`r(Q{)Edjm=Qg#$O;;WzUmD5ZK^%y( zICc5e*lrYv8o90n3bn@42$ddVfYx$EkW=E%L|avIJ1sTN+P%9_N%!Sx{rIFf78(q- zuSGjvl&?_xplr?GF4K>pGCnI5(tnzf@BJdeA7OqPyN)Vy$(j0@ zU86!HnhM^O5dRa`ES@i^>Ech1jdQP<(&}{K0N<_#fuPad1g*g|ss8gD2)7r=Ggiz- z3#H&`8`*wtWxB=jON2#V6o`)*ME9ALOkp8Dhe(xtw~iryM>A5cw1Dl z+@&ho-&=b;)++UcBxJo$x0`{#z_dxprrG)(E+=H1r;Ui}0MeRsrd@kQ9KJPq>^i`x zgxPaE>OZ~yek!%Hy!dGw_0GtGH>^HN)fBV1;91$%)@7pqEnN986!6TNI&ql%NIxU*0LO4jiMU2j1#! zGCtk4~KL~4s=2chp6)|9wB+9ZH`S-5yi@!>-1 z$8!%WpLc1xluj|K5+(+v?0N^*WaD`>ZV*ET#oedk!tyjp^3b5-tQD)nEFM-*mbnG@cc&>qRC3U&?oW)jO zSP}8r8_y8O(y3LyX%CZd0Ri)^txwu*8GE@h&FyqQYx$NIk3A51Lk${A!Z6eG(u4t! zbM8%_^I#?^pPH&&-o3ZR({pYn(pKmE9tmEvt?TD(9%;xX=Xo2yHE!O#wy@s{R!l=K ZOQ3|iW1uzZ4~zl;riSJQ1qU3j{U1kA2!;Rv literal 0 HcmV?d00001 diff --git a/ProjectPublishing/ProjectPublishing/Resources/PrintingHouse.jpg b/ProjectPublishing/ProjectPublishing/Resources/PrintingHouse.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c442f65b0eb0f79b716644e0018411f5e4945ffb GIT binary patch literal 21455 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ʗT}%-OL6R zd$Fx7%Nz`RjDu=+BIo!^adx_G3$}>!gcO8|mUtw23feN>b0;1fbt4&P9nl1&@pC8v z<)exIZi*|Aw1lqlAD0uj;9x9|tm-(D-lJ#xE@N*KM=E$-N~F2A9yxbd(cC{UDA#(@ z4s^_h_brRP0PM)9){l`$mT9hFzn}Rgun_w!uh`X^`VoV~SY^w@hU>KUWccsPNLMcWq>(2iQAYNf7H$&H|&tKW^s`A>w&kqHq%4&x@ThX&rMM&PN8uG2N^ScoP#`xNcNyQ z`OdHh=AV3%oIs`pqGl{+CG7@~7x4nNBa&@QA>%}p^JMpcueVf9x446T*k$HTAmkUr zxfbZ$PD4z(D@q*uV7MqfS@tYIqY8)#!Zc@V05N8SnWS41y;>P1HkpW~b z-=q8-Im3)tk&zoR6@{)z22AMZgHVNesFv1$KQDv_F5AC7M1rC6`o`oQO^HnvvxUHKeBy+7tc6PE zZk#y$j;C9EK+G^iEU{pQK6YQYNF*m;s^4uwvXCbNwnrmKD=QnC@Ear#$-rr?kd2_d zUaD^z7N7)2?+{|*qv2-7Ox=cc4jT5^)%Aqt7P#O|jn zP^r~elp>5%YUxbS^lo7W4MH%t_{3S^K_P@rpaEssKZIV2mbuZF8$D{S>BI`3FZDa# zZpQ$o^^L?d$p99A@eOfkV)WrbKoBe`(1{Oeo^V8yp$&0P#h_Hf^{?|J*OPALIP8(pZhqD7IN~xbTZloud8n zpiL1%hbMGGNr4NBhkHbS^X$ThaaT7H&DF`MMan3o1VYV6e*;S@~wL5Egr z0d%>Hsox=T-ZHw&4PN%&C-nLdeK4;<>&KR#hzRvFbyCj%_1d|La*O%q?j2=fzD(UCD@BUpl$uV5PP5Y zs2w|zw=ppt9@~!<91d%>HMBK?6EFgVV1{EQgMdOVTkK(~QmE}t76Xf3Twx;7Y5h;U z2Me*08p5KK!lotE0}@$$z2-to3g1O!d^5(nQ5OO^?+uZVx5j!Qs34@INFcijv@~mr zvz~VidlPBDIl}ZE*=m*LPTRnOze!bf`iI&YA~q9SCf<(5QaU+92sBy_mkUMTu*v_1 z#S8(xf#%1aq9H>4#*{SZ%tyW>mKM^+9#-d?#`eUD%C9A;!12cfpIN6qIOJ=fXy9S(r>L*)QdMtLYG%o9ccA*K zvA!_9LWHkNE)+@D{F~-jR1;PRD&ZZWm(aV>4Vr%ac9*?@C7)07wP!|ollpEErgKd? z`_cH!fBVGj9wHj+J8fHHI6~}5Se4JMkmdxc&X57ZF!A`j;4L3y%wV9?SZ_E0mpMl7 zD_B#EPz(;!NnTJQ@1@yvT4_0fhY2S4NkBx^cm5DtfcUS>>;#D@c4WE z%ple_1jyYVmNdoY)F?jM)95rrtP0&}^J+o%ZI@e8ROp%24r{IDk3BR zw0HE1TawbDN+43T=GpVk=(=?rR}uGtK?I0KaK?k)1Nb3nzdISpDg)LoDf#yDq0{wL z*O{nO+I5`Zk7rq-ndl;R06BPbf>hF}z;yBC3l8B0p^7Rqs$NE52Fj-@DpCnERkPAE{o;}_UKgeRGjFYP@(Z3by42RV>WWYjcrq0?n^kLFQwzr8 zH$j-@w43KwyqO0yQI%t;4$P?zy@BpI6vO*(bWo2M!$H`Mltj&#yBp*B*rbdaWrH!Q zO8F#xVf!juZQT5c8~PuO`+|GN^}7XwxB1(ubm~2rRW2-l;|-;5M<3$y>|E1UjAP#d znMd;EkkF8PbuPxKW(YkCCZfkd(^MZ8q?^3D-M*9sP*Nq@vFbNaQtC3tVUkh?zX|9a zh8a<>R1PpCsog4mBUz=a0rN z7rmBbMcm{~k^#TbsX7rE&f%lJs*1y3IvVO+M{{Be%?0j=?JiEN?;#vbDO_(%2CN8Y%=*Nk}ZNCfLMrka)VacmP1axzVgqq7X9_3w;SH4I5TOrp}Gen-kUaeY#t zf^&l(Rw|LU3E1{5ByB`*Gz4>^*SGTJ{NhO<-Ujc*pzf^^A%C)rJeo3FkvKRXL{yg> z2>ON3+!hsO9+fwQ4l4-R$*5lmn7WI@(z)}k=AKRv%)9a*de9`$SOf{5swO%|&V9eC`~+X+7`U2HT3{e5tGHX)xA zyf&;La}Q)2KQs+Jd=l<=?IG7vOfV%Jo^J+ux=P-F^)zQ-vQ+(k#HQBa37)B-7->h0 z64gpFSm{E>eb_kQEhP?;01hJY#!S#5E7%M#njoCZLo7H%#h5~C(5tZl=^Z*OEGEZQ zm6BCR>%F3?!=2ZYA#gk1yjNlM4AN;V7g4+@IY z_uiWbW5)#fOIQ-JatlPIfZ!$F$sE@=e2BWN`U>`adqSV>fZgAU+MUfcBHd5?Xj;abq2Iqu{C@$& z5IgS?qel9SU*b8-N_`{Zb3|f`%;pOzpcaXK-v-gjH zT$B0yCpiS7jhVz0bB5Ijw{AH)Lnt=5>DE}d@Wx#iD40dT+F7w3ahEsyB4Vq|(3ilH z5v;z7ZYkxMEsclEDB^ckdl6xza*2M>=G@(ibc@r2vaqZcoC5^rz|N_0WusyZNrW`n zoTh=wTw;VABZ?@Zg9a!vkXr<89#b<<5k&zM#hHY&j)H!Wyw-+YK*RdXMKr`|bEGGA{8yy>PGc3>3;MT4eqHx2J%3y|gf z!cn!=p>^6+T0wD=ODGmx6`_*=0l>wAvjc>zsA(%PiGx{aTD~h^?WIV=UD zb*S>jYmy2)zeILTxL=bw`6Y4mj>fn}WG_M)MRmd_y~FbZ&&OuUbWf-rPxLgKN!|9! zvR=dPawkyxgXJjIdym8$F8mLdmj^9<(*|MP`GMXWv-_JR)R-|kmtOExSe&8^7%-U; zM-)*)4sd3L4BZLj>%Rbyxnvmy^daE!W!4NgVC@n-jcSpHKMS^ofI(T4<` z7r>WM?4&TNV8&kJzcG_bpV&n$v%LG3+o?~CO*-03gIn6(>>#(!zDZcSRB@S9SKXg$ zjN}TPbbgPt$pNVZIi7}WdrsYNY=?W8thuhEEJfs87mIC)@M8sgLGll@y}Un-0q-#fKo67R zUr_2k1k0d{7vo=>iO6&>sJ#0$_~3|kd#iC~RqEVBGl5pKn<~}>HfI|vsl32C4frf2 zyNk4}F=E0f;)*CZ%sYV21C<{zKuK^6SAujQYWHYGleiM%ie@$YOFDljd$3l|N9hPz zsnJE{xE0H2ewfv?)c9h(;)@Pdp?V>uKd``G_3Z*!q25;^*7K6d*ip=6Pbmh6pO2I- zS~M#2_m#vjuK{1EmFIUm0x#5`d{GZF#a1j2dqc!SDwp7Obhl{IfZkf$Q0IvR=w>>8 zT={3Trxf71pWDlAm{?)C!lUnAWyo{qFp}y;f!Dwyt~s01|?*DitHnblx$f zJ)F|B{OT)k1TN4#AM^h9~X+E$@m)4;-K4>D9%xBI*18~RrwV4YF+ zlT`lzyRe$wznP+Ur}HTNKg_Q){&Sj+xqe_-hpLt4ePj&|zk+hErS%i?ton@1!*d-B ze@J4kSJ8sjOar9Ct?m-hbfPR+84#niy+>Yr3M+V1}VuXvRV(Z`TI;jkJ5 z!e3~8gSd}#<}Rr}=zJ(F%3y%}!!c(u^2~nAlJg~h;{fM!3-%*Qvj7O(6^ z){@t9{z#72U>m|=YGDKsm8Un^_W%Gn0R?3}r{*O>jNXDI?`iUDFF|ZIU(S(suD8DK z9`VVOM);H71fuj`e`LvjPl=*qp&oGWXhsF8N#doo&o(Y&)|N7EkUw)$dN&nXeVF}# zCPX!`eaDym4d?NPyasK`&zScQto=v(=hZW*-h4CUN=*Bp{b$t!DtytDA9+s7dch9~ z2;i;4G2wyffFlRQJ%|zxs7p4+=|pOKVRFvy>JPbNN#5Ujl@N`A@rabSPn5@+x&*Gg z#1JDX{PZdrZO|XNeWIqjjn(A#n4s1O3)(!znM{$l%{}RGYRFXx9^(9zedATC1INmQ zTbHW&545Tsui2x4fSc3pF^Yqk{Evv$h2O&k0AatKlNd&~Z?Zi! zJp?_4_kyAs7uk$1j7{JfvYl>qt95-?N5Zj7!{<#2H9$6CLphCGM=`EzJTk;n7)%QJ z89d%`$zfKsM%juvs%2x0YDOxgs;RDTtMqe-8x5O~OS2ySt&UNFiwhi1ZoQ=_JeH1- zjSZ*m=j|Q9nb}U|*OFqgbS&u=d^1Pi5cYyNUjG09FTC)C*SIBxx&4>42RP_mS4Pmp01${XlUo6h!!99H-JF@CdOqGEb0 zVc}so@AKI{K}Wj`T^-&0Osc%dhH#2tBW*Ao8*if?4*`L+2GBNv+G`GkDM~qE1#(P! z#z1IfOKiCHDsl{1O8)@7k|N4Re(ccmC@{bK>HCc}VULxv#N1?D^>yHwzZe9*$q=_+ zf>w7Wm9y8kXl|T;x4niT(Hp;-)r%<{{J39qIhrE<-_*zkWV7s4(tW~(_qYxS8yI{= z3|{O|#i}_;bcAt3nyFbfB>Tjz=+&oxz>$W!U{_-CeVn2y=iQ;2zZW)51XY5u0%mN8 znWHxG*qFFcz%-aef;6sv@&wGp;$dNVWuZEno^ch_MRN{OFYAx@iEIX3hW3p=Vh1>a z3|@i#k-vD4M@-AVK1o_z6;wRms3S~fo{#R3>mAMFJ7hYiNNZNnhr#!aU~G^*p)02^ zCw%?p_SA;^TrOT@ylo4zOMei$mTcGRTcs{VSLP(UP5%JgrnUMRaefkK$ZVzpY0mu2 zAr8p;fG9fPugoo&tkix87=(avCL<~4Z-{0aC||@iE4=NUh%cX=5vri0tsia#DQ2FFbIHuUKmE% z)z9_Kh6(fRN_`RL_lJAhUlI1wEUxe34Qrdvx{+JNvv1+VD8z9!?qkegYm4KY_g^Mq{Ai zPCtGs0hYxuqgW{hz8mVcmAa{uJ@b~)y7UCy`(M+ELy3Gwy;w%A6?o(hJrp5o7L2oI zuy5;86Sd#sHHAzivg$Uq&rM&i3a8MavxV?FrB^Beust zxCu(j7rAhOFwf9AJR0z96`wULdXT}7MHc$u}p6l$At_b9mq{-*<-^q zyxk+_j6Q^OM~e~FzJK1ytCsuVr@UK)b*b|HqepOG5F&>-4}@;7Z-OMqi?(3r7F-~3 zFU86fX3Ode1io0IR|2&5ErHBF@5+86B7v2^SxW?suL*#+(0LsDM;JD~VxM7{5{92G z2Vj*>b_1Z@c#E{M-_9P=#NLK@7(r?6HnW+5(UdY^s-?v>66FmUQB7wsX&z~ToK4Jm zkz2-`<3k*>2QwgQLt9v6&@;1gIf&Jq}By#4Y#cZ8n-7 zZ@GpdpVev?iSEylJd7&+li5o6DVFpX;ASDoK4KhBS@)7+wmDGnP={wZI5|h$(9FuKrfe{vBqIQZjlEF`8-6<;#WxZgkn*gbXA-faie&~C;`z$ z#%LADn0Vcf1WrlO{wC(`jLBp50UeihCfao~Zgrhe{5efWaKYqzKxF$rFdu*)m=;UY z0L*(JGf(F!nLh901FiL79Sj*D_rS;zrtu}L2evq1y3%MPsLYIY37yc~e&Y=uvj%dF zQ-<)kKv2o(81{xmLd8y$;s!QZu`Cr>4lA}VWTLd#m)Dz1&E4K9Vk3evU?Xp_Z$3{v zdNQzigz^oY`Q?EcPyoPAls^6DWd>r_#uyxlafrgS_D)N|HS6s#KNM;FQL0UUY=3n> zV2YSaXPP517$$;u3BP!iaDFH1(;r?LNym(6zFEq@m}W-iML%{6L7IH29l-hP?g(D? zvFwRkcdxM@Z1BTf+Rup9P~HAy3gz9uo^q@kTKt663u4?+QaLt4v5v0ArD=fIwAVL+ zuX$uOTVI)oExC8hu&--<#C{3FS&qy)E7|*q%=Uifx%GoHXEJ?9-JYZ{!-(sv)O}2& zb!dXSGLMi3J)jfjG7gaavnZYY48EqC^ii3O>@o4?zXZ%TYF*y`_nQ50`KP?oeb02y z%NEW0$<`NDj%uByIs0Hz5A=;6jLp*lp;@T2Q#)y{YUNgqguUOG;8Q_UmiUg*m4R?+ zF0XCA;PSUn0AejiT&oF>_so5_CO6F?e+&c~$Idb<^MXaGjj8R(l4?8%)Oe6fG%KWE z8C5!~SK=VE&yW1L!w)W3f~O4nzY>0c zpQe!i0GT&GX}S3){URF=2vL{93-KXG(ueBM{c<0sPx*=e06#zA=lndieK`LB&4@<) zS@@?6X!~L^ov~NuiK4!shBmqgxz57tG(5^>32tuP=%nz*7M@MyK!MI@-q7+~fQ!Ah zoq`ND^99wS@o`mL=J#+3sPYgWoPzx1)%gfK{Dl3qhwkC~xD0i31dr9g=i`Oe_~2#- zH~|K(LFX7r!4Urd8Uyj5AEbl)WIyAB%fSQq;Ga|qAy`Ou5_>#FI0r5VHd@-Q=>eCD zA&@&kIY2-`B{!6oK_HUJWU^T-mOx5Wq@<*zuO7ThmP;j)$%Z&Wt0E|A6)n3B#&dWT zE@3Q|OC^%YWU^9ODU7mNQj(iWdI1+N(ibjV=7ht6%?aktX8;i9hcqz5o)UBLobc!4 zoGb6a)i3D|snt5Ax1CURoa>E@{7dgK>*$vWaA#cSg!Rt3)yLQB#;-^dlh8V)`U1t5 zE)2PNONTT$xPb>WAcKG)g9dQs;Odz;=RXbzYPecb7YZ?di>If$;UpZ;*)vOoT>shBnsXfh literal 0 HcmV?d00001