4 Commits

Author SHA1 Message Date
17f5a4fa6a дополнительные изменения 2024-12-14 15:44:34 +04:00
6b7a684869 лаба 3 2024-12-14 15:06:53 +04:00
b5a3d4e2a3 лаб 2 2024-12-11 10:32:08 +04:00
930a6448ab 1 лаба 2024-12-10 20:13:54 +04:00
83 changed files with 8110 additions and 77 deletions

View File

@@ -0,0 +1,20 @@
namespace ProjectConfectFactory.Entities;
public class Component
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Unit { get; private set; } = string.Empty;
public decimal Count { get; private set; }
public static Component CreateEntity(int id, string name, string unit, decimal count)
{
return new Component
{
Id = id,
Name = name ?? string.Empty,
Unit = unit ?? string.Empty,
Count = count
};
}
}

View File

@@ -0,0 +1,12 @@
namespace ProjectConfectFactory.Entities.Enums;
public enum DeliveryType
{
None = 0,
Express = 1, // 1-2 дня
Middle = 2, // 3-5 дней
Long = 3 // 6-10 дней
}

View File

@@ -0,0 +1,19 @@
namespace ProjectConfectFactory.Entities.Enums;
[Flags]
public enum ProductType
{
None = 0,
Dark = 1, // горький шоколад
White = 2, // белый шоколад
Nut = 4, // ореховый
Fondant = 8, // с помадкой
Alcohol = 16 // с алкоголем
}

View File

@@ -0,0 +1,36 @@
namespace ProjectConfectFactory.Entities;
// заказ
public class Order
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Phone { get; private set; } = string.Empty;
public IEnumerable<OrderProducts> OrderProducts { get; private set;} = [];
public DateTime DateTime { get; private set; }
public static Order CreateOpeartion(int id, string name, string phone, IEnumerable<OrderProducts> orderProducts)
{
return new Order
{
Id = id,
Name = name ?? string.Empty,
Phone = phone ?? string.Empty,
OrderProducts = orderProducts,
DateTime = DateTime.Now
};
}
public static Order CreateOpeartion(TempOrderProducts tempOrderPoducts,
IEnumerable<OrderProducts> orderProducts)
{
return new Order
{
Id = tempOrderPoducts.Id,
Name = tempOrderPoducts.Name,
Phone = tempOrderPoducts.Phone,
OrderProducts = orderProducts,
DateTime = tempOrderPoducts.DateTime
};
}
}

View File

@@ -0,0 +1,21 @@
namespace ProjectConfectFactory.Entities;
// класс продукт в заказе
public class OrderProducts
{
public int Id { get; private set; }
public int ProductId { get; private set; }
public int Count { get; private set; }
public decimal Price { get; private set; }
public static OrderProducts CreateElement(int id, int productId, int count, decimal price)
{
return new OrderProducts
{
Id = id,
ProductId = productId,
Count = count,
Price = price
};
}
}

View File

@@ -0,0 +1,38 @@
using ConfectFactory.Entities;
using ProjectConfectFactory.Entities.Enums;
namespace ProjectConfectFactory.Entities;
public class Product
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public ProductType ProductType { get; private set; }
public IEnumerable<Recipe> Recipe { get; private set; } = [];
public decimal Price { get; private set; }
public static Product CreateEntity(int id, string name, ProductType productType, IEnumerable<Recipe> recipe, decimal price)
{
return new Product
{
Id = id,
Name = name ?? string.Empty,
ProductType = productType,
Recipe = recipe,
Price = price
};
}
public static Product CreateEntity(TempRecipe tempRecipe,
IEnumerable<Recipe> recipe)
{
return new Product
{
Id = tempRecipe.Id,
Name = tempRecipe.Name,
ProductType = tempRecipe.ProductType,
Recipe = recipe,
Price = tempRecipe.Price
};
}
}

View File

@@ -0,0 +1,22 @@
namespace ProjectConfectFactory.Entities;
//Закупка
public class Purchase
{
public int Id { get; private set; }
public DateTime DateTime { get; private set; }
public int SellerId { get; private set; }
public int ComponentId { get; private set; }
public decimal Count { get; private set; }
public static Purchase CreateOpeartion(int id, int sellerId, int componentId, decimal count)
{
return new Purchase
{
Id = id,
DateTime = DateTime.Now,
SellerId = sellerId,
ComponentId = componentId,
Count = count
};
}
}

View File

@@ -0,0 +1,19 @@
namespace ProjectConfectFactory.Entities;
// класс компонент в продукте (рецепт)
public class Recipe
{
public int Id { get; private set; }
public int ComponentId { get; private set; }
public decimal CountComponent { get; private set; }
public static Recipe CreateElement(int id, int componentId, decimal countComponent)
{
return new Recipe
{
Id = id,
ComponentId = componentId,
CountComponent = countComponent
};
}
}

View File

@@ -0,0 +1,22 @@
using ProjectConfectFactory.Entities.Enums;
namespace ProjectConfectFactory.Entities;
public class Seller
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Phone { get; private set; } = string.Empty;
public DeliveryType DeliveryTime { get; private set; }
public static Seller CreateEntity(int id, string name, string phone, DeliveryType deliveryTime)
{
return new Seller
{
Id = id,
Name = name ?? string.Empty,
Phone = phone ?? string.Empty,
DeliveryTime = deliveryTime
};
}
}

View File

@@ -0,0 +1,13 @@

namespace ProjectConfectFactory.Entities;
public class TempOrderProducts
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Phone { get; private set; } = string.Empty;
public DateTime DateTime { get; private set; }
public int ProductId { get; private set; }
public int Count { get; private set; }
public decimal Price { get; private set; }
}

View File

@@ -0,0 +1,13 @@
using ProjectConfectFactory.Entities.Enums;
namespace ConfectFactory.Entities;
public class TempRecipe
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public ProductType ProductType { get; private set; }
public decimal Price { get; private set; }
public int ComponentId { get; private set; }
public decimal CountComponent { get; private set; }
}

View File

@@ -1,39 +0,0 @@
namespace ProjectConfectFactory
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

View File

@@ -1,10 +0,0 @@
namespace ProjectConfectFactory
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,170 @@
namespace ProjectConfectFactory
{
partial class FormConFactory
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
menuStripTool = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
ProductToolStripMenuItem = new ToolStripMenuItem();
SellerToolStripMenuItem = new ToolStripMenuItem();
ComponentToolStripMenuItem = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
OrderToolStripMenuItem = new ToolStripMenuItem();
PurchaseToolStripMenuItem = new ToolStripMenuItem();
ReportToolStripMenuItem = new ToolStripMenuItem();
DirectoryReportToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItemComponentReport = new ToolStripMenuItem();
OrderDistribReportToolStripMenuItem = new ToolStripMenuItem();
menuStripTool.SuspendLayout();
SuspendLayout();
//
// menuStripTool
//
menuStripTool.BackColor = Color.Bisque;
menuStripTool.ImageScalingSize = new Size(20, 20);
menuStripTool.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, ReportToolStripMenuItem });
menuStripTool.Location = new Point(0, 0);
menuStripTool.Name = "menuStripTool";
menuStripTool.Size = new Size(862, 28);
menuStripTool.TabIndex = 0;
menuStripTool.Text = "menuStrip1";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ProductToolStripMenuItem, SellerToolStripMenuItem, ComponentToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(117, 24);
справочникиToolStripMenuItem.Text = "Справочники";
//
// ProductToolStripMenuItem
//
ProductToolStripMenuItem.Name = "ProductToolStripMenuItem";
ProductToolStripMenuItem.Size = new Size(182, 26);
ProductToolStripMenuItem.Text = "Продукты";
ProductToolStripMenuItem.Click += ProductToolStripMenuItem_Click;
//
// SellerToolStripMenuItem
//
SellerToolStripMenuItem.Name = "SellerToolStripMenuItem";
SellerToolStripMenuItem.Size = new Size(182, 26);
SellerToolStripMenuItem.Text = "Поставщики";
SellerToolStripMenuItem.Click += SellerToolStripMenuItem_Click;
//
// ComponentToolStripMenuItem
//
ComponentToolStripMenuItem.Name = "ComponentToolStripMenuItem";
ComponentToolStripMenuItem.Size = new Size(182, 26);
ComponentToolStripMenuItem.Text = "Компоненты";
ComponentToolStripMenuItem.Click += ComponentToolStripMenuItem_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { OrderToolStripMenuItem, PurchaseToolStripMenuItem });
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
операцииToolStripMenuItem.Size = new Size(95, 24);
операцииToolStripMenuItem.Text = "Операции";
//
// OrderToolStripMenuItem
//
OrderToolStripMenuItem.Name = "OrderToolStripMenuItem";
OrderToolStripMenuItem.Size = new Size(156, 26);
OrderToolStripMenuItem.Text = "Заказ";
OrderToolStripMenuItem.Click += OrderToolStripMenuItem_Click;
//
// PurchaseToolStripMenuItem
//
PurchaseToolStripMenuItem.Name = "PurchaseToolStripMenuItem";
PurchaseToolStripMenuItem.Size = new Size(156, 26);
PurchaseToolStripMenuItem.Text = "Поставка";
PurchaseToolStripMenuItem.Click += PurchaseToolStripMenuItem_Click;
//
// ReportToolStripMenuItem
//
ReportToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, toolStripMenuItemComponentReport, OrderDistribReportToolStripMenuItem });
ReportToolStripMenuItem.Name = "ReportToolStripMenuItem";
ReportToolStripMenuItem.Size = new Size(73, 24);
ReportToolStripMenuItem.Text = "Отчёты";
//
// DirectoryReportToolStripMenuItem
//
DirectoryReportToolStripMenuItem.Name = "DirectoryReportToolStripMenuItem";
DirectoryReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.W;
DirectoryReportToolStripMenuItem.Size = new Size(350, 26);
DirectoryReportToolStripMenuItem.Text = "Документ со справочниками";
DirectoryReportToolStripMenuItem.Click += DirectoryReportToolStripMenuItem_Click;
//
// toolStripMenuItemComponentReport
//
toolStripMenuItemComponentReport.Name = "toolStripMenuItemComponentReport";
toolStripMenuItemComponentReport.ShortcutKeys = Keys.Control | Keys.E;
toolStripMenuItemComponentReport.Size = new Size(350, 26);
toolStripMenuItemComponentReport.Text = "Распределение компонентов";
toolStripMenuItemComponentReport.Click += toolStripMenuItemComponentReport_Click;
//
// OrderDistribReportToolStripMenuItem
//
OrderDistribReportToolStripMenuItem.Name = "OrderDistribReportToolStripMenuItem";
OrderDistribReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.P;
OrderDistribReportToolStripMenuItem.Size = new Size(350, 26);
OrderDistribReportToolStripMenuItem.Text = "Востребованность продуктов";
OrderDistribReportToolStripMenuItem.Click += OrderDistribReportToolStripMenuItem_Click;
//
// FormConFactory
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackgroundImage = Properties.Resources.Фон;
BackgroundImageLayout = ImageLayout.Stretch;
ClientSize = new Size(862, 453);
Controls.Add(menuStripTool);
MainMenuStrip = menuStripTool;
Name = "FormConFactory";
StartPosition = FormStartPosition.CenterParent;
Text = "\"Кондитерская фабрика\"";
menuStripTool.ResumeLayout(false);
menuStripTool.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStripTool;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem ProductToolStripMenuItem;
private ToolStripMenuItem SellerToolStripMenuItem;
private ToolStripMenuItem ComponentToolStripMenuItem;
private ToolStripMenuItem операцииToolStripMenuItem;
private ToolStripMenuItem OrderToolStripMenuItem;
private ToolStripMenuItem PurchaseToolStripMenuItem;
private ToolStripMenuItem ReportToolStripMenuItem;
private ToolStripMenuItem DirectoryReportToolStripMenuItem;
private ToolStripMenuItem toolStripMenuItemComponentReport;
private ToolStripMenuItem OrderDistribReportToolStripMenuItem;
}
}

View File

@@ -0,0 +1,124 @@
namespace ProjectConfectFactory;
using ProjectConfectFactory.Forms;
using Unity;
public partial class FormConFactory : Form
{
private readonly IUnityContainer _container;
public FormConFactory(IUnityContainer container)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
}
private void ProductToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormProducts>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SellerToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormSellers>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ComponentToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormComponents>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void OrderToolStripMenuItem_Click(object sender, EventArgs e)
{
{
try
{
_container.Resolve<FormOrders>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void PurchaseToolStripMenuItem_Click(object sender, EventArgs e)
{
{
try
{
_container.Resolve<FormPurchases>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void DirectoryReportToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormDirectoryReport>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void OrderDistribReportToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<OrderDistributionReport>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void toolStripMenuItemComponentReport_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormComponentReport>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStripTool.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,167 @@
namespace ProjectConfectFactory.Forms
{
partial class FormComponent
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonBack = new Button();
ButtonSave = new Button();
label4 = new Label();
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxComponentUnit = new TextBox();
textBoxComponentName = new TextBox();
numericUpDownComponentCount = new NumericUpDown();
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).BeginInit();
SuspendLayout();
//
// buttonBack
//
buttonBack.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonBack.Location = new Point(291, 245);
buttonBack.MinimumSize = new Size(94, 29);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(94, 29);
buttonBack.TabIndex = 17;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSave.Location = new Point(67, 245);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 16;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(22, 191);
label4.Name = "label4";
label4.Size = new Size(132, 20);
label4.TabIndex = 15;
label4.Text = "Кол-во на складе:";
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(22, 131);
label3.Name = "label3";
label3.Size = new Size(113, 20);
label3.TabIndex = 14;
label3.Text = "Ед. измерения:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(22, 67);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 13;
label2.Text = "Наименование:";
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(169, 9);
label1.Name = "label1";
label1.Size = new Size(102, 23);
label1.TabIndex = 12;
label1.Text = "Компонент:";
//
// textBoxComponentUnit
//
textBoxComponentUnit.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
textBoxComponentUnit.Location = new Point(206, 124);
textBoxComponentUnit.Name = "textBoxComponentUnit";
textBoxComponentUnit.Size = new Size(218, 27);
textBoxComponentUnit.TabIndex = 10;
//
// textBoxComponentName
//
textBoxComponentName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
textBoxComponentName.Location = new Point(206, 60);
textBoxComponentName.Name = "textBoxComponentName";
textBoxComponentName.Size = new Size(218, 27);
textBoxComponentName.TabIndex = 9;
//
// numericUpDownComponentCount
//
numericUpDownComponentCount.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
numericUpDownComponentCount.Location = new Point(206, 184);
numericUpDownComponentCount.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
numericUpDownComponentCount.Name = "numericUpDownComponentCount";
numericUpDownComponentCount.Size = new Size(218, 27);
numericUpDownComponentCount.TabIndex = 18;
//
// FormComponent
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(482, 303);
Controls.Add(numericUpDownComponentCount);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxComponentUnit);
Controls.Add(textBoxComponentName);
Name = "FormComponent";
StartPosition = FormStartPosition.CenterParent;
Text = "Компонент";
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonBack;
private Button ButtonSave;
private Label label4;
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxComponentUnit;
private TextBox textBoxComponentName;
private NumericUpDown numericUpDownComponentCount;
}
}

View File

@@ -0,0 +1,74 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormComponent : Form
{
private readonly IComponentRepository _componentRepository;
private int? _componentId;
public int Id
{
set
{
try
{
var component = _componentRepository.ReadComponentById(value);
if (component == null)
{
throw new InvalidDataException(nameof(component));
}
textBoxComponentName.Text = component.Name;
textBoxComponentUnit.Text = component.Unit;
numericUpDownComponentCount.Value = (decimal)component.Count;
_componentId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormComponent(IComponentRepository componentRepository, IPurchaseRepository purchaseRepository)
{
InitializeComponent();
_componentRepository = componentRepository ?? throw new ArgumentNullException(nameof(componentRepository));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxComponentName.Text) || string.IsNullOrWhiteSpace(textBoxComponentUnit.Text) || numericUpDownComponentCount.Value == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_componentId.HasValue)
{
_componentRepository.UpdateComponent(CreateComponent(_componentId.Value));
}
else
{
_componentRepository.CreateComponent(CreateComponent(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private Component CreateComponent(int id) => Component.CreateEntity(id, textBoxComponentName.Text, textBoxComponentUnit.Text,
Convert.ToDecimal(numericUpDownComponentCount.Value));
}

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->

View File

@@ -0,0 +1,186 @@
namespace ProjectConfectFactory.Forms;
partial class FormComponentReport
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label1 = new Label();
textBoxFilePath = new TextBox();
ButtonSelectFilePath = new Button();
label2 = new Label();
label3 = new Label();
label4 = new Label();
ButtonMakeReport = new Button();
dateTimePickerStart = new DateTimePicker();
dateTimePickerEnd = new DateTimePicker();
comboBoxComponent = new ComboBox();
label5 = new Label();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Location = new Point(18, 65);
label1.Name = "label1";
label1.Size = new Size(112, 20);
label1.TabIndex = 0;
label1.Text = "Путь до файла:";
//
// textBoxFilePath
//
textBoxFilePath.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
textBoxFilePath.Location = new Point(158, 62);
textBoxFilePath.Name = "textBoxFilePath";
textBoxFilePath.Size = new Size(212, 27);
textBoxFilePath.TabIndex = 1;
//
// ButtonSelectFilePath
//
ButtonSelectFilePath.Anchor = AnchorStyles.Top | AnchorStyles.Right;
ButtonSelectFilePath.Location = new Point(376, 65);
ButtonSelectFilePath.Name = "ButtonSelectFilePath";
ButtonSelectFilePath.Size = new Size(32, 27);
ButtonSelectFilePath.TabIndex = 2;
ButtonSelectFilePath.Text = "...";
ButtonSelectFilePath.UseVisualStyleBackColor = true;
ButtonSelectFilePath.Click += ButtonSelectFilePath_Click;
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(18, 119);
label2.Name = "label2";
label2.Size = new Size(91, 20);
label2.TabIndex = 3;
label2.Text = "Компонент:";
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(18, 171);
label3.Name = "label3";
label3.Size = new Size(97, 20);
label3.TabIndex = 5;
label3.Text = "Дата начала:";
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(18, 233);
label4.Name = "label4";
label4.Size = new Size(90, 20);
label4.TabIndex = 7;
label4.Text = "Дата конца:";
//
// ButtonMakeReport
//
ButtonMakeReport.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
ButtonMakeReport.Location = new Point(106, 268);
ButtonMakeReport.Name = "ButtonMakeReport";
ButtonMakeReport.Size = new Size(199, 40);
ButtonMakeReport.TabIndex = 9;
ButtonMakeReport.Text = "Сформировать";
ButtonMakeReport.UseVisualStyleBackColor = true;
ButtonMakeReport.Click += ButtonMakeReport_Click;
//
// dateTimePickerStart
//
dateTimePickerStart.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
dateTimePickerStart.Location = new Point(158, 164);
dateTimePickerStart.Name = "dateTimePickerStart";
dateTimePickerStart.Size = new Size(250, 27);
dateTimePickerStart.TabIndex = 10;
//
// dateTimePickerEnd
//
dateTimePickerEnd.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
dateTimePickerEnd.Location = new Point(158, 226);
dateTimePickerEnd.Name = "dateTimePickerEnd";
dateTimePickerEnd.Size = new Size(250, 27);
dateTimePickerEnd.TabIndex = 11;
//
// comboBoxComponent
//
comboBoxComponent.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboBoxComponent.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxComponent.FormattingEnabled = true;
comboBoxComponent.Location = new Point(158, 111);
comboBoxComponent.Name = "comboBoxComponent";
comboBoxComponent.Size = new Size(250, 28);
comboBoxComponent.TabIndex = 12;
//
// label5
//
label5.AutoSize = true;
label5.BackColor = Color.Bisque;
label5.Location = new Point(133, 17);
label5.Name = "label5";
label5.Size = new Size(172, 20);
label5.TabIndex = 13;
label5.Text = "Характеристики отчёта:";
//
// FormComponentReport
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(431, 331);
Controls.Add(label5);
Controls.Add(comboBoxComponent);
Controls.Add(dateTimePickerEnd);
Controls.Add(dateTimePickerStart);
Controls.Add(ButtonMakeReport);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(ButtonSelectFilePath);
Controls.Add(textBoxFilePath);
Controls.Add(label1);
MinimumSize = new Size(449, 378);
Name = "FormComponentReport";
Text = "Отчёт по компонентам";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private TextBox textBoxFilePath;
private Button ButtonSelectFilePath;
private Label label2;
private Label label3;
private Label label4;
private Button ButtonMakeReport;
private DateTimePicker dateTimePickerStart;
private DateTimePicker dateTimePickerEnd;
private ComboBox comboBoxComponent;
private Label label5;
}

View File

@@ -0,0 +1,76 @@
using ProjectConfectFactory.Reports;
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormComponentReport : Form
{
private readonly IUnityContainer _container;
public FormComponentReport(IUnityContainer container, IComponentRepository componentRepository, IProductRepository productRepository)
{
InitializeComponent();
_container = container ?? throw new ArgumentNullException(nameof(container));
comboBoxComponent.DataSource = componentRepository.ReadComponents();
comboBoxComponent.DisplayMember = "Name";
comboBoxComponent.ValueMember = "Id";
}
private void ButtonSelectFilePath_Click(object sender, EventArgs e)
{
var sfd = new SaveFileDialog()
{
Filter = "Excel Files | *.xlsx"
};
if (sfd.ShowDialog() != DialogResult.OK)
{
return;
}
textBoxFilePath.Text = sfd.FileName;
}
private void ButtonMakeReport_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxFilePath.Text))
{
throw new Exception("Отсутствует имя файла для отчета");
}
if (comboBoxComponent.SelectedIndex < 0)
{
throw new Exception("Не выбраны данные");
}
if (dateTimePickerEnd.Value <= dateTimePickerStart.Value)
{
throw new Exception("Дата начала должна быть раньше даты окончания");
}
if
(_container.Resolve<TableReport>().CreateTable(textBoxFilePath.Text,
(int)comboBoxComponent.SelectedValue!, dateTimePickerStart.Value, dateTimePickerEnd.Value))
{
MessageBox.Show("Документ сформирован", "Формирование документа",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", "Формирование документа",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при создании очета",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,130 @@
namespace ProjectConfectFactory.Forms;
partial class FormComponents
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormComponents));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewComponents = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewComponents).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 1;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewComponents
//
dataGridViewComponents.AllowUserToAddRows = false;
dataGridViewComponents.AllowUserToDeleteRows = false;
dataGridViewComponents.AllowUserToResizeColumns = false;
dataGridViewComponents.AllowUserToResizeRows = false;
dataGridViewComponents.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewComponents.BackgroundColor = Color.Bisque;
dataGridViewComponents.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewComponents.Dock = DockStyle.Fill;
dataGridViewComponents.GridColor = Color.Bisque;
dataGridViewComponents.Location = new Point(0, 0);
dataGridViewComponents.MultiSelect = false;
dataGridViewComponents.Name = "dataGridViewComponents";
dataGridViewComponents.ReadOnly = true;
dataGridViewComponents.RowHeadersVisible = false;
dataGridViewComponents.RowHeadersWidth = 51;
dataGridViewComponents.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewComponents.Size = new Size(657, 450);
dataGridViewComponents.TabIndex = 2;
//
// FormComponents
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewComponents);
Controls.Add(panel1);
MinimumSize = new Size(818, 497);
Name = "FormComponents";
Text = "Компоненты";
Load += FormComponents_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewComponents).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewComponents;
}

View File

@@ -0,0 +1,110 @@

using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormComponents : Form
{
private readonly IUnityContainer _container;
private readonly IComponentRepository _componentRepository;
public FormComponents(IUnityContainer container, IComponentRepository componentRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_componentRepository = componentRepository ??
throw new ArgumentNullException(nameof(componentRepository));
}
private void FormComponents_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormComponent>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_componentRepository.DeleteComponent(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormComponent>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewComponents.DataSource = _componentRepository.ReadComponents();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewComponents.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewComponents.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

@@ -0,0 +1,474 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@@ -0,0 +1,103 @@
namespace ProjectConfectFactory.Forms;
partial class FormDirectoryReport
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
checkBoxProduct = new CheckBox();
checkBoxComponent = new CheckBox();
checkBoxSeller = new CheckBox();
buttonBuild = new Button();
SuspendLayout();
//
// checkBoxProduct
//
checkBoxProduct.AutoSize = true;
checkBoxProduct.Location = new Point(25, 24);
checkBoxProduct.Name = "checkBoxProduct";
checkBoxProduct.Size = new Size(99, 24);
checkBoxProduct.TabIndex = 0;
checkBoxProduct.Text = "Продукты";
checkBoxProduct.UseVisualStyleBackColor = true;
//
// checkBoxComponent
//
checkBoxComponent.AutoSize = true;
checkBoxComponent.Location = new Point(25, 54);
checkBoxComponent.Name = "checkBoxComponent";
checkBoxComponent.Size = new Size(121, 24);
checkBoxComponent.TabIndex = 1;
checkBoxComponent.Text = "Компоненты";
checkBoxComponent.UseVisualStyleBackColor = true;
//
// checkBoxSeller
//
checkBoxSeller.AutoSize = true;
checkBoxSeller.Location = new Point(25, 84);
checkBoxSeller.Name = "checkBoxSeller";
checkBoxSeller.Size = new Size(117, 24);
checkBoxSeller.TabIndex = 2;
checkBoxSeller.Text = "Поставщики";
checkBoxSeller.UseVisualStyleBackColor = true;
//
// buttonBuild
//
buttonBuild.Location = new Point(196, 49);
buttonBuild.Name = "buttonBuild";
buttonBuild.Size = new Size(132, 29);
buttonBuild.TabIndex = 4;
buttonBuild.Text = "Сформировать";
buttonBuild.UseVisualStyleBackColor = true;
buttonBuild.Click += ButtonBuild_Click;
//
// FormDirectoryReport
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(361, 130);
Controls.Add(buttonBuild);
Controls.Add(checkBoxSeller);
Controls.Add(checkBoxComponent);
Controls.Add(checkBoxProduct);
Name = "FormDirectoryReport";
StartPosition = FormStartPosition.CenterParent;
Text = "Выгрузка справочников";
ResumeLayout(false);
PerformLayout();
}
#endregion
private CheckBox checkBoxProduct;
private CheckBox checkBoxComponent;
private CheckBox checkBoxSeller;
private Button buttonBuild;
}

View File

@@ -0,0 +1,52 @@
using ProjectConfectFactory.Reports;
using Unity;
namespace ProjectConfectFactory.Forms
{
public partial class FormDirectoryReport : Form
{
private readonly IUnityContainer _container;
public FormDirectoryReport(IUnityContainer container)
{
InitializeComponent();
_container = container ?? throw new ArgumentNullException(nameof(container));
}
private void ButtonBuild_Click(object sender, EventArgs e)
{
try
{
if (!checkBoxProduct.Checked && !checkBoxComponent.Checked && !checkBoxSeller.Checked)
{
throw new Exception("Не выбран ни один справочник для выгрузки");
}
var sfd = new SaveFileDialog()
{
Filter = "Docx Files | *.docx"
};
if (sfd.ShowDialog() != DialogResult.OK)
{
throw new Exception("Не выбран файла для отчета");
}
if (_container.Resolve<DocReport>().CreateDoc(sfd.FileName, checkBoxProduct.Checked,
checkBoxSeller.Checked, checkBoxComponent.Checked))
{
MessageBox.Show("Документ сформирован", "Формирование документа",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", "Формирование документа",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,225 @@
namespace ProjectConfectFactory.Forms
{
partial class FormOrder
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxOrderPhone = new TextBox();
textBoxOrderName = new TextBox();
dateTimePickerOrder = new DateTimePicker();
label4 = new Label();
groupBoxListProducts = new GroupBox();
dataGridViewProducts = new DataGridView();
ColumnProduct = new DataGridViewComboBoxColumn();
ColumnCount = new DataGridViewTextBoxColumn();
ColumnPrice = new DataGridViewTextBoxColumn();
buttonBack = new Button();
ButtonSave = new Button();
groupBoxListProducts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit();
SuspendLayout();
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(92, 112);
label3.Name = "label3";
label3.Size = new Size(72, 20);
label3.TabIndex = 10;
label3.Text = "Телефон:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(92, 62);
label2.Name = "label2";
label2.Size = new Size(115, 20);
label2.TabIndex = 9;
label2.Text = "Имя заказчика:";
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(245, 11);
label1.Name = "label1";
label1.Size = new Size(57, 23);
label1.TabIndex = 8;
label1.Text = "Заказ:";
//
// textBoxOrderPhone
//
textBoxOrderPhone.Anchor = AnchorStyles.Top | AnchorStyles.Right;
textBoxOrderPhone.Location = new Point(284, 105);
textBoxOrderPhone.Name = "textBoxOrderPhone";
textBoxOrderPhone.Size = new Size(250, 27);
textBoxOrderPhone.TabIndex = 7;
//
// textBoxOrderName
//
textBoxOrderName.Anchor = AnchorStyles.Top | AnchorStyles.Right;
textBoxOrderName.Location = new Point(284, 55);
textBoxOrderName.Name = "textBoxOrderName";
textBoxOrderName.Size = new Size(250, 27);
textBoxOrderName.TabIndex = 6;
//
// dateTimePickerOrder
//
dateTimePickerOrder.Anchor = AnchorStyles.Top | AnchorStyles.Right;
dateTimePickerOrder.Enabled = false;
dateTimePickerOrder.Location = new Point(284, 156);
dateTimePickerOrder.Name = "dateTimePickerOrder";
dateTimePickerOrder.Size = new Size(250, 27);
dateTimePickerOrder.TabIndex = 11;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(92, 163);
label4.Name = "label4";
label4.Size = new Size(44, 20);
label4.TabIndex = 12;
label4.Text = "Дата:";
//
// groupBoxListProducts
//
groupBoxListProducts.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
groupBoxListProducts.Controls.Add(dataGridViewProducts);
groupBoxListProducts.Location = new Point(27, 209);
groupBoxListProducts.Name = "groupBoxListProducts";
groupBoxListProducts.Size = new Size(570, 292);
groupBoxListProducts.TabIndex = 26;
groupBoxListProducts.TabStop = false;
groupBoxListProducts.Text = "Список продуктов:";
//
// dataGridViewProducts
//
dataGridViewProducts.BackgroundColor = Color.Bisque;
dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewProducts.Columns.AddRange(new DataGridViewColumn[] { ColumnProduct, ColumnCount, ColumnPrice });
dataGridViewProducts.Dock = DockStyle.Fill;
dataGridViewProducts.Location = new Point(3, 23);
dataGridViewProducts.Name = "dataGridViewProducts";
dataGridViewProducts.RowHeadersVisible = false;
dataGridViewProducts.RowHeadersWidth = 51;
dataGridViewProducts.Size = new Size(564, 266);
dataGridViewProducts.TabIndex = 27;
//
// ColumnProduct
//
ColumnProduct.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnProduct.HeaderText = "Продукт";
ColumnProduct.MinimumWidth = 6;
ColumnProduct.Name = "ColumnProduct";
//
// ColumnCount
//
ColumnCount.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnCount.HeaderText = "Кол-во";
ColumnCount.MinimumWidth = 6;
ColumnCount.Name = "ColumnCount";
//
// ColumnPrice
//
ColumnPrice.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnPrice.HeaderText = "Общая цена";
ColumnPrice.MinimumWidth = 6;
ColumnPrice.Name = "ColumnPrice";
//
// buttonBack
//
buttonBack.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonBack.Location = new Point(406, 521);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 25;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSave.Location = new Point(92, 521);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 24;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// FormOrder
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.Linen;
ClientSize = new Size(631, 563);
Controls.Add(groupBoxListProducts);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label4);
Controls.Add(dateTimePickerOrder);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxOrderPhone);
Controls.Add(textBoxOrderName);
MinimumSize = new Size(649, 610);
Name = "FormOrder";
StartPosition = FormStartPosition.CenterParent;
Text = "Заказ";
groupBoxListProducts.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxOrderPhone;
private TextBox textBoxOrderName;
private DateTimePicker dateTimePickerOrder;
private Label label4;
private GroupBox groupBoxListProducts;
private DataGridView dataGridViewProducts;
private Button buttonBack;
private Button ButtonSave;
private DataGridViewComboBoxColumn ColumnProduct;
private DataGridViewTextBoxColumn ColumnCount;
private DataGridViewTextBoxColumn ColumnPrice;
}
}

View File

@@ -0,0 +1,63 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormOrder : Form
{
private readonly IOrderRepository _orderRepository;
public FormOrder(IOrderRepository orderRepository, IProductRepository productRepository)
{
InitializeComponent();
_orderRepository = orderRepository ??
throw new ArgumentNullException(nameof(orderRepository));
ColumnProduct.DataSource = productRepository.ReadProducts();
ColumnProduct.DisplayMember = "Name";
ColumnProduct.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewProducts.RowCount < 2 || string.IsNullOrWhiteSpace(textBoxOrderName.Text) || string.IsNullOrWhiteSpace(textBoxOrderPhone.Text))
{
throw new Exception("Имеются незаполненные поля");
}
_orderRepository.CreateOrder(Order.CreateOpeartion(0, textBoxOrderName.Text, textBoxOrderPhone.Text, CreateListOrderProductsFromDataGrid()));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private List<OrderProducts> CreateListOrderProductsFromDataGrid()
{
var list = new List<OrderProducts>();
foreach (DataGridViewRow row in dataGridViewProducts.Rows)
{
if (row.Cells["ColumnProduct"].Value == null ||
row.Cells["ColumnCount"].Value == null ||
row.Cells["ColumnPrice"].Value == null)
{
continue;
}
list.Add(OrderProducts.CreateElement(0, Convert.ToInt32(row.Cells["ColumnProduct"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value), Convert.ToDecimal(row.Cells["ColumnPrice"].Value)));
}
return list.GroupBy(x => x.ProductId, x => new { x.Count, x.Price })
.Select(g => OrderProducts.CreateElement(0, g.Key, g.Sum(x => x.Count), g.Sum(x => x.Price))).ToList();
}
}

View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ColumnProduct.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnPrice.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnProduct.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnPrice.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1,118 @@
namespace ProjectConfectFactory.Forms
{
partial class FormOrders
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormOrders));
panel1 = new Panel();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewOrders = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewOrders).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 1;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewOrders
//
dataGridViewOrders.AllowUserToAddRows = false;
dataGridViewOrders.AllowUserToDeleteRows = false;
dataGridViewOrders.AllowUserToResizeColumns = false;
dataGridViewOrders.AllowUserToResizeRows = false;
dataGridViewOrders.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewOrders.BackgroundColor = Color.Bisque;
dataGridViewOrders.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewOrders.Dock = DockStyle.Fill;
dataGridViewOrders.GridColor = Color.Bisque;
dataGridViewOrders.Location = new Point(0, 0);
dataGridViewOrders.MultiSelect = false;
dataGridViewOrders.Name = "dataGridViewOrders";
dataGridViewOrders.ReadOnly = true;
dataGridViewOrders.RowHeadersVisible = false;
dataGridViewOrders.RowHeadersWidth = 51;
dataGridViewOrders.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewOrders.Size = new Size(657, 450);
dataGridViewOrders.TabIndex = 2;
//
// FormOrders
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewOrders);
Controls.Add(panel1);
MinimumSize = new Size(818, 497);
Name = "FormOrders";
StartPosition = FormStartPosition.CenterParent;
Text = "Заказы";
Load += FormOrders_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewOrders).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewOrders;
}
}

View File

@@ -0,0 +1,89 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormOrders : Form
{
private readonly IUnityContainer _container;
private readonly IOrderRepository _orderRepository;
public FormOrders(IUnityContainer container, IOrderRepository orderRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_orderRepository = orderRepository ??
throw new ArgumentNullException(nameof(orderRepository));
}
private void FormOrders_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormOrder>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_orderRepository.DeleteOrder(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewOrders.DataSource = _orderRepository.ReadOrder();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewOrders.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewOrders.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@@ -0,0 +1,219 @@
namespace ProjectConfectFactory.Forms
{
partial class FormProduct
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label2 = new Label();
textBoxProductName = new TextBox();
label1 = new Label();
numericUpDownProductPrice = new NumericUpDown();
label4 = new Label();
buttonBack = new Button();
ButtonSave = new Button();
groupBoxRecipe = new GroupBox();
dataGridViewRecipe = new DataGridView();
ColumnComponent = new DataGridViewComboBoxColumn();
ColumnCount = new DataGridViewTextBoxColumn();
label3 = new Label();
checkedListBoxProductType = new CheckedListBox();
((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).BeginInit();
groupBoxRecipe.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).BeginInit();
SuspendLayout();
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(43, 73);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 15;
label2.Text = "Наименование:";
//
// textBoxProductName
//
textBoxProductName.Location = new Point(195, 66);
textBoxProductName.Name = "textBoxProductName";
textBoxProductName.Size = new Size(182, 27);
textBoxProductName.TabIndex = 14;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(299, 20);
label1.Name = "label1";
label1.Size = new Size(78, 23);
label1.TabIndex = 16;
label1.Text = "Продукт:";
//
// numericUpDownProductPrice
//
numericUpDownProductPrice.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
numericUpDownProductPrice.Location = new Point(484, 66);
numericUpDownProductPrice.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
numericUpDownProductPrice.Name = "numericUpDownProductPrice";
numericUpDownProductPrice.Size = new Size(152, 27);
numericUpDownProductPrice.TabIndex = 20;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(407, 73);
label4.Name = "label4";
label4.Size = new Size(48, 20);
label4.TabIndex = 19;
label4.Text = "Цена:";
//
// buttonBack
//
buttonBack.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonBack.Location = new Point(435, 498);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 22;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSave.Location = new Point(129, 498);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 21;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// groupBoxRecipe
//
groupBoxRecipe.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
groupBoxRecipe.Controls.Add(dataGridViewRecipe);
groupBoxRecipe.Location = new Point(43, 242);
groupBoxRecipe.Name = "groupBoxRecipe";
groupBoxRecipe.Size = new Size(596, 230);
groupBoxRecipe.TabIndex = 23;
groupBoxRecipe.TabStop = false;
groupBoxRecipe.Text = "Рецепт:";
//
// dataGridViewRecipe
//
dataGridViewRecipe.BackgroundColor = Color.Bisque;
dataGridViewRecipe.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewRecipe.Columns.AddRange(new DataGridViewColumn[] { ColumnComponent, ColumnCount });
dataGridViewRecipe.Dock = DockStyle.Fill;
dataGridViewRecipe.Location = new Point(3, 23);
dataGridViewRecipe.Name = "dataGridViewRecipe";
dataGridViewRecipe.RowHeadersVisible = false;
dataGridViewRecipe.RowHeadersWidth = 51;
dataGridViewRecipe.Size = new Size(590, 204);
dataGridViewRecipe.TabIndex = 27;
//
// ColumnComponent
//
ColumnComponent.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnComponent.HeaderText = "Компонент";
ColumnComponent.MinimumWidth = 6;
ColumnComponent.Name = "ColumnComponent";
//
// ColumnCount
//
ColumnCount.HeaderText = "Кол-во";
ColumnCount.MinimumWidth = 6;
ColumnCount.Name = "ColumnCount";
ColumnCount.Width = 250;
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(43, 111);
label3.Name = "label3";
label3.Size = new Size(105, 20);
label3.TabIndex = 25;
label3.Text = "Тип продукта:";
//
// checkedListBoxProductType
//
checkedListBoxProductType.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
checkedListBoxProductType.FormattingEnabled = true;
checkedListBoxProductType.Location = new Point(43, 151);
checkedListBoxProductType.MultiColumn = true;
checkedListBoxProductType.Name = "checkedListBoxProductType";
checkedListBoxProductType.Size = new Size(596, 70);
checkedListBoxProductType.TabIndex = 28;
//
// FormProduct
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(691, 553);
Controls.Add(checkedListBoxProductType);
Controls.Add(label3);
Controls.Add(groupBoxRecipe);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(numericUpDownProductPrice);
Controls.Add(label4);
Controls.Add(label1);
Controls.Add(label2);
Controls.Add(textBoxProductName);
MinimumSize = new Size(709, 600);
Name = "FormProduct";
StartPosition = FormStartPosition.CenterParent;
Text = "Продукт";
((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).EndInit();
groupBoxRecipe.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label2;
private TextBox textBoxProductName;
private Label label1;
private NumericUpDown numericUpDownProductPrice;
private Label label4;
private Button buttonBack;
private Button ButtonSave;
private GroupBox groupBoxRecipe;
private Label label3;
private DataGridView dataGridViewRecipe;
private CheckedListBox checkedListBoxProductType;
private DataGridViewComboBoxColumn ColumnComponent;
private DataGridViewTextBoxColumn ColumnCount;
}
}

View File

@@ -0,0 +1,130 @@
using ProjectConfectFactory.Entities.Enums;
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormProduct : Form
{
private readonly IProductRepository _productRepository;
private int? _productId;
public FormProduct(IProductRepository productRepository, IComponentRepository componentRepository)
{
InitializeComponent();
_productRepository = productRepository ??
throw new ArgumentNullException(nameof(productRepository));
foreach (var elem in Enum.GetValues(typeof(ProductType)))
{
checkedListBoxProductType.Items.Add(elem);
}
ColumnComponent.DataSource = componentRepository.ReadComponents();
ColumnComponent.DisplayMember = "Name";
ColumnComponent.ValueMember = "Id";
}
public int Id
{
set
{
try
{
var product = _productRepository.ReadProductById(value);
if (product == null)
{
throw new InvalidDataException(nameof(product));
}
foreach (ProductType elem in Enum.GetValues(typeof(ProductType)))
{
if ((elem & product.ProductType) != 0)
{
checkedListBoxProductType.SetItemChecked(checkedListBoxProductType.Items.IndexOf(elem), true);
}
}
textBoxProductName.Text = product.Name;
numericUpDownProductPrice.Value = (decimal)product.Price;
_productId = value;
foreach (var elem in product.Recipe)
{
var row = dataGridViewRecipe.Rows[dataGridViewRecipe.Rows.Add()];
row.Cells["ColumnComponent"].Value = elem.ComponentId;
row.Cells["ColumnCount"].Value = elem.CountComponent;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewRecipe.RowCount < 1 || string.IsNullOrWhiteSpace(textBoxProductName.Text) ||
checkedListBoxProductType.CheckedItems.Count == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_productId.HasValue)
{
_productRepository.UpdateProduct(CreateProduct(_productId.Value));
}
else
{
_productRepository.CreateProduct(CreateProduct(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private List<Recipe> CreateListRecipeFromDataGrid()
{
var list = new List<Recipe>();
foreach (DataGridViewRow row in dataGridViewRecipe.Rows)
{
if (row.Cells["ColumnComponent"].Value == null ||
row.Cells["ColumnCount"].Value == null)
{
continue;
}
list.Add(Recipe.CreateElement(0, Convert.ToInt32(row.Cells["ColumnComponent"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value)));
}
return list;
}
private Product CreateProduct(int id)
{
ProductType productType = ProductType.None;
foreach (var elem in checkedListBoxProductType.CheckedItems)
{
productType |= (ProductType)elem;
}
return Product.CreateEntity(id, textBoxProductName.Text, productType, CreateListRecipeFromDataGrid(), Convert.ToInt32(numericUpDownProductPrice.Value));
}
}

View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ColumnComponent.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1,132 @@
namespace ProjectConfectFactory.Forms
{
partial class FormProducts
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormProducts));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewProducts = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(780, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 2;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewProducts
//
dataGridViewProducts.AllowUserToAddRows = false;
dataGridViewProducts.AllowUserToDeleteRows = false;
dataGridViewProducts.AllowUserToResizeColumns = false;
dataGridViewProducts.AllowUserToResizeRows = false;
dataGridViewProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewProducts.BackgroundColor = Color.Bisque;
dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewProducts.Dock = DockStyle.Fill;
dataGridViewProducts.GridColor = Color.Bisque;
dataGridViewProducts.Location = new Point(0, 0);
dataGridViewProducts.MultiSelect = false;
dataGridViewProducts.Name = "dataGridViewProducts";
dataGridViewProducts.ReadOnly = true;
dataGridViewProducts.RowHeadersVisible = false;
dataGridViewProducts.RowHeadersWidth = 51;
dataGridViewProducts.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewProducts.Size = new Size(780, 450);
dataGridViewProducts.TabIndex = 3;
//
// FormProducts
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(923, 450);
Controls.Add(dataGridViewProducts);
Controls.Add(panel1);
MinimumSize = new Size(941, 497);
Name = "FormProducts";
StartPosition = FormStartPosition.CenterParent;
Text = "Продукты";
Load += FormProducts_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewProducts;
}
}

View File

@@ -0,0 +1,110 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormProducts : Form
{
private readonly IUnityContainer _container;
private readonly IProductRepository _productRepository;
public FormProducts(IUnityContainer container, IProductRepository productRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_productRepository = productRepository ??
throw new ArgumentNullException(nameof(productRepository));
}
private void FormProducts_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormProduct>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_productRepository.DeleteProduct(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormProduct>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewProducts.DataSource = _productRepository.ReadProducts();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewProducts.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewProducts.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

@@ -0,0 +1,474 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@@ -0,0 +1,195 @@
namespace ProjectConfectFactory.Forms
{
partial class FormPurchase
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label4 = new Label();
dateTimePickerPruchase = new DateTimePicker();
label1 = new Label();
label2 = new Label();
comboBoxComponent = new ComboBox();
comboBoxSellerName = new ComboBox();
label3 = new Label();
buttonBack = new Button();
ButtonSave = new Button();
numericUpDownComponentCount = new NumericUpDown();
label5 = new Label();
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).BeginInit();
SuspendLayout();
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(37, 143);
label4.Name = "label4";
label4.Size = new Size(44, 20);
label4.TabIndex = 14;
label4.Text = "Дата:";
//
// dateTimePickerPruchase
//
dateTimePickerPruchase.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
dateTimePickerPruchase.Enabled = false;
dateTimePickerPruchase.Location = new Point(171, 136);
dateTimePickerPruchase.Name = "dateTimePickerPruchase";
dateTimePickerPruchase.Size = new Size(250, 27);
dateTimePickerPruchase.TabIndex = 13;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Location = new Point(37, 88);
label1.Name = "label1";
label1.Size = new Size(89, 20);
label1.TabIndex = 15;
label1.Text = "Поставщик:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Font = new Font("Segoe UI", 10F);
label2.Location = new Point(151, 27);
label2.Name = "label2";
label2.Size = new Size(86, 23);
label2.TabIndex = 16;
label2.Text = "Поставка:";
//
// comboBoxComponent
//
comboBoxComponent.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboBoxComponent.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxComponent.FormattingEnabled = true;
comboBoxComponent.Location = new Point(171, 187);
comboBoxComponent.Name = "comboBoxComponent";
comboBoxComponent.Size = new Size(250, 28);
comboBoxComponent.TabIndex = 17;
//
// comboBoxSellerName
//
comboBoxSellerName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboBoxSellerName.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSellerName.FormattingEnabled = true;
comboBoxSellerName.Location = new Point(171, 80);
comboBoxSellerName.Name = "comboBoxSellerName";
comboBoxSellerName.Size = new Size(250, 28);
comboBoxSellerName.TabIndex = 18;
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(37, 195);
label3.Name = "label3";
label3.Size = new Size(91, 20);
label3.TabIndex = 19;
label3.Text = "Компонент:";
//
// buttonBack
//
buttonBack.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonBack.Location = new Point(272, 299);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 27;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSave.Location = new Point(68, 299);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 26;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// numericUpDownComponentCount
//
numericUpDownComponentCount.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
numericUpDownComponentCount.Location = new Point(171, 245);
numericUpDownComponentCount.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
numericUpDownComponentCount.Name = "numericUpDownComponentCount";
numericUpDownComponentCount.Size = new Size(250, 27);
numericUpDownComponentCount.TabIndex = 28;
//
// label5
//
label5.AutoSize = true;
label5.BackColor = Color.Bisque;
label5.Location = new Point(37, 252);
label5.Name = "label5";
label5.Size = new Size(61, 20);
label5.TabIndex = 29;
label5.Text = "Кол-во:";
//
// FormPurchase
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(449, 355);
Controls.Add(label5);
Controls.Add(numericUpDownComponentCount);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label3);
Controls.Add(comboBoxSellerName);
Controls.Add(comboBoxComponent);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(label4);
Controls.Add(dateTimePickerPruchase);
Name = "FormPurchase";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставка";
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label4;
private DateTimePicker dateTimePickerPruchase;
private Label label1;
private Label label2;
private ComboBox comboBoxComponent;
private ComboBox comboBoxSellerName;
private Label label3;
private Button buttonBack;
private Button ButtonSave;
private NumericUpDown numericUpDownComponentCount;
private Label label5;
}
}

View File

@@ -0,0 +1,50 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
using System.ComponentModel;
namespace ProjectConfectFactory.Forms;
public partial class FormPurchase : Form
{
private readonly IPurchaseRepository _purchaseRepository;
public FormPurchase(IPurchaseRepository purchaseRepository,
ISellerRepository sellerRepository, IComponentRepository componentRepository)
{
InitializeComponent();
_purchaseRepository = purchaseRepository ?? throw new ArgumentNullException(nameof(purchaseRepository));
comboBoxSellerName.DataSource = sellerRepository.ReadSellers();
comboBoxSellerName.DisplayMember = "Name";
comboBoxSellerName.ValueMember = "Id";
comboBoxComponent.ValueMember = "ComponentId";
comboBoxComponent.DataSource = componentRepository.ReadComponents();
comboBoxComponent.DisplayMember = "Name";
comboBoxComponent.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (comboBoxSellerName.SelectedIndex < 0 || comboBoxComponent.SelectedIndex < 0)
{
throw new Exception("Имеются незаполненные поля");
}
_purchaseRepository.CreatePurchase(Purchase.CreateOpeartion(0, (int)comboBoxSellerName.SelectedValue!, (int)comboBoxComponent.SelectedValue!, (decimal) numericUpDownComponentCount.Value));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,103 @@
namespace ProjectConfectFactory.Forms
{
partial class FormPurchases
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panel1 = new Panel();
buttonAdd = new Button();
dataGridViewPurchases = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 2;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewPurchases
//
dataGridViewPurchases.AllowUserToAddRows = false;
dataGridViewPurchases.AllowUserToDeleteRows = false;
dataGridViewPurchases.AllowUserToResizeColumns = false;
dataGridViewPurchases.AllowUserToResizeRows = false;
dataGridViewPurchases.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewPurchases.BackgroundColor = Color.Bisque;
dataGridViewPurchases.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewPurchases.Dock = DockStyle.Fill;
dataGridViewPurchases.GridColor = Color.Bisque;
dataGridViewPurchases.Location = new Point(0, 0);
dataGridViewPurchases.MultiSelect = false;
dataGridViewPurchases.Name = "dataGridViewPurchases";
dataGridViewPurchases.ReadOnly = true;
dataGridViewPurchases.RowHeadersVisible = false;
dataGridViewPurchases.RowHeadersWidth = 51;
dataGridViewPurchases.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewPurchases.Size = new Size(657, 450);
dataGridViewPurchases.TabIndex = 3;
//
// FormPurchases
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewPurchases);
Controls.Add(panel1);
MinimumSize = new Size(818, 497);
Name = "FormPurchases";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставки";
Load += FormPurchases_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonAdd;
private DataGridView dataGridViewPurchases;
}
}

View File

@@ -0,0 +1,49 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormPurchases : Form
{
private readonly IUnityContainer _container;
private readonly IPurchaseRepository _purchaseRepository;
public FormPurchases(IUnityContainer container, IPurchaseRepository purchaseRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_purchaseRepository = purchaseRepository ??
throw new ArgumentNullException(nameof(purchaseRepository));
}
private void FormPurchases_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormPurchase>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewPurchases.DataSource = _purchaseRepository.ReadPurchases();
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,166 @@
namespace ProjectConfectFactory.Forms
{
partial class FormSeller
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
textBoxSellerName = new TextBox();
textBoxSellerPhone = new TextBox();
comboBoxSellerDelivTime = new ComboBox();
label1 = new Label();
label2 = new Label();
label3 = new Label();
label4 = new Label();
ButtonSellerSave = new Button();
ButtonSellerBack = new Button();
SuspendLayout();
//
// textBoxSellerName
//
textBoxSellerName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
textBoxSellerName.Location = new Point(230, 66);
textBoxSellerName.Name = "textBoxSellerName";
textBoxSellerName.Size = new Size(218, 27);
textBoxSellerName.TabIndex = 0;
//
// textBoxSellerPhone
//
textBoxSellerPhone.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
textBoxSellerPhone.Location = new Point(230, 130);
textBoxSellerPhone.Name = "textBoxSellerPhone";
textBoxSellerPhone.Size = new Size(218, 27);
textBoxSellerPhone.TabIndex = 1;
//
// comboBoxSellerDelivTime
//
comboBoxSellerDelivTime.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
comboBoxSellerDelivTime.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSellerDelivTime.FormattingEnabled = true;
comboBoxSellerDelivTime.Location = new Point(230, 189);
comboBoxSellerDelivTime.Name = "comboBoxSellerDelivTime";
comboBoxSellerDelivTime.Size = new Size(218, 28);
comboBoxSellerDelivTime.TabIndex = 2;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(172, 19);
label1.Name = "label1";
label1.Size = new Size(101, 23);
label1.TabIndex = 3;
label1.Text = "Поставщик:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(46, 73);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 4;
label2.Text = "Наименование:";
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(46, 137);
label3.Name = "label3";
label3.Size = new Size(72, 20);
label3.TabIndex = 5;
label3.Text = "Телефон:";
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(46, 197);
label4.Name = "label4";
label4.Size = new Size(104, 20);
label4.TabIndex = 6;
label4.Text = "Тип доставки:";
//
// ButtonSellerSave
//
ButtonSellerSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSellerSave.Location = new Point(71, 251);
ButtonSellerSave.Name = "ButtonSellerSave";
ButtonSellerSave.Size = new Size(94, 29);
ButtonSellerSave.TabIndex = 7;
ButtonSellerSave.Text = "Сохранить";
ButtonSellerSave.UseVisualStyleBackColor = true;
ButtonSellerSave.Click += ButtonSellerSave_Click;
//
// ButtonSellerBack
//
ButtonSellerBack.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
ButtonSellerBack.Location = new Point(315, 251);
ButtonSellerBack.Name = "ButtonSellerBack";
ButtonSellerBack.Size = new Size(94, 29);
ButtonSellerBack.TabIndex = 8;
ButtonSellerBack.Text = "Отмена";
ButtonSellerBack.UseVisualStyleBackColor = true;
ButtonSellerBack.Click += ButtonSellerBack_Click;
//
// FormSeller
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(482, 303);
Controls.Add(ButtonSellerBack);
Controls.Add(ButtonSellerSave);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(comboBoxSellerDelivTime);
Controls.Add(textBoxSellerPhone);
Controls.Add(textBoxSellerName);
MinimumSize = new Size(500, 350);
Name = "FormSeller";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставщик";
ResumeLayout(false);
PerformLayout();
}
#endregion
private TextBox textBoxSellerName;
private TextBox textBoxSellerPhone;
private ComboBox comboBoxSellerDelivTime;
private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Button ButtonSellerSave;
private Button ButtonSellerBack;
}
}

View File

@@ -0,0 +1,77 @@
using ProjectConfectFactory.Repositories;
using ProjectConfectFactory.Entities.Enums;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Forms;
public partial class FormSeller : Form
{
private readonly ISellerRepository _sellerRepository;
private int? _sellerId;
public int Id
{
set
{
try
{
var seller = _sellerRepository.ReadSellerById(value);
if (seller == null)
{
throw new InvalidDataException(nameof(seller));
}
textBoxSellerName.Text = seller.Name;
textBoxSellerPhone.Text = seller.Phone;
comboBoxSellerDelivTime.SelectedItem = seller.DeliveryTime;
_sellerId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormSeller(ISellerRepository sellerRepository)
{
InitializeComponent();
_sellerRepository = sellerRepository ??
throw new ArgumentNullException(nameof(sellerRepository));
comboBoxSellerDelivTime.DataSource = Enum.GetValues(typeof(DeliveryType));
}
private void ButtonSellerSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxSellerName.Text) || string.IsNullOrWhiteSpace(textBoxSellerPhone.Text) || comboBoxSellerDelivTime.SelectedIndex < 1)
{
throw new Exception("Имеются незаполненные поля");
}
if (_sellerId.HasValue)
{
_sellerRepository.UpdateSeller(CreateSeller(_sellerId.Value));
}
else
{
_sellerRepository.CreateSeller(CreateSeller(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonSellerBack_Click(object sender, EventArgs e) => Close();
private Seller CreateSeller(int id) => Seller.CreateEntity(id, textBoxSellerName.Text, textBoxSellerPhone.Text,
(DeliveryType)comboBoxSellerDelivTime.SelectedItem!);
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,132 @@
namespace ProjectConfectFactory.Forms
{
partial class FormSellers
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSellers));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewSellers = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewSellers).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(789, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 453);
panel1.TabIndex = 0;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewSellers
//
dataGridViewSellers.AllowUserToAddRows = false;
dataGridViewSellers.AllowUserToDeleteRows = false;
dataGridViewSellers.AllowUserToResizeColumns = false;
dataGridViewSellers.AllowUserToResizeRows = false;
dataGridViewSellers.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewSellers.BackgroundColor = Color.Bisque;
dataGridViewSellers.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewSellers.Dock = DockStyle.Fill;
dataGridViewSellers.GridColor = Color.Bisque;
dataGridViewSellers.Location = new Point(0, 0);
dataGridViewSellers.MultiSelect = false;
dataGridViewSellers.Name = "dataGridViewSellers";
dataGridViewSellers.ReadOnly = true;
dataGridViewSellers.RowHeadersVisible = false;
dataGridViewSellers.RowHeadersWidth = 51;
dataGridViewSellers.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewSellers.Size = new Size(789, 453);
dataGridViewSellers.TabIndex = 1;
//
// FormSellers
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(932, 453);
Controls.Add(dataGridViewSellers);
Controls.Add(panel1);
MinimumSize = new Size(950, 500);
Name = "FormSellers";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставщики";
Load += FormSellers_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewSellers).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private DataGridView dataGridViewSellers;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
}
}

View File

@@ -0,0 +1,109 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormSellers : Form
{
private readonly IUnityContainer _container;
private readonly ISellerRepository _sellerRepository;
public FormSellers(IUnityContainer container, ISellerRepository sellerRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_sellerRepository = sellerRepository ??
throw new ArgumentNullException(nameof(sellerRepository));
}
private void FormSellers_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormSeller>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_sellerRepository.DeleteSeller(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormSeller>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewSellers.DataSource = _sellerRepository.ReadSellers();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewSellers.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewSellers.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

@@ -0,0 +1,474 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@@ -0,0 +1,121 @@
namespace ProjectConfectFactory.Forms;
partial class OrderDistributionReport
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
ButtonSelectFileName = new Button();
labelFileName = new Label();
ButtonCreate = new Button();
label2 = new Label();
npgsqlDataAdapter1 = new Npgsql.NpgsqlDataAdapter();
dateTimePickerODR = new DateTimePicker();
SuspendLayout();
//
// ButtonSelectFileName
//
ButtonSelectFileName.Location = new Point(12, 21);
ButtonSelectFileName.Name = "ButtonSelectFileName";
ButtonSelectFileName.Size = new Size(94, 29);
ButtonSelectFileName.TabIndex = 0;
ButtonSelectFileName.Text = "Выбрать";
ButtonSelectFileName.UseVisualStyleBackColor = true;
ButtonSelectFileName.Click += ButtonSelectFileName_Click;
//
// labelFileName
//
labelFileName.AutoSize = true;
labelFileName.BackColor = Color.Bisque;
labelFileName.Location = new Point(190, 21);
labelFileName.Name = "labelFileName";
labelFileName.Size = new Size(45, 20);
labelFileName.TabIndex = 1;
labelFileName.Text = "Файл";
//
// ButtonCreate
//
ButtonCreate.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
ButtonCreate.Location = new Point(94, 149);
ButtonCreate.Name = "ButtonCreate";
ButtonCreate.Size = new Size(209, 29);
ButtonCreate.TabIndex = 4;
ButtonCreate.Text = "Сформировать";
ButtonCreate.UseVisualStyleBackColor = true;
ButtonCreate.Click += ButtonCreate_Click;
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(23, 88);
label2.Name = "label2";
label2.Size = new Size(44, 20);
label2.TabIndex = 2;
label2.Text = "Дата:";
//
// npgsqlDataAdapter1
//
npgsqlDataAdapter1.DeleteCommand = null;
npgsqlDataAdapter1.InsertCommand = null;
npgsqlDataAdapter1.SelectCommand = null;
npgsqlDataAdapter1.UpdateCommand = null;
//
// dateTimePickerODR
//
dateTimePickerODR.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
dateTimePickerODR.Location = new Point(119, 83);
dateTimePickerODR.Name = "dateTimePickerODR";
dateTimePickerODR.Size = new Size(250, 27);
dateTimePickerODR.TabIndex = 5;
//
// OrderDistributionReport
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(402, 203);
Controls.Add(dateTimePickerODR);
Controls.Add(ButtonCreate);
Controls.Add(label2);
Controls.Add(labelFileName);
Controls.Add(ButtonSelectFileName);
MinimumSize = new Size(420, 250);
Name = "OrderDistributionReport";
Text = "Востребованность продуктов";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button ButtonSelectFileName;
private Label labelFileName;
private Button ButtonCreate;
private Label label2;
private Npgsql.NpgsqlDataAdapter npgsqlDataAdapter1;
private DateTimePicker dateTimePickerODR;
}

View File

@@ -0,0 +1,62 @@

using ProjectConfectFactory.Reports;
using System.Windows.Forms;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class OrderDistributionReport : Form
{
private string _fileName = string.Empty;
private readonly IUnityContainer _container;
public OrderDistributionReport(IUnityContainer container)
{
InitializeComponent();
_container = container ?? throw new ArgumentNullException(nameof(container));
}
private void ButtonSelectFileName_Click(object sender, EventArgs e)
{
var sfd = new SaveFileDialog()
{
Filter = "Pdf Files | *.pdf"
};
if (sfd.ShowDialog() == DialogResult.OK)
{
_fileName = sfd.FileName;
labelFileName.Text = Path.GetFileName(_fileName);
}
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(_fileName))
{
throw new Exception("Отсутствует имя файла для отчета");
}
if
(_container.Resolve<ChartReport>().CreateChart(_fileName, dateTimePickerODR.Value))
{
MessageBox.Show("Документ сформирован",
"Формирование документа",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах",
"Формирование документа",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при создании очета",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="npgsqlDataAdapter1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -1,3 +1,14 @@
using ProjectConfectFactory.Repositories.Implementations;
using ProjectConfectFactory.Repositories;
using Unity;
using Unity.Lifetime;
using ConfectFactory.Repositories.Implementations;
using ConfectFactory.Repositories;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Serilog;
using Unity.Microsoft.Logging;
namespace ProjectConfectFactory
{
internal static class Program
@@ -11,7 +22,35 @@ namespace ProjectConfectFactory
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
Application.Run(CreateContainer().Resolve<FormConFactory>());
}
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.AddExtension(new LoggingExtension(CreateLoggerFactory()));
container.RegisterType<IOrderRepository, OrderRepository>(new TransientLifetimeManager());
container.RegisterType<IProductRepository, MyProductRepository>(new TransientLifetimeManager());
container.RegisterType<IComponentRepository, ComponentRepository>(new TransientLifetimeManager());
container.RegisterType<IPurchaseRepository, PurchaseRepository>(new TransientLifetimeManager());
container.RegisterType<ISellerRepository, SellerRepository>(new TransientLifetimeManager());
container.RegisterType<IConnectionString, ConnectionString>(new TransientLifetimeManager());
return container;
}
private static LoggerFactory CreateLoggerFactory()
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration()
.ReadFrom.Configuration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build())
.CreateLogger());
return loggerFactory;
}
}
}

View File

@@ -8,4 +8,43 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="9.0.2" />
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
<PackageReference Include="Serilog" Version="4.2.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.9.0" />
<PackageReference Include="Unity" Version="5.11.10" />
<PackageReference Include="Unity.Microsoft.Logging" Version="5.11.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,83 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ProjectConfectFactory.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом 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() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectConfectFactory.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap add {
get {
object obj = ResourceManager.GetObject("add", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Фон {
get {
object obj = ResourceManager.GetObject("Фон", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Фон" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Фон.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="add" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -0,0 +1,50 @@
using Microsoft.Extensions.Logging;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Reports;
internal class ChartReport
{
private readonly IOrderRepository _orderRepository;
private readonly ILogger<ChartReport> _logger;
public ChartReport(IOrderRepository orderRepository, ILogger<ChartReport> logger)
{
_orderRepository = orderRepository ??
throw new ArgumentNullException(nameof(orderRepository));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public bool CreateChart(string filePath, DateTime dateTime)
{
try
{
new PdfBuilder(filePath)
.AddHeader("Заказы")
.AddPieChart("Купленные продукты", GetData(dateTime))
.Build();
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при формировании документа");
return false;
}
}
private List<(string Caption, double Value)> GetData(DateTime dateTime)
{
return _orderRepository
.ReadOrder()
.Where(x => x.DateTime.Date == dateTime.Date)
.SelectMany(x => x.OrderProducts)
.GroupBy(x => x.ProductId, (key, group) => new
{
ProductId = key,
TotalCount = group.Sum(x => x.Count)
})
.Select(x => ($"{x.ProductId}", (double)x.TotalCount))
.ToList();
}
}

View File

@@ -0,0 +1,99 @@
using Microsoft.Extensions.Logging;
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
using System.Data;
namespace ProjectConfectFactory.Reports;
internal class DocReport
{
private readonly IComponentRepository _componentRepository;
private readonly IProductRepository _productRepository;
private readonly ISellerRepository _sellerRepository;
private readonly ILogger<DocReport> _logger;
public DocReport(IProductRepository productRepository, IComponentRepository componentRepository,
ISellerRepository sellerRepository, ILogger<DocReport> logger)
{
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
_componentRepository = componentRepository ?? throw new ArgumentNullException(nameof(componentRepository));
_sellerRepository = sellerRepository ?? throw new ArgumentNullException(nameof(sellerRepository));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public bool CreateDoc(string filePath, bool includeProduct, bool
includeComponent, bool includeSeller)
{
try
{
var builder = new WordBuilder(filePath)
.AddHeader("Документ со справочниками");
if (includeProduct)
{
builder.AddParagraph("Продукты")
.AddTable([2400, 2400, 2400, 1200], GetProduct());
}
if (includeComponent)
{
builder.AddParagraph("Компоненты")
.AddTable([2400, 1200, 2400], GetComponent());
}
if (includeSeller)
{
builder.AddParagraph("Поставщики")
.AddTable([2400, 2400, 1200], GetSeller());
}
builder.Build();
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при формировании документа");
return false;
}
}
private List<string[]> GetProduct()
{
var product = _productRepository.ReadProducts();
var header = new[] { "Наименование", "Тип продукта", "Рецепт", "Цена" };
var dataRows = product.Select(product => new[]
{
product.Name,
product.ProductType.ToString(),
string.Join(", ", product.Recipe.Select(r => $"{r.ComponentId} ({r.CountComponent})")),
product.Price.ToString() }).ToList();
return new List<string[]> { header }.Concat(dataRows).ToList();
}
private List<string[]> GetComponent()
{
return [
["Наименование", "Единица измерения", "Количество на складе"],
.. _componentRepository
.ReadComponents()
.Select(x => new string[] { x.Name, x.Unit, x.Count.ToString()}),
];
}
private List<string[]> GetSeller()
{
return [
["Наименование", "Телефон", "Тип доставки"],
.. _sellerRepository
.ReadSellers()
.Select(x => new string[] { x.Name, x.Phone, x.DeliveryTime.ToString() }),
];
}
}

View File

@@ -0,0 +1,342 @@
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;
namespace ProjectConfectFactory.Reports;
internal class ExcelBuilder
{
private readonly string _filePath;
private readonly SheetData _sheetData;
private readonly MergeCells _mergeCells;
private readonly Columns _columns;
private uint _rowIndex = 0;
public ExcelBuilder(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
throw new ArgumentNullException(nameof(filePath));
}
if (File.Exists(filePath))
{
File.Delete(filePath);
}
_filePath = filePath;
_sheetData = new SheetData();
_mergeCells = new MergeCells();
_columns = new Columns();
_rowIndex = 1;
}
public ExcelBuilder AddHeader(string header, int startIndex, int count)
{
CreateCell(startIndex, _rowIndex, header, StyleIndex.BoldTextWithoutBorder);
for (int i = startIndex + 1; i < startIndex + count; ++i)
{
CreateCell(i, _rowIndex, "",StyleIndex.SimpleTextWithoutBorder);
}
_mergeCells.Append(new MergeCell()
{
Reference =
new
StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}")
});
_rowIndex++;
return this;
}
public ExcelBuilder AddParagraph(string text, int columnIndex)
{
CreateCell(columnIndex, _rowIndex++, text, StyleIndex.SimpleTextWithoutBorder);
return this;
}
public ExcelBuilder AddTable(int[] columnsWidths, List<string[]> data)
{
if (columnsWidths == null || columnsWidths.Length == 0)
{
throw new ArgumentNullException(nameof(columnsWidths));
}
if (data == null || data.Count == 0)
{
throw new ArgumentNullException(nameof(data));
}
if (data.Any(x => x.Length != columnsWidths.Length))
{
throw new InvalidOperationException("widths.Length != data.Length");
}
uint counter = 1;
int coef = 2;
_columns.Append(columnsWidths.Select(x => new Column
{
Min = counter,
Max = counter++,
Width = x * coef,
CustomWidth = true
}));
// Добавление заголовка
for (var j = 0; j < data.First().Length; ++j)
{
CreateCell(j, _rowIndex, data.First()[j], StyleIndex.BoldTextWithBorder);
}
_rowIndex++;
// Добавление основных данных
for (var i = 1; i < data.Count - 1; ++i)
{
for (var j = 0; j < data[i].Length; ++j)
{
CreateCell(j, _rowIndex, data[i][j], StyleIndex.SimpleTextWithBorder);
}
_rowIndex++;
}
// Добавление итоговой строки
for (var j = 0; j < data.Last().Length; ++j)
{
CreateCell(j, _rowIndex, data.Last()[j], StyleIndex.BoldTextWithBorder);
}
_rowIndex++;
return this;
}
public void Build()
{
using var spreadsheetDocument = SpreadsheetDocument.Create(_filePath,
SpreadsheetDocumentType.Workbook);
var workbookpart = spreadsheetDocument.AddWorkbookPart();
GenerateStyle(workbookpart);
workbookpart.Workbook = new Workbook();
var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet();
if (_columns.HasChildren)
{
worksheetPart.Worksheet.Append(_columns);
}
worksheetPart.Worksheet.Append(_sheetData);
var sheets =
spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets());
var sheet = new Sheet()
{
Id =
spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "Лист 1"
};
sheets.Append(sheet);
if (_mergeCells.HasChildren)
{
worksheetPart.Worksheet.InsertAfter(_mergeCells,
worksheetPart.Worksheet.Elements<SheetData>().First());
}
}
private static void GenerateStyle(WorkbookPart workbookPart)
{
var workbookStylesPart =
workbookPart.AddNewPart<WorkbookStylesPart>();
workbookStylesPart.Stylesheet = new Stylesheet();
var fonts = new Fonts()
{
Count = 2,
KnownFonts =
BooleanValue.FromBoolean(true)
};
fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
{
FontSize = new FontSize() { Val = 11 },
FontName = new FontName() { Val = "Calibri" },
FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
FontScheme = new FontScheme()
{
Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor)
}
});
// TODO добавить шрифт с жирным
fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
{
FontSize = new FontSize() { Val = 11 },
FontName = new FontName() { Val = "Calibri" },
FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
FontScheme = new FontScheme()
{
Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor)
},
Bold = new Bold() { Val = true }
});
workbookStylesPart.Stylesheet.Append(fonts);
// Default Fill
var fills = new Fills() { Count = 1 };
fills.Append(new Fill
{
PatternFill = new PatternFill()
{
PatternType = new
EnumValue<PatternValues>(PatternValues.None)
}
});
workbookStylesPart.Stylesheet.Append(fills);
// Default Border
var borders = new Borders() { Count = 2 };
borders.Append(new Border
{
LeftBorder = new LeftBorder(),
RightBorder = new RightBorder(),
TopBorder = new TopBorder(),
BottomBorder = new BottomBorder(),
DiagonalBorder = new DiagonalBorder()
});
// TODO добавить настройку с границами
borders.Append(new Border
{
LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin },
RightBorder = new RightBorder() { Style = BorderStyleValues.Thin },
TopBorder = new TopBorder() { Style = BorderStyleValues.Thin },
BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin },
DiagonalBorder = new DiagonalBorder()
});
workbookStylesPart.Stylesheet.Append(borders);
// Default cell format and a date cell format
var cellFormats = new CellFormats() { Count = 4 };
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 0,
BorderId = 0,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Left,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
// TODO дополнить форматы
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 0,
BorderId = 1,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Right,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 1,
BorderId = 0,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Center,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 1,
BorderId = 1,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Center,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
workbookStylesPart.Stylesheet.Append(cellFormats);
}
private enum StyleIndex
{
// TODO дополнить стили
SimpleTextWithoutBorder = 0,
SimpleTextWithBorder = 1,
BoldTextWithoutBorder = 2,
BoldTextWithBorder = 3,
}
private void CreateCell(int columnIndex, uint rowIndex, string text,
StyleIndex styleIndex)
{
var columnName = GetExcelColumnName(columnIndex);
var cellReference = columnName + rowIndex;
var row = _sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex!
== rowIndex);
if (row == null)
{
row = new Row() { RowIndex = rowIndex };
_sheetData.Append(row);
}
var newCell = row.Elements<Cell>()
.FirstOrDefault(c => c.CellReference != null &&
c.CellReference.Value == columnName + rowIndex);
if (newCell == null)
{
Cell? refCell = null;
foreach (Cell cell in row.Elements<Cell>())
{
if (cell.CellReference?.Value != null &&
cell.CellReference.Value.Length == cellReference.Length)
{
if (string.Compare(cell.CellReference.Value,
cellReference, true) > 0)
{
refCell = cell;
break;
}
}
}
newCell = new Cell() { CellReference = cellReference };
row.InsertBefore(newCell, refCell);
}
newCell.CellValue = new CellValue(text);
newCell.DataType = CellValues.String;
newCell.StyleIndex = (uint)styleIndex;
}
private static string GetExcelColumnName(int columnNumber)
{
columnNumber += 1;
int dividend = columnNumber;
string columnName = string.Empty;
int modulo;
while (dividend > 0)
{
modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo).ToString() +
columnName;
dividend = (dividend - modulo) / 26;
}
return columnName;
}
}

View File

@@ -0,0 +1,76 @@
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Shapes.Charts;
using MigraDoc.Rendering;
using System.Text;
namespace ProjectConfectFactory.Reports;
internal class PdfBuilder
{
private readonly string _filePath;
private readonly Document _document;
public PdfBuilder(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
throw new ArgumentNullException(nameof(filePath));
}
if (File.Exists(filePath))
{
File.Delete(filePath);
}
_filePath = filePath;
_document = new Document();
DefineStyles();
}
public PdfBuilder AddHeader(string header)
{
_document.AddSection().AddParagraph(header, "NormalBold");
return this;
}
public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data)
{
if (data == null || data.Count == 0)
{
return this;
}
var chart = new Chart(ChartType.Pie2D);
var series = chart.SeriesCollection.AddSeries();
series.Add(data.Select(x => x.Value).ToArray());
var xseries = chart.XValues.AddXSeries();
xseries.Add(data.Select(x => x.Caption).ToArray());
chart.DataLabel.Type = DataLabelType.Percent;
chart.DataLabel.Position = DataLabelPosition.OutsideEnd;
chart.Width = Unit.FromCentimeter(16);
chart.Height = Unit.FromCentimeter(12);
chart.TopArea.AddParagraph(title);
chart.XAxis.MajorTickMark = TickMarkType.Outside;
chart.YAxis.MajorTickMark = TickMarkType.Outside;
chart.YAxis.HasMajorGridlines = true;
chart.PlotArea.LineFormat.Width = 1;
chart.PlotArea.LineFormat.Visible = true;
chart.TopArea.AddLegend();
_document.LastSection.Add(chart);
return this;
}
public void Build()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var renderer = new PdfDocumentRenderer(true)
{
Document = _document
};
renderer.RenderDocument();
renderer.PdfDocument.Save(_filePath);
}
private void DefineStyles()
{
var headerStyle = _document.Styles.AddStyle("NormalBold", "Normal");
headerStyle.Font.Bold = true;
headerStyle.Font.Size = 14;
}
}

View File

@@ -0,0 +1,84 @@
using Microsoft.Extensions.Logging;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Reports;
internal class TableReport
{
private readonly IOrderRepository _orderRepository;
private readonly IPurchaseRepository _purchaseRepository;
private readonly ILogger<TableReport> _logger;
public TableReport(IOrderRepository orderRepository,IPurchaseRepository purchaseRepository,
ILogger<TableReport> logger)
{
_orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
_purchaseRepository = purchaseRepository ?? throw new ArgumentNullException(nameof(purchaseRepository));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
internal static readonly string[] item = ["Поставщик", "Дата", "Количество купленного компонента", "Продукт", "Количество купленного продукта"];
public bool CreateTable(string filePath, int ComponentId, DateTime startDate, DateTime endDate)
{
try
{
new ExcelBuilder(filePath)
.AddHeader("Сводка по компонентам и проудктам", 0, 5)
.AddParagraph("за период", 0)
.AddTable([10, 10, 15, 10, 15], GetData(ComponentId, startDate, endDate))
.Build();
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при формировании документа");
return false;
}
}
private List<string[]> GetData(int componentId, DateTime startDate, DateTime endDate)
{
{
var data =
_purchaseRepository
.ReadPurchases()
.Where(x => x.DateTime >= startDate && x.DateTime <= endDate && x.ComponentId == componentId)
.Select(x => new
{
SellerId = (int?)x.SellerId,
Date = (DateTime?)x.DateTime,
CountIn = (int?)x.Count,
ProductId = (int?)null,
CountOut = (int?)null
}).Union(
_orderRepository
.ReadOrder()
.Where(x => x.DateTime >= startDate && x.DateTime <= endDate)
.Select(x => new {
SellerId = (int?)null,
Date = (DateTime?)x.DateTime,
CountIn = (int?)null,
ProductId = (int?)x.OrderProducts.FirstOrDefault()?.ProductId,
CountOut = (int?)x.OrderProducts.FirstOrDefault()?.Count
}))
.OrderBy(x => x.Date);
return new List<string[]>() { item }
.Union(
data.Select(x => new string[] {
x.SellerId.ToString(),
x.Date.ToString(),
x.CountIn.ToString(),
x.ProductId.ToString(),
x.CountOut.ToString()
}))
.Union(
[["Всего", "", data.Sum(x => x.CountIn).ToString(), "" ,data.Sum(x=> x.CountOut).ToString()]])
.ToList();
}
}
}

View File

@@ -0,0 +1,139 @@
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Packaging;
namespace ProjectConfectFactory.Reports;
public class WordBuilder
{
private readonly string _filePath;
private readonly Document _document;
private readonly Body _body;
public WordBuilder(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
throw new ArgumentNullException(nameof(filePath));
}
if (File.Exists(filePath))
{
File.Delete(filePath);
}
_filePath = filePath;
_document = new Document();
_body = _document.AppendChild(new Body());
}
public WordBuilder AddHeader(string header)
{
var paragraph = _body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
var runProperties = run.AppendChild(new RunProperties());
runProperties.AppendChild(new Bold());
run.AppendChild(new Text(header));
return this;
}
public WordBuilder AddParagraph(string text)
{
var paragraph = _body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
var runProperties = run.AppendChild(new RunProperties());
runProperties.AppendChild(new Bold());
run.AppendChild(new Text(text));
return this;
}
public WordBuilder AddTable(int[] widths, List<string[]> data)
{
if (widths == null || widths.Length == 0)
{
throw new ArgumentNullException(nameof(widths));
}
if (data == null || data.Count == 0)
{
throw new ArgumentNullException(nameof(data));
}
if (data.Any(x => x.Length != widths.Length))
{
throw new InvalidOperationException("widths.Length != data.Length");
}
var table = new Table();
table.AppendChild(new TableProperties(
new TableBorders(
new TopBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder()
{
Val = new
EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}
)
));
// Заголовок
var tr = new TableRow();
for (var j = 0; j < widths.Length; ++j)
{
tr.Append(new TableCell(
new TableCellProperties(new TableCellWidth()
{
Width = widths[j].ToString()
}),
new Paragraph(new Run(new RunProperties(new Bold()), new
Text(data.First()[j])))));
}
table.Append(tr);
// Данные
table.Append(data.Skip(1).Select(x =>
new TableRow(x.Select(y => new TableCell(new Paragraph(new
Run(new Text(y))))))));
_body.Append(table);
return this;
}
public void Build()
{
using var wordDocument = WordprocessingDocument.Create(_filePath,
WordprocessingDocumentType.Document);
var mainPart = wordDocument.AddMainDocumentPart();
mainPart.Document = _document;
}
}

View File

@@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface IComponentRepository
{
IEnumerable<Component> ReadComponents();
Component ReadComponentById(int id);
void CreateComponent(Component component);
void UpdateComponent(Component component);
void DeleteComponent(int id);
}

View File

@@ -0,0 +1,7 @@
namespace ConfectFactory.Repositories
{
public interface IConnectionString
{
string ConnectionString { get; }
}
}

View File

@@ -0,0 +1,11 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface IOrderRepository
{
IEnumerable<Order> ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null);
void CreateOrder(Order order);
void DeleteOrder(int id);
}

View File

@@ -0,0 +1,23 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Entities.Enums;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories;
public interface IProductRepository
{
void CreateProduct(Product product);
void UpdateProduct(Product product);
Product ReadProductById(int id);
IEnumerable<Product> ReadProducts();
void DeleteProduct(int id);
}

View File

@@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories;
public interface IPurchaseRepository
{
IEnumerable<Purchase> ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null, int? Count = null);
void CreatePurchase(Purchase purchase);
}

View File

@@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface ISellerRepository
{
void CreateSeller(Seller seller);
void DeleteSeller(int id);
Seller ReadSellerById(int id);
IEnumerable<Seller> ReadSellers();
void UpdateSeller(Seller seller);
}

View File

@@ -0,0 +1,132 @@
using ConfectFactory.Repositories;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories.Implementations;
public class ComponentRepository : IComponentRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<ComponentRepository> _logger;
public ComponentRepository(IConnectionString connectionString, ILogger<ComponentRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateComponent(Component component)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(component));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryInsert = @"
INSERT INTO Components (Name, Unit, Count)
VALUES (@Name, @Unit, @Count)";
connection.Execute(queryInsert, component);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteComponent(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryDelete = @"
DELETE FROM Components
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Component ReadComponentById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var querySelect = @"
SELECT * FROM Components
WHERE Id=@id";
var component = connection.QueryFirst<Component>(querySelect, new
{
id
});
_logger.LogDebug("Найденный объект: {json}",
JsonConvert.SerializeObject(component));
return component;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Component> ReadComponents()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var querySelect = "SELECT * FROM Components";
var components = connection.Query<Component>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(components));
return components;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public void UpdateComponent(Component component)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(component));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryUpdate = @"
UPDATE Components
SET
Name=@Name,
Unit=@Unit,
Count=@Count
WHERE Id=@Id";
connection.Execute(queryUpdate, component);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
}

View File

@@ -0,0 +1,7 @@

namespace ConfectFactory.Repositories.Implementations;
public class ConnectionString : IConnectionString
{
string IConnectionString.ConnectionString => "host=localhost;port=5432;database=con_factory;username=postgres;password=postgres";
}

View File

@@ -0,0 +1,168 @@
using ConfectFactory.Entities;
using ConfectFactory.Repositories;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories.Implementations;
public class MyProductRepository : IProductRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<MyProductRepository> _logger;
public MyProductRepository(IConnectionString connectionString, ILogger<MyProductRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateProduct(Product product)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(product));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryInsert = @"
INSERT INTO Products (Name, ProductType, Price)
VALUES (@Name, @ProductType, @Price);
SELECT MAX(Id) FROM Products";
var productId =
connection.QueryFirst<int>(queryInsert, product, transaction);
var querySubInsert = @"
INSERT INTO Recipe (productId, ComponentId, CountComponent)
VALUES (@productId,@ComponentId, @CountComponent)";
foreach (var elem in product.Recipe)
{
connection.Execute(querySubInsert, new
{
productId,
elem.ComponentId,
elem.CountComponent
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteProduct(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Products
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Product ReadProductById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT p.*, pc.ComponentId, pc.CountComponent FROM Products p
INNER JOIN Recipe pc ON pc.ProductId = p.Id
WHERE p.Id=@id";
var product = connection.Query<TempRecipe>(querySelect, new { id });
_logger.LogDebug("Найденный объект: {json}",
JsonConvert.SerializeObject(product));
return product.GroupBy(x => x.Id, y => y,
(key, value) => Product.CreateEntity(value.First(),
value.Select(z => Recipe.
CreateElement(0, z.ComponentId, z.CountComponent)))).ToList().First();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Product> ReadProducts()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT p.*, pc.ComponentId, pc.CountComponent FROM Products p
INNER JOIN Recipe pc ON pc.ProductId = p.Id";
var products = connection.Query<TempRecipe>(querySelect);
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(products));
return products.GroupBy(x => x.Id, y => y,
(key, value) => Product.CreateEntity(value.First(),
value.Select(z => Recipe.
CreateElement(0, z.ComponentId, z.CountComponent)))).ToList();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public void UpdateProduct(Product product)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}",
JsonConvert.SerializeObject(product));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryUpdate = @"
UPDATE Products
SET
Name=@Name,
ProductType=@ProductType,
Price=@Price
WHERE Id=@Id;
DELETE FROM Recipe
WHERE ProductId=@Id";
connection.Execute(queryUpdate, product);
var querySubInsert = @"
INSERT INTO Recipe (ProductId, ComponentId, CountComponent)
VALUES (@Id,@ComponentId, @CountComponent)";
foreach (var elem in product.Recipe)
{
connection.Execute(querySubInsert, new
{
product.Id,
elem.ComponentId,
elem.CountComponent
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
}

View File

@@ -0,0 +1,102 @@
using ConfectFactory.Repositories;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories.Implementations;
public class OrderRepository : IOrderRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<OrderRepository> _logger;
public OrderRepository(IConnectionString connectionString,
ILogger<OrderRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateOrder(Order order)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}",
JsonConvert.SerializeObject(order));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryInsert = @"
INSERT INTO Orders (Name,Phone,DateTime)
VALUES (@Name,@Phone, @DateTime);
SELECT MAX(Id) FROM Orders";
var orderId = connection.QueryFirst<int>(queryInsert, order, transaction);
var querySubInsert = @"
INSERT INTO OrderProduct (OrderId, ProductId, Count, Price)
VALUES (@OrderId,@ProductId, @Count, @Price)";
foreach (var elem in order.OrderProducts)
{
connection.Execute(querySubInsert, new
{
orderId,
elem.ProductId,
elem.Count,
elem.Price
},
transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteOrder(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Orders
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public IEnumerable<Order> ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null)
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT o.*, orr.ProductId, orr.Count, orr.Price FROM orders o
INNER JOIN orderProduct orr ON orr.OrderId = o.Id";
var orders =
connection.Query<TempOrderProducts>(querySelect);
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(orders));
return orders.GroupBy(x => x.Id, y => y,
(key, value) =>
Order.CreateOpeartion(value.First(),
value.Select(z => OrderProducts.CreateElement(0, z.ProductId, z.Count,z.Price)))).ToList();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@@ -0,0 +1,60 @@
using ConfectFactory.Repositories;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories.Implementations;
public class PurchaseRepository : IPurchaseRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<PurchaseRepository> _logger;
public PurchaseRepository(IConnectionString connectionString, ILogger<PurchaseRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreatePurchase(Purchase purchase)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}",
JsonConvert.SerializeObject(purchase));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO Purchases (DateTime, SellerId, ComponentId, Count)
VALUES (@DateTime, @SellerId, @ComponentId, @Count)";
connection.Execute(queryInsert, purchase);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public IEnumerable<Purchase> ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null, int? Count = null)
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Purchases";
var purchases =
connection.Query<Purchase>(querySelect);
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(purchases));
return purchases;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@@ -0,0 +1,132 @@
using ProjectConfectFactory.Entities;
using ConfectFactory.Repositories;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using Dapper;
namespace ProjectConfectFactory.Repositories.Implementations;
public class SellerRepository : ISellerRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<SellerRepository> _logger;
public SellerRepository(IConnectionString connectionString, ILogger<SellerRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateSeller(Seller seller)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(seller));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryInsert = @"
INSERT INTO Sellers (Name, Phone, DeliveryTime)
VALUES (@Name, @Phone, @DeliveryTime)";
connection.Execute(queryInsert, seller);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteSeller(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryDelete = @"
DELETE FROM Sellers
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Seller ReadSellerById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var querySelect = @"
SELECT * FROM Sellers
WHERE Id=@id";
var seller = connection.QueryFirst<Seller>(querySelect, new
{
id
});
_logger.LogDebug("Найденный объект: {json}",
JsonConvert.SerializeObject(seller));
return seller;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Seller> ReadSellers()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var querySelect = "SELECT * FROM Sellers";
var sellers = connection.Query<Seller>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(sellers));
return sellers;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public void UpdateSeller(Seller seller)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(seller));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
var queryUpdate = @"
UPDATE Sellers
SET
Name=@Name,
Phone=@Phone,
DeliveryTime=@DeliveryTime
WHERE Id=@Id";
connection.Execute(queryUpdate, seller);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

View File

@@ -0,0 +1,15 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/conFactory_log.txt",
"rollingInterval": "Day"
}
}
]
}
}